[英]Use localized Razor pages as e-mail templates
我正在開發一個 .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 類庫中實現本地化?
這是項目文件
我看到至少有兩個選項可供您選擇:
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"]
將文化作為參數添加到IRazorViewToStringRenderer
RenderViewToStringAsync
:
Task<string> RenderViewToStringAsync<TModel> (string viewName, TModel model, string culture);
將文化添加到RazorViewToStringRenderer
的RenderViewToStringAsync
實現:
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);
作為已接受答案的補充,您可以通過以下方式從電子郵件主題中的資源獲得翻譯效果:
像這樣編輯RegisterAccountService
類:
private readonly IStringLocalizer<RazorHtmlEmails.RazorClassLib.SharedResources> _localizer;
將RazorHtmlEmails.RazorClassLib.SharedResources
替換為您的命名空間,然后:
public RegisterAccountService(IRazorViewToStringRenderer razorViewToStringRenderer, IStringLocalizer<RazorHtmlEmails.RazorClassLib.SharedResources> localizer)
{
_razorViewToStringRenderer = razorViewToStringRenderer;
_localizer = localizer;
}
並申請:
SendEmail(toAddresses, "donotreply@contoso.com", _localizer["My_Email_Subject_Translation"].Value, body);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.