关于Silverlight本地化的文章已然不少。在园子里nasa的Silverlight本地化正是一篇好文。而本文将从其他角度解析这方面的知识,本文将包括如下几个方面的内容
- 本地化/全球化的意义
- 在Silverlight中使用.resx实现本地化/全球化的几种方式
- 在Silverlight中通过MVVM实现本地化/全球化
- 示例及源码
本地化/全球化的意义
本地化/全球化是当我们的应用/产品发展到一定阶段的时候必然会遇到的问题,我认为不要因为“我们的客户全是国内公司”这种想法而在产品初期不考虑本地化/全球化的问题。其原因在于:
1 我们永远无法预知以后的事情。
2 国内公司的概念有两种,一种是本土公司一种是跨国公司。跨国公司自不必说,即使在本土公司中使用的项目也难免出现“老外来视察”这类情况。
3 在开发前期考虑本地化/全球化问题远比在维护阶段做这些工作容易得到。看之前的项目代码(尤其还可能不是自己写的)、改代码可是程序员最讨厌的事情之一,如果再碰到组织混乱的代码,那简直就是噩梦了。
4 .NET中提供的本地化/全球化方案简单方便强大,成本增加有限。
综上所述,除非是小型项目(如小型企业网站项目等),我建议在产品初级就需考虑本地化/全球化的问题。
在Silverlight中实现本地化/全球化的方式
Silverlight的Framework是.NET Framework的子集,对本地化/全球化的支持也很完整。与普遍的.NET应用程序相同,都是使用.resx文件做为本地化资源文件实现。(当然,使用其他的一些本地化/全球化方案也可以,如硬编码设置常量等,本文主要讲述使用资源文件的方法)
这里以MS的Project2007为例说明一个使用resx的经典场景:
在这两处均出现“新建”字样。如果我们要将其改为繁体版或英文版,那么按照传统的方式就必须打开Visual Studio分别修改这两处的文字,牵一发而动全身。(某些行业软件中相同的词条更是成千上万)
而使用.resx文件后我们只需修改相应语言的对应词条即可。
从这一层面来说,使用.resx还遵循了DRY原则。
注:在Silverlight中由于Resource一词有特殊含义,所以本文中皆使用.resx代表本地化资源文件。
在Silverlight中使用.resx实现本地化/全球化的方式
常言道:“只选对的不选贵的”。这句话也可以理解为最适合的才是最好的。在Silverlight中,有很多种方法可以通过使用.resx实现本地化/全球化。没有哪一种办法是最好的,这要根据你的喜好和项目本身的情况(如周边资源、项目组平均能力)等进行选择。
这里我列举出一些解决方案,他们都各有利弊:
- 方法1:Business Application
安装.NET WCF RIA Services后就可以在新建Silverlight项目的窗口中找到该模板。通过该模板创建的项目会自动在Helpers文件夹下创建一个ResourceWrapper类来包装所有的.resx类的实例。
其优点是:代码都是由模板自动创建的,省了很多功夫。
- 方法2:后台硬编码
很传统的方法,比如后台可以写
public string ResourceLabelDate { get { return MyStrings.Label_Date; } }
前台可以写
<TextBlock x:Name="lblDate"/>
其优点是:code的时候支持代码感知,强类型,前台Xaml干净整洁
- 方法3:今天的主角—MVVM
后台一样是
public string ResourceLabelDate { get { return MyStrings.Label_Date; } }
前台
<TextBlock Text="{Binding ResourceLabelDate}"/>
其优点是:MVVM模式与生俱来的优势;对ViewModel进行单元测试很方便;前台Xaml也很干净。
另外还有Telerik公司出品的LocalizationManager等方式,这里就不一一列举了。
在下一篇文章中,我们将从零开始一步步的通过MVVM模式实现本地化/全球化并提供源码。