当前位置:   article > 正文

在ASP.NET Core 使用PO文件指定本地化_.net使用po文件

.net使用po文件

 

目录

1 引用包OrchardCore.Localization.Core

2 在启动项中配置Website使用本地化

3 法语和西班牙语创建PO文件

4 从视图中读取PO文件

5 从控制器中读取PO文件

6 使用不同的复数形式添加语言

7 在PO文件的入口处使用msgctxt限制范围

8 PO 文件的位置


可移植对象文件通常也称为 PO 文件,是基于文本文件,其中包含原始未翻译字符串与其相应翻译之间关系的条目。它们可以替换资源文件,用于ASP.NET Core 中构建的网站进行本地化

相比资源文件使用PO文件有如下几个优点:

1. PO 文件支持附属形式,我将在教程的后半部分进行解释

2. PO 文件不像 .resx 文件那样需要编译

3. PO 文件可以与在线编辑工具进行良好的配合

1 引用包OrchardCore.Localization.Core

首先你需要引用OrchardCore.Localization.Core包,使用vs引用该包

图片

2 在启动项中配置Website使用本地化

在启动项中添加如下代码:

  1. using Microsoft.AspNetCore.Localization;
  2. using Microsoft.AspNetCore.Mvc.Razor;
  3. using System.Globalization;
  4. using OrchardCore.Localization.PortableObject;
  5. var builder = WebApplication.CreateBuilder(args);
  6. // Add services to the container.
  7. builder.Services.AddControllersWithViews()
  8. .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
  9. builder.Services.AddPortableObjectLocalization();
  10. builder.Services.Configure<RequestLocalizationOptions>(options =>
  11. {
  12. var supportedCultures = new[]
  13. {
  14. new CultureInfo("en-US"),
  15. new CultureInfo("fr"),
  16. new CultureInfo("es")
  17. };
  18. options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
  19. options.SupportedCultures = supportedCultures;
  20. options.SupportedUICultures = supportedCultures;
  21. });
  22. var app = builder.Build();
  23. // Configure the HTTP request pipeline.
  24. if (!app.Environment.IsDevelopment())
  25. {
  26. app.UseExceptionHandler("/Home/Error");
  27. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  28. app.UseHsts();
  29. }
  30. app.UseHttpsRedirection();
  31. app.UseStaticFiles();
  32. app.UseRequestLocalization();
  33. app.UseRouting();
  34. app.UseAuthorization();
  35. app.MapControllerRoute(
  36. name: "default",
  37. pattern: "{controller=Home}/{action=Index}/{id?}");
  38. app.Run();

在上面代码中我指定网站支持3种语言, 它将使用PO文件,我们通过使用builder.Services.AddPortableObjectLocalization();来实现

接下来,我指定RequestLocalization中间件通过客户端提供的请求自动设置文化信息,可以使用app.UseRequestLocalization();代码来完成

3 法语和西班牙语创建PO文件

在Visual Studio中创建两个文本文件,一个是法语另一个是西班牙语:

1. fr.po

2. es.po

fr.po 文件如下:​​​​​​​

  1. msgid "Hello world!"
  2. msgstr "Bonjour le monde!"

es.po文件如下:

  1. msgid "Hello world!"
  2. msgstr "¡Hola Mundo!"

PO 文件存储要翻译的字符串和翻译后的字符串,语法是:

msgid: 要翻译的字符串

msgstr: 翻译后的字符串

这里PO文件包含的翻译的字符串"Hello world!”

fr.po文件被使用如果请求文化是fr-FR,fr-CA等,类似"es.po"文件被使用如果请求文化"es-MX",'es-US'等

4 从视图中读取PO文件

我们使用IViewLocalizer 对象读取PO文件,在视图文件中注入该对象​​​​​​​

  1. @using Microsoft.AspNetCore.Mvc.Localization;
  2. @inject IViewLocalizer;

现在我们可以使用该对象来读取PO文件

<p>@Localizer["Hello world!"]</p>

测试

运行应用程序在浏览器的url后面添加?culture=fr, 你将会在浏览器中看到Hello world

图片

5 从控制器中读取PO文件

我们可以使用IStringLocalizer对象在控制器中读取PO文件,在Controller中使用依赖注入获取IStringLocalizer 对象,并且可以在Action方法中使用它​​​​​​​

  1. private readonly ILogger<HomeController> _logger;
  2. private readonly IStringLocalizer<HomeController> _localizer;
  3. public HomeController(IStringLocalizer<HomeController> localizer,ILogger<HomeController> logger)
  4. {
  5. _localizer = localizer;
  6. _logger = logger;
  7. }
  8. public IActionResult Index()
  9. {
  10. string translatedString = _localizer["Hello world!"];
  11. return View();
  12. }

6 使用不同的复数形式添加语言

在es.po中添加如下字符串:​​​​​​​

  1. msgid "There is one item."
  2. msgid_plural "There are {0} items."
  3. msgstr[1] "French text for first plural"
  4. msgstr[2] "French text for second plural"

接下来在视图中添加如下代码:​​​​​​​

  1. <p>@Localizer.Plural(1, "There is one item.", "There are {0} items.")</p>
  2. <p>@Localizer.Plural(2, "There is one item.", "There are {0} items.")</p>

视图将显示如下:​​​​​​​

  1. French text for first plural
  2. French text for second plural

7 在PO文件的入口处使用msgctxt限制范围

"msgctxt" 条目用于在 PO 文件中限定条目仅适用于特定的类或视图,例子:当我在fr.po文件中添加下面问题,该文件本地化只适用于About视图​​​​​​​

  1. msgctxt "Views.Home.About"
  2. msgid "Hello world!"
  3. msgstr "Bonjour le monde!"

8 PO 文件的位置

我们可以使用下面代码来改变PO文件的位置

builder.Services.AddPortableObjectLocalization(options => options.ResourcesPath = "Localization");

源代码地址:

https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.GlobalizationLocalization/AspNetCore.GlobalLocalResFiles

 引入地址

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/539999
推荐阅读
相关标签
  

闽ICP备14008679号