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

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

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

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服务器

你们可对照着看app

通常有两种状况: 一种是web项目须要返回多语言,,一种是dll里,须要单独实现多语言的,好比插件中框架

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

 

一.Web 项目中函数

  若是是默认建立的Asp.net core的项目,以及引用完Microsoft.Extensions.Localization包了,因此不须要额外引入ui

  1.资源文件的位置问题spa

  网上的教程中,提到一个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值做为判断     });   }

   3.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就好,不须要本身作缓存    } }

 

最后,也是最重要的,,记得发布以后,,发布的目录下,有一堆的语言代码的文件夹,如图:

 

 记得把本身刚刚编写的语言对应的文件夹更新到服务器上,要否则,出来的仍是默认语言,由于框架找不到对应的语言文件信息

原文出处:https://www.cnblogs.com/kugar/p/12302100.html

相关文章
相关标签/搜索