【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 

posted on 2024-02-16 20:11  梦琪小生  阅读(224)  评论(0编辑  收藏  举报

导航