Я вижу по крайней мере два варианта для вас:
- Используйте разные файлы ресурсов для разных культур.
- Используйте разные файлы cs html для разных культур.
Optoin 1 - использовать разные файлы ресурсов для разных культур
Выполните следующие действия:
В проекте API зарегистрируйтесь IStringLocalizerFactory
и IStringLocalizer<>
:
services.AddSingleton<IStringLocalizerFactory, ResourceManagerStringLocalizerFactory>();
services.AddScoped(typeof(IStringLocalizer<>), typeof(StringLocalizer<>));
services.AddScoped<IRegisterAccountService, RegisterAccountService>();
services.AddScoped<IRazorViewToStringRenderer, RazorViewToStringRenderer>();
Создайте файл Resources.Resx в Razor View Library и установите для его пользовательского инструмента значение 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
из IRazorViewToStringRenderer
:
Task<string> RenderViewToStringAsync<TModel>
(string viewName, TModel model, string culture);
Добавить культуру к реализации 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);
...
Используйте его:
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);