参考:https://www.cnblogs.com/chenshibao/p/18937359
开发工具:Visual Studio2022
使用资源字典实现。首先创建在项目下新建多语言目录,新建语言资源
en-US.xaml内容
<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=netstandard"><sys:String x:Key="Home">Home</sys:String><sys:String x:Key="Chinese">Chinese</sys:String><sys:String x:Key="English">English</sys:String>
</ResourceDictionary>
zh-CN.xaml内容
<ResourceDictionaryxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:sys="clr-namespace:System;assembly=netstandard"><sys:String x:Key="Home">首页</sys:String><sys:String x:Key="Chinese">中文</sys:String><sys:String x:Key="English">英文</sys:String>
</ResourceDictionary>
App.xaml合并资源
<Applicationx:Class="WpfLocalization.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfLocalization"StartupUri="MainWindow.xaml"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="pack://application:,,,/WPFLocalization;component/Language/zh-CN.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</Application>
MainWindow.xaml
<Windowx:Class="WpfLocalization.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:WpfLocalization"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="800"Height="450"d:DataContext="{d:DesignInstance Type=local:MainWindowModel}"mc:Ignorable="d"><Grid><StackPanel><StackPanel Orientation="Horizontal"><ButtonPadding="5"Command="{Binding ChangeLanguageCommand}"CommandParameter="zh-CN"Content="{DynamicResource Chinese}" /><ButtonMargin="20,0,0,0"Padding="5"Command="{Binding ChangeLanguageCommand}"CommandParameter="en-US"Content="{DynamicResource English}" /></StackPanel><TextBlock Text="{DynamicResource Home}" /></StackPanel></Grid>
</Window>
MainWindow.xaml.cs的构造方法里面指定DataContext
using System.Windows;namespace WpfLocalization
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataContext = new MainWindowModel();}}
}
MainWindowModel.cs
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;using Prism.Common;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;namespace WpfLocalization
{public partial class MainWindowModel : ObservableObject{/// <summary>/// 切换语言/// </summary>/// <param name="language"></param>[RelayCommand]public void ChangeLanguage(string language){var dictionaries = Application.Current.Resources.MergedDictionaries;// 移除当前语言资源var existingTheme = dictionaries.FirstOrDefault(d => d.Source != null &&(d.Source.OriginalString.Contains("Language/zh-CN.xaml") ||d.Source.OriginalString.Contains("Language/en-US.xaml")));if (existingTheme != null){dictionaries.Remove(existingTheme);}//添加新语言资源dictionaries.Add(new ResourceDictionary() { Source = new Uri("Language/" + language + ".xaml", UriKind.Relative) });}}
}
运行效果