首页 > 解决方案 > 使用本地化的 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)

我在网上找到了一些关于POsresx文件的东西,但一切都需要Startup实现。razor pages 不是主项目,主项目只是一个 API,而前端由另一个 Angular 项目处理。

如何在没有启动文件的 Razor 类库中实现本地化?

这是项目文件

在此处输入图像描述

标签: c#asp.net-mvcasp.net-corerazorlocalization

解决方案


我为您看到至少两个选项:

  1. 针对不同的文化使用不同的资源文件。
  2. 对不同的文化使用不同的 cshtml 文件。

Optoin 1 - 为不同的文化使用不同的资源文件

跟着这些步骤:

  1. 在 API 项目中,注册IStringLocalizerFactoryIStringLocalizer<>

     services.AddSingleton<IStringLocalizerFactory, ResourceManagerStringLocalizerFactory>();
     services.AddScoped(typeof(IStringLocalizer<>), typeof(StringLocalizer<>));
     services.AddScoped<IRegisterAccountService, RegisterAccountService>();
     services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
    
  2. 在 Razor 视图库中创建 Resources.Resx 文件并将其自定义工具设置为PublicResXFileCodeGenerator. 然后对于每种语言,创建类似的资源文件Resources.fa-IR.Resx并清除自定义工具以不为语言文件生成代码。然后添加资源名称和值,例如fa-IR

     Name        Value            Comment
     =========================================
     Welcome     خوش آمدید              
    
  3. 将字符串本地化器注入您想要的视图:

     @using Microsoft.Extensions.Localization
     @inject IStringLocalizer<RazorHtmlEmails.RazorClassLib.SharedResources> SR
    

在上面的例子中,RazorHtmlEmails.RazorClassLib是资源的命名空间。

  1. SR["resource key in resource file"]每当您想显示资源文件中的字符串时使用:

     @SR["Welcome"]
    
  2. 将文化作为参数添加到RenderViewToStringAsyncof IRazorViewToStringRenderer

     Task<string> RenderViewToStringAsync<TModel>
         (string viewName, TModel model, string culture);
    
  3. 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);
     ...
    
  4. 用它:

     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);

推荐阅读