本地化基于MVVM的WPF应用程序

ekqde3dh  于 2023-05-30  发布在  其他
关注(0)|答案(6)|浏览(114)

什么是一个很好的方法来本地化一个基于MVVM的WPF应用程序,可以在运行时改变它的语言?当然,我可以在ViewModel中为每个显示在View中的字符串创建一个字符串属性,但这对我来说似乎相当乏味。对此是否有共同的方法/最佳做法?

5m1hhzi4

5m1hhzi41#

这是一个excellent article about WPF localization。它涉及Microsoft支持的本地化技术和一些替代技术
我不推荐本地化的“官方”解决方案。使用起来真的很痛苦,它会修改你的XAML(给每个可以本地化的元素添加x:Uid属性),而且MS没有好的工具来使它成为一个简单的解决方案。很好的旧resx本地化更容易使用,并且只需几个技巧(即标记扩展和/或附加属性)就可以很好地与WPF集成。此外,由于绑定系统,您可以在运行时轻松更改接口语言。

e0bqpujr

e0bqpujr2#

WPF has a lot of support for localization也许你可以利用这个不幸的是,我认为在运行时更改用户界面语言有些困难,您可能需要提出自己的方案。
另外,由于视图模型是与UI无关的,我不认为在视图模型中存储用户界面字符串是一个好的解决方案。这些属于视图。

p5fdfcr1

p5fdfcr13#

您可以将用户界面字符串存储在程序集的资源中,并使用x:Static直接从XAML访问它们,而不是在视图模型中使用用户界面字符串:

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

props命名空间应该引用程序集的Properties命名空间:

xmlns:props="clr-namespace:My.Assembly.Properties"
3pmvbmvn

3pmvbmvn4#

您可以使用自定义标记扩展查找本地化值,并在UI区域性更改时更新这些值。
下面是一个示例,说明这可能如何工作:

<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}" />

此示例摘自Rick Strahl和Michele Leroux Bustamante撰写的优秀WPF本地化指南:http://wpflocalization.codeplex.com/。从这个网站下载指南,其中以文档形式详细描述了这项技术,并提供了一个示例应用程序。
这种方法的另一个好处是它可以在设计器中工作。

l5tcr1uw

l5tcr1uw5#

如果你对这个主题感兴趣,你可以看看我在codeplex上开发的库。
本地化库:http://localizationlibrary.codeplex.com/

相关问题