WPF 藉助自訂 XML 檔案實現國際化

WPF 藉助自訂 XML 檔案實現國際化

本文詳細介紹了在WPF程式中使用自訂XML檔案實現國際化的方法,包括安裝必備NuGet套件、動態獲取語言清單、動態切換語言、在程式碼和XAML介面中使用翻譯字串等內容,同時提供了原始碼連結,幫助開發者輕鬆實現WPF應用程式的國際化。

最後更新 2025/1/26 上午6:02
沙漠尽头的狼
預計閱讀 6 分鐘
分類
WPF
標籤
.NET C# WPF NuGet 國際化

在現今全球化的軟體開發環境中,應用程式的國際化變得越來越重要。它可以讓您的軟體適應不同地區和語言的使用者,提升使用者體驗。本文和 《Avalonia使用XML檔案實現國際化》 類似,今天介紹的套件只適用於WPF程式,下面我們將簡單介紹其用法。

安裝必備 NuGet 套件

要在WPF程式中使用自訂XML檔案實現國際化,首先需要安裝一個關鍵的NuGet套件。在Visual Studio的NuGet套件管理員主控台中,執行以下命令:

Install-Package WPFXmlTranslator

這個套件為我們提供了實現國際化所需的核心功能和工具。

動態取得語言清單

在一個支援多語言的應用程式中,讓使用者能夠選擇他們偏好的語言是非常重要的。透過以下程式碼,我們可以輕鬆地取得語言清單:

List<LocalizationLanguage> languages = I18nManager.Instance.Resources.Select(kvp => kvp.Value).ToList();

這裡的 I18nManagerWPFXmlTranslator 套件提供的一個管理類別,它負責處理國際化相關的資源。Resources 屬性儲存了所有可用的語言資源,我們透過 Select 方法將其轉換為 LocalizationLanguage 物件的清單。

其中,「LocalizationLanguage」類別定義如下:

public class LocalizationLanguage
{
    public string Language { get; set; } = (string) null;

    public string Description { get; set; } = (string) null;

    public string CultureName { get; set; } = (string) null;

    //...
}

LocalizationLanguage 類別包含了語言的基本資訊,如語言名稱、描述和文化名稱。取得語言清單後,我們可以將其用於介面繫結,例如在下拉式選單中顯示可供使用者選擇的語言選項,或者在其他需要展示語言資訊的介面元素中進行資料繫結。

<ComboBox ItemsSource="{Binding Languages}"
      SelectedItem="{Binding SelectLanguage}"
      DisplayMemberPath="Language" />

在這個XAML程式碼中,我們建立了一個 ComboBox 控制項,將其 ItemsSource 屬性繫結到 Languages 清單,SelectedItem 屬性繫結到 SelectLanguage 屬性,DisplayMemberPath 屬性設定為 Language,這樣就可以在下拉式選單中顯示語言清單供使用者選擇。

動態切換語言

當使用者於介面中選擇了不同的語言後,我們需要在程式碼中實現語言的動態切換。以下是實現語言切換的程式碼範例:

var culture = new CultureInfo(language);
I18nManager.Instance.Culture = culture;

這裡的 language 參數為 LocalizationLanguage 類別的 CultureName 屬性值。CultureInfo 類別是.NET框架中用於表示特定文化的類別,透過設定 I18nManager.Instance.Culture 屬性為對應的 CultureInfo 物件,我們可以實現介面語言的即時切換,為使用者提供無縫的國際化體驗。

程式碼中使用翻譯字串

在程式碼中,我們可以根據強型別 Key 方便地取得目前語言文化的翻譯字串。例如:

var titleCurrentCulture = I18nManager.Instance.GetResource(Localization.Main.MainView.Title); // 取得目前語言
var titleZhCN = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "zh-CN");	// 取得簡體中文
var titleEnUS = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "en-US");	// 取得英文

I18nManager.Instance.GetResource 方法用於取得指定語言的翻譯字串。第一個參數是強型別的語言Key,它指向XML語言檔案中的某個具體的翻譯項目。第二個參數是可選的,用於指定具體的語言文化名稱。透過這種方式,我們可以在程式碼的任何地方靈活地使用翻譯文字,確保介面顯示的內容與使用者選擇的語言相匹配。

xaml 介面中的應用

在 xaml 介面中使用 XML 翻譯檔案也非常便捷。首先,需要引入相應的命名空間:

xmlns:language="clr-namespace:Localization"
xmlns:markup="https://codewf.com"

其中,「markup」為前面安裝的輔助庫命名空間,它提供了 「I18n」 標記延伸協助類別,用於在介面中繫結翻譯文字;「language」為 T4 檔案產生的 C# 強型別語言 Key 關聯類別命名空間,透過它可以與 XML 語言檔案的語言 Key 進行關聯。

以下是在控制項中使用翻譯文字的範例:

<Button Content="{markup:I18n {x:Static language:ChoiceLanguagesView.LanguageKey}}" />

在上述範例中,「Button」控制項的 「Content」屬性透過 「I18n」標記延伸繫結到了 「ChoiceLanguagesView.LanguageKey」對應的翻譯文字上。這樣,當介面語言發生變化時,按鈕的顯示文字也會自動更新為相應語言的翻譯內容。

當然也支援指定語言:

<StackPanel>     <StackPanel Orientation="Horizontal">
         <TextBlock Text="Current Thread" />
         <TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}}"></TextBlock>
     </StackPanel>
     <StackPanel Orientation="Horizontal">
         <TextBlock Text="en-US" />
         <TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=en-US}" />
     </StackPanel>
     <StackPanel Orientation="Horizontal">
         <TextBlock Text="ja-JP" />
         <TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=ja-JP}" />
     </StackPanel>
     <StackPanel Orientation="Horizontal">
         <TextBlock Text="zh-CN" />
         <TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=zh-CN}" />
     </StackPanel>
     <StackPanel Orientation="Horizontal">
         <TextBlock Text="zh-Hant" />
         <TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=zh-Hant}" />
     </StackPanel>
 </StackPanel>

在這個範例中,我們建立了一個 StackPanel 配置,其中包含多個子 StackPanel,每個子 StackPanel 顯示不同語言的翻譯文字。透過在 I18n 標記延伸中指定 CultureName 屬性,我們可以顯示特定語言的翻譯內容。

此外,xaml 介面還支援動態 Key 的繫結,例如:

<u:Banner
    Content="{markup:I18n {Binding SelectedMenuItem.Description}}"
    Header="{markup:I18n {Binding SelectedMenuItem.Name}}"
    Type="{Binding SelectedType}" />

在這個範例中,「Banner」控制項的 「Content」和 「Header」屬性分別繫結到了動態的 「SelectedMenuItem.Description」和 「SelectedMenuItem.Name」屬性上,透過 「I18n」標記延伸實現了動態翻譯文字的顯示。

總結

用法和Avalonia版本一致,下面是WPF版本原始碼,其中包括NuGet套件原始碼和使用範例:

透過使用自訂XML檔案和 WPFXmlTranslator 套件,我們可以方便地實現WPF應用程式的國際化。這種方法不僅簡單易用,而且具有很強的靈活性,可以滿足不同應用場景的需求。希望本文對您有所幫助,讓您的WPF應用能夠走向更廣闊的國際市場。

繼續探索

延伸閱讀

更多文章