Asp.net core 2.x/3.x 的 Globalization 和 localization 的使用 (一) 使用方法

时间:2024-01-26 09:59:31

由于Api的接口需要返回多语言,因此参考了网上很多篇文章,,有些文章写的太过于理论,看起来比较费劲,今天下午搞了一个下午,总结了一下经验,,

做这个功能时,主要参考了两篇文章:

https://blog.johnwu.cc/article/ironman-day21-asp-net-core-localization.html

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1

大家可对照着看

 

一般有两种情况: 一种是web项目需要返回多语言,,一种是dll里,需要单独实现多语言的,比如插件中

前提,项目中需要引入 Microsoft.Extensions.Localization 包

一.Web 项目中

  如果是默认创建的Asp.net core的项目,以及引用完Microsoft.Extensions.Localization包了,所以不需要额外引入

  1.资源文件的位置问题

  网上的教程中,提到一个SharedResource的用法,并且是放在Resources文件夹中,今天试了很多次,发觉是这么用的,

  比如在不同的area中:

  创建一个Resources文件夹,

  然后添加一个叫SharedResource的类,内容啥都不需要就要一个空的类而已

  再添加对应语言的资源文件,如: SharedResource.en.resx  或者 SharedResource.th.resx

  结构:

  

 

 

   SharedResource.cs :

  namespace ZKXT.Devices.Api.Areas.AppApi.Resources
  {
    public class SharedResource{}

  }

  2.Start.cs 中:

  public void ConfigureServices(IServiceCollection services)

  {

    services.Configure<RequestLocalizationOptions>(options =>
    {
      options.DefaultRequestCulture = new RequestCulture("zn-cn");  //默认的语言
    });

 

    services.AddLocalization(); //注册相应Service  

  }

 

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

   {

    

    var support = new List<CultureInfo>()
    {
      new CultureInfo("zh-cn"),  //注册多种语言,具体可以查看http://www.lingoes.net/zh/translator/langcode.htm找对应
      new CultureInfo("en"),
      new CultureInfo("th")
    };


    app.UseRequestLocalization(x =>
    {
      x.SetDefaultCulture("zh-cn");
      x.SupportedCultures = support;  //设置支持的语言
      x.SupportedUICultures = support;  //设置UI语言,这里有个很大的坑,如果不设置该属性,在Action中,CultureInfo.CurrentCulture返回的是正确的语言,但是在CultureInfo.CurrentUICulture返回的是默认语言
      x.AddInitialRequestCultureProvider(new AcceptLanguageHeaderRequestCultureProvider());  //设置判断当前语言的方式,我项目中是使用了Accept-Language 的header值作为判断
    });

  }

  2.Controller中:

  在构造函数中注入

       public DevicesController(IStringLocalizer<SharedResource> localize=null):ControllerBase 

  注意: 这里的SharedResource,一定是要对应的area中的,框架会根据SharedResource对应的namespace转换成对应的路径,并读取相应的资源文件,这个比较重要.

 

二. dll中

  1.需手动引入 Microsoft.Extensions.Localization 包 

  2.需要在web项目中注入后,在request中自动设定当前线程的语言

  3.资源文件目录结构如图:

  

 

 

 

  public class Base

  {

    private static IStringLocalizerFactory _factory = null;

    private string _name="";

    static Base()
    {
      _factory = new ResourceManagerStringLocalizerFactory(Options.Create(new LocalizationOptions(){ ResourcesPath = "Resources" }),
NullLoggerFactory.Instance);

      _name=typeof(Base).Assembly.GetName().Name;
    }

 

    protected virtual IStringLocalizer GetLocalizer()   //后续使用该函数,即可返回对应的Localizer
    {
     return _factory.Create("SharedResource", _name);  //这里能指定名称,就不是非要新建个 SharedResource 类了,看了factory的源码,Create的实现自带缓存功能,所以不会每次都new一个类,因此直接Create就好,不需要自己做缓存
    }

  }