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
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" 的值
可通过以下方式查看默认Provider
app.UseRequestLocalization(options =>
{
var cultureProviders = options.RequestCultureProviders;
}
本地化使用
注入
使用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(),响应头中会附带语言
AcceptLanguageHeaderRequestCultureProvider的方式配置区域化
配置为泰文
利用postman请求
QueryStringRequestCultureProvider方式
由于只访问本地化资源只需要传递"ui-culture"参数(需要区域化日期等才需传递culture<配置项中配置为了lang>)