我正在尝试创建一个 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 内部,提供的代码仅将其推向正确的方向,但尚不清楚如何。我无法适应它来做任何有用的事情。
我不确定让翻译语言在运行时更改是否有用。我想我需要另一个级别的绑定。为了保持较低的复杂性,我不会在基本版本工作之前尝试这样做。
目前没有我可以给你看的代码。它只是处于一种可怕的状态,它唯一做的就是抛出异常,或者不翻译任何东西。任何简单的例子都非常受欢迎(如果这种情况存在的话)。