WPF实现多语言切换完整指南
一、基础实现方案
1. 资源文件准备
首先创建不同语言的资源文件:
Resources/
├── Strings.resx // 默认语言(英语)
├── Strings.zh-CN.resx // 简体中文
└── Strings.ja-JP.resx // 日语
Strings.resx (默认英语):
<data name="WelcomeMessage" xml:space="preserve">
<value>Welcome to our application!</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Exit</value>
</data>
Strings.zh-CN.resx (简体中文):
<data name="WelcomeMessage" xml:space="preserve">
<value>欢迎使用我们的应用程序!</value>
</data>
<data name="Exit" xml:space="preserve">
<value>退出</value>
</data>
2. 创建资源管理类
// LocalizationManager.cs
using System.Globalization;
using System.Threading;
using System.Windows;
public class LocalizationManager
{
private static readonly CultureInfo _defaultCulture = new CultureInfo("en-US");
public static void Initialize()
{
// 设置默认语言
SetLanguage(_defaultCulture);
}
public static void SetLanguage(CultureInfo culture)
{
if (culture == null)
throw new ArgumentNullException(nameof(culture));
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
// 更新所有已加载的资源字典
var mergedDictionaries = Application.Current.Resources.MergedDictionaries;
var resourceDict = mergedDictionaries.FirstOrDefault(d => d.Source != null &&
d.Source.OriginalString.Contains("Resources/Strings."));
if (resourceDict != null)
{
mergedDictionaries.Remove(resourceDict);
}
// 添加新的语言资源
var newResourceDict = new ResourceDictionary
{
Source = new Uri($"/YourAssemblyName;component/Resources/Strings.{culture.Name}.xaml",
UriKind.Relative)
};
mergedDictionaries.Insert(0, newResourceDict);
// 更新界面
foreach (Window window in Application.Current.Windows)
{
var context = window.DataContext as INotifyPropertyChanged;
if (context != null)
{
context.OnPropertyChanged(string.Empty); // 触发所有绑定重新评估
}
}
}
public s