作為一個普通開發者, 我們負責的專案的使用群體大多數是本國的人民, 但不可避免的也有一些做外貿的業務或者給外企做的專案, 這個時候就要求我們的專案有服務全球客戶的能力, 而一個支援國際化能力的框架會讓我們專案的體驗變得更好.
關於在地化我們聽到最多的是I18N、L10N、G11N, 那它們分別代表了什麼意思呢?
在地化包括:
經過研究表明, 在地化後的產品的銷量會比未經過在地化的更好, 75%的人偏好用母語購買產品, 86%的在地化廣告在點選率、轉換率上超過未經過在地化的廣告, 這些數位都說明了人們對自己母語顯示的內容更加感興趣, 通過在地化可以讓你更精準的打動客戶, 幫你迅速的進入市場, 但在地化不等於直接翻譯, 在地化是基於對當地市場情況和文化精心策劃的, 在習慣、習俗、日期和貨幣格式上是不相同的, 在地化的產品能節約溝通成本, 更容易被理解和接受.
舉個通俗的例子: 相比找一個不認識的陌生人買東西, 我們更喜歡去找那個知根知底的本地人買東西, 這無關產品的質量, 只是熟悉的人更容易獲得我們的認同感
雖然在地化包括很多模組, 但在此我們只考慮產品的在地化, 下面我們就說一下如何做使得自己的產品可以支援在地化
Assignment.I18nDemo
,並安裝Masa.Contrib.Globalization.I18n.AspNetCore
dotnet add package Masa.Contrib.Globalization.I18n.AspNetCore --version 0.7.0-preview.16
I18n
, 並修改Program.cs
builder.Services.AddI18n();
I18N
app.UseI18n();//啟用在地化中介軟體
- Resources
- I18n
- en-US.json
- zh-CN.json
- supportedCultures.json
{
"Home":"Home"
}
{
"Home":"首頁"
}
[
{
"Culture":"zh-CN",
"DisplayName":"中文簡體",
"Icon": "{Replace-Your-Icon}"
},
{
"Culture":"en-US",
"DisplayName":"English (United States)",
"Icon": "{Replace-Your-Icon}"
}
]
I18n
app.Map("/test", (string key) => I18n.T(key));
Home
的值是不是感覺用起來十分簡單呢, 但這究竟是如何做的呢
國內的小夥伴根據上面的例子操作下來, 會發現請求響應的內容是中文, 那什麼情況下它會變成英文呢?
由於.NET 提供了在地化的能力, 它提供了在地化的中介軟體, 通過它使得我們的專案具備解析當前語言的能力
目前它支援了以下三種方式進行語言切換:
c=en-UK|uic=en-US
語言優先順序:
URL 引數 方式 > Cookies方式 > 使用者端語言 > 預設語言
預設語言有兩種設定方式, 它們分別是:
supportedCultures.json
檔案中的第一個語言app.UseI18n("{Replace-Your-DefaultCulture}")
它們的優先順序是:
手動指定預設語言 > 約定設定
builder.Services.AddI18n(options =>
{
options.ResourcesDirectory = Path.Combine("Resources", "I18n");//修改預設資源路徑
options.SupportedCultures = new List<CultureModel>() //支援語言
{
new("zh-CN"),
new("en-US")
};
});
如果你希望將組態檔嵌入到dll檔案中, 不希望被看到修改, 那麼你需要將資源json檔案的生成操作改為嵌入的資源
, 並修改I18N註冊程式碼為:
builder.Services.AddI18nByEmbedded();
相信瞭解前端開發的小夥伴也見到過巢狀的資源設定, 那對於Masa提供的多語言方案而言, 我們也支援這種格式的設定, 例如:
{
"Home":"首頁",
"User":{
"Name":"名稱"
}
}
我們希望拿到User節點下的Name屬性的值, 則可以通過:
var result = I18N.T("User.Name");//其中key的值不區分大小寫
當然除此之外, 我們也可以將不同資源的檔案分開存放到不同的json檔案, 然後通過新增多個資源目錄的檔案, 最終實現, 但在使用時稍微有區別:
app.Map("/test2", (string key, II18n<CustomResource> i18n) => i18n.T(key));//通過DI獲取到自定義資源下Key對應內容
多語言的遠端資源設定目前僅支援Dcc, 我們可以這樣做:
MasaConfiguration
並使用Dcc, 修改Program.cs
builder.Services.AddMasaConfiguration(configurationBuilder =>
{
// configurationBuilder.UseDcc();//正確設定好Dcc設定後開啟
});
appsettings.json
{
"DccOptions": {
"ManageServiceAddress": "{Replace-Your-DccManagerServiceHost}",
"RedisOptions": {
"Servers": [
{
"Host": "{Replace-Your-DccUseRedisHost}",
"Port": 6379
}
],
"DefaultDatabase": 0,
"Password": ""
}
}
}
對MasaConfiguration有疑問點這裡
builder.Services.AddI18n(
Path.Combine("Resources", "I18n"),
"supportedCultures.json",
options => options.UseDcc());
我們僅需要在/Resources/I18n
目錄下存放支援語言的設定即可, 具體的語言設定將從Dcc讀取 (讀取Dcc語言的設定節點: 在Dcc設定下預設AppId下的"Culture.{語言}"), 例如:
如果支援語言為zh-CN
、en-US
, 則預設讀取Dcc設定下預設AppId下Culture.zh-CN
、Culture.en-Us
兩個設定物件的值, 我們僅需要修改它們的值即可, 並且如果對應的內容發生更改, 專案無需重啟即可完成自動更新
在MasaFramework
中, 抽象了多語言的能力, 它提供了
name
的值 (如果name
不存在, 則返回name
的值)name
的值 (如果returnKey為false, 且name不存在, 則返回null
)name
的值, 並根據文化、輸入引數格式化響應資訊返回 (如果name
不存在, 則返回name
的值)name
的值, 並根據文化、輸入引數格式化響應資訊返回 (如果returnKey為false, 且name不存在, 則返回null
)name
的值, 如果name
不存在, 則返回name
的值name
的值 (如果returnKey為false, 且name不存在, 則返回null
)name
的值, 並根據文化、輸入引數格式化響應資訊返回 (如果name
不存在, 則返回name
的值)name
的值, 並根據文化、輸入引數格式化響應資訊返回 (如果returnKey為false, 且name不存在, 則返回null
)我們可以通過DI
獲取到II18n
進而來使用它提供的這些能力, 當然它使用的是資源型別為DefaultResource
的資源 (在服務註冊時所指向的資源 services.AddI18n()
), 除此之外, 我們也可以通過DI
獲取到II18n<DefaultResource>
來使用, 也可以通過I18n
(全域性靜態類)來使用它提供的能力, 但是如果你使用了自定義資源型別, 則只能通過DI
獲取II18n<{Replace-Your-ResourceType}>
來使用.
除此之外, 我們還提供了支援的語言列表的能力, 它被抽象在ILanguageProvider
我們可以通過DI
獲取ILanguageProvider
來使用, 也可以通過I18n.GetLanguages()
來使用
當然, MasaFramework
絕不僅僅只是提供了這麼簡單的多語言的能力, 目前全域性異常、Caller也已經支援了多語言, 其他模組也在逐步完善多語言支援, 等之後框架的錯誤資訊也將會支援多語言, 我們的開發體驗也將會變得更加友好
Assignment18
https://github.com/zhenlei520/MasaFramework.Practice
MASA.Framework:https://github.com/masastack/MASA.Framework
MASA.EShop:https://github.com/masalabs/MASA.EShop
MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor
如果你對我們的 MASA Framework 感興趣,無論是程式碼貢獻、使用、提 Issue,歡迎聯絡我們
本文來自部落格園,作者:磊_磊,轉載請註明原文連結:https://www.cnblogs.com/zhenlei520/p/16997914.html
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利