实现 WPF 多语言界面
Implement WPF multilanguage interface
我想制作我的 WPF
window multilanguage
。
我已经阅读 this post。我希望翻译由我的 class 实例执行,而不是使用 resx
文件,这是负责翻译的,因为我也在应用程序的其他点使用它。
我想用 converter
来实现 Binding
,它接收必须翻译的键值。我不知道这是否是最好的方法,或者是否有更好的解决方案。
非常感谢任何帮助!谢谢。
这是个好方法。
您可以编写一个 MarkupExtension 来处理翻译。
像这样使用它:
<TextBlock Text="{MyNameSpace:Translate 'good night'}"/>
MarkupExtension会负责去你的class/service翻译
该字符串和 return 它。
这样你就不需要有不必要的绑定和转换器。
这是我找到的解决方案:
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。
我想制作我的 WPF
window multilanguage
。
我已经阅读 this post。我希望翻译由我的 class 实例执行,而不是使用 resx
文件,这是负责翻译的,因为我也在应用程序的其他点使用它。
我想用 converter
来实现 Binding
,它接收必须翻译的键值。我不知道这是否是最好的方法,或者是否有更好的解决方案。
非常感谢任何帮助!谢谢。
这是个好方法。 您可以编写一个 MarkupExtension 来处理翻译。 像这样使用它:
<TextBlock Text="{MyNameSpace:Translate 'good night'}"/>
MarkupExtension会负责去你的class/service翻译 该字符串和 return 它。
这样你就不需要有不必要的绑定和转换器。
这是我找到的解决方案:
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。