使用本地化的 Razor 页面作为电子邮件模板

Dev*_*Dev 6 c# asp.net-mvc localization razor asp.net-core

我正在开发一个 .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)
Run Code Online (Sandbox Code Playgroud)

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

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

这是项目文件

在此处输入图片说明

Rez*_*aei 6

我看到至少有两个选项可供您选择:

  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>();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 Razor 视图库中创建一个 Resources.Resx 文件并将其自定义工具设置为PublicResXFileCodeGenerator. 然后对于每种语言,创建资源文件,Resources.fa-IR.Resx并清除自定义工具以不为语言文件生成代码。然后添加资源名称和值,例如fa-IR

     Name        Value            Comment
     =========================================
     Welcome     ??? ?????              
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将字符串定位器注入您想要的视图:

     @using Microsoft.Extensions.Localization
     @inject IStringLocalizer<RazorHtmlEmails.RazorClassLib.SharedResources> SR
    
    Run Code Online (Sandbox Code Playgroud)

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

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

     @SR["Welcome"]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将文化作为参数添加到RenderViewToStringAsyncof IRazorViewToStringRenderer

     Task<string> RenderViewToStringAsync<TModel>
         (string viewName, TModel model, string culture);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将文化添加到RenderViewToStringAsyncin 的实现中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);
     ...
    
    Run Code Online (Sandbox Code Playgroud)
  4. 用它:

     string body = await _razorViewToStringRenderer.RenderViewToStringAsync(
         "/Views/Emails/ConfirmAccount/ConfirmAccountEmail.cshtml", 
         confirmAccountModel, "fa-IR");
    
    Run Code Online (Sandbox Code Playgroud)

选项 2 - 为不同的文化使用不同的 cshtml 文件

如果您不想使用资源文件,并且希望针对不同文化使用不同的 cshtml 文件,只需使用命名约定。例如template.fa-IR.cshtml为波斯语创建一个,然后在渲染时使用该视图:

string body = await _razorViewToStringRenderer.RenderViewToStringAsync(
    "/Views/Emails/ConfirmAccount/ConfirmAccountEmail.fa-IR.cshtml", 
    confirmAccountModel);
Run Code Online (Sandbox Code Playgroud)