Silverlight 2中多语言支持实现(上)

引言

最近项目要在Silverlight 2应用程序中实现本地化,原以为这个过程非常简单,却没想到实现的时候一波三折,好在结果还算不错。需求是这样的,用户第一次访问的时候,默认为英文,当用户选择一种显示语言后,记录在本地,下次用户访问时直接显示已经选择的语言。现在我把整个实现的过程记录下来,希望对大家有所帮助。

本文为Silverlight 2中多语言支持实现第一部分。

准备工作

我们发现在Silverlight 2中提供了ResourceManager类,这意味着可以通过资源文件来实现,首先在Silverlight项目中建立一个文件夹,命名为Resources,添加一个资源文件Strings.resx,并添加几个值,如下图所示:

TerryLee_0007

该文件将作为默认资源文件,设置Access Modifier为Public,它将会生成Strings.Designer.cs文件,如下图所示:

TerryLee_0008 

现在再创建几个其它语言的资源文件,如中文、法语、挪威语等,注意资源文件的命名方式,都是以Strings+语言文化构成,有关每一种语言文件的代码,大家可以查阅MSDN。

TerryLee_0009

其它这些文件的Access Modifier的设置为No Code generation。有了前面这些准备工作,接下来进行实现。

实现

有了上面这些资源,我们很容易想到利用Silverlight中的静态资源来绑定到UI控件上面,首先定义资源文件:

TerryLee_0011

绑定到UI控件上,如我们放置三个按钮:

TerryLee_0012

最后我们只剩下一步工作,就是指定当前线程的语言文化和UI语言文化,这一点我们可以在Application_Startup事件中来实现,我们设置为zh-CN,如下代码所示:

TerryLee_0010

至此工作完成,可是当我们编译时却发现有这样的错误:

Type 'Strings' is not usable as an object element because it is not public or does not define a public parameterless constructor or a type converter

很明显Strings类型的构造函数访问性不是public,打开Strings.Design.cs文件可以看到,它的构造函数是internal的,这一点好办,手工修改为public(也许该问题将会在RTM中解决)。但是要注意,每次当修改完Resource文件后,它会再次变为internal类型。

TerryLee_0013

问题出现

现在编译成功,可是当运行时却并没有出现我们想要的结果。我们首先会想到,资源文件编译后是否下载到了本地,也就是是否打包到了xap文件中,这一点很好证实,我们可以解压xap文件来看看,果然不出所料,如下图所示:

TerryLee_0014

在xap文件中,除了Silverlight项目程序集之外,并没有任何与资源文件有关的东西。有一种“暴力”的办法可以解决这个问题,那就是我们拷贝Silverlight项目bin\Debug文件夹下的资源文件,手工进行打包xap文件,并且需要在xap文件的AppManifest.xaml文件夹中手工加入AssemblyPart,如下代码所示:

TerryLee_0015

事实证明,这样确实可以得到多语言的支持,问题在于每次编译后,xap文件都会重新生成一次。总是这样手工打包也不是长久之计,所以必须想办法彻底解决问题,也许到了Silverlight 2.0 RTM,这个问题已经不存在了。

问题解决

我们打开Silverlight项目文件(.csproj),可以看到有SupportedCultures这样一项,如果在这里进行了设置,再编译Silverlight项目时将会自动打包资源文件,如下图所示,我们添加一项zh-CN:

TerryLee_0016

现在再解压xap文件看看效果,可以看到,现在zh-CH资源文件已经打包在了xap文件中:

TerryLee_0017

运行程序,可以看到已经显示为中文了:

TerryLee_0018 

到这里,终于可以松一口气了,下面接着实现其它功能。

添加本地存储

现在我们要实现本地存储功能,这个不是什么难事,可以通过Silverlight 2中的隔离存储来实现。在用户选择一种语言后保存到本地:

TerryLee_0019

然后在应用程序启动时,读取该配置:

TerryLee_0020

好了,现在我们来看一下效果:

英文

TerryLee_0021

中文:

TerryLee_0018 

总结

至此,简单的多语言支持算是实现了,其实还有其它的问题没有解决,我将在下一篇分析。最后再啰唆一句:Silverlight 2 Beta 2对于多语言支持的支持实在是...

posted @ 2008-06-19 01:05  TerryLee  阅读(10283)  评论(44编辑  收藏  举报