2013-03-07 17 views
10

Come si può localizzare un'applicazione WPF utilizzando il modello MVVM? Voglio davvero farlo nel modo "giusto".MVVM conforma localizzazione nelle applicazioni WPF

Il mio approccio attuale è che utilizzo i file di risorse .resx per localizzare la mia applicazione.

Solution Explorer VS 2012

li ho incluso nel mio codice XAML

xmlns:localization="clr-namespace:ClientLibTestTool.ViewLanguages" 

e accedervi in ​​questo modo:

 <Button x:Name="BtnGenerate" 
       Content="{x:Static localization:localization.ButtonGenerate}"/> 

Le mie domande:

  1. C'è un modo migliore per farlo?
  2. Come posso testare le diverse lingue (caricare l'applicazione con impostazioni di lingua diverse)?
  3. È possibile modificare la lingua in fase di esecuzione?

Risposte:

Domanda 1:

Domanda 2: (Grazie, Stijn)

public MainWindow() 
{ 
    // Debug Settings 
    localization.Culture = CultureInfo.GetCultureInfo("en-US"); 
    // localization.Culture = CultureInfo.GetCultureInfo("de-DE"); 
    this.InitializeComponent(); 
} 

Domanda 3: (Grazie, Stijn)

Non

davvero , è necessario ridisegnare la finestra completa.

risposta

4

Questo è il modo appropriato per farlo, per quanto mi riguarda. Per passare da una lingua, cambiare la cultura utilizzato dalla classe di localizzazione:

localization.Culture = CultureInfo.GetCultureInfo("de-DE"); 

Poiché tutte le stringhe vengono prelevati in fase di esecuzione (tutte le chiamate nei file designer.cs generati assomigliano ResourceManager.GetString("SomeString", resourceCulture); e resourceCulture è ciò che viene impostato dalla chiamata sopra, questo influisce su ciò che si ottiene in fase di esecuzione, ma in questo caso si utilizzano i valori nelle voci di menu da xaml, è necessario ricostruire l'intero menu prima che questo abbia effetto

+1

Nota: questa riga di codice deve essere eseguita PRIMA del InitializeComponent(); Method. Altrimenti non funzionerà – Joel

+1

Questo è quello che intendevo con l'ultima frase, funzionerà ancora ma solo per il componente nts che fanno riferimento di nuovo. È possibile aggirare questo problema non utilizzando le stringhe di risorse in xaml, ma piuttosto associare a proprietà osservabili che contengono il valore della risorsa e generare un evento PropertyChanged ogni volta che questo cambia. – stijn