最近纠结于wpf 多国语言处理的问题,先说说找到的以下几种方案。
1.借用vc的处理方式,编译完了以后每个语言产生一个dll,分别放在语言文件夹里面,
Wpf 使用dllImport调用win32 api中的loadstring方法提取MUI资源,然后赋值为ui。
微软自己去判断该用哪个语言,不用自己操心。
优点:可靠,毕竟那么多地方都这么干的。
缺点:麻烦了点
2. 微软给出的解决方案,地址如下:
softbar
http://www.softbar.com/
其中里面有一句,让我很失望:
用 XAML 编写 UI;避免在代码中创建 UI。当您使用 XAML 创建 UI 时,应通过内置的本地化 API 来对其进行公开。
避免在代码中创建 UI !!!我的代码里面确实有创建UI的地方,这个可以避免,但是有时候避免不了。
而且编译过程太复杂了,我用这里面提供的方法,主语言没问题,第二语言没有成功过,也可能是我自己的问题了。
优点:微软给的,可能比较靠谱
缺点:限制多,也有些麻烦。
3.采用资源引用的方法。
Xaml里面这么写:
<MenuItem Header="{DynamicResource MAINWINDOW_HELP}" Name="miHelp" Command="Help"/>
资源文件这样子的:
<s:String x:Key="MAINWINDOW_HELP">Help</s:String>
每个语言一个xaml,然后放在一个类库项目里面,编译为dll。
启动时,获取操作系统语言,加载相应的xaml,如下:
var threadUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture.Parent;
string language = @"pack://application:,,,/ MUIRes;component/" + threadUICulture.EnglishName + ".xaml";
var currentLanguageResource = App.Current.Resources.MergedDictionaries.FirstOrDefault(o => o.Source.ToString().Contains("Language"));
try
{
ResourceDictionary resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri(language);
currentLanguageResource.Source = new Uri(language);
}
catch (System.Exception ex)
{
Debug.Write(ex);
return;
}
我采用的是第三种办法,遇到了一个问题:
香港地区,
System.Threading.Thread.CurrentThread.CurrentUICulture 获取到zh-HK,但是香港是繁体中文,应该是zh-TW, 所以我加了Parent,为:System.Threading.Thread.CurrentThread.CurrentUICulture.Parent 获取到zh-TW.
如果 做MUI的时候,香港地区的翻译和台湾的翻译不一样,咋办?不加Parent?如果一样呢?
或许可以这么做:如果有zh-HK,就用zh-HK,如果没有,使用zh-TW,再没有,就En。
这是目前发现的问题,鬼知道世界上那么多国家和语言,会不会有别的问题?况且这办法不是微软推荐的,领导说你能保证没问题吗?不敢…..
另外,每增加或删除一种语言,都要重新编译资源dll,不可能一个语言建一个项目吧?
不知道第一种方案里面的MUI处理逻辑,如果知道,照着做就放心了。
希望各位指点一下,谢谢。