在当今全球化的软件开发环境中,应用程序的国际化变得越来越重要。它可以让你的软件适应不同地区和语言的用户,提升用户体验。本文和 《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应用能够走向更广阔的国际市场。