.net core全球化配置、使用
相关的资源还是比较多的,主要参考微软的官方文档(地址)
本地化和全球化
要做本地化(Localization
),需要先让程序全球化(Globalization
)。
- 所谓全球化,就是指让程序具有支持多语言的能力,通俗来说,就是每个需要展示内容的地方的内容,都能支持多语言显示。(实际上不单单是文字,还有单位、日期、显示方式等等内容,细说就很麻烦了)
- 而本地化,就是在应用全球化的基础上,增加一种语言(
culture
)支持。
.net core中的全球化和本地化
使用
.net core中,可以通过IHtmlLocalizer
和IStringLocalizer
两个服务实现全球化,这两个服务在初始化时添加,有组件需要显示全球化字符串时,依赖注入他们,然后通过索引引用需要的文本:
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
namespace Localization.Controllers
{
[Route("api/[controller]")]
public class AboutController : Controller
{
private readonly IStringLocalizer<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
public class BookController : Controller
{
private readonly IHtmlLocalizer<BookController> _localizer;
public BookController(IHtmlLocalizer<BookController> localizer)
{
_localizer = localizer;
}
public IActionResult Hello(string name)
{
ViewData["Message"] = _localizer["<b>Hello</b><i> {0}</i>", name];
return View();
}
}
}
两个类中,分别使用了IStringLocalizer
和IHtmlLocalizer
获取本地化字符。使用方式相同,区别在于IHtmlLocalizer
会把字符串中的html特殊标志进行转码,防止页面显示问题。
另外在Razor页面中,也可以注入,一般是个使用IHtmlLocalizer
,防止页面布局受格式化字符串影响:
@using Microsoft.AspNetCore.Mvc.Localization
@page
@inject IHtmlLocalizer<SharedResource> Localizer
IHtmlLocalizer
类还有一个优点,就是在程序开发阶段,可以不配置任何本地化文件,此时该类会直接返回Key值作为字符串内容,方便开发。
初始化
一个题外话,在学习一个概念时,一般包括这几个方面的内容:配置、使用、整体概念。如果先看概念,往往会比较抽象难以理解;如果先看配置,可能会分不清主次,陷入一些细节;而先看使用,又可能产生“我是谁,我从哪来”这样的疑惑。
综合来看,我个人觉得可能先看使用稍好点,因为直奔主题,然后再是配置这块。对于不需要深入了解的情况下,整体概念可以略去,因为能从使用和配置上略见一斑。
回归主题,初始化还是像常见的功能那样,分为添加服务,和注册中间件两部分:
//in Startup.ConfigureServices
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
//in Startup.Configure
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures
});
在注册中间件时,通过RequestLocalizationOptions
配置默认的语言和所有可以支持的语言。
另外,其实通过添加服务时的RequestLocalizationOptions
,也能做到同样的效果:
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("ru-RU"),
new CultureInfo("zh-cn"),
new CultureInfo("zh-tw")
};
options.DefaultRequestCulture = new RequestCulture(culture: "zh-cn", uiCulture: "zh-cn");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
资源文件
有了服务,有了使用,真正的字符串资源是存储在资源文件中的。
资源文件的命名,符合使用资源文件的类名相同,有两种方式,例如对于HomeController使用IHtmlLocalizer<HomeController>
:
Resource name | Dot or path naming |
---|---|
Resources/Controllers.HomeController.fr.resx | Dot |
Resources/Controllers/HomeController.fr.resx | Path |
这里的基础目录Resources
,是在services.AddLocalization(options => options.ResourcesPath = "Resources");
这里配置的。
可以看出,每个语言每个使用的类,需要一个单独的文件存放。
这里的资源文件resx
文件格式,可以在VS中右键添加,然后在VS中直接编辑。
总结
这里分使用、配置、资源文件三部分总结了.net core本地化方法。
后续应该还会补充一个使用Json文件作为资源文件的方法。