2017-04-05 157 views
0

我想讓我的WPF窗口multilanguage。我已閱讀this post。我不希望使用resx文件,而是希望翻譯由我的類的實例執行,因爲我在應用程序的其他位置也使用它進行翻譯。執行WPF多國語言界面

我認爲實施Bindingconverter接收鍵值必須翻譯。我不知道這是最好的方法,還是有更好的解決方案。

任何幫助真的很感激!謝謝。

回答

0

這是我找到了解決辦法:

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; 
    } 
} 

現在我剛剛找到如何更新時,在界面語言更改運行時間。

+0

https://wpftutorial.net/LocalizeMarkupExtension.html這是爲了讓語言更改運行時的最後一部分 –

0

這是一個很好的方法。 您可以編寫一個MarkupExtension來處理翻譯。 使用它像這樣:

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

的的MarkupExtension負責去你的類/服務來翻譯 該字符串並將其返回。

這樣你不需要有不必要的綁定和轉換器。

+0

謝謝!我遵循這個指南http://10rem.net/blog/2011/03/09/creating-a-custom-markup-extension-in-wpf-and-soon-silverlight,我已經實現了我的CustomMarkupExtension。我怎樣才能從標記擴展中「去我的課程/服務」?它必須是一個靜態類嗎?謝謝! –

+0

也許我找到了解決方案:http://stackoverflow.com/questions/3047448/accessing-current-class-from-wpf-custom-markupextension –

+0

是的,無論是或通過使用某種服務定位器,以獲得一個實現一個接口,你的班級會做什麼。 – Mishka