我正嘗試創建一個WPF MarkupExtension類,該類提供文本翻譯類中的翻譯文本。翻譯的東西效果很好,但需要用文本鍵調用靜態方法來返回翻譯後的文本。像這樣:使用DataBinding值的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定義爲「Minuten」,下面的方法調用將返回正確的詞來使用:
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'工作得更好 –
這看起來會怎麼樣? ' '?有點向後鍵入。如果我想讓語言詞典在運行時可以改變,那還需要一個綁定呢? –
ygoe