今天要來介紹多國語系的處理,想要建立一個國際化網站,多國語系可以說是基本需求,那我們就來看如何在 Blazor 中實現吧!
除了數字與日期格式有原先 .NET 框架的文化特性外,其他都要自己來處理多國語系的範本,這也是理所當然的,除非機器翻譯的準確率接近完美,否則公司大可花錢請人翻譯,以免在公開網站出現奇葩內容。
那麼我們該如何在 Blazor wasm 中實現多國語系呢?很遺憾官方目前並沒有提供一份詳細的文件,但留了一個 Repository 來供我們參考,讓我們以pranavkm/LocSample的方式來當作多國語系的處理吧!
首先針對需要多國語系的元件建立資源檔,其檔案名稱如 {Component}.{Culture}.resx
,Component
為使用此資源檔的元件名稱,需確保名稱與元件名稱一致,Culture
為文化特性的值,若不加則代表預設的資源檔。
因為 .resx
屬於 XML 格式的檔案,所以這邊就不貼 Code 了,建立 {Component.resx}
且擁有 Greetings
欄位其值為 你好!
,並建立 {Component}.en.resx
且擁有 Greetings
欄位其值為 Hello!
。
在 Component
使用資源檔前,需要先從 Nuget
安裝 Microsoft.Extensions.Localization
,我們需要透過其命名空間下的 IStringLocalizer<T>
物件來取得資源檔內容,安裝完畢後記得註冊服務 builder.Services.AddLocalization();
,註冊時 AddLocalization
方法也提供 LocalizationOptions
來設定額外內容,雖然目前只有提供 ResourcesPath
來修改資源檔定位的相關路徑。
然後就可以在元件注入 IStringLocalizer<T>
來存取相關的資源檔,如:
1 | @* Day27Sample.razor *@ |
為了提供使用者切換文化特性,需要建立一個選擇文化特性的元件:
1 | @* CultureSelector.razor *@ |
但因為注入後就會被初始化,所以我們一定要透過網頁重啟,來使文化特性在初始化時能以使用者選擇的文化特性,所以我們需要藉由 localStorage
來保存使用者修改文化特性時的值,並且在重新啟動時取得該值:
1 | // Program.cs |
JS 內容為:
1 | window.blazorCulture = { |
這樣只要在合適的地方使用 CultureSelector
元件選擇文化特性,就能透過重新載入的方式使全站語系變更,且之後的每一次進入都可以看到相同的內容,除非使用者自行清除。
以上就是多國語系的處理方式,美中不足的是這套一定要使用 .resx
來當作資源檔,沒辦法使用 .json
來處理,但 Blazor 也算是個新興框架吧?相信未來會有更多的解決辦法!完整程式碼在範本程式碼 - Day27。
感謝大家的閱讀,我們明天見。