由于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值作為判斷 }); }
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.uj5u.com/net/63127.html
標籤:.NET Core
上一篇:SQL連接資料庫
