WPF 动态切换界面语言

概述

很多时候,软件都会被要求支持中英文,此时,就需要编程人员对软件进行多语种支持的开发。
解决方案有很多,这里主要介绍通过编辑xaml语言包来实现。
其功能有:

  • 通过设定“ <Application.Resources>”的方式,实现控件动态加载语言
  • 支持动态切换
  • 支持自动加载上一次选定的语言

先来看效果

中英文切换效果

环境说明

当前样例,运行环境是:

  • VS 2022
  • .Net 6
  • WPF
  • C#
  • Windows 11

原则上,windows开发平台均适用。

具体步骤

1. 编辑你的语言包

首选,你需要创建两个语言包,分别是中文、英文的xaml文件。
在这里插入图片描述
它们的文件【属性】,设置为如图:
在这里插入图片描述

2. 编辑语言包内容

我们通过定义key、value来编辑一个字典的xaml文件。
它们的每个“词条”,均为string类型。
以Chinese.xaml 为例,其内容基本如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:DeviceToolsKit"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <!--Common Text Dictionary-->
    <sys:String x:Key="DicText_Common_Tips">提示说明:</sys:String>
    <sys:String x:Key="DicText_Common_Error">错误警告:</sys:String>
    <sys:String x:Key="DicText_Common_Notice">注意事项:</sys:String>

</ResourceDictionary>

以第一个词条文本举例
它的key名称是"DicText_Common_Tips",我们后面可以通过使用这个名称来调用它的具体文本值。
【提示说明:】这个是"DicText_Common_Tips"的具体文本。

请注意,下方的命名空间是必须添加的

xmlns:sys="clr-namespace:System;assembly=mscorlib"

下面附上对应的English.xaml文件

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:DeviceToolsKit"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">

   
    <!--Common Text Dictionary-->
    <sys:String x:Key="DicText_Common_Tips">Tips:</sys:String>
    <sys:String x:Key="DicText_Common_Error">Error:</sys:String>
    <sys:String x:Key="DicText_Common_Notice">Notice:</sys:String>

</ResourceDictionary>

通过对比,我们可以发现

  • 中英文字典的Key值名称是一致的,唯一不同的是其对应的文本不同。
  • 因此,这也就基本确定了后续的开发思路:
  •  我们只需要加载需要的xaml文件,然后在需要的地方,使用唯一的keyName就可以了。
    

3. 修改App.xaml

 <Application.Resources>

        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--Language packages-->
                <ResourceDictionary Source="Resources\Languages\Chinese.xaml"/>
                <ResourceDictionary Source="Resources\Languages\English.xaml"/>
                
        </ResourceDictionary>

    </Application.Resources>

在你的App.xaml文件中,增加上述语言包xaml文件。
此后,它将作为资源,并在程序启动的时候被加载进去。
需要注意的是

  • 语言包的路径,这需要根据你自身项目来确定,我这里是把中英文的语言包放在了项目的Resources\Languages\文件夹下。
  • 原则上,系统会自动采用最后一次加载的语言包,作为默认的语种显示。
  • 因此,我们会在后面通过这个特性,来实现 “即时切换”、“默认加载上次选择的语言”这两个功能。

4. 使用语言包字典的Key

语言包的使用非常简单,只需要在你的UI xaml文件里面,对Text或者Content内容进行DynamicResource 的绑定即可。

 <TextBlock Margin="10,0,0,0" Text="{DynamicResource DicText_Common_Tips}"/>

5. 实现动态切换语言

首先,在你项目中,添加一个语言的下拉列表,然后为其后面的按钮或者某个控件,绑定一个切换语言的函数方法。
这个步骤我就不多做赘述了,相信各位能够自己实现。
主要介绍一下动态切换的核心方法:

private void ChangeUILanguage(string targetLanguage)
        {
            List<ResourceDictionary> dictionaryList = new List<ResourceDictionary>();
            foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
            {
                dictionaryList.Add(dictionary);
            }

            string requestedCulture = @"Resources\Languages\" + targetLanguage + ".xaml";
            var resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedCulture));

            if (resourceDictionary != null)
            {
                Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
                Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
            }
            else
            {
                MessageBox.Show("Can not load the language resources.");
                return;
            }
        }

前面提过:系统会默认使用最后一次加载的语言包,作为使用的对象。
因此,我们利用这个特性,通过以下步骤可以实现即时切换的目标:

  1. 获取当前App的所有ResourceDictionary资源
  2. 如果你现在想要使用English的xaml语言包,那么就先找到它。
  3. 然后再将其移除ResourceDictionary资源队列
  4. 最后重新将其添加
  5. 此时,系统便会使用“最新加载的资源”。

6. 自动加载上次选择的语言包

步骤1:添加App.config文件

向你的项目中,添加App.config文件
然后添加如下的字段:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="Language" value="Chinese" />
	</appSettings>
</configuration>

步骤2:重写OnStartup方法

展开App.xaml,编辑App.xaml.cs文件
在这里插入图片描述
添加并修改如下内容

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);


            List<ResourceDictionary> dictionaryList = new List<ResourceDictionary>();
            foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
            {
                dictionaryList.Add(dictionary);
            }
            var targetLanguage = ConfigurationManager.AppSettings["Language"];

            if (targetLanguage == null)
                targetLanguage = "English";

            string requestedCulture = @"Resources\Languages\" + targetLanguage + ".xaml";
            var resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedCulture));

            if(resourceDictionary!=null)
            {
                Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
                Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
            }
            else
            {
                MessageBox.Show("Can not find the language resources.");
                return;
            }

        }
    }

这段代码中,我们会先行读取config的language值,然后将其作为目标,找到并重新加载对应的语言包。

步骤3:添加修改App.config 的方法

这个方法,你可以将它添加在需要的地方。
一般是把它放在选择语言的界面,也就是实现语言即时切换的地方。

  private void UpdateAppConfigLanguageSetting(string valueStr)
        {
            Configuration _configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            _configuration.AppSettings.Settings["Language"].Value = valueStr;
            _configuration.Save();
            ConfigurationManager.RefreshSection("appSettings");
        }

其中

 ConfigurationManager.RefreshSection("appSettings");

这句刷新config section的方法是必须的。

总结

上述方法适用于中小型项目。
在大型项目中,建议使用其他资源消耗更少的方法来提升性能。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 要在 WPF动态切换语言词典,你可以使用 C# 的 `ResourceManager` 类。 首先,在 WPF 项目中创建资源文件,每个资源文件对应一种语言,并在资源文件中定义语言词典。然后,你可以使用 `ResourceManager` 类来加载资源文件并访问词典中的项目。 具体来说,你需要执行以下步骤: 1. 创建资源文件:在 WPF 项目中的任意位置,右键单击并选择“添加”->“新建项”,然后选择“资源文件”。 2. 在资源文件中定义语言词典:每个资源文件都是一个以键值对的形式存储的词典,键表示要使用的项目的名称,值表示对应的内容。例如,在英文资源文件中,你可以定义一个名为“hello”的项,其值为“Hello, world!”。 3. 加载资源文件:使用 `ResourceManager` 类的 `GetObject` 方法来加载资源文件。例如: ```csharp ResourceManager resourceManager = new ResourceManager("MyResources", typeof(MainWindow).Assembly); ``` 4. 访问词典中的项目:使用 `ResourceManager` 类的 `GetString` 方法来访问词典中的项目。例如,要获取资源文件中名为“hello”的项,你可以使 ### 回答2: 在WPF应用程序中,可以使用C-Sharp实现动态切换语言词典的功能。首先,需要在应用程序中创建不同语言的资源文件,每个资源文件对应一种语言。这些资源文件通常具有相同的键值对结构,只是对应的文本内容不同。例如,可以创建一个英文资源文件和一个中文资源文件,分别存储英文和中文的文本内容。 然后,可以在应用程序的设计界面中添加一个下拉菜单或者按钮,用于选择不同的语言。当用户选择其他语言时,应用程序会根据选择的语言动态加载对应的语言词典。 为了实现动态切换语言,可以使用以下步骤: 1. 在应用程序的代码中创建一个全局的Language属性,用于记录当前选中的语言。 2. 在应用程序启动时,将默认的语言设置为应用程序所需的默认语言,同时加载对应的语言资源文件。 3. 在下拉菜单或者按钮的选择事件中,更新全局的Language属性,并重新加载对应的语言资源文件。 4. 使用C-Sharp的ResourceDictionary类,动态加载语言资源文件。可以使用ResourceDictionary类的Clear()方法清空当前的资源文件,然后使用MergedDictionaries属性添加新的资源文件。 5. 在界面中使用x:Static提供的静态资源绑定,将界面中的控件文本与资源文件中的文本关联起来。这样,在语言切换时,界面上的文本内容会自动更新为选中语言对应的文本。 通过以上步骤,就可以实现在WPF应用程序中使用C-Sharp动态切换语言词典的功能。用户选择不同的语言时,应用程序会重新加载对应的语言资源文件,从而实现动态切换语言的效果。 ### 回答3: 在WPF动态切换语言词典,我们可以使用C-Sharp编程语言来实现。首先,我们需要创建多个语言词典文件,存储各种语言的翻译资源。每个语言词典文件都是一个.xaml文件,内容类似于以下的格式: ```xaml <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <system:String x:Key="WelcomeMessage">Welcome</system:String> <!-- 其他翻译资源 --> </ResourceDictionary> ``` 其中,`system:String`是一个键值对,`x:Key`表示资源的键,`WelcomeMessage`是该资源的值,表示欢迎消息的翻译。 接下来,我们在WPF应用的代码中创建一个全局的`ResourceDictionary`对象,并根据需要动态切换语言。我们可以在程序启动时加载默认语言的词典文件,如英文,然后根据用户选择的语言重新加载对应语言的词典文件。 例如,在按钮点击事件中,我们可以使用以下代码来切换到中文语言: ```csharp private void Button_Click(object sender, RoutedEventArgs e) { // 清除之前加载的词典文件 Application.Current.Resources.MergedDictionaries.Clear(); // 加载目标语言的词典文件 ResourceDictionary languageDictionary = new ResourceDictionary(); languageDictionary.Source = new Uri("ChineseDictionary.xaml", UriKind.Relative); // 添加到应用程序的资源中 Application.Current.Resources.MergedDictionaries.Add(languageDictionary); } ``` 这样,当用户点击按钮时,程序会清除之前加载的词典文件,并加载中文词典文件。之后,程序会使用新的语言资源来更新界面上的文本和其他翻译资源。 通过这种方式,我们可以在WPF应用中实现动态切换语言词典的功能,使应用能够提供多语言支持。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值