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注册了IStringLocalizerFactoryIStringLocalizer<>,并指定了资源的根目录为“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.CurrentCultureCultureInfo.CurrentUICulture
 我们可以通过AddSupportedCultures(等同于SupportedCultures AddSupportedUICultures(等同于SupportedUICultures自定义设置多个支持的区域文化

 

配置 CultureProvider

ASP.NET Core 框架默认添加了3种 Provider

  •     QueryStringRequestCultureProvider:通过在 Query 中设置"culture"、"ui-culture"的值,例如 ?culture=zh-CN&ui-culture=zh-CN
  •     CookieRequestCultureProvider:通过Cookie中设置名为 ".AspNetCore.Culture" Key 的值,值形如 c=zh-CN|uic=zh-CN
  •     AcceptLanguageHeaderRequestCultureProvider:从请求头中设置 "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>)

 参考

posted @ 2024-07-16 10:38  流年sugar  阅读(5)  评论(0编辑  收藏  举报