在現今全球化的軟體開發環境中,應用程式的國際化變得越來越重要。它可以讓您的軟體適應不同地區和語言的使用者,提升使用者體驗。本文和 《Avalonia使用XML檔案實現國際化》 類似,今天介紹的套件只適用於WPF程式,下面我們將簡單介紹其用法。
安裝必備 NuGet 套件
要在WPF程式中使用自訂XML檔案實現國際化,首先需要安裝一個關鍵的NuGet套件。在Visual Studio的NuGet套件管理員主控台中,執行以下命令:
Install-Package WPFXmlTranslator
這個套件為我們提供了實現國際化所需的核心功能和工具。
動態取得語言清單
在一個支援多語言的應用程式中,讓使用者能夠選擇他們偏好的語言是非常重要的。透過以下程式碼,我們可以輕鬆地取得語言清單:
List<LocalizationLanguage> languages = I18nManager.Instance.Resources.Select(kvp => kvp.Value).ToList();
這裡的 I18nManager 是 WPFXmlTranslator 套件提供的一個管理類別,它負責處理國際化相關的資源。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應用能夠走向更廣闊的國際市場。