项目笔记---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

引用

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

时间: 2024-08-01 17:27:14

项目笔记---WPF多语言方案的相关文章

Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下:   1.UI控件与布局     2.MVVM     3.数据绑定     4.await/async     5.Linq查询     6.WCF RIA Services     7.序列化     8.委托与事件 1.UI控件与布局 常用的主要是Grid.StackPanel.Border,其中最常用的的是Grid,是一

Silverlight项目笔记2:初识Prism以及IoC

项目采用了Prism框架,以下为自己的一些初步认识:   一.Prism Prism是由微软Patterns & Practices团队开发的针对WPF和Silverlight的MVVM框架,好处是将功能模块化,能有效减小程序大小,增强扩展性与可维护性. Prism的几个关键点: (1)启动器类UnityBootstrapper Silverlight程序入口处调用Bootstrapper.Run方法时,Prism会自动做一些初始化工作,包括读取模块信息表,创建模块类实例并初始化(还可以选择按需

Go语言学习笔记(一) [Go语言的HelloWorld]

日期:2014年7月18日 1.简介 Go 编程语言是一个使得程序员更加有效率的开源项目.Go 是有表达力.简 洁.清晰和有效率的.它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有性的模块化程序.Go 编译到机器码非常快 速,同时具有便利的垃圾回收和强大的运行时反射.它是快速的.静态类型编译语言,但是感觉上是动态类型的,解释型语言. Go 是第一个实现了简单的(或更加简单的)并行开发,且跨平台的类 C 语言. 2.Go语言文档查看 安装好Go语言之后,其文档可以通过go do

微软BI项目笔记连载

本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的多维分析模块: <BI项目笔记>基于雪花模型的维度设计 <BI项目笔记>数据源视图设置 <BI项目笔记>创建标准维度.维度自定义层次结构 <BI项目笔记>创建父子维度 <BI项目笔记>创建时间维度(1) <BI项目笔记>创建时间维度(2) <BI项目笔记>创建多维数据集Cube

项目笔记---CSharp图片处理

原文:项目笔记---CSharp图片处理 最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用C#得以应用,学到了很多的知识和大家分享下我个人的经验,希望对大家有帮助. 二值化 二值化简而言之是对一副彩色图片进行0/1运算,最终显示一副黑白相间的图片,其意义多数在于对二值化处理后的图片进行分割识别,一些自动识别的验证码工具大多是先进行二值化,然后在模式识别,最终推断出验证码:我的项目中是由于硬件只支持黑色和白色,所以要对用户的

Python源码剖析笔记0 ——C语言基础

python源码剖析笔记0--C语言基础回顾 要分析python源码,C语言的基础不能少,特别是指针和结构体等知识.这篇文章先回顾C语言基础,方便后续代码的阅读. 1 关于ELF文件 linux中的C编译得到的目标文件和可执行文件都是ELF格式的,可执行文件中以segment来划分,目标文件中,我们是以section划分.一个segment包含一个或多个section,通过readelf命令可以看到完整的section和segment信息.看一个栗子: char pear[40]; static

《OOC》笔记(1)——C语言const、static和extern的用法

<OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用const修饰的函数形参 直接修饰 一个形如 int Minus(const int a, const int b, int testCase); 的函数,const的意义是什么呢? 答:参数a被const修饰,说明在Minus函数内,编译器不允许a被别的变量(例如x)赋值(修改).参数b同理. 如果你写了a

Silverlight项目笔记5:Oracle归档模式引起的异常&amp;&amp;表格控件绑定按钮

两个问题: (1)Oracle无法连接正常使用,原因是归档日志满了引起异常,最后选择删除归档日志恢复正常. (2)使用silverlight自带的表格绑定按钮竟然无法使用,通过变通绑定数据源集合,把按钮操作作为数据源集合一部分,重新绑定解决. 一.Oracle归档模式产生日志文件引起数据库异常 连接数据库失败,提示监听错误,各种检查监听配置文件,删除再添加监听,无果. sqlplus下重启数据库数据库依然无果,期间碰到多个错误提示: ORA-01034: ORACLE not available

【MySQL笔记】SQL语言四大类语言

SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块: SELECT <字段名表> FROM <表或视图名> WHERE <查询条件> 具体参看:[MySQL笔记]数据库的查询 2 .数据操纵语言DML INSERT - insert data into a table(插入) UPDATE - upda