拼吾爱程序人生.Net编程Silverlight Silverlight 2中多语言支持实现(上)

1  /  1  页   1 跳转 查看:655

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

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,这个问题已经不存在了。

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Silverlight] 的这些文章也感兴趣:

简单的Silverlight音乐播放器Widget
非常精彩的Silverlight 2控件样式
一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)
用 Chiron 运行 IronPython 编写的 Silverlight 程序
一步一步学Silverlight 2系列文章
在Silverlight应用程序中操作Cookie
在Silverlight2 Beta2中开发自定义控件
Silverlight1.1中的事件处理
使用Silverlight开发用户贡献内容的视频站点的快速入门包
Tool Roundup for Silverlight
 

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

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

 附件: 您所在的用户组无法下载或查看附件


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

 附件: 您所在的用户组无法下载或查看附件


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

 附件: 您所在的用户组无法下载或查看附件


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

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

 附件: 您所在的用户组无法下载或查看附件


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

 附件: 您所在的用户组无法下载或查看附件


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

英文

 附件: 您所在的用户组无法下载或查看附件


中文:



总结

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

快速回复帖子

标题
禁用 URL 识别
禁用表情
禁用 Discuz!NT 代码
使用个人签名
  [完成后可按 Ctrl+Enter 无刷新发布]  

版权所有 拼吾爱程序人生    Total Unique Visitors:

free hit counter

Powered by Discuz!NT 2.1.202   Copyright © 2001-2008 Comsenz Inc. 鄂ICP备07500843号
返顶部