《Programming WPF》翻譯 第6章 4.應用程式全球化

來源:互聯網
上載者:User

標籤:

原文:《Programming WPF》翻譯 第6章 4.應用程式全球化

如果你打算髮布你的應用程式到全球各地,你可能需要為不同地區的使用者介面準備不同的版本。至少,這需要解決將文本翻譯成適當的語言;同樣需要解決UI改變的問題。你可能需要特定的外觀適應為本地化的文化習俗。或者,你可能會發現原始的外觀在翻譯後並不能正常工作,因為詞的長度是不一樣的。(雖然WPF的外觀體系避免了這一問題,更易於建立更彈性的外觀。)

為你的軟體在不同的市場建立不同的版本是可能的。儘管如此,更加普遍的辦法是建立一個單獨的版本來適應於不同的場所,通過在運行期選取一個合適的資源檔。WPF的底層架構ResourceManager可以相當直接地使用這個辦法。

Microsoft對本地化和全球化加以區別。本地化是一個支援一個應用程式在意個特定的場所使用的過程,通過建立特定文化的資源如文本的翻譯。全球化是一個確保一個應用程式可以被本地化而不用編譯的過程。使用ResourceManager可以協助我們對應用程式進行全球化,因為這個類的在運行期選擇的資源支援一個單獨的應用程式版本通過提供合適的資源進行本地化。更多資訊請參考微軟國際網站http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vboriInternationalization.asp (http://shrinkster.com/6m9).

當一個ResourceManager被要求按名稱擷取資源流時,首先它要決定使用哪種文化。文化時語言與地區的合稱,被典型地表示為一個短字串。例如,en-US表示在美國使用的英語。而en-GB則代表在英國使用的英語。前兩個字母表明語言,後兩個表示地區。同時指明語言和地區是因為即使兩種文化共用一種語言,在方言和習語上還是有差別的。例如,本書的作者之一來自en-GB,因此喜歡使用color而不是colour。

ResourceManager的GetStream方法使用一個CultureInfo對象作為參數。如果你想使用使用者最終配置過的文化,你可以從Thread.CurrentThread的CurrentUICulture屬性重新擷取一個CultureInfo對象。

雖然可執行體經常將資源編譯到其中,ResourceManager仍然會先尋找指定文化的資源,在求諸於內嵌資源之前。首先會在包含應用程式目錄的子目錄中按文化名稱搜尋。因此,如果你的應用程式運行在French-Canadian的文化上,會在名為fr-CA的子目錄中尋找一個叫做MyApp.resources.dll的檔案,這裡MyApp是應用程式或組件的名稱。如果不存在,會接著在尋找名為fr的目錄尋找相同的檔案。這意味著一旦你的翻譯預算並不擴充到為全世界所有使用法語的不同地區產生不同的版本,你可以取代的提供一套單獨的法語資源,專門用於使用法語的地區。如果這些子目錄都不存在這個檔案,它將求助於使用內嵌資源。

這些被ResourceManager尋找的DLL資源稱為全球化編譯資源,命名的原因是這些資源都是很小的資源,聚集為一個大的編譯集。

注意到,一旦你提供了一個全球化編譯集,你就不需要提供所有資源的語言版本。這樣那些內嵌在你的主編譯集的資源對於所有資源都是很是的。例如,圖6-6中的應用程式有一個內嵌的bmp檔案Sunset.jpg。世界大部分都會有日落,所以你仍可能需要為南極和北極的版本做特殊的工作。基本的Sunset.jpg可以為大多數文化使用。這將要浪費空間對於每個全球化資源都要擷取同一張圖片的副本。幸運的是,這不是必須的。如果一個特定的命名資源在全球化編譯資源中並不存在,ResourceManager將會回到內嵌資源中來。

你可以把全球化編譯資源想象為僅包含內嵌資源和目標文化所需資源之間的差別。任何普通的資源都單獨位於主編譯集中。一個特定語言但不限地區的編譯集所在的子目錄(如fr子目錄),包含不同於特定語言的所需資源。而且,完全特定文化的子目錄(如fr-CA,fr-FR,fr-BE等)包含那些需要考慮當地習語的資源(在這裡的上下文中,“資源”是一個通過ResourceManager重新獲得的流,而不是通過ResourceDictionary重新擷取到的對象)

6.4.1使用XAML建立本地化應用程式

因為XAML是編譯在BAML資源中的,可以通過ResourceManager擷取到,本地化是一種內在的特徵,由任何WPF應用程式使用XAML建立。儘管如此,在Visual Studio 2005中,並沒有對WPF應用程式本地化提供內在支援,因此需要一些手動步驟。

如果你要在XAML中建立一個UI,有效本地化每次產生一個XAML檔案。ResourceManager不能比一個單獨的BAML資源得到更加細密的資源,因此,每一個BAML資源不是本地化就是非本地化的。由於xaml檔案和其後台代碼之間的緊密聯絡,儘管如此,本地化BAML資源具有和原始版本一樣的基本結構,這是非常重要的。基本上,你可以通過為語言版本寫一個xaml檔案擷取資源,並且嘗試保持結構的一樣。然而,這是一種具有更具強壯性的方式來保證一致性。

取代以為每種文化建立一組xaml檔案,你可以寫一組主要的xaml檔案,每個表單或頁面都有一個這樣的檔案。你可能希望對每種惡化都提供支援,可以使用一個工具產生特定文化的全球化編譯資源,其中包含本地化資源。你提供設定檔的工具表明資源應該如何被修改,從而建立本地化的版本。圖6-7解釋了全部的過程。

這是一個些微冗長的過程。在WPF最新的發布版本中,並未更好的改進和整合到Visual Studio 2005中。眼下,歡迎此預發布的軟體來到這個精彩的世界。

圖6-7


首先,你必須保證工程通過指定一個預設的
UI文化,被設定為建立一個本地化的應用程式。在寫代碼的時候,沒有辦法在Visual Studio 2005中進行這樣的操作,所以你必須使用文字編輯器編輯.csproj檔案。在PropertyGroup元素中添加一個UICulture元素(UICulture元素出現在那個部分並不要緊),將其設定為預設文化。該文化為將要建立的主要資源。這將引起Visual Studio 2005為了這個預設文化,將所有的二進位資源置入全球化編譯資源中。樣本6-28展示了一個xaml的例子。

樣本6-28

<Project DefaultTargets="Build"
         xmlns
="http://schemas.microsoft.com/developer/msbuild/2003">
  
<PropertyGroup>
    
    
<UICulture>en-US</UICulture>
    
  
</PropertyGroup>
  

下一步,你必須將Uids標籤添加到xaml中。Uid標籤是xaml元素的一個特殊的屬性,顯示需要本地化的內容。包含了本地化指令的本地化設定檔,使用Uid屬性顯示那些元素被修改了。樣本6-29展示了一個使用了Uid的TextBlock。

樣本6-29

<TextBlock x:Uid="TextBlock_1">Hello, world</TextBlock>

你可以手動添加你想要的。或者你能使用msbuild自動產生它們(msbuild是一個命令列工具,用來產生工程。Visual Studio 2005使用同樣的建立技術,但是msbuild提供更多的控制。例如,它允許你在Uid產生WPF建立系統的特徵)。為了自動添加Uids到你的xaml中,運行這個命令:

msbuild /t:updateuid MyProject.csproj

如果你已經做完這些,隨後編輯好你的xaml,你可能想檢查是否以重複的Uid標籤終結,可以使用以下命令:

msbuild /t:checkuid MyProject.csproj

現在你可以產生這個工程了,或者使用Visual Studio 2005的命令列執行msbuild,將工程名作為一個參數傳遞。你會發現在產生一個exe或dll的同時,你的工程也在子目錄中添加了一個全球化資源。(這個子目錄將是添加到工程中的UICulture元素名稱重的一個。)

下一步是建立一個設定檔用於引導本地化過程。這個檔案包含所有的本地化資源,如翻譯過的字串。你可以使用LocBaml命令列工具建立這個檔案的骨架。這個工具檢查了BAML流的編譯資源,建立了一個檔案,檔案中每一行都是一條本地化資訊。你可以將翻譯字串和任何需要的資源放入這個檔案中。

在WPF的當前預覽版本中,LocBaml只提供原始碼的形式,因此在執行之前需要先產生它。你可以在WinFX SDK文檔中找到這些代碼。在Avalon-Globalization and Localization-How-to Topic section,找到“Localize an Application”標題。這裡將提供給你LocBaml的代碼。

樣本6-30展示了如何執行LocBaml組建組態檔案的骨架。

樣本6-30

LocBaml bin\Debug\en-US\MyApp.resources.dll /out:MyAppResources.csv

這將建立一個CSV檔案。表6-1描述了CSV檔案中每一列(按出現順序)。為了本地化一個資源,編輯Value這一列。(注意這個CSV檔案並不包含標題列,只依賴於列的位置。)

表6-1

列名

描述

Baml Name

唯一標誌BAML流,這個值表現為AssemblyManifestStreamName:SubStraemName 的形式

Resource Key

唯一標誌本地化資源,這個值表現為Uid.ElementType.$Property的形式

Localization Category

一個來自LocalizationCategory枚舉的入口,表明是哪一類內容

Readable

表明在轉換期間資源是否可見

Modifiable

表明在轉換期間Value是否可以更改

Comments

本地化的注釋

Value

資源的值

樣本6-31展示了設定檔中的一行。(由於頁面寬度,這一行被拆成了3行顯示在下面)。

樣本6-31

HelloApp.g.fr-FR.resources:window1.baml,
TextBlock_1:System.Windows.Controls.TextBlock.$Content,
None,True,True,,Bonjour monde

一旦你已經轉換了所有的值,你就可以再次執行LocXaml產生新的資源dll。你必須傳遞原始資源dll的路徑,CSV檔案(包含翻譯)的路徑,一個目標地址,以及一個目標文化,正如樣本6-32所示。。(由於頁面寬度,這一行被拆成了3行顯示在下面)。

樣本6-32

LocBaml /generate bin\Debug\en-US\MyApp.resources.dll /trans:MyAppResource.csv
  /out:bin\Debug\en-GB /cul:en-GB

這將產生一個新的全球化編譯資源在指定的目錄,以選中的文化為目標。(如果你想產生多個編譯資源,為每一種文化建立一個CSV檔案,為每個檔案只執行一次LocBaml。)如果你把資源編譯結果放在一個按文化命名的應用程式目錄的子目錄中,這將自動在運行期被擷取到,應用程式會執行選中的特定文化。

《Programming WPF》翻譯 第6章 4.應用程式全球化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.