開發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條街。
預覽效果:
原文出處:https://www.cnblogs.com/hupo376787/p/12373571.html