在項目需求中,我們經常需要實現多語言應用,專業術語就是資源全球化。在WinRT庫中,在命名空間Windows.Globalization下也提供了相應的全球化資源的方法。
下面咱就來一步步實現一個簡單的全球化:
1、准備好我們的資源,在這之前,有個” BCP-47”這個名字需要了解,我們資源語言包的名稱需要按照BCP-47規則來命名。如中文包的名稱為:zh-CN,英文包的名稱為:en-US.
我們在工程中新建一個strings文件夾,在該文件夾下再新建zh-CN和en-US文件夾,在兩個文件夾下分別建立一個resource.resw資源文件
2 、資源文件與控件顯示之間是通過控件的uid關聯的,新建一個空白頁面ResourcePage.xaml
< ComboBox Margin ="10, 10, 0, 13" Grid.Column ="0" SelectedValuePath ="Tag" Name ="langComboBox" HorizontalAlignment ="Left" VerticalAlignment ="Top" Width ="106" Height ="34" SelectionChanged ="langComboBox_SelectionChanged" >
< ComboBoxItem Tag ="en-US" >English </ ComboBoxItem >
< ComboBoxItem Tag ="zh-CN" >Chinese </ ComboBoxItem >
</ ComboBox >
< TextBlock x:Uid ="tbWelcome" x:Name ="tbWelcome" HorizontalAlignment ="Left" Margin ="20,0,0,0" TextWrapping ="Wrap" FontSize ="30" Foreground ="Red" VerticalAlignment ="Top" Height ="49" Width ="287" />
</ StackPanel >
3、添加資源內容:
中文:
英文也類似的添加
4、工程文件中的Package.appxmanifest中”應用程序UI”可以設置默認的語言。為了測試,我們添加了一個ComboBox,進行兩種語言的切換
{
string language=Convert.ToString(langComboBox.SelectedValue);
if (Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride != language)
{
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = language;
ResourceManager.Current.DefaultContext.Reset();
ResourceLoader loader = new ResourceLoader();
tbWelcome.Text = loader.GetString( " tbWelcome/Text ");
}
}
以上就實現了一個簡單的控件顯示的全球化,當然全球化的用法不光光是語言顯示還,當不同語言下控件顯示的寬度可以不同,如芬蘭語就比英語的字符長,所以我們也可以將控件的寬度作一個全不過化,例如上面的控件就可以在資源文件中添加tbWelcome.Width相應的值。
我們注意到,在切換不同語言時我們主要分為兩步,將應用程序的首選語言設置為我們當前選擇的語言;然后利用ResourceLoader加載相應的資源包,通過該資源包去加載不同控件的資源。
對於ResourceLoader,我們也可以手動指定對應的資源我,ResourceLoader resource=new ResourceLoader(.resw文件名)即可。
說到資源加載,還有一種用法不得不提,這種用法是讓應用自動去匹配最適合的資源,如我們的資源文件可能很多,這時可以通過以下用法讓應用程序去篩選:
if (context.QualifierValues.ContainsKey( " language "))
{
context.QualifierValues[ " language "] = language;
}
else
{
context.QualifierValues.Add( " language ", language);
}
ResourceMap resourceStringMap = ResourceManager.Current.MainResourceMap.GetSubtree( " Resources ");
ResourceCandidate resourceCandidate = resourceStringMap.GetValue( " tbWelcome/Text ", context);
if (resourceCandidate!= null)
{
tbWelcome.Text = resourceCandidate.ValueAsString;
}
ResourceContext表示當前應用的上下關聯的資源,通過該資源中對應的語言去獲取我們需要的資源值。
還有一種切換資源的用法,該用法需要先指定PrimaryLanguageOverride的值為當前我們的語言,用法如下:
if (Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride != language)
{
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = language;
ResourceManager.Current.DefaultContext.Reset();
tbWelcome.Text = ResourceManager.Current.MainResourceMap.GetValue( " Resources/tbWelcome/Text ").ValueAsString;
}
當然,全球化資源這塊還有日期和時間、貨幣的一些全球化,因為每個國家的顯示形式也是不一樣的,這些相對簡單,只要參照API中給的一些模板格式化就ok啦,微軟示例都有提供哦~