电竞比分网-中国电竞赛事及体育赛事平台

分享

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

 新進小設(shè)計 2020-04-19

由于Api的接口需要返回多語言,因此參考了網(wǎng)上很多篇文章,,有些文章寫的太過于理論,看起來比較費勁,今天下午搞了一個下午,總結(jié)了一下經(jīng)驗,,

做這個功能時,主要參考了兩篇文章:

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

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

大家可對照著看

一般有兩種情況: 一種是web項目需要返回多語言,,一種是dll里,需要單獨實現(xiàn)多語言的,比如插件中

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

 

一.Web 項目中

  如果是默認創(chuàng)建的Asp.net core的項目,以及引用完Microsoft.Extensions.Localization包了,所以不需要額外引入

  1.資源文件的位置問題

  網(wǎng)上的教程中,提到一個SharedResource的用法,并且是放在Resources文件夾中,今天試了很多次,發(fā)覺是這么用的,

  比如在不同的area中:

  創(chuàng)建一個Resources文件夾,

  然后添加一個叫SharedResource的類,內(nèi)容啥都不需要就要一個空的類而已

  再添加對應(yīng)語言的資源文件,如: SharedResource.en.resx  或者 SharedResource.th.resx

  結(jié)構(gòu):

  

 

   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(); //注冊相應(yīng)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找對應(yīng)       new CultureInfo("en"),       new CultureInfo("th")     }; app.UseRequestLocalization(x =>     {       x.SetDefaultCulture("zh-cn");       x.SupportedCultures = support; //設(shè)置支持的語言       x.SupportedUICultures = support; //設(shè)置UI語言,這里有個很大的坑,如果不設(shè)置該屬性,在Action中,CultureInfo.CurrentCulture返回的是正確的語言,但是在CultureInfo.CurrentUICulture返回的是默認語言       x.AddInitialRequestCultureProvider(new AcceptLanguageHeaderRequestCultureProvider()); //設(shè)置判斷當前語言的方式,我項目中是使用了Accept-Language 的header值作為判斷     });   }

   3.Controller中:

  在構(gòu)造函數(shù)中注入

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

  注意: 這里的SharedResource,一定是要對應(yīng)的area中的,框架會根據(jù)SharedResource對應(yīng)的namespace轉(zhuǎn)換成對應(yīng)的路徑,并讀取相應(yīng)的資源文件,這個比較重要.

二. dll中

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

  2.需要在web項目中注入后,在request中自動設(shè)定當前線程的語言

  3.資源文件目錄結(jié)構(gòu)如圖:

  

   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() //后續(xù)使用該函數(shù),即可返回對應(yīng)的Localizer    {      return _factory.Create("SharedResource", _name); //這里能指定名稱,就不是非要新建個 SharedResource 類了,看了factory的源碼,Create的實現(xiàn)自帶緩存功能,所以不會每次都new一個類,因此直接Create就好,不需要自己做緩存    } }

 

最后,也是最重要的,,記得發(fā)布之后,,發(fā)布的目錄下,有一堆的語言代碼的文件夾,如圖:

 

 記得把自己剛剛編寫的語言對應(yīng)的文件夾更新到服務(wù)器上,要不然,出來的還是默認語言,因為框架找不到對應(yīng)的語言文件信息

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多