Silverlight 2中多语言支持实现(上) 推荐
2008-06-19 01:03
686 查看
引言
最近项目要在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项目文件(.csproj),可以看到有SupportedCultures这样一项,如果在这里进行了设置,再编译Silverlight项目时将会自动打包资源文件,如下图所示,我们添加一项zh-CN:现在再解压xap文件看看效果,可以看到,现在zh-CH资源文件已经打包在了xap文件中:
运行程序,可以看到已经显示为中文了:
到这里,终于可以松一口气了,下面接着实现其它功能。
添加本地存储
现在我们要实现本地存储功能,这个不是什么难事,可以通过Silverlight 2中的隔离存储来实现。在用户选择一种语言后保存到本地:然后在应用程序启动时,读取该配置:
好了,现在我们来看一下效果:
英文
中文:
总结
至此,简单的多语言支持算是实现了,其实还有其它的问题没有解决,我将在下一篇分析。最后再啰唆一句:Silverlight 2 Beta 2对于多语言支持的支持实在是...相关文章推荐
- Silverlight 2中多语言支持实现(下) 推荐
- Silverlight 2中多语言支持实现(下)
- Silverlight 2中多语言支持实现(上)
- 使用jsp标签和java资源管理实现jsp支持多语言
- 结合Resumable.js实现在Server端PHP支持的大文件上传、断点续传功能 推荐
- 策略模式实现支持多种类数据库的DBHelp(推荐--arvin)
- WinCE多语言的支持实现
- 在ASP.NET MVC中通过URL路由实现对多语言的支持
- 在XCode中实现多语言环境支持
- 使用GNUgettext实现本地化语言支持
- 稳扎稳打Silverlight(32) - 2.0Tip/Trick之MessageBox, Popup, 循环的几种实现方法, 动态变换主题, 本地化(多语言), 响应鼠标双击事件
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- 稳扎稳打Silverlight(54) - 4.0通信之对UDP协议的支持: 通过 UdpAnySourceMulticastClient 实现 ASM(Any Source Multicast),即“任意源多播”
- python实现三元语言模型与输入法推荐
- 稳扎稳打Silverlight(55) - 4.0通信之对UDP协议的支持: 通过 UdpSingleSourceMulticastClient 实现 SSM(Source Specific Multicast),即“源特定多播”