WP7 - Localize on your App (多語系作法)

Winodws Phone 7 – Localize on your App (多語系作法)

由於目前WP7還不支援中文輸入,因此,中文語系的國家還不是Marketplace所主要關注的對象,

因此,我們製作的程式即使只有提供台灣的用戶使用,也必需要有支援多語系的作法,這樣才會通過App Hub上的認證阿

 

製作支援多語系的WP7 App,需要注意那些資源與運用的技巧呢?

根據<How to: Build a Localized Application for Windows Phone>所提供的範例,主要是實作過程有幾個重要的步驟,如下:

實作範例”LocalizedMyApp”。

Step 1. 建立語系資源檔三個AppResources.resx、AppResources.de-DE.resx與AppResources.es-ES.resx,把資源檔的:Access Modifier設為Public。

003

Step 2. 設定專案檔資訊:

          Step 2-1. 開啟專案檔(*.csproj)找到內容中的<SupportedCultures>;設定支援的語系,例如:

                        <SuppoertedCultures>de-DE;es-ES;</SupportedCultures>。

001

          Step 2.2. 開啟專案屬性,點選「Assembly Infomation」,設定「Netural Language」為預設語系。

002  000

Step 3. 建立一個新類別:LocalizedStrings.cs,用來進行多語系資源轉換的使用。

   1: public class LocalizedStrings
   2: {
   3:     public LocalizedStrings()
   4:     {
   5:     }
   6:  
   7:     private static GlobalizationSample.AppResources localizedresources = new GlobalizationSample.AppResources();
   8:  
   9:     public GlobalizationSample.AppResources Localizedresources { get { return localizedresources; } }
  10:  
  11: }

Step 4: 開啟App.xaml,在「Application.Resources」註冊多語系描述詞,讓在其他xaml檔中可以透過該Tag來使用資源檔。

   1: <Application.Resources>
   2:     <local:LocalizedStrings xmlns:local ="clr-namespace:換成你的專案名詞"
   3:                        x:Key="LocalizedStrings" />
   4: </Application.Resources>
   5:  

Step 5: 在指定的畫面元件中,使用以下指令,取得資源檔中的資源

   1: "{Binding Path=resourceFile.resourceName, Source={StaticResource LocalizedStrings}}" 
   2:  

 

Step 6:  測試。切換語言時,透過手機中的[Setting->Region & Language] 選擇「Display Language」。記得重開機

 

根據上述的說明,大家可以看出該篇文章透過設計的方式就可以方便的達到多語系的功能,是不是很方便呢?!當然,我寫這篇文

章的目的也不是只是為中翻英而已,而是要修改上面的範例,提供一個不用重新開機就可以取得語系調換的效果

 

在不修改上述作法,並且保留直接透過畫面元件中使用”Binding Path”與”StaticResource”的組合來達成多語系的效果,

我改往「LocalizedStrings.cs」檔案下手。

實作範例”NonResetLocalized”:修改的部分如下:

(1) 建立二個語系資源檔,支援繁中、簡中與英文,命名為:AppResources.resx、AppResourcesDeDe.resx與AppResourcesEsEs.resx

(2) 修改LocalizedStrings.cs類別中針對Localizedresources屬性的資料型別:

      2-1. [注意] 此處修改屬性的資料類型為:object;而不是原始範例中的AppResource

      2-2. 語系的變換,透過IsolatedStorageSettings來儲存用戶選擇的語系。

   1: public class LocalizedStrings
   2: {
   3:     private System.Globalization.CultureInfo gCulture = null;
   4:  
   5:     public LocalizedStrings()
   6:     {
   7:         //取得儲存於IsolatedStorageSettings中的Lang語系代碼
   8:         System.IO.IsolatedStorage.IsolatedStorageSettings tSetting = System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings;
   9:         if (tSetting.Contains("Lang"))
  10:         {
  11:             //指定語系
  12:             gCulture = new System.Globalization.CultureInfo(tSetting["Lang"].ToString());
  13:         }
  14:         else
  15:         {
  16:             //預設語系
  17:             gCulture = System.Globalization.CultureInfo.CurrentUICulture;
  18:         }
  19:     }
  20:  
  21:     //宣告三個指定的語系資源檔
  22:     private static AppResource localizedresources = new AppResource();
  23:     private static AppResourceEsES localizedresourcesEses = new AppResourceEsES();
  24:     private static AppResourceDeDe localizedresourcesDede = new AppResourceDeDe();
  25:     
  26:     //資料型別改為object
  27:     public object Localizedresources
  28:     {
  29:         get
  30:         {
  31:             object tResult = null;
  32:             //識別語系
  33:             switch (gCulture.Name)
  34:             {
  35:                 case "es-ES":
  36:                     tResult = localizedresourcesEses;
  37:                     break;
  38:                 case "en-US":
  39:                     tResult = localizedresources;
  40:                     break;
  41:                 case "de-DE":
  42:                     tResult = localizedresourcesDede;
  43:                     break;
  44:             }
  45:             return tResult;
  46:         }
  47:     }
  48: }

(3) 切換不同語系,採用「用戶選擇完語系後,跳離目前程式,再一次啟動程式,進行語系切換」。

004 005 006

 

[注意]

雖然上述是我自己用的方法,但其實懂得使用資源檔來做多語系的人員,應該可以看出它其中與原始範例不同的地方吧。

簡單來說,我建立三個語系資源檔,但在原始範例中其他二個語系檔的資源會被產生成相對應的dll檔,但在不用重開機的範

例裡卻不會存在這些語系檔的dll檔,如下圖:

原始範例007 不用重開機範例008

這完全是二個不同的作法,如果使用原始範例的作法,產生的語系dll檔是會在程式執行時,依照目前Device預設語言來載入

但是如果是不用重開始範例裡的作法,則把三個語系資源檔在程式執行時,全部載入到Assembly(NonResetLocalized.dll)中

這是要特別注意的地方。

 

20110104.. ..Pou

上述的方法雖然可以做到不用重新開機就可以做到換語系的辦法,但是我後來發現這樣的作法其實是不太洽當的,

因此,另外找了二篇文章<How to localize Silverlight Applications the smart way (必讀) & Dynamic Localization in Silverlight (必讀)>,

並且試過確定可以使用的範例。這二篇,透過實作IValueConverter介面的方式,用自定的ResourceManager來完成語系的切換,

其中,如果想要變換語系的部分,可以注意UICulture的實作來進行語系的轉換,即可以達成多語系的應用。

 

20110905.. ..Pou:

如果針對您的程式標題也要做一下Localized的話,可以參考<How to: Localize an Application Title for Windows Phone>的內容,

其中也說明如何透過WP7平台語系的dll來更換。

 

================

根據上面二個範例,可以到下方的載點下載玩看看會比較有感覺。

 

================

 

另外,依照過去在撰寫ASP.NET實作多語系的作法,我簡單另外做了一個例子,實作透過ResourceManager來根據指定的語系

載入相對應的Resource Files(資源檔:.resx),並且替換目前畫面上的內容。

(1) 產生三個語系的資源檔,分別命名為:AppResources.resx、AppResourcesZhCn.resx與AppResourcesEnUs.resx,

並且各增加一筆資料與修改指定的修飾詞為:public。如下圖。

Screen40

(2) 識別目前支援的語系,指定ResourceManager根據指定的語系來讀取資源檔。

   1: public MainPage()
   2: {
   3:     InitializeComponent();
   4:     Loaded += new RoutedEventHandler(MainPage_Loaded);
   5: }
   6:  
   7: void MainPage_Loaded(object sender, RoutedEventArgs e)
   8: {
   9:     ResourceManager tRM = null;
  10:     //識別目前使用的語系
  11:     string tLanguage = System.Globalization.CultureInfo.CurrentCulture.Name;
  12:     //根據語系讀取指定的資源檔
  13:     switch (tLanguage)
  14:     {
  15:         case "zh-TW":
  16:             tRM = new ResourceManager("MultiLanguageApp.AppResourceszh-cn", Assembly.Load("MultiLanguageApp"));
  17:             break;
  18:         case "zh-CN":
  19:             tRM = new ResourceManager("MultiLanguageApp.AppResources", Assembly.Load("MultiLanguageApp"));
  20:             break;
  21:         case "en-US":
  22:             tRM = new ResourceManager("MultiLanguageApp.AppResourcesen-us", Assembly.Load("MultiLanguageApp"));
  23:             break;
  24:     }    
  25:     //取得指定ID對應的語系內容        
  26:     string tValue = tRM.GetString("PageTitle");
  27: }

(3) 替換畫面中的內容。

Screen41

 

==

以上是介紹如何讓自己的WP7 App具有多語系的功能,我個人覺得Silverlight針對多語系的製作跟過去比較起來,

方便了不少。當然,如果你只是部分需要引用資源檔內的內容,不妨可以使用ResourceManager類別來進行讀取。

以上的介紹,希望能有所幫助。

 

[補充]

Multi-language for Tile

先介紹這一篇<How to localize The Title in a WP7 Silverlight application>,該篇有Sample Code,幫您定義好相關的多語系安裝檔。

如果想要自己開發支援中文的語系安裝檔,可透過Visual C++多增加一個專案來進行開發。

 

如何實作一個好的多語系程式

根據<Localization Best Practices for Windows Phone>提供幾個重要的觀念:

(a) 不要過度在地化

(b) 限制文字的長度,並注意是否支援Text-Warp的功能,避免文字轉換後造成字數過長或被截斷的問題

(c) 多語系轉換的應該是以一個完整詞或句子,而不是只是一個單字

(d) 不建議使用符號取代的方式來更換多語系的內容,容易造成語系不同切換的錯誤

(e) Choose an appropriate translation approach (重要)

 

References:

Globalization and Localization for Windows Phone (必讀)

How to: Localize an Application Title for Windows Phone (必讀)

How to: Build a Globalized Application for Windows Phone (必讀)

How to localize The Title in a WP7 Silverlight application (如果是App UI中內容專用,可直接參考該篇)

Code Samples for Windows Phone

WP7 Multi-language v2

Globalization and Localization on WP7 - any that are automatic for devices/users in different cultures

Localization in WP7 Beta & Localization Issue on WP7

Creating Globally Aware Applications

Localizing Silverlight-based Applications & ResourceManager Class (必讀)

How to localize Silverlight Applications the smart way (必讀)

Dynamic Localization in Silverlight (必讀)

Localizing Silverlight-based Applications

 

Dotblogs 的標籤: ,