WPF 多国语言开发与配置
简介
配置 WPF 客户端多国语言,并在设置中允许切换语言。
WPF 的标准做法为创建专门用于语言切换的资源字典,使用 <System:String /> 标签创建。
代码
创建 Language 文件夹做为语言存放目录,资源字典命名以语言缩写命名。
英文:/Language/en-US.xaml
中文:/Language/zh-CN.xaml
资源字典
1 2 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>
 
  | 
 
1 2 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)中引用语言配置文件
资源样式按顺序加载,标签重复的后加载覆盖先加载的,所以可以移除样式后新增,达到运行中修改语言的目的。
1 2 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>
   | 
 
切换语言
1 2 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();         }     } }
   | 
 
调用
1 2 3 4 5 6 7 8
   |  SetLanguage();
 
  SetLanguage("/Window;component/Language/en-US.xaml");
 
  SetLanguage("/Window;component/Language/zh-CN.xaml");
 
  |