我正在尝试创建一个WPF MarkupExtension类,该类提供来自我的文本翻译类的翻译文本。翻译功能很好用,但需要使用文本键调用静态方法才能返回翻译后的文本。就像这样:
ImportLabel.Text = Translator.Translate("import files");
// will be "Dateien importieren" in de or "Import files" in en
它的特点是接受计数值以提供更好的措辞。
ImportLabel.Text = Translator.Translate("import n files", FileCount);
// will be "Import 7 files" or "Import 1 file"
另一个例子:如果某个事情需要4分钟,那么它的名称与只需要1分钟时不同。如果文本键“minutes”被定义为任何数字都是“Minuten”,而对于计数为1则为“Minute”,则以下方法调用将返回正确的单词:
Translator.Translate("minutes", numberOfMinutes)
// will be "minute" if it's 1, and "minutes" for anything else
现在,在WPF应用程序中,有很多XAML代码,其中包含大量的文字。为了能够在不疯狂的情况下进行翻译,我需要一个标记扩展,可以传递我的文本键,并在运行时返回已翻译的文本。这部分相当容易。创建一个继承自MarkupExtension的类,添加一个接受文本键作为参数的构造函数,将其存储在私有字段中,并让其ProvideValue方法为存储的键返回翻译文本。
我的真正问题是:如何使我的标记扩展接受计数值,以便它是数据绑定的,并且当计数值更改时,翻译文本也会相应更新?
它应该像这样使用:
<TextBlock Text="{t:Translate 'import files', {Binding FileCount}}"/>
每当FileCount的绑定值发生变化时,TextBlock必须接收新的文本值以反映变化并仍然提供良好的措辞。
我在这里找到了一个看起来类似的解决方案:http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx 但是,尽管我努力跟随它,但我无法理解它做了什么或为什么会起作用。一切似乎都发生在WPF内部,提供的代码只是把它推向正确的方向,但其中的过程不清楚。我无法使其适应我的需求。
我不确定在运行时更改翻译语言是否有用。我认为我需要另一层绑定才能实现这一点。为了保持复杂性低,我不会在基本版本工作之前寻求实现它。
目前没有可以展示给您的代码。它处于一个可怕的状态,唯一的事情就是抛出异常,或者不翻译任何内容。如果在这种情况下存在简单的示例,则非常欢迎。
IValueConverter
比MarkupExtension
更适合。 - sa_ddam213<TextBlock Text="{Binding FileCount, Converter=???}"/>
?有点反向输入。如果我想在运行时使语言字典可变,那也需要一个绑定,对吧? - ygoe