本地化可以在运行时更改其语言的基于MVVM的WPF allication会有什么好的方法吗?当然,我可以在ViewModel中创建一个字符串属性,用于显示View中某处的每个字符串,但对我来说似乎相当乏味。对此有一个共同的方法/最佳实践吗?本地化基于MVVM的WPF应用程序
回答
WPF has a lot of support for localization。也许你可以利用它?不幸的是,我认为在运行时更改用户界面语言有点困难,您可能需要提出自己的方案。
此外,由于视图模型与UI无关,我不认为在视图模型中存储用户界面字符串是一个很好的解决方案。这些都属于这个观点。
而是在你的视图模型具有用户界面的字符串,你可以将它们存储在组装的资源,并直接从XAML访问它们,使用x:Static
:
<TextBlock Text="{x:Static props:Resources.MyLabel}"/>
的props
命名空间应该是指你的程序集的Properties
命名空间:
xmlns:props="clr-namespace:My.Assembly.Properties"
只要确保您修改的资源访问权限为公共,而不是内部。 – midspace 2011-02-28 03:07:08
这里是一个excellent article about WPF localization。它涉及微软支持的本地化技术,以及一些替代方案
我不会推荐用于本地化的“官方”解决方案......使用它真的很痛苦,它会修改你XAML(增加了x:Uid属性到每个可以本地化的元素),并且MS没有好的工具使它成为一个简单的解决方案。良好的旧resx本地化使用起来更加容易,并且只需几个技巧(即标记扩展和/或附加属性)就可以很好地与WPF集成。此外,由于绑定系统,您可以在运行时轻松更改界面语言。
对于Rick Strahl文章+1。这个很好。实际上,绑定系统并没有遵循当前UI线程的文化,但本文告诉您如何纠正这个问题。好的选择。 – 2009-08-26 05:29:02
+1非常有用的答案。感谢这篇文章 – gyurisc 2011-10-03 06:28:12
您可以使用自定义标记扩展来查找本地化值并在UI文化更改时对其进行更新。
这里有一个如何这可能工作的例子:http://wpflocalization.codeplex.com/:
<Label x:Name="lblResxHelloWorldMarkupExtension1Value"
Content="{res:Res Id=HelloWorld,Default=Hello#}"
Margin="{res:Res Id=HelloWorldMargin,Default=10}"
Width="{res:Res Id=HelloWorldWidth,
ResourceSet=WpfClickOnce.MyFormRes, Default=50}" />
这个例子是从优秀的WPF本地化指导由Rick施特拉尔和米歇尔·勒鲁布斯塔曼特这里创作拍摄。从本网站下载指南,其中以文档形式和示例应用程序详细描述了此技术。
这种方法的另一个很好的优点是它在设计器中工作。
如果你对这个话题几乎感兴趣,你可以看看我在codeplex上开发的库。
LocalizationLibrary:http://localizationlibrary.codeplex.com/
考虑到视图模型是观的典范,我个人认为,这是把本地化的理想场所。这也将允许来自相同视图模型的本地化Silverlight和WPF UI。 – 2009-08-26 00:05:06
我不得不不同意皮特戴维斯。本地化属于视图,而不是视图模型。视图模型不应该担心视图想要呈现的方式。而且,本地化只是视图可以用其他语言呈现的一种方式。 – 2011-02-24 15:23:11