UWP App國際化的兩種實現
開發App,我們都會標配簡體中文和英文兩種語言。至於你加多少種,取決於你的客戶市場。無論如何,英語是必不可少的。
UWP平臺裡面,微軟也提供了一種預設的國際化方案,即修改Resources.resw資原始檔,不過這種方案有一個很大的缺點,需要重啟App才能生效,這就對客戶體驗造成了很大的影響。
另一種方案是Github上的一個方案,作者做的很完美了,適配了WPF和UWP平臺,可以實現實時切換語言,而不必重啟App。
下面就看一下兩個方案的實現。
1. 微軟自家的修改Resources.resw方案 —— 需要重啟生效
微軟的方案比較麻煩,不推薦使用。
這裡舉一個簡單的例子。
a. 新建一個頁面有一個確定鍵,一個取消鍵,一個下拉框選擇語言。
注意需要翻譯的控制元件,我都添加了Uid屬性,系統就是根據這個找翻譯文字的,所以一定要定義好,而且不能重複。
<StackPanel> <Button x:Uid="button_ok" Content="OK"/> <Button x:Uid="button_cancel" Margin="0 30" Content="Cancel"/> <ComboBox SelectionChanged="ComboBox_SelectionChanged"> <TextBlock x:Uid="tb_lang_en" Text="English"/> <TextBlock x:Uid="tb_lang_zh" Text="簡體中文"/> </ComboBox> </StackPanel>
b. 如果解決方案中沒有Strings資料夾,那麼新建一個。然後再下面新建對應的語言資料夾。我這裡新建了zh-cn,en-us。
每一個下面新建一個資原始檔Resources.resw。
然後開啟Resources.resw,
編輯控制元件的對應的屬性,比如Button的Content,TextBlock的Text等等,要精確到屬性,不然只寫一個button,是不可以被識別的。
為了避免Uid出錯,可以編輯完一個檔案,然後整體複製過去,只用改Value就可以了。
c. 新增選擇語言事件,把選擇的語言記錄到本地儲存。
需要用到Windows.Storage.ApplicationData。
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if((sender as ComboBox).SelectedIndex == 0) { Windows.Storage.ApplicationData.Current.LocalSettings.Values["CurrentLanguage"] = "en-us"; } else if ((sender as ComboBox).SelectedIndex == 1) { Windows.Storage.ApplicationData.Current.LocalSettings.Values["CurrentLanguage"] = "zh-cn"; } }
d. 在App.xaml.cs中,設定App的首選語言。
在App初始化this.InitializeComponent();前設定。
public App() { if (Windows.Storage.ApplicationData.Current.LocalSettings.Values["CurrentLanguage"] != null) { string strCurrentLanguage = Windows.Storage.ApplicationData.Current.LocalSettings.Values["CurrentLanguage"].ToString(); Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = strCurrentLanguage; } else Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "zh-cn"; this.InitializeComponent(); this.Suspending += OnSuspending; }
這樣就算完成了。
開啟App後,選擇語言,然而並沒有什麼卵反應。重啟一下App,才能看到效果。
你氣不氣!
2. Github大神的動態載入方案 —— 實時生效,強烈推薦!!!
專案地址:https://github.com/DaZiYuan/MultiLanguageForXAML.git
裡面包含了原始碼,還有例項檔案,非常非常全面。我就不多舉例了。
只需要定義好json檔案,然後在程式碼裡面引用即可。
現在非常流行的localise網站支援匯出世界通用的json,從翻譯到開發,完美對接。
而不像微軟的Resw檔案,localise不支援,也不會支援。
總之,甩微軟的那套方案10086條街。
預覽效果:
&n