ASP.NET Core-本地化
安装扩展ResXManager用于管理本地化资源文件
添加资源文件Resource.resx
使用工具ResXManager增加其他资源文件,具体参考ResXManager使用
注册本地化
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddLanguage(this IServiceCollection service)
{
service.Configure<RequestLocalizationOptions>(options =>
{
var cultures = new List<CultureInfo>
{
new CultureInfo("zh-Hans"),
new CultureInfo("en"),
new CultureInfo("th-TH")
};
options.DefaultRequestCulture = new RequestCulture(cultures[0]);//当服务接收到的请求没有指明当前区域文化,就会使用此默认的区域文化
options.SupportedCultures = cultures;//影响日期、时间、数字、货币的展示格式
options.SupportedUICultures = cultures;//影响查找那些区域文化资源(如:.resx、json文件等),也就是说,如果这里没有添加没有区域文化A,即使添加了A区域的资源文件,也无法生效。一般Culture和UICultrue保持一致
options.ApplyCurrentCultureToResponseHeaders = true;//当Http响应时,将当前区域信息设置到 Response Header:Content-Language中
options.AddInitialRequestCultureProvider(new QueryStringRequestCultureProvider() { QueryStringKey = "lang" }); //自定义配置QueryStringRequestCultureProvider的参数key,QueryStringKey默认值culture UIQueryStringKey默认值ui-culture
});
service.AddLocalization(options => options.ResourcesPath = "");//指定资源文件根目录
return service;
}
}
Program.cs中添加本地化服务
注:通过AddLocalization注册了IStringLocalizerFactory和IStringLocalizer<>,并指定了资源的根目录为“Resources”
Program.cs中启用请求本地化中间件
注:
1.app.UseRouting() 之后再调用 app.UseRequestLocalization()
2.RequestLocalizationOptions请求本地化配置项,可以选择本次方式使用service.Configure<RequestLocalizationOptions>直接配置,也可在启用中间件时设置
app.UseRequestLocalization(options => { //var cultureProviders = options.RequestCultureProviders; var cultures = new[] { "zh-Hans", "en", "th-TH" }; options.AddSupportedCultures(cultures); options.AddSupportedUICultures(cultures); options.SetDefaultCulture(cultures[0]); //当Http响应时,将当前区域信息设置到 Response Header:Content - Language中 options.ApplyCurrentCultureToResponseHeaders = true; //自定义配置QueryStringRequestCultureProvider的参数key,QueryStringKey默认值culture UIQueryStringKey默认值ui-culture options.AddInitialRequestCultureProvider(new QueryStringRequestCultureProvider() { QueryStringKey = "lang" }); });
注:默认情况下该中间件支持的区域文化仅为当前区域文化,即CultureInfo.CurrentCulture
和CultureInfo.CurrentUICulture
,
我们可以通过AddSupportedCultures(等同于
SupportedCultures )
和AddSupportedUICultures(等同于
SupportedUICultures)
自定义设置多个支持的区域文化
配置 CultureProvider【请求区域性提供程序】
标明请求中的区域性标志以哪种Provider提供。如果没有一个提供程序可以确定请求区域性,则使用 DefaultRequestCulture
ASP.NET Core 框架默认添加了3种 Provider
QueryStringRequestCultureProvider
:通过在 Query 中设置"culture"、"ui-culture"的值,例如 ?culture=zh-CN&ui-culture=zh-CNCookieRequestCultureProvider
:通过Cookie中设置名为 ".AspNetCore.Culture" Key 的值,值形如 c=zh-CN|uic=zh-CNAcceptLanguageHeaderRequestCultureProvider
:从请求头中设置 "Accept-Language" 的值
以上默认列表从最具体到最不具体排序
可通过以下方式查看默认Providers
app.UseRequestLocalization(options => { var cultureProviders = options.RequestCultureProviders; }
更改请求区域性提供程序参数名
app.UseRequestLocalization(options => {
//此处将默认参数culture改为lang options.AddInitialRequestCultureProvider(new QueryStringRequestCultureProvider() { QueryStringKey = "lang" }); //自定义配置QueryStringRequestCultureProvider的参数key,QueryStringKey默认值culture UIQueryStringKey默认值ui-culture });
更改请求区域性提供程序
app.UseRequestLocalization(options => { var questStringCultureProvider = options.RequestCultureProviders[0]; options.RequestCultureProviders.RemoveAt(0);//删除第一顺序的QueryStringRequestCultureProvider options.RequestCultureProviders.Insert(1, questStringCultureProvider);//再将QueryStringRequestCultureProvider插入变为第三顺序 });
除了以上框架提供的默认Provider还有以下两种
- CustomRequestCultureProvider 通过配置的委托确定请求的区域性信息。--自定义提供程序
- RouteDataRequestCultureProvider 通过路由数据中的值确定请求的区域性信息
本地化使用
资源文件
Resource.resx
Resource.zh-Hans.resx
Resource.en-US.resx
注入
使用IStringLocalizer<>方式注入<>为资源文件类名,也可建立一个资源同名的空类作为伪类,用来代理共享资源
调用
完整代码
[Authorize] [ApiController] [Route("controller")] //[PermissionAuthorize(Permissions.Users)] public class FileController : ControllerBase { private IStringLocalizer<Resource> _localizer; public FileController(IStringLocalizer<Resource> localizer) { _localizer = localizer; } [HttpGet("GetLocal")] public string GetLocal() { return _localizer["start"];//资源名称区分大小写 } }
请求结果
未配置请求区域化
1.本次请求没有明确区域文化,又因以上本地化配置中明确请求中未指定区域文化时(或指定不存在的区域文化时)默认的区域文化是“zh-Hans”,结果显示中文
2.当资源不存在时返回资源name本身
因注册app.UseRequestLocalization(),设置属性ApplyCurrentCultureToResponseHeaders为“true”,响应头中会附带语言
配置请求区域化
工具:利用postman请求
AcceptLanguageHeaderRequestCultureProvider的方式配置区域化
配置区域:泰国
QueryStringRequestCultureProvider方式配置区域化
配置区域:泰国
由于只访问本地化资源只需要传递"ui-culture"参数(需要区域化日期等才需传递culture<以上配置项中配置key改为了lang>)