近期由于朋友邀请帮忙给一个开源的游戏“外挂”做一个I18N的解决方案,恰好也是WPF做的,之前有过相关经验,就忙了一个星期终于搞定了,已经提交给作者了,现在这里做一个分享。

  这里分享下我个人Fork的GitHub地址: https://github.com/Cuiyansong/Hearthstone-Deck-Tracker

什么是I18N

  简单来说就是多语言,为什么多语言叫I18N,请参见结语中的引用。

如何实现

  其实WPF上实现多语言于winform有些相似,就是更换软件运行时资源(Resource)。而WPF在这方面有些更先天的优势---XAML,这里不想详细展开XAML对Winform的革新,这里想强调的是有了XAML使得WPF做界面绑定时更具有优势。

对比很多WPF多语言方案,WPFLocalizeExtension具有更多的优势,当然也有些不足,这是后话,这里我选择用后者来给大家演示。

本文不会很深入的探讨原理,直接介绍如何应用。

  1. 引入WPFLocalizeExtension.dll,建议用NuGet,搜索WPFLocalizeExtension,然后依次安装。(不会用NuGet?点这里

  2. WPFLocalizeExtension.dll 依赖于 XAML Markup Extensions, 实现了更多设计时(Design Time)动态绑定的实现等功能,有兴趣的读者可自行搜索,这也是这个开源框架不同于其他方式的强大之处所在。

  3. 在MainWindow.xaml引中加入如下信息:

  说明: DesignCultrue=”en-US” ,这个是默认英语设置,其他语言可以更改如zh-CN

DefaultDictonary=”Strings”这个是绑定到多语言文件的前缀<Name>.<Language>.resx

DefaultAssembly=”Hearthstone Deck Tracker”这个是程序集名称。

  4. 绑定界面Visual元素:

  绑定方式有3种,具体请参考这里,我选择了{lex:Loc ABC}这种方式。

  5. 增加多语言文件

    在项目中添加一个文件夹,如命名”Langs”,然后添加Strings.zh-CN.resx, String.de-DE.resx,Strings.resx,这些文件都是系统类型的资源文件,相信大家看见后缀resx就会知道如何添加 J.

  最后就是添加多语言信息了,这里强调一下:这几个文件中的Key值必须相同(有点啰嗦吧!)

    这样界面上只要 content = {lex:Loc ACTION}就可以了。(这里的content只要是文本类型的均可以绑定字符串,例如某些控件的Header、Text、Content等)

  6. 运行时切换语言更新界面:

    WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.GetCultureInfo(“zh-CN”);

    在软件中可以把用户设置的语言保存在Setting文件中,然后每次Form_Load时设置下当前的Cultrue。

  7. CodeBehind中绑定多语言Key:

  当然,除了UI可以动态绑定,程序中的提示信息也可以绑定Key。

Var Msg = Lang.GetLocalizedString(“ERROR_INFO”);
        public static string GetLocalizedString(string key, string resourceFileName = "Strings", bool addSpaceAfter = false)
{
var localizedString = String.Empty; // Build up the fully-qualified name of the key
var assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
var fullKey = assemblyName + ":" + resourceFileName + ":" + key;
var locExtension = new LocExtension(fullKey);
locExtension.ResolveLocalizedValue(out localizedString); // Add a space to the end, if requested
if (addSpaceAfter)
{
localizedString += " ";
} return localizedString;
}

更多

  1. 不足:资源文件会生成多个resource.dll分别在根目录下的相应语言目录下,文件夹显得太多,目前我还没有找到解决办法,如果谁有解决办法请告知。

https://github.com/Epix37/Hearthstone-Deck-Tracker/pull/426

  2. 此外还有针对多语言中阿拉伯语、希伯来语等特殊语言的布局设计未涉及在文章中。

http://www.oschina.net/translate/building-multilingual-wpf-applications

更新

2015.01.21 WPFLocalizationExtension这个框架在某些情况下导致“设计时”出现界面错误,如遇到此问题,请多次尝试“Clean”项目解决方案并Reload窗体,截止目前GitHub依然没有解决此问题。

引用

I18N:http://baike.baidu.com/link?url=4a1hNzarT1W0tiQy7Hiviy-X8_N7O9nLlNJrrx2DxNneInZ4vbnT9ZrdBszGLPaJ-LsxF73Zqjy74ezss7V-bq

WPF LocalizeExtension官网:http://wpflocalizeextension.codeplex.com/

NuGet配置及使用:http://blog.sina.com.cn/s/blog_674da3040101sv0o.html

翻译:http://www.oschina.net/translate/building-multilingual-wpf-applications

原文:http://www.codeproject.com/Articles/38751/Building-Multilingual-WPF-Applications

最新文章

  1. .NET 基础 一步步 一幕幕[运算符、占位符、转义符]
  2. Spring Mvc的入门
  3. Python开发【第三篇】:Python基本之文件操作
  4. 获取FIle路径下所有文件的地址和名称
  5. php正则表达式 常用记录
  6. 微信公众号&quot;赞赏&quot;功能来了 觉得不错就给作者打个赏吧
  7. 【freemaker】之循环,判断,对象取值
  8. UVa10895 Placing Lampposts
  9. 文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象
  10. 关于异或(Xor)的一点笔记
  11. mysql 初识之日志文件篇
  12. 如何将php数组或者对象传递给javascript
  13. python小白之路
  14. 性能调优之Mapping
  15. GIT 数据结构
  16. CodeForces - 348D Turtles(LGV)
  17. 一. Python基础(1)--语法
  18. java注解学习(1)注解的作用和三个常用java内置注解
  19. 网络监测 断网 网速 ping 完整案例 MD
  20. ural 1091. Tmutarakan Exams(容斥)

热门文章

  1. xpath定位--绝对与相对的定位
  2. FP真验货客户的成品和半成品编码部分没有带尾续,导致FP规划错误 IN_SALES_ORDER数据不带CZ
  3. 【MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.
  4. hdoj1251-统计难题 【字典树】
  5. 53. Maximum Subarray最大求和子数组12 3(dp)
  6. 理解数据结构Priority Queue
  7. PostgreSQL+pgpool-II复制方案
  8. discuz目录结构和插件创建
  9. 【转】MEF程序设计指南四:使用MEF声明导出(Exports)与导入(Imports)
  10. Java数据结构和算法(三)顺序存储的树结构