官方文档描述不是很友好,有部分内容不好理解什么意思。
此文记录一下自己踩坑经验。


  • 安装 NuGet包 Volo.Abp.Localization

  • 添加模块依赖

    • 以下模块在框架里已经引用了 AbpLocalizationModule ,如果已经依赖了下面的任何一个,相关的Nuget包也可以不安装
      • AbpAspNetCoreMvcModule
      • AbpApplicationModule
      • AbpApplicationContractsModule
      • AbpAuthrizationModule
      • AbpFeaturesModule
      • AbpExceptionHandlingModule
  • 定义一个普通的类与 json 文件放在一起,用于定位文件

    public class TestResource
    {
    }
    
  • 在自己模块中配置如下信息(也可以抽离一个新的模块)

    // 程序集根命名空间为:Haha.Abc.Efg
    // 在AbpLocalizationOptions配置了.AddVirtualJson("/Resources");    
    //    1. AddEmbedded<TestResource>(),虚拟文件路径为:/Haha/Abc/Efg/Resources
    //    2. AddEmbedded<TestResource>("Haha.Abc.Efg"),虚拟文件路径为:/Resources
    [DependsOn(typeof(AbpLocalizationModule))]
    public class MyModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Configure<AbpVirtualFileSystemOptions>(options =>
            {
                options.FileSets.AddEmbedded<TestResource>("YourRootNameSpace");
            });
    
            Configure<AbpLocalizationOptions>(options =>
            {
                options.Resources
                    //.Add<TestResource>("en")
                    //.Add<TestResource>("zh-Hant")
                    .Add<TestResource>("zh-Hans")
                    .AddVirtualJson("/Localization/Resources/Test");
            });
        }
    }
    
  • 本地化文件内容

    {
      "culture": "en",
      "texts": {
        "HelloWorld": "Hello World!"
      }
    }
    
    • culture是文化代码,用于在Module里配置
    • texts是语言文本键值对,是一个对象
  • 使用

    public class MyService
    {
        private readonly IStringLocalizer<TestResource> _localizer;
    
        public MyService(IStringLocalizer<TestResource> localizer)
        {
            _localizer = localizer;
        }
    
        public void Foo()
        {
            var str = _localizer["HelloWorld"];
        }
    }
    
  • 异常中使用

    // 本地化文件内可配置插值
    {
      "culture": "zh-Hans",
      "texts": {
        "Warehouse:NotFound": "未找到Id为【{id}】的仓库!",
        "Warehouse:IdIsNullOrEmpty": "Id不能为空!",
        "Warehouse:NameIsEmpty": "仓库名不能为空!",
        "Warehouse:NameIsTheSame": "新仓库名与旧仓库名一样!",
        "Warehouse:CodeAlreadyExist": "编号为【{code}】的仓库已存在!"
      }
    }
    
    // 代码中抛出异常
    var id = "3fa85f64-5717-4562-b3fc-2c963f66afa6";
    throw new BusinessException(code: "Warehouse:NotFound").WithData("id", id);
    
    // 最终结果
    {
      "error": {
        "code": "Warehouse:NotFound",
        "message": "未找到Id为【3fa85f64-5717-4562-b3fc-2c963f66afa6】的仓库!",
        "details": null,
        "data": {
          "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        },
        "validationErrors": null
      }
    }
    
  • 语言文件(比如 en.json)要选择“嵌入的资源” 重要


https://docs.abp.io/zh-Hans/abp/latest/Localization

https://github.com/abpframework/abp

相关文章:

  • 2021-11-13
  • 2021-07-02
  • 2021-09-24
  • 2021-12-14
  • 2021-09-10
  • 2022-12-23
  • 2021-11-19
  • 2021-11-25
猜你喜欢
  • 2021-07-23
  • 2021-09-08
  • 2022-02-08
  • 2022-12-23
  • 2021-06-21
  • 2021-06-11
相关资源
相似解决方案