Silverlight 2中多语言支持实现(上)
文/Terrylee 出处/博客园
引言最近项目要在Silverlight 2应用程序中实现本地化,原以为这个过程非常简单,却没想到实现的时候一波三折,好在结果还算不错。需求是这样的,用户第一次访问的时候,默认为英文,当用户选择一种显示语言后,记录在本地,下次用户访问时直接显示已经选择的语言。现在我把整个实现的过程记录下来,希望对大家有所帮助。
本文为Silverlight 2中多语言支持实现第一部分。
准备工作我们发现在Silverlight 2中提供了ResourceManager类,这意味着可以通过资源文件来实现,首先在Silverlight项目中建立一个文件夹,命名为Resources,添加一个资源文件Strings.resx,并添加几个值,如下图所示:

附件:
您所在的用户组无法下载或查看附件该文件将作为默认资源文件,设置Access Modifier为Public,它将会生成Strings.Designer.cs文件,如下图所示:

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

附件:
您所在的用户组无法下载或查看附件其它这些文件的Access Modifier的设置为No Code generation。有了前面这些准备工作,接下来进行实现。
实现有了上面这些资源,我们很容易想到利用Silverlight中的静态资源来绑定到UI控件上面,首先定义资源文件:

附件:
您所在的用户组无法下载或查看附件绑定到UI控件上,如我们放置三个按钮:

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

附件:
您所在的用户组无法下载或查看附件至此工作完成,可是当我们编译时却发现有这样的错误:
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类型。

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

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

附件:
您所在的用户组无法下载或查看附件事实证明,这样确实可以得到多语言的支持,问题在于每次编译后,xap文件都会重新生成一次。总是这样手工打包也不是长久之计,所以必须想办法彻底解决问题,也许到了Silverlight 2.0 RTM,这个问题已经不存在了。
| 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。 |