WPF多语言实现

参考:https://www.cnblogs.com/chenshibao/p/18937359
开发工具:Visual Studio2022

使用资源字典实现。首先创建在项目下新建多语言目录,新建语言资源

image

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=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内容

<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=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合并资源

<Application
    x: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

<Window
    x: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">
                <Button
                    Padding="5"
                    Command="{Binding ChangeLanguageCommand}"
                    CommandParameter="zh-CN"
                    Content="{DynamicResource Chinese}" />
                <Button
                    Margin="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 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) });
        }
    }
}

运行效果
image
image

posted @ 2025-10-23 16:42  山水蒙!  阅读(5)  评论(0)    收藏  举报