有没有人在Silverlight中拥有本地化的最佳实践或经验。 MSDN recommends将资源绑定到XAML,但结果非常混乱:
<TextBlock Text="{Binding Path=Resource1.HelloText, Source={StaticResource LocalizedStrings }}"/>
这一页将使XAML无法读取!
任何捷径?
答案 0 :(得分:2)
前一段时间我问了一个类似但更复杂的问题(silverlight paramterised resource values for internationalisation)
MSDN上给出的示例实际上不足以进行严格的本地化,它假设每个字符串都完全存在且没有参数,实际情况是您将拥有要嵌入字符串中的值,但需要占位符来标记该位置字符串中的变量,因此翻译人员可以在翻译时移动标记。
你可以通过在Silverlight中实现多重绑定来实现更高级的机制--Colin Eberhardt做了一个很好的实现(silverlight multibindings how to attached mutiple bindings to a single property) - 调整了一下并结合MultiValue Converter你可以执行多个绑定,允许首先绑定到语言文件,然后绑定到要嵌入的参数。
这是一个非常痛苦但是本地化的故事只是显而易见的缺点 - 即使在PDC09上通过silverlight 3/4聊天,目前还没有一条很好的路线 - 如果WPF多重绑定使其达到SL4而使其略有下降更简单,但我还没有看到一个很好的替代实现,除了人们从ViewModel输出所有字符串 - 从'设计师'的角度来看似乎是错误的。
答案 1 :(得分:0)
我同意微软对Silverlight(以及WPF和Windows Phone)本地化的建议非常简陋。它有几个问题。最重要的是
原因是Visual Studio,等Microsoft工具不能提供本地化XAML的任何方法。一个简单的解决方案是本地化XAML,包括本地化的XAML以及本地化的RESX到附属程序集文件中。
<TextBlock Text="Hello World"/>
比
更容易查看,编辑和维护<TextBlock Text="{Binding Path=Resource1.HelloText, Source={StaticResource LocalizedString }}"/>
+
<data name="LocalizedString" xml:space="preserve">
<value>Hello World</value>
</data>
您需要做的是将字符串硬编码到XAML中并本地化XAML本身。没有好的工具,这将变得非常困难。这就是为什么我建议您使用可以定位XAML的本地化工具。仅此一点并不存在,因为如果你有本地化的XAML,你仍然需要将它们编译成卫星装配文件,最后将卫星包含在你的XAP文件中。
您需要一个可以本地化RESX和XAML的工具,还可以编译本地化的附属程序集文件。有一些工具可以做到这一点(例如Sisulizer)。
如果您只想使用Visual Studio,那么您必须坚持使用Microsoft的最佳实践。