c# - 使用本地化的 Razor 页面作为电子邮件模板
问题描述
我正在开发一个 .NET Core 项目,我将 Razor 页面作为电子邮件模板发送。我遵循了本教程: https ://scottsauber.com/2018/07/07/walkthrough-creating-an-html-email-template-with-razor-and-razor-class-libraries-and-rendering-it-from -a-net-standard-class-library/ 我唯一找不到的是如何通过将所需语言作为参数传递来发送本地化电子邮件(示例):
public async Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model, string lang)
我在网上找到了一些关于POs
和resx
文件的东西,但一切都需要Startup
实现。razor pages 不是主项目,主项目只是一个 API,而前端由另一个 Angular 项目处理。
如何在没有启动文件的 Razor 类库中实现本地化?
这是项目文件
解决方案
我为您看到至少两个选项:
- 针对不同的文化使用不同的资源文件。
- 对不同的文化使用不同的 cshtml 文件。
Optoin 1 - 为不同的文化使用不同的资源文件
跟着这些步骤:
在 API 项目中,注册
IStringLocalizerFactory
并IStringLocalizer<>
:services.AddSingleton<IStringLocalizerFactory, ResourceManagerStringLocalizerFactory>(); services.AddScoped(typeof(IStringLocalizer<>), typeof(StringLocalizer<>)); services.AddScoped<IRegisterAccountService, RegisterAccountService>(); services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
在 Razor 视图库中创建 Resources.Resx 文件并将其自定义工具设置为
PublicResXFileCodeGenerator
. 然后对于每种语言,创建类似的资源文件Resources.fa-IR.Resx
并清除自定义工具以不为语言文件生成代码。然后添加资源名称和值,例如fa-IR
:Name Value Comment ========================================= Welcome خوش آمدید
将字符串本地化器注入您想要的视图:
@using Microsoft.Extensions.Localization @inject IStringLocalizer<RazorHtmlEmails.RazorClassLib.SharedResources> SR
在上面的例子中,RazorHtmlEmails.RazorClassLib
是资源的命名空间。
SR["resource key in resource file"]
每当您想显示资源文件中的字符串时使用:@SR["Welcome"]
将文化作为参数添加到
RenderViewToStringAsync
ofIRazorViewToStringRenderer
:Task<string> RenderViewToStringAsync<TModel> (string viewName, TModel model, string culture);
RenderViewToStringAsync
为in的实现添加文化RazorViewToStringRenderer
:public async Task<string> RenderViewToStringAsync<TModel> (string viewName, TModel model, string culture) { Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture); Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture); ...
用它:
string body = await _razorViewToStringRenderer.RenderViewToStringAsync( "/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml", confirmAccountModel, "fa-IR");
选项 2 - 为不同的文化使用不同的 cshtml 文件
如果您不想使用资源文件并且想要为不同的文化提供不同的 cshtml 文件,只需使用命名约定即可。例如template.fa-IR.cshtml
,为波斯语创建一个,然后在渲染时使用该视图:
string body = await _razorViewToStringRenderer.RenderViewToStringAsync(
"/Views/Emails/ConfirmAccount/ConfirmAccountEmail.fa-IR.cshtml",
confirmAccountModel);
推荐阅读
- javascript - 如何在标签栏标签的标签屏幕中显示 React Native 中的长文本
- javascript - 使用javascript按时间对对象数组进行排序
- firebase - 无法让 firebase Service Worker 在移动设备上运行(Vue.js 电容器;Android / iOS)
- python - OSError:[Errno -9999] 意外主机错误
- python - Scikit-Learn 中是否有任何具有非负权重约束的线性分类器?
- python - 是否有任何命令可以为我提供基于多点几何的 alpha 形状?
- javascript - 可以即时增加 UV_THREADPOOL_SIZE 吗?
- c# - 具有多个(两个)分层子节点的树视图
- javascript - 与 Google 地球引擎中的另一个要素集合合并时保留要素集合属性
- snowflake-cloud-data-platform - 如何在雪花中调用另一个数据库中的存储过程