WPF 多国语言开发与配置
简介
配置 WPF 客户端多国语言,并在设置中允许切换语言。
WPF 的标准做法为创建专门用于语言切换的资源字典,使用 <System:String /> 标签创建。
代码
创建 Language 文件夹做为语言存放目录,资源字典命名以语言缩写命名。
英文:/Language/en-US.xaml
中文:/Language/zh-CN.xaml
资源字典
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:System ="clr-namespace:System;assembly=mscorlib">
 
 <System:String x:Key="Save">Save</System:String>
 <System:String x:Key="Close">Close</System:String>
 <System:String x:Key="Exit">Exit</System:String>
 <System:String x:Key="OK">OK</System:String>
 <System:String x:Key="Yes">Yes</System:String>
 <System:String x:Key="No">No</System:String>
 <System:String x:Key="Cancel">Cancel</System:String>
 </ResourceDictionary>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:System ="clr-namespace:System;assembly=mscorlib">
 
 <System:String x:Key="Save">保存</System:String>
 <System:String x:Key="Close">取消</System:String>
 <System:String x:Key="Exit">退出</System:String>
 <System:String x:Key="OK">确定</System:String>
 <System:String x:Key="Yes">是</System:String>
 <System:String x:Key="No">否</System:String>
 <System:String x:Key="Cancel">取消</System:String>
 </ResourceDictionary>
 
 | 
引用资源
在全局资源(App.xaml)中引用语言配置文件
资源样式按顺序加载,标签重复的后加载覆盖先加载的,所以可以移除样式后新增,达到运行中修改语言的目的。
| 12
 3
 4
 5
 6
 7
 
 | <Application><Application.Resources>
 
 <ResourceDictionary Source="/Window;component/Language/en-US.xaml"/>
 <ResourceDictionary Source="/Window;component/Language/zh-CN.xaml"/>
 </Application.Resources>
 </Application>
 
 | 
切换语言
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 
 | private static List<LanguageModel> _listLanguage;
 
 
 public static List<LanguageModel> ListLanguage
 {
 get
 {
 if (_listLanguage == null)
 {
 _listLanguage = new List<LanguageModel>();
 _listLanguage.Add(new LanguageModel() { FileName = "en-US", Language = "English", Resource = new ResourceDictionary() { Source = new Uri("/Window;component/Language/en-US.xaml", UriKind.RelativeOrAbsolute) } });
 _listLanguage.Add(new LanguageModel() { FileName = "zh-CN", Language = "简体中文", Resource = new ResourceDictionary() { Source = new Uri("/Window;component/Language/zh-CN.xaml", UriKind.RelativeOrAbsolute) } });
 }
 return _listLanguage;
 }
 set
 {
 _listLanguage = value;
 }
 }
 
 
 
 
 
 public static void SetLanguage(string language = null)
 {
 
 List<ResourceDictionary> dictionaryList = new List<ResourceDictionary>();
 foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
 {
 dictionaryList.Add(dictionary);
 }
 if (string.IsNullOrEmpty(language))
 {
 var vSystemConfigInfo_Language = GetSystemConfigInfo(SECTION_SYSTEM, SYSTEM_LANGUAGE);
 foreach (var item in ListLanguage)
 {
 if (item.FileName.Equals(vSystemConfigInfo_Language))
 {
 language = item.Resource.Source.OriginalString;
 break;
 }
 }
 }
 if (!string.IsNullOrEmpty(language))
 {
 var resourceDictionary = dictionaryList.FirstOrDefault(o => o.Source.OriginalString.Equals(language));
 if (resourceDictionary != null)
 {
 Application.Current.Resources.BeginInit();
 Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
 Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
 Application.Current.Resources.EndInit();
 }
 }
 }
 
 | 
调用
| 12
 3
 4
 5
 6
 7
 8
 
 | SetLanguage();
 
 
 SetLanguage("/Window;component/Language/en-US.xaml");
 
 
 SetLanguage("/Window;component/Language/zh-CN.xaml");
 
 |