WPF MVVM本地化c#,运行时
本文关键字:运行时 本地化 MVVM WPF | 更新日期: 2023-09-27 18:08:12
我是MVVM WPF初学者,所以我正在搜索最轻和最简单的WPF MVVM本地化解决方案,这也将在运行时工作-当程序运行时发生变化。条件是我不能使用任何nuget(或类似的)-所以只是我的代码。
我在谷歌上找到了几个不错的例子:链接1链接2
如果有其他人,请提供链接。我正在寻找解决方案,在那里我可以以后添加语言而不改变代码 -所以添加Resources.xx.resx稍后到文件夹。
如有任何问题请提问。对不起,这个问题没有意义。我正在寻找用户的任何经验,任何已经达到的解决方案。
有很多方法可以实现这一点,但是我最喜欢的方法之一是使用ResourceDictionary
来声明语言资源,当然,这只适用于UI。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib">
...
<System:String x:Key="Test">Hello World</System:String>
...
</ResourceDictionary>
这里的技巧是为每种语言使用多个资源字典,因此您可能有另一个用于法语的资源字典。<System:String x:Key="Test">Bonjour le monde</System:String>
注意,x:Key
属性都是相同的,这将允许您使用MergedDictionaries
在运行时更改资源引用。
无论如何,这里有一个使用它的例子:
<TextBlock Text="{DynamicResource Test}" ... />
您必须在App.xaml
文件中使用MergedDictionaries
,然后在需要时删除/添加适当的语言。有关如何做到这一点的更多信息,请参阅这里。
<FlowDirection x:Key="FlowDirection">RightToLeft</FlowDirection>
你的窗口可以像这样引用这个资源:
<Window ...
FlowDirection="{DynamicResource FlowDirection}">
就像我说的,还有其他实现本地化的方法,您当然应该查看文档。
我更喜欢使用RESX文件进行WPF本地化。它支持xaml本地化,可以很容易地用于代码隐藏,包括视图模型。Resx文件是WinForms的标准解决方案,WPF Infralution也允许在wfp中使用它。
只写:
public class ViewModel
{
public string MyString
{
get { return Resources.myString; }
}
}
它将返回与当前CultureInfo一致的字符串。如果没有找到本地化文件或没有这样的资源,将使用默认的resx文件。
希望能有所帮助
我使用带有自定义名称空间的自定义标记扩展,它允许我这样编写XAML:
<Label Content="{Translate 'First Name:'}" />
我还有一个实用程序,它从我的XAML中提取这些绑定的所有出现情况,并将其放入一个电子表格中供翻译人员使用,还有一个实用程序将翻译结果转换为XML文件。每种语言的XML然后被添加到一个语言包中,这是一个MEF插件;每个文件都被添加到一个自定义的ResourceDictionary中,这个ResourceDictionary用[Export]
属性进行了装饰,允许我们在应用程序发布后发布更新和/或新的语言包。