准备工作 我们发现在Silverlight 2中提供了ResourceManager类这意味着可以通过资源文件来实现首先在Silverlight项目中建立个文件夹命名为Resources添加个资源文件Strings.resx并添加几个值如下图所示:
该文件将作为默认资源文件设置Access Modier为Public它将会生成Strings.Designer.cs文件如下图所示:
现在再创建几个其它语言资源文件如中文、法语、挪威语等注意资源文件命名方式都是以Strings+语言文化构成有关每种语言文件代码大家可以查阅MSDN
其它这些文件Access Modier设置为No Code generation有了前面这些准备工作接下来进行实现
实现 有了上面这些资源我们很容易想到利用Silverlight中静态资源来绑定到UIControl控件上面首先定义资源文件:
绑定到UIControl控件上如我们放置 3个按钮:
最后我们只剩下步工作就是指定当前线程语言文化和UI语言文化这点我们可以在Application_Startup事件中来实现我们设置为zh-CN如下代码所示:
至此工作完成可是当我们编译时却发现有这样:
Type 'Strings' is not usable as an object element because it is not public or does not a public parameterless constructor or a type converter
很明显Strings类型构造访问性不是public打开Strings.Design.cs文件可以看到它构造是ernal这点好办手工修改为public(也许该问题将会在RTM中解决)但是要注意每次当修改完Resource文件后它会再次变为ernal类型
问题出现 现在编译成功可是当运行时却并没有出现我们想要结果我们首先会想到资源文件编译后是否下载到了本地也就是是否打包到了xap文件中这点很好证实我们可以解压xap文件来看看果然不出所料如下图所示:
在xap文件中除了Silverlight项目集的外并没有任何和资源文件有关东西有种“暴力”办法可以解决这个问题那就是我们拷贝Silverlight项目binDebug文件夹下资源文件手工进行打包xap文件并且需要在xap文件AppManest.xaml文件夹中手工加入AssemblyPart如下代码所示:
事实证明这样确实可以得到多语言支持问题在于每次编译后xap文件都会重新生成次总是这样手工打包也不是长久的计所以必须想办法彻底解决问题也许到了Silverlight 2.0 RTM这个问题已经不存在了
问题解决 我们打开Silverlight项目文件(.csproj)可以看到有SupportedCultures这样项如果在这里进行了设置再编译Silverlight项目时将会自动打包资源文件如下图所示我们添加项zh-CN:
现在再解压xap文件看看效果可以看到现在zh-CH资源文件已经打包在了xap文件中:
运行可以看到已经显示为中文了:
到这里终于可以松口气了下面接着实现其它功能
添加本地存储 现在我们要实现本地存储功能这个不是什么难事可以通过Silverlight 2中隔离存储来实现在用户选择种语言后保存到本地:
然后在应用启动时读取该配置:
好了现在我们来看下效果:
英文
中文:
整理总结 至此简单多语言支持算是实现了其实还有其它问题没有解决我将在下篇分析最后再啰唆句:Silverlight 2 Beta 2对于多语言支持支持实在是...
最新评论