2016-11-25 25 views
2

Ich habe eine DropDown (mit MahApps, wenn das wichtig ist), die ich verwenden möchte, um die Sprache "on the fly" in meinem Programm zu wechseln.Sprache/Ressource programmatisch mit WPF ändern

Sprache Klasse

namespace SAM 
{ 
    public class Language 
    { 
     public string Title { get; set; } 
     public string Culture { get; set; } 
    } 
} 

Sprache ändern

private void DropLanguage_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    Language lang = DropLanguage.SelectedItem as Language; 
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang.Culture); 
} 

ich alle meine Strings als Ressourcen in Resources.resx (Standard) und Resources.en.resx (Englisch)

3 Ausgaben Ich bin nicht un derstand

  • Wenn „englisch“ aus der Drop-down-Auswahl ändert sich die Sprache nicht sofort, aber wenn ich etw klicken. sonst, z.B. "nah" (es fragt "sicher?"), die Sprache hat sich geändert.
  • Zeichenfolgen, die direkt in der .xaml-Datei wie <TextBlock Text="{x:Static p:Resources.Config_HeaderBar_Find_Speaker}" /> sind, werden überhaupt nicht aktualisiert.
  • Bonus: Wie würde ich zurück zur Standardsprache wechseln, als new CultureInfo(lang.Culture); erwartet einen Parameter und für den Standard habe ich Culture = null (wie die Resources.resx hat nichts in seinem Namen). Ändern Sie die Datei auf Resources.default.resx Verwirrungen mit meinem Code viel ...

Wenn eines der Probleme behoben werden könnte, wäre ich sehr dankbar ...

Antwort

0

Es gibt 2 Dinge

Thread.CurrentThread.CurrentCulture 

und Thread.CurrentThread.CurrentUICulture

um diese valuse verwenden, um die statische Methode

einzustellen
CultureInfo.GetCultureInfo(String langCode) 

wo einige Beispiele für die Parameter langcode sind folgende Strings

"de-DE" 
"en-US" 

usw.

weitere Informationen bei

https://msdn.microsoft.com/en-us/library/yck8b540(v=vs.110).aspx

Also, insgesamt diese Zeilen Code sould Arbeit für Änderungen in Deutsch Sprache:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE"); 
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE"); 
2

Ich versuchte, ähnliches Problem zu lösen. Die einfachste Lösung für mich war, den gesamten Fensterinhalt in UserControl zu verschieben und die Schnittstelle für das Fenster mit der Methode refreshLanguage() zu erstellen.Dann rufe ich aus Modell:

private void SetLanguage(string cultureName) 
    { 
     var cul = new System.Globalization.CultureInfo(cultureName); 
     Properties.Resources.Culture = cul; 
     System.Globalization.CultureInfo.DefaultThreadCurrentCulture = cul; 
     System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = cul; 
     System.Threading.Thread.CurrentThread.CurrentUICulture = cul; 
     System.Threading.Thread.CurrentThread.CurrentCulture = cul; 
     InitializeHamburgerMenu(); 
     MainWindowView.RegreshLanguage(); 
     RaisePropertyChanged("Title"); 
    } 

Und RefreshLanguage in Fenstern wie folgt aussieht:

public void RegreshLanguage() 
    { 
     GlobalUserControl content = new GlobalUserControl("Views/SettingsPage.xaml"); 
     ContentPresenter_GlobalUserControl.Content = content; 
    } 

In meinem Fall Usercontrol Navigation bietet, so dass ich bestehen zuletzt navigierten URI als Parameter. Wenn Sie also den Status beibehalten möchten, können Sie ihn als Parameter an das neue UserControl übergeben. Das erneute Erstellen von Benutzersteuerelementen bewirkt, dass alle Strings ohne Fensterwiederherstellung neu geladen werden. Vielleicht wäre eine gute Idee, hier GC.Collect(); zu nennen, aber hängt von Ihrem Szenario ab.

Über Standard neutrale Kultur. Für mich arbeitet SetLanguage("") anrufen.

Verwandte Themen