惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
美团技术团队
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
有赞技术团队
有赞技术团队
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
Google DeepMind News
Google DeepMind News
月光博客
月光博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Recent Announcements
Recent Announcements
MongoDB | Blog
MongoDB | Blog

博客园 - HUGO.CM

安装OpenCode后,无法使用。解决方案 修改Abp中Auto API Controllers中 默认生成的 Put、Delete请求 vs2022 开发Python 中文报错:SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte Abp9.0.4运行DbMigrator,报错“The LINQ expression '@__organizationUnitIds_0' could not be translated. ...” 执行abp命令时,出现死循环解决方案 【机译】ABP Helper Methods Blazor文件上传异常:Did not receive any data in the allotted time Abp报错:AbpException: No theme registered! Use AbpThemingOptions to register themes. Abp分布式实体缓存 Abp vNext 在控制台输出SQL 【译】在 ABP 框架项目中配置多个数据库上下文 ABP浏览页面报错:Could not find the bundle file '/libs/abp/core/abp.css' for the bundle 'LeptonXLite.Global' 或 'Basic.Global' 运行abp install-libs再报错npm ERR! code E404 Abp配置文件设置IdentityServer客户端 精简版Abp开发教程 - 第三章: 创建应用程序 精简版Abp开发教程 - 第二章: 创建实体与数据库 精简版Abp开发教程 - 第一章: 创建解决方案 Abp vNext 使用Mysql数据库 Abp vNext 修改默认表前缀 Abp vNext 使用sql2005、sql2008等脚本报错解决
ABP与BootstrapBlazor 本地化相关处理
HUGO.CM · 2023-06-21 · via 博客园 - HUGO.CM

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

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;
    });

在设置ABP内嵌本地化文件时,如果设置这段代码,也是无用的。因为ABP与BB对于本地化文件存放路径完全不一样。就算设置了JsonLocalizationOptions.ResourcesPath或者将ABP的本地化文件改成与BB一致,存放Locales,都是无用功。

options.AdditionalJsonAssemblies = new Assembly[]
 {
	typeof(BookStoreDomainSharedModule).Assembly
 };

再就是使用AdditionalJsonFiles进行设置,千万别使用绝对路径

// 设置 Json 物理路径文件
options.AdditionalJsonFiles = new string[]
{
	@"D:\Acme.BookStore.Test\Acme.BookStore.Domain.Shared\Localization\BookStore\en.json",
	@"D:\Acme.BookStore.Test\Acme.BookStore.Domain.Shared\Localization\BookStore\zh-Hans.json",
	@"D:\Acme.BookStore.Test\Acme.BookStore.Domain.Shared\Localization\BookStore\zh-Hant.json"
};

综上所述,又想偷懒,所以LocalizationOptionsExtensions改造如下代码,Module只需设置AdditionalJsonAssemblies即可。

private static List<Stream> GetResourceStream(this JsonLocalizationOptions option, Assembly assembly, string cultureName)
    {
        var ret = new List<Stream>();

        // 如果开启回落机制优先增加回落语言
        if (option.EnableFallbackCulture)
        {
            AddStream(option.FallbackCulture);
        }

        // 查找父资源
        var parentName = GetParentCultureName(cultureName).Value;
        if (!string.IsNullOrEmpty(parentName) && !EqualFallbackCulture(parentName))
        {
            AddStream(parentName);
        }

        // 当前文化资源
        if (!EqualFallbackCulture(cultureName))
        {
            AddStream(cultureName);
        }

        #region 获取ABP内嵌本地化文件
        if (ret.Count == 0)
        {
            foreach (var json in assembly.GetManifestResourceNames())
            {
                if (json.EndsWith($"{cultureName}.json"))
                {
                    var stream = assembly.GetManifestResourceStream(json);
                    if (stream != null)
                    {
                        ret.Add(stream);
                    }
                }
            }
        }
        #endregion
        
        return ret;

        ...
    }

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