Используйте локализованные страницы Razor в качестве шаблонов электронной почты - PullRequest
4 голосов
/ 11 февраля 2020

Я занимаюсь разработкой базового проекта. NET, где я отправляю страницы 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. Страницы-бритвы - это не основной проект, основной проект - это просто API, а интерфейс обрабатывается другим проектом Angular.

Как реализовать локализацию в библиотеке классов Razor без запуска файл?

Это файлы проекта

enter image description here

1 Ответ

4 голосов
/ 02 марта 2020

Я вижу по крайней мере два варианта для вас:

  1. Используйте разные файлы ресурсов для разных культур.
  2. Используйте разные файлы cs html для разных культур.

Optoin 1 - использовать разные файлы ресурсов для разных культур

Выполните следующие действия:

  1. В проекте API зарегистрируйтесь IStringLocalizerFactory и IStringLocalizer<>:

    services.AddSingleton<IStringLocalizerFactory, ResourceManagerStringLocalizerFactory>();
    services.AddScoped(typeof(IStringLocalizer<>), typeof(StringLocalizer<>));
    services.AddScoped<IRegisterAccountService, RegisterAccountService>();
    services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
    
  2. Создайте файл Resources.Resx в Razor View Library и установите для его пользовательского инструмента значение PublicResXFileCodeGenerator. Затем для каждого языка создайте файл ресурсов, например Resources.fa-IR.Resx, и очистите пользовательский инструмент, чтобы не создавать код для языковых файлов. Затем добавьте имя и значение ресурса, например, для fa-IR:

    Name        Value            Comment
    =========================================
    Welcome     خوش آمدید              
    
  3. Ввести локализатор строки в нужные представления:

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

    В приведенном выше Например, RazorHtmlEmails.RazorClassLib - это пространство имен ресурса.

  4. Используйте SR["resource key in resource file"] всякий раз, когда вы хотите показать строку из файла ресурса:

    @SR["Welcome"]
    
  5. Добавить культуру в качестве параметра к RenderViewToStringAsync из IRazorViewToStringRenderer:

    Task<string> RenderViewToStringAsync<TModel>
        (string viewName, TModel model, string culture);
    
  6. Добавить культуру к реализации RenderViewToStringAsync в 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);
    ...
    
  7. Используйте его:

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

Вариант 2 - Используйте разные файлы cs html для разных культур

Если вы не хотите использовать файлы ресурсов и хотите иметь разные файлы cs html для разных культур, просто используйте соглашение об именах. Например, создайте template.fa-IR.cshtml для персидского языка, а затем при рендеринге используйте это представление:

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