【WPF】Xaml调用.resx资源文件,多语言翻译
参考文章:https://blog.csdn.net/u010839204/article/details/103932044
本文在该文章的基础上进行了 “改进”
这个是基类库,基本处理均在基类库里面完成。须注意 StringResources.resx名字和StringResourcesExtension前部分名字须保持一致。
类 StringResourcesExtension:
namespace Fpi.HandyControl.Language { [MarkupExtensionReturnType(typeof(BindingExpression))] public class StringResourcesExtension : MarkupExtension { /// <summary> /// 资源的名称,与资源文件StringResource.resx对应 /// </summary> [ConstructorArgument("key")] public string Key { get; set; } /// <summary> /// 获取资源内容 /// </summary> public string Value { get => StringResourcesManager.GetString(this.GetType(), Key); } public StringResourcesExtension(string key) : this() { Key = key; } public StringResourcesExtension() { } /// <summary> /// 重写函数 /// </summary> /// <param name="serviceProvider"></param> /// <returns></returns> public override object ProvideValue(IServiceProvider serviceProvider) { Binding binding = new Binding("Value") { Source = this, Mode = BindingMode.OneWay }; return binding.ProvideValue(serviceProvider); } } }
类 StringResourcesManager:
namespace Fpi.HandyControl.Language { public class StringResourcesManager { /// <summary> /// 获取字符串 /// </summary> /// <param name="name"></param> /// <returns></returns> public static string GetString(Type type, string name) { ResourceManager resource = null; var assembly = type.Assembly; if (resourcedic.ContainsKey(assembly)) { resource = resourcedic[assembly]; } else { string ex = "Extension"; resource = new ResourceManager(type.FullName.Substring(0, type.FullName.Length - ex.Length), assembly); resourcedic.Add(assembly, resource); } return resource.GetString(name, CultureInfo); } private static Dictionary<Assembly, ResourceManager> resourcedic = new Dictionary<Assembly, ResourceManager>(); }
基类库完成后,开始写应用库
同样StringResources.resx名字和StringResourcesExtension前部分名字要一致
此时多语言文件对应的文件夹下建一个StringResourcesExtension类即可
namespace HandyControlTest.Language { public class StringResourcesExtension : Fpi.HandyControl.Language.StringResourcesExtension { public StringResourcesExtension() : base() { } public StringResourcesExtension(string key) : base(key) { } } }
类里面不需要写什么代码就继承一下,构造函数加一下,就可以了。目前暂时没想到如何把这一个类省略掉的方法。
xaml中调用:
xmlns:lang="clr-namespace:HandyControlTest.Language" xmlns:lang1="clr-namespace:Fpi.HandyControl.Language;assembly=Fpi.HandyControl"
<Button Name="btntest2" Content="{lang:StringResources Test}" Width="100" Height="35" Grid.Row="2" Grid.Column="1"></Button> <Button Name="btntest1" Content="{lang1:StringResources Test}" Width="100" Height="35" Grid.Row="4" Grid.Column="1"></Button>
试了基类库和应用库两个都可以直接用,后续每增加一个应用类库,只要建个文件夹,创建一个类继承一下就可以了,无需增加额外代码。
附:
多语言工具:ResXManager.VSIX.vsix
链接: https://pan.baidu.com/s/1nKU-0ol1gD3LOiSUxHwsOw 提取码: 0505