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.1app

你們可對照着看框架

 

通常有兩種狀況: 一種是web項目須要返回多語言,,一種是dll裏,須要單獨實現多語言的,好比插件中ide

前提,項目中須要引入 Microsoft.Extensions.Localization 包函數

一.Web 項目中ui

  若是是默認建立的Asp.net core的項目,以及引用完Microsoft.Extensions.Localization包了,因此不須要額外引入spa

  1.資源文件的位置問題.net

  網上的教程中,提到一個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就好,不須要本身作緩存
    }

  }
相關文章
相關標籤/搜索