[Abp 源码分析]十三、多语言(本地化)处理 (4)

在 Abp.Zero 模块还有两外一个实现,叫做 ApplicationLanguageProvider ,这个提供者则是从数据库表 ApplicationLanguage 获取的这些语言列表数据,并且这些语言信息还与租户有关,不同的租户他所能够获得到的语言数据也不一样。

public IReadOnlyList<LanguageInfo> GetLanguages() { // 可以看到这里传入的当前登录用户的租户 Id,通过这个参数去查询的语言表数据 var languageInfos = AsyncHelper.RunSync(() => _applicationLanguageManager.GetLanguagesAsync(AbpSession.TenantId)) .OrderBy(l => l.DisplayName) .Select(l => l.ToLanguageInfo()) .ToList(); SetDefaultLanguage(languageInfos); return languageInfos; } 2.4 本地化资源 2.4.1 本地化资源列表

在多语言模块配置内部使用的是 ILocalizationSourceList 类型的一个 Sources 属性,该类型其实就是继承自 IList<ILocalizationSource> 的一个具体实现而已,一个类型为 ILocalizationSource 的集合,不过其扩展了一个

Extensions 属性用于存放扩展的多语言数据字段。

2.4.2 本地化资源

其接口定义为 ILocalizationSource ,Abp 默认为我们实现了四种本地化资源的实现。

[Abp 源码分析]十三、多语言(本地化)处理

第一个是空实现,可以跳过,第二个则是针对资源文件进行读取的的本地化资源,第三个是基于字典的的本地化资源定义,最后一个是由 Abp Zero 模块所提供的数据库版本的多语言资源定义。

首先看一下该接口的定义:

public interface ILocalizationSource { // 本地化资源唯一的名称 string Name { get; } // 用于初始化本地化资源,在 Abp 框架初始化的时候被调用 void Initialize(ILocalizationConfiguration configuration, IIocResolver iocResolver); // 从当前本地化资源中获取给定关键字的多语言文本项,为用户当前语言 string GetString(string name); // 从当前本地化资源中获取给定关键字与区域文化的多语言文本项 string GetString(string name, CultureInfo culture); // 作用同上,只不过不存在会返回 NULL string GetStringOrNull(string name, bool tryDefaults = true); // 作用同上,只不过不存在会返回 NULL string GetStringOrNull(string name, CultureInfo culture, bool tryDefaults = true); // 获得当前语言所有的多语言文本项集合 IReadOnlyList<LocalizedString> GetAllStrings(bool includeDefaults = true); // 获得给定区域文化的所有多语言文本项集合 IReadOnlyList<LocalizedString> GetAllStrings(CultureInfo culture, bool includeDefaults = true); }

也就可以这么来看,我们有几套本地化资源,他们通过 Name 来进行标识,如果你需要在本地化管理器获取某一套本地化资源,那么你可以直接通过 Name 来进行定位。而每一套本地化资源,自身都拥有具体的多语言数据,这些多语言数据有可能来自文件也有可能来自数据库,这取决于你具体的实现。

2.4.3 基于字典的本地化资源

最开始我们在使用范例当中,通过 DictionaryBasedLocalizationSource 来建立我们的本地化资源对象。该对象实现了 ILocalizationSource 与 IDictionaryBasedLocalizationSource 接口,内部定义了一个本地化资源字典提供器。

当调用本地化资源的 Initialize() 方法的时候,会使用具体的本地化资源字典提供器来获取数据,而这个字典提供器可以为 XmlFileLocalizationDictionaryProvider、JsonEmbeddedFileLocalizationDictionaryProvider 等。

这些内部字典提供器在初始化的时候,会将自身的数据按照 语言/多语言项 的形式将多语言信息存放在一个字典之中,而这个字典又可以分为 XML、JSON 等等等等...

// 内部字典提供器 public interface ILocalizationDictionaryProvider { // 语言/多语言项字典 IDictionary<string, ILocalizationDictionary> Dictionaries { get; } // 本地化资源初始化时被调用 void Initialize(string sourceName); }

而这里的 ILocalizationDictionary 其实就是一个键值对,键关联的是多语言项的标识 KEY,例如 "Home",而 Value 就是具体的展示文本信息了。

而是用字典本地化资源对象获取数据的时候,其实也就是从其内部的字典提供器来获取数据。

[Abp 源码分析]十三、多语言(本地化)处理

例如本地化资源有一个 GetString() 方法,它内部拥有一个字典提供器 DictionaryProvider,我要获取某个 KEY 为 "Home" 所需要经过的步骤如下。

public ILocalizationDictionaryProvider DictionaryProvider { get; } public string GetString(string name) { // 获取当前用户区域文化,标识为 "Home" 的展示文本 return GetString(name, CultureInfo.CurrentUICulture); } public string GetString(string name, CultureInfo culture) { // 获取值 var value = GetStringOrNull(name, culture); // 判断值为空的话,根据配置的要求是否抛出异常 if (value == null) { return ReturnGivenNameOrThrowException(name, culture); } return value; } // 获得 KEY 关联的文本 public string GetStringOrNull(string name, CultureInfo culture, bool tryDefaults = true) { var cultureName = culture.Name; var dictionaries = DictionaryProvider.Dictionaries; // 在这里就开始从初始化所加载完成的语言字典里面,获取具体的多语言项字典 ILocalizationDictionary originalDictionary; if (dictionaries.TryGetValue(cultureName, out originalDictionary)) { // 多语言项字典拿取具体的多语言文本值 var strOriginal = originalDictionary.GetOrNull(name); if (strOriginal != null) { return strOriginal.Value; } } if (!tryDefaults) { return null; } //Try to get from same language dictionary (without country code) if (cultureName.Contains("-")) //Example: "tr-TR" (length=5) { ILocalizationDictionary langDictionary; if (dictionaries.TryGetValue(GetBaseCultureName(cultureName), out langDictionary)) { var strLang = langDictionary.GetOrNull(name); if (strLang != null) { return strLang.Value; } } } //Try to get from default language var defaultDictionary = DictionaryProvider.DefaultDictionary; if (defaultDictionary == null) { return null; } var strDefault = defaultDictionary.GetOrNull(name); if (strDefault == null) { return null; } return strDefault.Value; } 2.3.4 基于数据库的本地化资源

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzfsd.html