NetCore 國際化最佳實踐
ASP.NET Core中提供了一些本地化服務和中間件,可將網站本地化為不同的語言文化。ASP.NET Core中我們可以使用Microsoft.AspNetCore.Localization庫來實現本地化。但是默認只支持使用資源文件方式做多語言存儲,很難在實際場景中使用。有沒有可能支持官方資源文件的基礎上還能支持動態添加修改多語言呢,答案是有的,那就是NetPro.Globalization
安裝
Package Manager方式:
Install-Package NetPro.Globalization 6.0.10
.NET CLI 方式:
dotnet add package NetPro.Globalization --version 6.0.10
PackageReference:
<PackageReference?Include="NetPro.Globalization"?Version="6.0.10"?/>
.NET CLI 方式:
paket add NetPro.Globalization --version 6.0.10
基于NetPro環境的初始化
如基于NetPro環境的使用,比較簡單,在執行安裝步驟后配置多語言持久化的sqlite地址即可
"Globalization":?{"UIQueryStringKey":?"language",?//請求的query攜帶的多語言參數名,默認為language"ConnectionString":?"Data?Source=Globalization.db;Cache=Shared",?//sqlite地址"Cultures":?["zh-CN","en-US"],"Annotations":?true,?//是否打開注冊數據注解本地化服務"Record":?true?//不存在是否記錄(自動插入數據庫默認語系),默認true}
脫離NetPro環境的使用
如不是基于NetPro環境的使用,比需要手動進行各項初始化
public?void?ConfigureServices(IServiceCollection?services){services.AddGlobalization();}
public?void?Configure(IApplicationBuilder?app,?IWebHostEnvironment?env){//置于app.UseRouting()后便可;var?configuration?=?app.ApplicationServices.GetService<IConfiguration>();var?globalization?=?configuration.GetSection(nameof(Globalization)).Get<Globalization>();var?cultures?=?globalization?.Cultures????new?string[]?{?};var?localizationOptions?=?new?RequestLocalizationOptions().AddSupportedUICultures(cultures);localizationOptions.RequestCultureProviders.Insert(0,?new?QueryStringRequestCultureProvider?{?UIQueryStringKey?=?globalization.UIQueryStringKey?});localizationOptions.RequestCultureProviders.Insert(1,?new?AcceptLanguageHeaderRequestCultureProvider());localizationOptions.RequestCultureProviders.Insert(2,?new?CookieRequestCultureProvider());app.UseRequestLocalization(localizationOptions);}
使用
public?class?GlobalizationDemoController?:?ControllerBase{private?readonly?IStringLocalizer<NetPro.Globalization.Globalization>?_localizer;//建議使用NetPro.Globalization.Globalization?統一的類提供字符串承載,過多語言碎片public?GlobalizationDemoController(,?IStringLocalizer<NetPro.Globalization.Globalization>?localizer){_localizer?=?localizer;}///?<summary>///?多語言國際化示例///?</summary>[HttpGet("globalization")]public?IActionResult?Globalization(){var?localMsg?=?_localizer["當前時間為"]?+?$":{DateTime.Now}";return?Ok(new?{?localMsg?});}}
客戶端處理
客戶端請求接口時,依次支持,query,header,cookie等三種方式攜帶多語言標識
query 默認
language
; 支持修改UIQueryStringKey
節點覆蓋默認參數名,推薦query方式header 默認
Accept-Language
cookie 默認為
.AspNetCore.Culture
?既:(Microsoft.AspNetCore.Localization.CookieRequestCultureProvider.DefaultCookieName)
實驗:
中文環境:
request?http://localhost:5001/api/globalizationdemo/globalization?language=zh-CN
response?localMsg:?"當前時間為:2022/6/11 14:47:01"
英文環境:
request?http://localhost:5001/api/globalizationdemo/globalization?language=en-US
response?localMsg:?"當前時間為:2022/6/11 14:47:01"
發現依然中文,原因是找不到對應的語言,會自動將_localizer[string]中的字符串作為默認值插入,此時只需要手動再插入一條en-US的翻譯即可
再次請求:
request?http://localhost:5001/api/globalizationdemo/globalization?language=en-US
response?localMsg:?"This time is:2022/6/11 14:50:25"
總結
除了以上支持sqlite數據庫存儲多語言信息,同時也支持微軟默認的資源文件方式,并且使用方式與原生一致,不會有新的學習成本。
NetPro.Globalizatio:
https://github.com/LeonKou/NetPro/tree/dev_6.0/src/Library/NetPro.Globalization
NetPro框架Github地址:
https://github.com/LeonKou/NetPro