官方文档描述不是很友好,有部分内容不好理解什么意思。
此文记录一下自己踩坑经验。
-
安装 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)要选择“嵌入的资源” 重要