|
由于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 } 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; }
最后,也是最重要的,,記得發(fā)布之后,,發(fā)布的目錄下,有一堆的語言代碼的文件夾,如圖:
記得把自己剛剛編寫的語言對應(yīng)的文件夾更新到服務(wù)器上,要不然,出來的還是默認語言,因為框架找不到對應(yīng)的語言文件信息 |
|
|
來自: 新進小設(shè)計 > 《待分類》