2017-04-05 3 views
0

Ich möchte meine WPF Fenster multilanguage. Ich habe bereits this post gelesen. Anstatt die resx Datei zu verwenden, möchte ich, dass die Übersetzungen von einer Instanz meiner Klasse ausgeführt werden, die die Übersetzung verantwortlich ist, da ich sie auch an anderen Stellen der Anwendung verwende.Implementieren WPF mehrsprachige Schnittstelle

Ich dachte, die Binding mit einer converter zu implementieren, die den Schlüsselwert erhält, der übersetzt werden muss. Ich weiß nicht, ob dies der beste Ansatz ist oder ob es eine bessere Lösung gibt.

Jede Hilfe ist wirklich zu schätzen! Vielen Dank.

Antwort

0

Dies ist die Lösung, die ich gefunden:

public class TranslateMarkupExtension : MarkupExtension 
{ 
    [ConstructorArgument("value1")] 
    public string Value1 { get; set; } 

    public TranslateMarkupExtension() { } 

    public TranslateMarkupExtension(string value1) 
    { 
     Value1 = value1; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var rootObjectProvider = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider; 
     var root = rootObjectProvider.RootObject; 

     var translation = GetLangTranslator(root); 

     return string.IsNullOrEmpty(translation) ? Value1 :translation; 
    } 

    private string GetLangTranslator(object root) 
    { 
     var properties = root.GetType().GetProperties(); 

     foreach (var property in properties) 
     { 
      if (typeof(MultiLanguage) == property.PropertyType) 
      {     
       var m = property.PropertyType.GetMethod("Translate"); 

       var propValue = property.GetValue(root); 
       return m.Invoke(propValue, new object[] {Value1}) as string; 
      } 
     } 

     return null; 
    } 
} 

Jetzt habe ich nur zu finden, wie die Benutzeroberfläche zu aktualisieren, wenn die Sprache ändern Laufzeit.

+0

https://wpftutorial.net/LocalizeMarkupExtension.html Dies ist der letzte Teil, um die Laufzeit der Sprache ändern zu lassen –

0

Das ist ein guter Ansatz. Sie können eine MarkupExtension schreiben, um mit den Übersetzungen umzugehen. es wie so verwenden:

<TextBlock Text="{MyNameSpace:Translate 'good night'}"/> 

Die Markupextension wird verantwortlich sein, um Ihre Klasse/Service zu gehen diese Zeichenfolge zu übersetzen und sie zurückbringen.

So brauchen Sie keine unnötigen Bindungen und Konverter.

+0

Vielen Dank! Ich habe dieses Handbuch http://10rem.net/blog/2011/03/09/creating-a-custom-markup-extension-in-wpf-and-soon-silverlight gefolgt und ich habe meine CustomMarkupExtension implementiert. Wie kann ich von der Markup-Erweiterung zu meiner Klasse/meinem Dienst gehen? Muss es eine statische Klasse sein? Vielen Dank! –

+0

Wahrscheinlich habe ich die Lösung gefunden: http://StackOverflow.com/questions/3047448/accessing-current-class-from-wpf-custom-markupextension –

+0

Ja, entweder das oder eine Art Service-Locator verwenden, um eine Implementierung zu erhalten einer Schnittstelle, die Ihre Klasse tun wird. – Mishka

Verwandte Themen