2009-08-25 58 views
8

本地化可以在运行时更改其语言的基于MVVM的WPF allication会有什么好的方法吗?当然,我可以在ViewModel中创建一个字符串属性,用于显示View中某处的每个字符串,但对我来说似乎相当乏味。对此有一个共同的方法/最佳实践吗?本地化基于MVVM的WPF应用程序

回答

9

WPF has a lot of support for localization。也许你可以利用它?不幸的是,我认为在运行时更改用户界面语言有点困难,您可能需要提出自己的方案。

此外,由于视图模型与UI无关,我不认为在视图模型中存储用户界面字符串是一个很好的解决方案。这些都属于这个观点。

+3

考虑到视图模型是观的典范,我个人认为,这是把本地化的理想场所。这也将允许来自相同视图模型的本地化Silverlight和WPF UI。 – 2009-08-26 00:05:06

+5

我不得不不同意皮特戴维斯。本地化属于视图,而不是视图模型。视图模型不应该担心视图想要呈现的方式。而且,本地化只是视图可以用其他语言呈现的一种方式。 – 2011-02-24 15:23:11

6

而是在你的视图模型具有用户界面的字符串,你可以将它们存储在组装的资源,并直接从XAML访问它们,使用x:Static

<TextBlock Text="{x:Static props:Resources.MyLabel}"/> 

props命名空间应该是指你的程序集的Properties命名空间:

xmlns:props="clr-namespace:My.Assembly.Properties" 
+0

只要确保您修改的资源访问权限为公共,而不是内部。 – midspace 2011-02-28 03:07:08

9

这里是一个excellent article about WPF localization。它涉及微软支持的本地化技术,以及一些替代方案

我不会推荐用于本地化的“官方”解决方案......使用它真的很痛苦,它会修改你XAML(增加了x:Uid属性到每个可以本地化的元素),并且MS没有好的工具使它成为一个简单的解决方案。良好的旧resx本地化使用起来更加容易,并且只需几个技巧(即标记扩展和/或附加属性)就可以很好地与WPF集成。此外,由于绑定系统,您可以在运行时轻松更改界面语言。

+0

对于Rick Strahl文章+1。这个很好。实际上,绑定系统并没有遵循当前UI线程的文化,但本文告诉您如何纠正这个问题。好的选择。 – 2009-08-26 05:29:02

+0

+1非常有用的答案。感谢这篇文章 – gyurisc 2011-10-03 06:28:12

1

您可以使用自定义标记扩展来查找本地化值并在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施特拉尔和米歇尔·勒鲁布斯塔曼特这里创作拍摄。从本网站下载指南,其中以文档形式和示例应用程序详细描述了此技术。

这种方法的另一个很好的优点是它在设计器中工作。