项目笔记---WPF多语言方案
近期由于朋友邀请帮忙给一个开源的游戏“外挂”做一个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依然没有解决此问题。
引用
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
项目笔记---WPF多语言方案的更多相关文章
- 项目笔记---WPF之Metro风格UI
写在前面 作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃. 切入正题, ...
- 项目笔记---WPF之Metro风格UI(转)
写在前面 作为新年开篇的文章,当然要选择比较“Cool”的东西来分享,这自然落到了WPF身上,WPF技术自身可塑性非常强,其强大的绘图技术以及XAML技术比WinForm而言有本质的飞跃. 切入正题, ...
- WPF 多语言 多资源 多皮肤 处理方案
同时兼容这么多需求的解决方案 我想到的 只有通过 动态切换加载资源字典 前端用绑定的模式 达到托管最大化 多语言举例 我编辑了 两个 语言包 一个中文 一个英文 (语言包这个最好用T4 写个模板, ...
- ASP.NET MVC 多语言方案
前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密 ...
- ASPNETMVC多语言方案
ASPNETMVC多语言方案 前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生 ...
- 《Go并发编程实战》读书笔记-初识Go语言
<Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy
23 DesignPatterns学习笔记:C++语言实现 --- 2.7 Proxy 2016-07-18 (www.cnblogs.com/icmzn) 模式理解
- 23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory
23 DesignPatterns学习笔记:C++语言实现 --- 2.5 Factory 2016-07-18 (www.cnblogs.com/icmzn) 模式理解 1. Flyweight ...
- Django项目笔记:sessions处理以及复杂对象序列化
前言:一点题外话 我发现,不更新博客的时候,不是非常忙,就是效率非常低.最近没怎么更新博客,原因是第二种= =.惭愧惭愧. 今天效率出奇的高,一天时间把PassNote后端的接口全部写完了,Djang ...
随机推荐
- django MongoDB上传文件
django上传文件,查询到的资料都是用的django自己的models.Model类,去定义一个FileField类型的存储文件,并且在里面加一句upload_to,如下所示: 但是如果用mon ...
- datagrid数据表格的维护
想想刚开始学jsp, 用application做一个简单的数据库, 简单的注册页面, 跟这个相比就是过家家 <%@ page language="java" contentT ...
- Cannot resolve class or package 'dbcp' Cannot resolve class 'BasicDataSource'
在applicationContext.xml中配置数据源时,报错如下: Cannot resolve class or package 'dbcp' Cannot resolve class 'Ba ...
- 几种TCP连接终止
在三次连接完成后,accept调用前,客户机发来RST. Berkeley实现将完全在内核中处理,不通知. 而SVR4实现将返回一个错误EPROTO,而POSIX指出应该是ECONNABORTED,后 ...
- Python 中 (&,|)和(and,or)之间的区别
&,|)和(and,or)是两组比较相似的运算符,用在“与”/ “或”上,在用法上有些许区别. (&,|)和(and,or)是用来比较两组变量的,格式基本上是: a & ba ...
- C++ define与const
C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常 ...
- 实现Quartz的动态增删改查
1. Maven依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...
- php5.4 trait 理解与学习
Trait 是 php5.4引入的新特性,手册上说的一大段没看懂,这里直接来过来. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员 ...
- JTemplate学习(一)
使用模板绑定数据,可以嵌套循环 参考:http://www.doc88.com/p-6621237324128.html <!DOCTYPE html PUBLIC "-//W3C// ...
- 如何定义一个高逼格的原生JS插件
插件的需求 我们写代码,并不是所有的业务或者逻辑代码都要抽出来复用.首先,我们得看一下是否需要将一部分经常重复的代码抽象出来,写到一个单独的文件中为以后再次使用.再看一下我们的业务逻辑是否可以为团队服 ...