实现WPF多语言界面

时间:2017-04-05 13:16:09

标签: c# wpf binding multilingual

我想制作WPF窗口multilanguage。 我已经阅读了this post。我希望翻译是由我的类的实例执行的,而不是使用resx文件,因为我在应用程序的其他方面也使用它。

我想用Binding实现converter,它接收必须翻译的键值。我不知道这是最好的方法还是有更好的解决方案。

任何帮助都非常感谢!感谢。

2 个答案:

答案 0 :(得分:0)

这是一个很好的方法。 您可以编写MarkupExtension来处理翻译。 像这样使用它:

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

MarkupExtension将负责转到您的班级/服务进行翻译 该字符串并将其返回。

这样你就不需要有不必要的绑定和转换器。

答案 1 :(得分: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;
    }
}

现在我只想找到在语言更改运行时更新UI的方法。