2016-04-13 27 views
1

在MVVM Light WPF應用程序中實現運行時本地化更改功能的正確方法是什麼?我正在使用基於資源的本地化(.resx文件),我想在幾乎任何時候都可以選擇更改區域設置。MVVM燈和運行時本地化更改

我雖然起初在做關於做全局屬性的App.xaml.csLocalizationChanged事件在每個視圖中連接起來,但是這至少違反了MVVM的兩條規則:沒有代碼隱藏代碼和耦合View類,因爲它們會依賴於應用程序的類(這將是很難單元測試它們)

另一個目的是創建全局接口ILocalizableModel將由LocalizableModel類(通過MVVM光魔在運行時注入)來實現,其然後提供接口寄存器LocalizationChanged事件和方式來設置新的本地化(也可能是其他一些功能,如枚舉可用的本地化)。該事件將在ViewModel類中觸發並請求它們更新所有屬性。這還有另一個問題:某些視圖數據(如列表)不能在不重新創建的情況下進行更新。並且在ViewModel中強烈處理View特定的代碼也似乎有點扭曲的想法。

另一個想法是使用Observator模式或在模型中連線的自動屬性。

但是,什麼是「正確的」,MVVM的方式呢?

+2

1)MVVM並不禁止在代碼中使用代碼。它只是需要避免在代碼隱藏中與代碼邏輯無關的任何代碼。 2)本地化是一種視圖責任,爲什麼你想把所有這些東西帶入視圖模型? – Dennis

+0

@丹尼斯在模型中也使用了一些本地化的資源,本地化版本的資源需要從數據庫中提取 – PiotrK

回答

2

我花了數週的時間研究這個問題,並得出了resx文件不是WPF/MVVM最佳解決方案的結論。我找到了最好的解決方案是使用a custom markup extension它允許你申報你的XAML這樣的:

<TextBlock Text="{Translate 'Hello World!'}" /> 

這提供了許多好處:

  1. 您仍然可以寫XAML用自己的母語,在原始字符串形成用於索引您的本地化表格的鍵。
  2. 您可以編寫一個簡單的實用程序來解析所有XAML並將關鍵字串提取到單個表格中,然後您可以將其提供給翻譯人員(此外,在您等待正確的翻譯時可以輕鬆粘貼到Google翻譯中)。
  3. 您可以即時更改當前語言,所有綁定將立即更新。
+0

我最終使用了這個:http://wpflocalizeextension.codeplex.com/解決方案。看起來非常尖銳至今! :) – PiotrK