纠结于wpf 多国语言方案,希望各位指点

最近纠结于wpf 多国语言处理的问题,先说说找到的以下几种方案。

1.借用vc的处理方式,编译完了以后每个语言产生一个dll,分别放在语言文件夹里面,

Wpf 使用dllImport调用win32 api中的loadstring方法提取MUI资源,然后赋值为ui。

微软自己去判断该用哪个语言,不用自己操心。

优点:可靠,毕竟那么多地方都这么干的。

缺点:麻烦了点

2. 微软给出的解决方案,地址如下:

http://msdn.microsoft.com/zh-cn/library/ms788718.aspx

其中里面有一句,让我很失望:

用 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处理逻辑,如果知道,照着做就放心了。

希望各位指点一下,谢谢。

posted @ 2011-04-02 10:23  xiaokang088  阅读(2733)  评论(18编辑  收藏  举报