WPF使用内置资源系统实现应用程序国际化
作者:海盗Sharp
本文详细介绍了如何利用WPF内置资源系统实现应用程序的国际化和本地化,涵盖创建多语言资源字典、实现资源管理以及动态绑定资源等内容,帮助开发者轻松为WPF应用程序添加多语言支持,需要的朋友可以参考下
使用WPF内置资源系统实现国际化
随着全球化进程的加速和软件市场的不断扩大,越来越多的桌面应用程序需要面向全球用户提供多语言支持。WPF(Windows Presentation Foundation)作为微软主流的桌面应用开发框架,其内置的资源系统为国际化(Internationalization,简称i18n)和本地化(Localization,简称l10n)提供了完善的支持。
国际化与本地化的区别
- 国际化(i18n):指设计软件时使其能够适应不同语言和地区,而无需进行工程变更
- 本地化(l10n):指将国际化软件适配到特定语言和地区的过程,包括翻译文本、调整日期/时间格式、货币符号等
WPF国际化的优势
- 内置支持:WPF框架原生支持资源字典和动态资源绑定,无需第三方库
- 运行时切换:支持应用程序运行时不重启即可切换语言
- XAML集成:与XAML标记语言深度集成,开发体验流畅
- 类型安全:资源在编译时进行验证,减少运行时错误
文章摘要
本文详细介绍了如何使用WPF内置资源系统实现应用程序的国际化/本地化。主要内容包括:
- 创建多语言资源字典 - 为每种语言创建XAML资源文件,定义对应的字符串资源
- 实现资源管理类 - 创建LanguageManager类,提供语言切换、资源加载和字符串获取功能
- XAML中动态绑定 - 使用DynamicResource绑定资源键,实现界面文本的自动更新
- 初始化语言设置 - 在App.xaml或App.xaml.cs中配置默认语言
- 运行时语言切换 - 通过调用ChangeLanguage方法实现界面语言的即时切换
通过这套方案,开发者可以轻松为WPF应用程序添加多语言支持,提升用户体验和产品国际化能力。
适用场景
- 面向国际市场的商业软件
- 需要支持多语言的企业内部系统
- 开源项目希望扩大用户群体
- 教育软件需要适应不同语言环境
本文将通过完整的示例,详细介绍如何利用WPF内置资源系统实现从资源创建、管理到界面绑定的完整国际化解决方案。
1.创建资源字典文件
创建
在资源Resources文件夹下创建语言的资源字典文件

创建资源字典

编写语言内容
首先引入System命名空间,后续资源都是string类型
xmlns:sys="clr-namespace:System;assembly=mscorlib"
然后添加对应的字符串,key和对应的文本,在不同语言中Key需要一一对应,然后文本是不同语言的。
示例如下
中文Lang.zh-CN.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="Title_MainWindow">主窗口</sys:String>
<sys:String x:Key="Button_Save">保存</sys:String>
<sys:String x:Key="Menu_File">文件</sys:String>
<sys:String x:Key="Menu_Edit">编辑</sys:String>
<sys:String x:Key="Button_CN">中文版</sys:String>
<sys:String x:Key="Button_EN">英文版</sys:String>
</ResourceDictionary>英文 Lang.en-US.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String x:Key="Title_MainWindow">Main Window</sys:String>
<sys:String x:Key="Button_Save">Save</sys:String>
<sys:String x:Key="Menu_File">File</sys:String>
<sys:String x:Key="Menu_Edit">Edit</sys:String>
<sys:String x:Key="Button_CN">Chinese</sys:String>
<sys:String x:Key="Button_EN">English</sys:String>
</ResourceDictionary>其他语言
按同样形式添加
2. 创建资源管理类
using System.Globalization;
using System.Windows;
using System.Windows.Markup;
public static class LanguageManager
{
private static ResourceDictionary? _currentResourceDictionary;
public static event EventHandler? LanguageChanged;
public static CultureInfo CurrentCulture { get; private set; } = CultureInfo.CurrentCulture;
// 支持的语言列表
public static List<CultureInfo> SupportedLanguages { get; } = new()
{
new CultureInfo("en-US"),
new CultureInfo("zh-CN"),
new CultureInfo("ja-JP")
};
public static void ChangeLanguage(CultureInfo culture)
{
if (culture == null) throw new ArgumentNullException(nameof(culture));
CurrentCulture = culture;
// 设置当前线程的UICulture
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
// 加载对应的资源字典
LoadResourceDictionary(culture.Name);
LanguageChanged?.Invoke(null, EventArgs.Empty);
}
private static void LoadResourceDictionary(string languageCode)
{
var app = Application.Current;
if (app == null) return;
// 移除现有的语言资源
if (_currentResourceDictionary != null)
{
app.Resources.MergedDictionaries.Remove(_currentResourceDictionary);
}
// 加载新的语言资源
var dict = new ResourceDictionary
{
Source = new Uri($"/YourProjectName;component/Resources/Lang.{languageCode}.xaml",
UriKind.RelativeOrAbsolute)
};
app.Resources.MergedDictionaries.Add(dict);
_currentResourceDictionary = dict;
}
// 从资源文件中获取字符串(代码中使用)
public static string GetString(string key)
{
var value = Application.Current.TryFindResource(key);
return value as string ?? $"#{key}#";
}
}
3. 在XAML中使用
之前直接写文本的地方都通过DynamicResource动态绑定资源名称
<Window
x:Class="WpfInternationalApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfInternationalApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="{DynamicResource Title_MainWindow}"
Width="800"
Height="450"
mc:Ignorable="d">
<Grid>
<Button
Width="97"
Height="32"
Margin="89,126,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="Button_Click"
Content="{DynamicResource Button_EN}" />
<Button
Width="97"
Height="32"
Margin="233,126,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Click="Button_Click_1"
Content="{DynamicResource Button_CN}" />
<Button
Width="109"
Height="30"
Margin="206,260,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Content="{DynamicResource Button_Save}" />
</Grid>
</Window>4. 初始化语言设置
方式一:在App.xaml中加载资源

<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/Languages/Lang.zh-CN.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>方式二:在App.xaml.cs中加载

protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 设置框架级别的语言
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
// 加载默认语言
LanguageManager.ChangeLanguage(LanguageManager.SupportedLanguages[0]);
}
5. 语言切换
直接使用ChangeLanguage方法切换即可
LanguageManager.ChangeLanguage(LanguageManager.SupportedLanguages[0]); LanguageManager.ChangeLanguage(LanguageManager.SupportedLanguages[1]);

6. 实现效果
中文版

英文版

以上就是WPF使用内置资源系统实现应用程序国际化的详细内容,更多关于WPF内置资源应用程序国际化的资料请关注脚本之家其它相关文章!
