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

  • 常规讨论

  • 最近纠结于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处理逻辑,如果知道,照着做就放心了。

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

    2011年4月2日 2:25

全部回复