[Silverlight]通过MVVM模式实现本地化/全球化(1)

关于Silverlight本地化的文章已然不少。在园子里nasaSilverlight本地化正是一篇好文。而本文将从其他角度解析这方面的知识,本文将包括如下几个方面的内容

  • 本地化/全球化的意义
  • 在Silverlight中使用.resx实现本地化/全球化的几种方式
  • 在Silverlight中通过MVVM实现本地化/全球化
  • 示例及源码

本地化/全球化的意义

本地化/全球化是当我们的应用/产品发展到一定阶段的时候必然会遇到的问题,我认为不要因为“我们的客户全是国内公司”这种想法而在产品初期不考虑本地化/全球化的问题。其原因在于:

1 我们永远无法预知以后的事情。

2 国内公司的概念有两种,一种是本土公司一种是跨国公司。跨国公司自不必说,即使在本土公司中使用的项目也难免出现“老外来视察”这类情况。

3 在开发前期考虑本地化/全球化问题远比在维护阶段做这些工作容易得到。看之前的项目代码(尤其还可能不是自己写的)、改代码可是程序员最讨厌的事情之一,如果再碰到组织混乱的代码,那简直就是噩梦了。

4 .NET中提供的本地化/全球化方案简单方便强大,成本增加有限。

综上所述,除非是小型项目(如小型企业网站项目等),我建议在产品初级就需考虑本地化/全球化的问题。

在Silverlight中实现本地化/全球化的方式

Silverlight的Framework是.NET Framework的子集,对本地化/全球化的支持也很完整。与普遍的.NET应用程序相同,都是使用.resx文件做为本地化资源文件实现。(当然,使用其他的一些本地化/全球化方案也可以,如硬编码设置常量等,本文主要讲述使用资源文件的方法)

这里以MS的Project2007为例说明一个使用resx的经典场景:

image image 在这两处均出现“新建”字样。如果我们要将其改为繁体版或英文版,那么按照传统的方式就必须打开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模式实现本地化/全球化并提供源码。

posted @ 2010-03-18 21:59  紫色永恒  阅读(2119)  评论(5编辑  收藏  举报