ABP https://abp.io/ 提供的启动模板, 默认使用是英文:
虽然可以通过右上角的菜单切换成中文, 但是对于国内项目来说, 默认使用中文是很正常的需求.
本文介绍了如何实现默认语言的几种方法, 希望能对 ABP 爱好者有所帮助, Let's begin!
前期准备
使用 ABP CLI https://docs.abp.io/en/abp/master/CLI 创建一个名为 AbpStudy 的 ASP.NET MVC 项目:
abp new AbpStudy
关于 MVC 的启动模板可以看文档, 这里就不赘述.
使用 ABP 版本的是当前最新的 v0.19, 后续版本应该也适用
方法 1: 通过服务设置
该方法参考了此回答, 谢谢 @maliming.
编辑 AbpStudy.web 工程下的 Startup.cs 文件, 在 Configure 方法的开始增加一行代码:
- public void Configure(IApplicationBuilder App, ILoggerFactory loggerFactory)
- {
- App.ApplicationServices.GetService<ISettingDefinitionManager>().Get(LocalizationSettingNames.DefaultLanguage).DefaultValue = "zh-Hans"; // 默认使用中文
- App.InitializeApplication();
- }
该方法首先获取了 SettingDefinitionManager 的服务实例, 然后调用 Get 方法获取了默认语言的 SettingDefinition, 然后设置了默认值 "zh-Hans", 即中文.
运行, 就会发现默认语言已经变成中文了:
怎么样, 非常简单吧?
关于 ABP 的 Setting, 现在官方的文档还未写完. 等待官方文档完善后我会更新到文章里
方法 2: 通过数据设置
虽然方法 1 非常简单, 但是因为是通过代码写死了默认语言, 如果想设置其他默认语言, 只能再次修改代码.
既然默认语言是通过 Setting 设置的, 那么我们可不可以通过数据设置默认语言呢? 答案是肯定的.
ABP 启动模板的数据库中有一个名为 AbpSettings 的表, 里面即是各种 Setting 的值.
我们可以向其中增加一条默认语言的记录:
- INSERT INTO AbpSettings(Id, Name, Value, ProviderName)
- Values(newid(), 'Abp.Localization.DefaultLanguage', 'zh-Hans', 'Global')
其中的 Name 的值即是方法 1 中 LocalizationSettingNames.DefaultLanguage 的值, 相当于默认语言 Setting 的一个 Key.
插入后的结果:
把方法 1 中我们增加的那行代码删除后, 再次运行确认默认语言仍然是中文.
如果我们把记录中的 "zh-Hans" 改为 "en", 重新运行后默认语言就会切换成英文了.
方法 3: 通过 Seed 设置
方法 3 实际上是方法 2 的一个改进: 我们利用了 ABP 提供了 Seed 系统 (即可通过代码初始化系统的一些数据), 这样我们在正式上线项目时, 不需要再额外执行 SQL 语句来执行数据初始化了.
首先我们把 AbpSettings 表中我们手动插入的那条记录删除.
然后在 AbpStudy.Domain 工程的 Settings 文件夹中增加一个名为 AbpStudySettingDataSeedContributor 的类, 用来为 Setting 设置初始化数据. 类代码如下:
- public class AbpStudySettingDataSeedContributor : IDataSeedContributor, ITransientDependency
- {
- private readonly IGuidGenerator _guidGenerator;
- private readonly ISettingRepository _settingRepository;
- public AbpStudySettingDataSeedContributor(IGuidGenerator guidGenerator, ISettingRepository settingRepository)
- {
- _settingRepository = settingRepository;
- _guidGenerator = guidGenerator;
- }
- public async Task SeedAsync(DataSeedContext context)
- {
- await _settingRepository.InsertAsync(new Setting(
- _guidGenerator.Create(),
- LocalizationSettingNames.DefaultLanguage,
- "zh-Hans",
- GlobalSettingValueProvider.ProviderName
- ));
- }
该类注入了 GuidGenerator 用来生成 GUID, 和 SettingRepository 用来向 AbpSettings 表插入数据.
在 SeedAsync 方法中使用 InsertAsync 方法插入了默认语言的记录, 记录的值与方法 2 中 SQL 中是一致的.
然后我们运行 AbpStudy.DbMigrator 工程, 这是启动模板附带的一个用来执行数据库迁移的一个工具, 它会扫描到我们刚写的 AbpStudySettingDataSeedContributor 类并调用它, 从而完成数据初始化.
AbpStudy.DbMigrator 工程有自己的数据库连接串, 定义在 appsettings.JSON 文件中, 别忘了将它修改成与 Web 工程中的一样.
运行 DbMigrator 截图:
再次查看 AbpSettings 表中的数据, 发现记录已经插入了, 与我们使用 SQL 语句插入的一样, 所以默认中文也同样可以生效.
禁用其他语言
如果你的项目不用考虑多语言, 那么右上角的语言切换菜单就显得有点多余了, 我们可以通过以下修改禁用其他语言:
修改 AbpStudy.Web 工程下的 AbpStudyWebModule 类, 将 ConfigureLocalizationServices 方法中其他语言的 options.Languages.Add(...) 代码删除, 只保留中文的即可:
- private void ConfigureLocalizationServices()
- {
- Configure<AbpLocalizationOptions>(options =>
- {
- options.Resources
- .Get<AbpStudyResource>()
- .AddBaseTypes(
- typeof(AbpUiResource)
- );
- //options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
- //options.Languages.Add(new LanguageInfo("en", "en", "English"));
- //options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
- //options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
- options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
- });
- }
再次运行, 发现右上角语言切换的菜单就不见了, 完美!
关于 ABP 框架设置默认语言的方法就介绍到这, 示例工程放到 GitHub https://github.com/wakuflair/AbpStudy 中.
Happy Coding!
来源: https://www.cnblogs.com/waku/p/11433242.html