我在我的WPF应用程序中使用MarkupExtension继承,我想在Silverlight下移植。
我做了一个“Locale”标记扩展,可以在xaml
中像这样使用<TextBlock Text="{ui:Locale aRandomId,'My default translation'}" />
实际上,这个MarkupExtension将其应用的属性绑定到字符串“My default translation”,或者,如果找到,则绑定到存储在名为“aRandomId”的数据库中的句子。
这个MarkupExtension允许我动态地改变我的UI的语言环境(markupextension正在注册一个弱事件'LocaleChanged',它会触发与它绑定的每个属性的更新)
由于我们无法从Silverlight中的MarkupExtension继承,我想知道是否有某种机制可以取代它。
感谢。
PS:如果需要,我可以提供此MarkupExtension的来源。
答案 0 :(得分:0)
出于这个目的,我正在使用Converter和ConverterParam:
这很容易做到,但是当你开始在你的应用程序中使用它们时,它会感觉非常模糊。
<强>更新强> 也许我过度复杂了你的需求...在我的应用程序中,我有两种使用模式,一种是转换器而另一种是没有。在最简单的情况下,我只想为本地化字典拉一个字符串,它看起来像:
Text="{Binding Localization[my_string_key], Source={StaticResource ViewModelLocator}}"
答案 1 :(得分:0)
我知道这会得到很多传统的答案,但我还想提出一些完全原创的东西,我们尝试(并成功)使用附加属性而不是绑定来更有效地本地化Silverlight:
我们发现资源和绑定解决方案既繁琐又不灵活,因为它们都需要在项目中设置转换(因此需要在应用程序更改时重新部署应用程序)。
此外,所选择的语言也会发生变化,当它发生变化时,它会同时变为所有字符串。如果语言发生变化,当你可以重新生成当前页面时,为此目的承担绑定的开销似乎很疯狂。
传统上翻译是分批发送的,并由语言管理(使用独特的密钥,翻译笔记等),所以我们发现这也更适合。
我们的解决方案意味着我们在中央服务器数据库中管理本地化,但也可以在应用程序本身内提供本地化编辑器,供翻译人员在使用应用程序时使用。