ABP与BootstrapBlazor 本地化相关处理
最近研究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; ... }
以上为本人一厢情愿想法,如有想法雷同,可借鉴参考。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!