ABP框架学习记录(10)- 本地化
ABP框架学习记录(10)- 本地化
ABP中的本地化主要涉及两个方面:一个是语言(Language)的管理(相对简单),另一个是语言对应得本地化资源(Localization)的管理(稍显复杂)。
目录结构:

引用
在 AbpKernelModule 完成对本地化资源的引用,设置的初始化:
PreInitialize 方法调用 AddLocalizationSources 方法,添加资源:

PreInitialize 方法调用 AddSettingProviders 方法,添加设置:

PostInitialize 方法初始化:

LocalizationManager/ILocalizationManager
遍历 LocalizationConfiguration 中的 ILocalizationSourceList 实例,通过 ILocalizationSource 的ILocalizationDictionaryProvider 实例完成本地化资源的初始化。

ILocalizationSource 接口:

ILocalizationConfiguration/LocalizationConfiguration: 用于配置支持本地化的语言的一个 LanguageInfo 集合,以及这些语言所对应的本地化资源。这两者分别对应 ILocalizationConfiguration 中的 Lanugages 和 Sources 属性。注意这个Sources是一个 ILocalizationSourceList 实例。
DictionaryBasedLocalizationSource
IDictionaryBasedLocalizationSource : 继承 ILocalizationSource 接口,DictionaryBasedLocalizationSource 实现 IDictionaryBasedLocalizationSource 接口,用于构建本地化源,适用于基于内存的词典以查找字符串。

子类的实现:

应用:

LocalizationSourceExtensionInfo:用于扩展本地化资源。ABP在 LocalizationManager 初始化的过程中将LocalizationSourceExtensionInfo 所对应的本地化资源扩充到 ILocalizationSource 对象的相应本地化资源字典中。
LocalizationDictionaryProviderBase
LocalizationDictionaryProviderBase 实现 ILocalizationDictionaryProvider 接口,它封装了一个IDictionary<string, ILocalizationDictionary> 实例(这是ABP在runtime时候,唯一持有本地化资源的对象),其中key就是sourceName。并且提供了一个方法Initialize来初始化本地化这个Dictionary。可以通过实现这个接口来提供其他类型的本地化资源。比如 Abp.Zero 就实现了数据库的本地化资源。

Initialize 方法:

LocalizationDictionaryProviderBase:实现了 ILocalizationDictionaryProvider 的抽象类,实现了extend本地化Dictionary的方法,这个方法主要用于初始化完成以后,用于扩展相应的ILocalizationDictionary对象。
XmlFileLocalizationDictionaryProvider,JsonFileLocalizationDictionaryProvider,JsonEmbeddedFileLocalizationDictionaryProvider,XmlEmbeddedFileLocalizationDictionaryProvider 类,继承 LocalizationDictionaryProviderBase;
LocalizationDictionary
ILocalizationDictionary:提供了索引器this[]方法的接口,该方法接受一个string返回的是本地化的string。当LocalizationManager 初始化动作结束后,每一种本地化语言的都对应有且仅有的一个 ILocalizationDictionary 对象,这个对象用于保存该语言的所有本地化信息。
LocalizationDictionary:实现了 ILocalizationDictionary 和 IEnumerable 两个接口,他本身就是一个具有集合操作的类。其内部封装了一个Dictionary的实例,用于提供真正的集合操作。这个基类只提供了从其内部的Dictionary中根据原string查找返回本地化的string。 其本身并没有将本地化资源文件中的数据加载到其内部的Dictionary的功能,这部分是在其子类中实现的。

XmlLocalizationDictionary:实现 BuildFomFile 和 BuildFomXmlString 方法用于从XML文件读取本地化数据。
JsonLocalizationDictionary:实现 BuildFromFile 和 BuildFromJsonString 方法用于从Json文件读取本地化数据。
JsonLocalizationFile: 反序列化Json字符串到 JsonLocalizationFile 对象。
LanguageManager
ILanguageManager/LanguageManager:通过调用 ILanguageProvider 接口返回 LanguageInfo 的一个集合。以及返回服务器的当前语言设置,如果服务器的当前语言不在 LocalizationConfiguration 的本地化语言集合中,则返回LocalizationConfiguration 的本地化语言集合中的第一项。
ILanguageProvider:接口定义一个返回本地化语言集合的方法。这里使用接口做隔离是有必要的,因为ABP底层框架的DefaultLanguageProvider 只是返回通过代码 hardcode (硬编码) 到系统中的 LanguageInfo 信息。如果需要从其他source(比如数据库)中获取配置的 LanguageInfo 信息,那么我们就必须实现自定义的 LanguageProvider。
DefaultLanguageProvider:从 LocalizationConfiguration 读取 LanguageInfo 的集合。
LanguageInfo:用于封装language的基本信息。
参考: