WPF當地語系化應用程式

by Vivid 28. 六月 2011 23:18

作者:許薰尹 精誠資訊恆逸教育訓練中心 資深講師

在WPF設計多國語言的應用程式步驟實在是相當地煩瑣。你需要為不同的文化特性設計衛星組件(Satellite assemblies),要進行當地語系化的項目都要在組件中定義,當WPF應用程式執行時,會自動載入符合當下文化特性的組件。

應用程式的文化特性資訊會記錄在System. Threading.Thread.CurrentThread.CurrentUICulture屬性,你可以明確地在應用程式中設定想要使用的文化特性。本文將介紹如何設計支援當地語系化的WPF應用程式。

設計畫面

使用Visual Studio 2010建立一個WPF Application 類型專案,名稱為UILocalize。在這篇文章的範例中,我要設計一個登入畫面來進行當地語系化的動作。參考圖1,在WPF視窗中加入兩個Label顯示「User ID:」、「Password:」字串,兩個文字方塊,以及兩個按鈕,顯示「Cancel」與「Login」字串:

clip_image002

圖 1:要當地語系化的登入畫面。

預設WPF應用程式是不分文化特性的,您需要手動地在專案檔案(*.csproj)中加入預設的UICulture的定義。您可以利用文書處理軟體,例如利用notepad,開啟專案檔(UILocalize.csproj檔案),加入以下標籤到<PropertyGroup>項目下方,請注意大小寫,大小寫將視為不同:

<UICulture>en-US</UICulture>

目前UILocalize.csproj檔案看起來如下:

<?xml version = "1.0" encoding = "utf-8"? >
<Project ToolsVersion = "4.0" DefaultTargets = "Build" xmlns = "http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <UICulture>en-US</UICulture>
        <Configuration Condition = " '$(Configuration)' == '' "> Debug </Configuration>
以下略

 

當你使用Visual Studio 2010建置專案功能編譯WPF應用程式時,便會產生指定文化特性的子目錄(bin\debug\en-US 目錄),在此目錄中也會產生資源組件,參考圖2所示。

clip_image004

圖 2:產生資源組件。

為當地語系化項目建立唯一識別碼(Uid)

你必需要利用Uid attribute標識出WPF應用程式中需要進行當地語系化的項目,例如要顯示在畫面中的字串、圖片及及屬性等等。為了簡化這個流程,您可以利用msbuild.exe工具程式將XAML檔案中所有項目加入唯一識別碼(unique identifiers,UID)。在Visual Studio Command Prompt命令提示字元執行msbuild.exe,並設定updateuid參數:

msbuild /t:updateuid UILocalize.csproj

參考圖3為執行結果:

clip_image006

圖 3:為當地語系化項目建立唯一識別碼(Uid)。

檢視XAML檔案中的每個項目,都會自動加入一個Uid做識別:

<Window
    x:Uid = "Window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class = "UILocalize.MainWindow"
    x:Name = "Window"
    Title = "Login"
    Width = "280" Height = "211">

    <Grid x:Uid = "LayoutRoot" x:Name = "LayoutRoot" Height = "156" Width = "229" >
        <Label x:Uid = "label1" Content = "User ID :" Height = "28" HorizontalAlignment = "Left" Margin = "12,12,0,0" Name = "label1" VerticalAlignment = "Top" />
        <Label x:Uid = "label2" Content = "Password :" Height = "28" HorizontalAlignment = "Left" Margin = "12,46,0,0" Name = "label2" VerticalAlignment = "Top" />
        <Button x:Uid = "button1" Content = "Cancel" Height = "23" HorizontalAlignment = "Left" Margin = "32,100,0,0" Name = "button1" VerticalAlignment = "Top" Width = "75" />
        <Button x:Uid = "button2" Content = "Login" Height = "23" HorizontalAlignment = "Left" Margin = "113,100,0,0" Name = "button2" VerticalAlignment = "Top" Width = "75" />
        <TextBox x:Uid = "textBox1" Height = "23" HorizontalAlignment = "Left" Margin = "90,17,0,0" Name = "textBox1" VerticalAlignment = "Top" Width = "120" />
        <TextBox x:Uid = "textBox2" Height = "23" HorizontalAlignment = "Left" Margin = "90,48,0,0" Name = "textBox2" VerticalAlignment = "Top" Width = "120" />
    </Grid>
</Window>

 

粹取出要當地語系化的內容

下一步您需要使用LocBaml.exe工具程式粹取出要當地語系化的內容,此工具程式可以從微軟MSDN網站下載LocBaml Tool Sample,下載網址請參考本文參考資源。您需要將LocBaml Tool Sample程式編譯成執行檔,然後將LocBaml.exe 複製到 bin\debug 目錄中。接下來在命令提示字元執行LocBaml.exe,並設定parse參數指明資源組件所在路徑,利out參數指明輸出成一個附檔名為csv的文字檔:

C:\netmag\UILocalize\UILocalize\bin\Debug>locbaml /parse en-US/UILocalize.resources.dll /out:UILocalize.csv

以下是CSV檔案部分內容,它會包含所有需當地語系化,有標識Uid的項目之相關屬性:

UILocalize.g.en-US.resources:mainwindow.baml,Window:UILocalize.MainWindow.$Content,None,True,True,,#LayoutRoot;
UILocalize.g.en-US.resources:mainwindow.baml,Window:System.Windows.Window.Title,Title,True,True,,Login
UILocalize.g.en-US.resources:mainwindow.baml,Window:System.Windows.FrameworkElement.Width,None,False,True,,280
UILocalize.g.en-US.resources:mainwindow.baml,Window:System.Windows.FrameworkElement.Height,None,False,True,,211
UILocalize.g.en-US.resources:mainwindow.baml,LayoutRoot:System.Windows.FrameworkElement.Height,None,False,True,,156

以下略

 

CSV檔案中的每個項目描述:

  • BAML 名稱,指明要當地語系化的資源。
  • 資源鍵值(Resource Key),即Uid。
  • 分類(Category),如標題(Title)、高度(Height)。
  • 可讀性(Readability),指明在UI中是否為可視的。
  • 可修改性(Modifiability),指明是否可修改。
  • 註解。
  • 文字值(Value)。

您需要看情況,將每一行的最後一個項目進行當地語系化。複製UILocalize.csv檔案一份,並改名為UILocalize.zh-TW.csv ,然後修改UILocalize.zh-TW.csv將最後一項修改為:

  • Login改「登入」。
  • User ID:改「帳號 :」。
  • Password 改「密碼 :」。
  • Cancel改「取消」。

產生當地語系化衛星組件(Satellite assemblies)

你需要為想使用的文化特性在專案的bin\debug目錄下建立一個子目錄,其名稱便是想用的文化特性代碼。例如要針對繁體中文進行當地語系化,你需要建立zh-TW子目錄。

接著就可以使用LocBaml.exe工具程式使用generate參數根據en-US/UILocalize.resources.dll來產生衛星組件(Satellite assemblies),組件會自動放到zh-TW目錄:

locbaml /generate en-US/UILocalize.resources.dll /trans:UILocalize.zh-TW.csv /out:zh-TW /cul:zh-TW

trans參數指名要使用來產生衛星組件的csv檔案;out參數指明組件要存放的目錄;cul參數指明文化特性。

最後您需要在載入包含文化特性資訊的資源組件之前變更應用程式要使用的文化特性,最佳位置就是在應用程式啟動時,如以下範例程式展示在WPF應用程式的建構函式中利用CultureInfo類別指明文化特性代碼為zh-TW,然後將此CultureInfo物件指定給Thread.CurrentThread.CurrentCulture與Thread.CurrentThread.CurrentUICulture屬性:

using System.Windows;
using System.Windows.Globalization;
using System.Windows.Threading;
 
public partial class App : Application
{
  public App()
  {
    CultureInfo culture = new CultureInfo("zh-TW");
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
  }
}

 

因為指定Thread.CurrentThread.CurrentUICulture的文化特性為zh-TW,因此執行視窗中的文字會顯示為中文資源檔的內容,參考圖4所示。

clip_image008

圖 4:顯示中文資源的登入視窗。

總結

當地語系化主要是讓應用程式能夠符合多國不同使用者的文化特性需求的設計過程。在WPF應用程式中使用衛星組件來達成。WPF中每個需要進行當地語系化的項目都需要指定一個唯一識別碼(Uid),您可以下載LocBaml Tool Sample工具程式來為XAML中項目建立識別碼。

參考資源

Tags:

WPF | 許薰尹Vivid Hsu | .NET Magazine國際中文電子雜誌

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List