WPF多语言支持


常见的有四种方案:1.资源字典2.资源文件、

我用的是资源字典。

1.做两个语言资源,如下:

(1)中文资源AppResource_zh_CN.xaml

"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    
    "lblSignTitle">欢迎登录
    "lblUserNumber">账号
    "lblUserPwd">密码
    "chkRemUserName">记住账户
    "btnSignIn">登录
    "btnGuestSign">游客登录
    "Locked">对不起,该账号已锁定,请联系管理员!
    "NoPass">用户名或密码错误!
    
    
    "txtSearchBox">搜索
    "btnMainPage">主页
    "btnMainPageTag">系统主页
    "txtBarkBg">深色主题
    "lblUStars1">登录
    "lblUStars2">个人信息
    "lblLogout">注销
    "lblMainTitle">B2P主控中心
    "helpBtn">帮助中心
    "minBtn">最小化
    "changeBtn">最大化
    "closeBtn">退出
    "msgSignIn">小主登录成功!~
    "msgSignOut">小主取消了登录!~
    "NoPermission">操作禁止(??`ω′?)您需要更高权限!~
    "UnknownUrl">按钮链接地址未知!
    

(2)英文资源AppResource_en_US.xaml,key的个数和名字与中文资源一致,修改key对应的值为英文(这里的例子用中文+En代替了)

"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    
    "lblSignTitle">欢迎登录En
    "lblUserNumber">账号En
    "lblUserPwd">密码En
    "chkRemUserName">记住账户En
    "btnSignIn">登录En
    "btnGuestSign">游客登录En
    "Locked">对不起,该账号已锁定,请联系管理员!En
    "NoPass">用户名或密码错误!En
    
    
    "txtSearchBox">搜索En
    "btnMainPage">主页En
    "btnMainPageTag">系统主页En
    "txtBarkBg">深色主题En
    "lblUStars1">登录En
    "lblUStars2">个人信息En
    "lblLogout">注销En
    "lblMainTitle">B2P主控中心En
    "helpBtn">帮助中心En
    "minBtn">最小化En
    "changeBtn">最大化En
    "closeBtn">退出En
    "msgSignIn">小主登录成功!~En
    "msgSignOut">小主取消了登录!~En
    "NoPermission">操作禁止(??`ω′?)您需要更高权限!~En
    "UnknownUrl">按钮链接地址未知!En
    

2.App.xaml添加语言字典资源(添加一个默认的就行,用于项目加载时用)

1     
2         
3             
4                      
5             
6         
7     

 3.在WPF窗口或者控件xaml代码中调用:

  把原来中文值改成{DynamicResource key}就行了,如下:

改为:

4.创建切换语言的菜单(ComboBox控件):

 后台代码:

   /// 
        /// 改变语言
        /// 
        private void CmbLanguage_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.RemovedItems.Count > 0)  // 注掉这一行看看会发生什么 
            {
                string Culture= "/HOST_CONTROL_CENTER_APP;component/Dictionarys/AppResource_{0}.xaml";
                if (e.AddedItems[1].ToString() == "简体中文")
                {
                    Culture = string.Format(Culture, "zh_CN");
                }
                else if ( e.AddedItems[1].ToString() == "English")
                {
                    Culture = string.Format(Culture, "en_US");
                }
                List<string> ll = new List<string>();
                foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
                {
                    if (dictionary.Source != null && dictionary.Source.OriginalString.Contains("AppResource"))
                    {
                        bool b = Application.Current.Resources.MergedDictionaries.Remove(dictionary);
                        dictionary.Source =new Uri(Culture, UriKind.RelativeOrAbsolute);
                        Application.Current.Resources.MergedDictionaries.Add(dictionary);
                        break;
                    }
                }
            }
        }

注:不成功记得把字典资源文件的属性改成“始终复制”。

参考文章(下面的方法都提供了多种方案):

[WPF]本地化入门 

WPF应用程序支持多国语言解决方案