20200526小记——C#WPF资源词典XAML实现多种语言

C#中实现要多种语言,网上很多介绍都是利用resx资源文件以及C#自带的CultureInfo类来实现,而且resx资源文件对于图像、图标、音频和视频等资源都可以更新替换,实现更多的内容。而对于某些程序来说,可能只要简单一些文字翻译即可,这里介绍一种利用资源词典实现多语言支持。

首先,在主项目下新建文件夹Language,在Language文件夹下建立两个资源词典文件cn.xaml和en.xaml作为用到的文本做多种语言版本。并在XAML文件中编写你所用到的文本。

20200526小记——C#WPF资源词典XAML实现多种语言_第1张图片


    项目

    

注意两处用到的文本位置尽量对应,方便查看对照。

其次,在App.xaml文件中添加引用



    
        
            
                
                
            
        
    
    

可以调整cn.xaml和en.xaml的位置,由于两者有相同的属性和对应值,界面上显示的会是后一个(这里是en.xaml,需要修改默认的资源可以调整)

设置好资源后,可以在配置文件中设置你的默认语言,以及自己设计相应的语言选择界面。麻烦的一点是WPF界面上控件的修改需要重绘控件才行,所以1每次更换语言重启2在启动页更换语言。

更换语言后如何更新呢?我是在Language文件夹下新建一个类Language.cs,每次更新时调用一下下方这个函数就行(using System.Windows)

public static void Updatelanguage(string lang) {
            List dictionaryList = new List();
            foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
            {
                dictionaryList.Add(dictionary);
            }
            string requestedCulture = "pack://application:,,,/UI;component/Language/" + lang + ".xaml";
            ResourceDictionary resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString.Equals(requestedCulture));
            Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
            Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
        }

每次设置语言就将语言放到最下方,这样调用到的就是你所选择的语言了。需要注意的是这里用到的URI地址requestedCulture,前面基本不用变,UI是你的项目名称,Language是你cn.xaml和en.xaml两个资源词典文件所在文件夹。

在WPF界面上的使用方式如下:

设置Content :Content="{StaticResource SelectSectionFile}"

静态资源的名称刚刚好。

在后台的调用最好的方式是自己新定义一个全局变量来方便调用查询,调用的方式如下:

if (Application.Current.Resources.MergedDictionaries.Count > 0) {
                ResourceDictionary RD = Application.Current.Resources.MergedDictionaries[Application.Current.Resources.MergedDictionaries.Count - 1];//更新完语言后再操作
                string pro= RD["Project"].ToString();//RD[""]冒号内对应XAML中的KEY
                int I=Convert.ToInt32(RD["I"].ToString());//如果调用不存在的KEY——I,会出错,最好加个try-catch验证一下。
            }

2020年5月26日19:00记——广州

你可能感兴趣的:(小记)