You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ABP框架如何从数据库/外部API加载本地化资源?

ABP框架从数据库加载本地化资源配置方案

要在ABP框架中从数据库加载本地化资源,需要自定义本地化资源贡献者(Contributor)替换默认的文件加载逻辑,具体步骤如下:

1. 定义本地化存储实体与仓储

首先创建数据库实体,用于持久化翻译内容:

public class LocalizationText : Entity<Guid>
{
    public string ResourceName { get; set; } // 对应本地化资源类名称(如MetadataResource)
    public string CultureName { get; set; } // 文化编码(如en、zh-Hans)
    public string Key { get; set; } // 本地化键
    public string Value { get; set; } // 翻译值
}

实现仓储接口与EF Core实现,用于查询数据库中的翻译数据:

public interface ILocalizationTextRepository : IRepository<LocalizationText, Guid>
{
    Task<List<LocalizationText>> GetListAsync(string resourceName, string cultureName);
}

public class LocalizationTextRepository : EfCoreRepository<MyDbContext, LocalizationText, Guid>, ILocalizationTextRepository
{
    public LocalizationTextRepository(IDbContextProvider<MyDbContext> dbContextProvider) 
        : base(dbContextProvider)
    {
    }

    public async Task<List<LocalizationText>> GetListAsync(string resourceName, string cultureName)
    {
        return await DbSet
            .Where(t => t.ResourceName == resourceName && t.CultureName == cultureName)
            .ToListAsync();
    }
}

2. 实现数据库本地化贡献者

继承LocalizationContributor,重写资源加载逻辑,从数据库获取翻译内容:

public class DbLocalizationContributor : LocalizationContributor
{
    private readonly ILocalizationTextRepository _localizationTextRepository;

    public DbLocalizationContributor(ILocalizationTextRepository localizationTextRepository)
    {
        _localizationTextRepository = localizationTextRepository;
    }

    public override async Task<IReadOnlyList<LocalizationString>> GetStringsAsync(
        LocalizationResource resource, 
        string cultureName, 
        bool includeDefaults = false)
    {
        var dbTexts = await _localizationTextRepository.GetListAsync(resource.Name, cultureName);
        return dbTexts.Select(t => new LocalizationString(t.Key, t.Value)).ToList();
    }

    public override Task<bool> IsResourceExistsAsync(LocalizationResource resource)
    {
        // 可根据实际业务判断资源是否存在,此处默认返回true
        return Task.FromResult(true);
    }
}

3. 配置本地化资源使用数据库贡献者

在模块的ConfigureServices方法中,替换原有的文件加载方式为数据库贡献者:

public override void ConfigureServices(ServiceConfigurationContext context)
{
    Configure<AbpLocalizationOptions>(options =>
    {
        // 为英文添加MetadataResource并绑定数据库贡献者
        options.Resources
            .Add<MetadataResource>("en")
            .AddBaseTypes(typeof(AbpValidationResource))
            .AddContributor<DbLocalizationContributor>();

        // 如需支持中文,添加对应文化的资源配置
        options.Resources
            .Get<MetadataResource>()
            .AddCulture("zh-Hans")
            .AddContributor<DbLocalizationContributor>();
    });
}

额外说明

  • 缓存优化:为避免频繁查询数据库,可在DbLocalizationContributor中集成IDistributedCache或IMemoryCache,缓存对应资源与文化的翻译内容。
  • 混合加载:若需同时使用文件与数据库资源,可保留AddVirtualJson并添加AddContributor,ABP会自动合并两者内容,数据库中的键值会覆盖文件中的同名键。
  • 外部API适配:如果要从外部API加载资源,只需修改DbLocalizationContributor中的数据获取逻辑,将数据库查询替换为API调用即可。

内容的提问来源于stack exchange,提问作者Mantas Čekanauskas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:25:56