Windows 8 學習筆記(二十二)--全球化資源


在項目需求中,我們經常需要實現多語言應用,專業術語就是資源全球化。在WinRT庫中,在命名空間Windows.Globalization下也提供了相應的全球化資源的方法。
下面咱就來一步步實現一個簡單的全球化:
1、准備好我們的資源,在這之前,有個” BCP-47”這個名字需要了解,我們資源語言包的名稱需要按照BCP-47規則來命名。如中文包的名稱為:zh-CN,英文包的名稱為:en-US.
我們在工程中新建一個strings文件夾,在該文件夾下再新建zh-CN和en-US文件夾,在兩個文件夾下分別建立一個resource.resw資源文件
2 、資源文件與控件顯示之間是通過控件的uid關聯的,新建一個空白頁面ResourcePage.xaml

< StackPanel  Orientation ="Horizontal"   HorizontalAlignment ="Center"  VerticalAlignment ="Center" >
            < 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,進行兩種語言的切換

private  void langComboBox_SelectionChanged( object sender, SelectionChangedEventArgs e)
        {
             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文件名)即可。

說到資源加載,還有一種用法不得不提,這種用法是讓應用自動去匹配最適合的資源,如我們的資源文件可能很多,這時可以通過以下用法讓應用程序去篩選:

ResourceContext context =  new ResourceContext();
             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的值為當前我們的語言,用法如下:

string language=Convert.ToString(langComboBox.SelectedValue);
             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啦,微軟示例都有提供哦~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM