ABP与BootstrapBlazor 本地化相关处理

发布时间 2023-06-21 10:20:49作者: HUGO.CM

最近研究ABP与BootstrapBlazor搭配使用。
但涉及到本地化文件格式,及处理上,两者不同。但各有千秋。
同CRUD下:ABP是有创建、修改、查询、显示等多个模型。但是BootstrapBlazor只需一个模型就能处理所有。
BootstrapBlazor很多组件是根据模型自动解析生成编辑组件。也只适配自己的本地化文件格式。如果想体现多业务模型这时候,就得创建好几个基本一模一样本地化文件内容。
想着极限偷懒的原则,在请教BootstrapBlazor作者后。经过多次研究,在此代码中添加一段代码即可。

public static IStringLocalizer? GetStringLocalizerFromService(Assembly assembly, string typeName) => assembly.IsDynamic
        ? null
        : Instance.GetOrCreate($"{nameof(GetStringLocalizerFromService)}-{CultureInfo.CurrentUICulture.Name}-{assembly.GetName().Name}-{typeName}", entry =>
    {
        IStringLocalizer? ret = null;
        var factories = Instance.Provider.GetServices<IStringLocalizerFactory>();
        if (factories != null)
        {
            var factory = factories.LastOrDefault(a => a is not JsonStringLocalizerFactory);
            if (factory != null)
            {
                var type = assembly.GetType(typeName);
                if (type != null)
                {
                    ret = factory.Create(type);

                    #region BB各组件 兼容Abp本地化
                    if (ret.GetType().FullName == "Microsoft.Extensions.Localization.ResourceManagerStringLocalizer")
                    {
                        var fType = factory.GetType();
                        if (fType.Name == "AbpStringLocalizerFactory")
                        {
                            ret = (IStringLocalizer)fType.InvokeMember("CreateDefaultOrNull", BindingFlags.Default | BindingFlags.InvokeMethod, null, factory, null);
                        }
                    }
                    #endregion
                }
            }
        }
        return ret;
    });

以上为本人一厢情愿想法,如有想法雷同,可借鉴参考。