如果你有集成 Abp.Zero 模块的话,可以通过在启动模块的预加载方法编写以下代码启用 Zero 的多语言机制。
Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization();Abp.Zero 针对原有的本地化资源进行了扩展,新增的本地化资源类叫做 MultiTenantLocalizationSource,该类同语言管理器一样,是一个基于多租户实现的本地化资源,内部字典的值是从数据库当中获取的,其大体逻辑与字典本地化资源一样,都是内部维护有一个字典提供器。
在通过 EnableDbLocalization() 方法的时候就直接替换掉了 ILanguageProvider 的默认实现,并且在配置的 Sources 源里面也增加了 MultiTenantLocalizationSource 作为一个本地化资源。
2.5 本地化资源管理器扯了这么多,让我们来看一下最为核心的 ILocalizationManager 接口,如果我们需要获取某个数据源的某个 Key 所对应的多语言值肯定是要注入这个本地化资源管理器来进行操作的。
public interface ILocalizationManager { // 根据名称获得本地化数据源 ILocalizationSource GetSource(string name); // 获取所有的本地化数据源 IReadOnlyList<ILocalizationSource> GetAllSources(); }这里的数据源标识的就是一个命名空间的作用,比如我在 A 模块当中有一个 Key 为 "Home" 的多语言项,在 B 模块也有一个 Key 为 "Home" 的多语言项,这个时候就可以用数据源标识来区分这两个 "Home" 。
本地化资源管理器通过在初始化的时候调用其 Initialize() 来初始化所有被注入的本地化资源,最后并将其放在一个字典之中,以便后续使用。
private readonly IDictionary<string, ILocalizationSource> _sources; foreach (var source in _configuration.Sources) { // ... 其他代码 _sources[source.Name] = source; source.Initialize(_configuration, _iocResolver); // ... 其他代码 } 3.结语针对 Abp 的多语言处理本篇文章不太适合作为入门了解,其中大部分知识需要结合 Abp 源码进行阅读才能够加深理解,此文仅作抛砖引玉之用,如有任何意见或建议欢迎大家在评论当中指出。
4.点此跳转到总目录