本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系。本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单。另一个是语言对应得本地化资源(Localization)的管理,这部分稍显复杂。


LanguageInfo:用于封装language的基本信息。

ILanguageProvider:接口定义一个返回本地化语言集合的方法。这里使用接口做隔离是有必要的,因为ABP底层框架的DefaultLanguageProvider只是返回通过代码hardcode到系统中的LanguageInfo信息。如果需要从其他source(比如数据库)中获取配置的LanguageInfo信息,那么我们就必须实现自定义的LanguageProvider。

DefaultLanguageProvider:从LocalizationConfiguration读取LanguageInfo的集合。

ILanguageManager/LanguageManager:通过调用ILanguageProvider接口返回LanguageInfo的一个集合。以及返回服务器的当前语言设置,如果服务器的当前语言不在LocalizationConfiguration的本地化语言集合中,则返回LocalizationConfiguration的本地化语言集合中的第一项。

以下是上面介绍的接口和类之间的关系


ILocalizationConfiguration/LocalizationConfiguration: 用于配置支持本地化的语言的一个LanguageInfo集合,以及这些语言所对应的本地化资源。这两者分别对应ILocalizationConfiguration中的Lanugages和Sources属性。注意这个Sources是一个ILocalizationSourceList实例。

下面是一个具体的web项目中的本地化配置。

这里有个限制需要留意,本地化资源是以SourceName分组的。比如上面的SimpleTaskSystem就是一个SourceName,其就标注了一组本地化资源(实际项目中获取指定字符串的本地化资源时,必须同时指定一个SourceName,以告知ABP从那组资源文件中读取本地化字符串)。

不能给LocalizationConfiguration的source添加两组本地化资源,而这两组本地化资源却使用同一个SourceName。如果另一组本地化资源需要使用相同的SourceName的话,需要以LocalizationSourceExtensionInfo的形式添加到LocalizationConfiguration的source的Extensions中。

实际项目中本地化资源的路径。

上面图中的资源文件是以什么样的形式被装载到ABP中的呢?图上的代码已经说明,通过DictionaryBasedLocalizationSource实例的形式被添加到LocalizationConfiguration的Sources中。
Source就是一个ILocalizationSourceList实例,是一个List. 另外ILocalizationSourceList实例还有一个IList<LocalizationSourceExtensionInfo>属性,这是用于扩展同组资源文件使用的。

LocalizationSourceExtensionInfo:用于扩展本地化资源。ABP在LocalizationManager初始化的过程中将LocalizationSourceExtensionInfo所对应的本地化资源扩充到ILocalizationSource对象的相应本地化资源字典中。

ILocalizableString/LocalizableString:封装需要被本地化的string的信息,并提供Localize方法(调用ILocalizationManager的GetString方法)返回本地化的string. SourceName指定其从那个本地化资源读取本地化文本。

FixedLocalizableString:封装不需要被本地化的string

ILocalizationContext/LocalizationContext: 上下文类封装了LocalizationManager。一般用作方法调用时的参数。

ILocalizationSource/IDictionaryBasedLocalizationSource/DictionaryBasedLocalizationSource: 从下面的图可以看出这组接口和类大致就相当于Facade模式的实现。ILocalizationManager对象通过ILocalizationSource对象调用各种本地化相关的逻辑。一组本地化资源只对应一个ILocalizationSource实例。

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对象。

ILocalizationDictionaryProvider:它封装了一个IDictionary<string, ILocalizationDictionary>实例(这是ABP在runtime时候,唯一持有本地化资源的对象),其中key就是sourceName(比如上面的"SimpleTaskSystem")。并且提供了一个方法Initialize来初始化本地化这个Dictionary。可以通过实现这个接口来提供其他类型的本地化资源。比如Abp.Zero 就实现了数据库的本地化资源。

LocalizationDictionaryProviderBase:实现了ILocalizationDictionaryProvider的抽象类,实现了extend本地化Dictionary的方法,这个方法主要用于初始化完成以后,用于扩展相应的ILocalizationDictionary对象。

XmlFileLocalizationDictionaryProvider:提供从xml文件中读取本地化信息,并将本地化信息装载到DefaultDictionary(IDictionary<string, ILocalizationDictionary> 对象)中。

JsonFileLocalizationDictionaryProvider:提供从Json文件中读取本地化信息,并将本地化信息装载到DefaultDictionary(IDictionary<string, ILocalizationDictionary> 对象)中。

JsonEmbeddedFileLocalizationDictionaryProvider:提供从xml文件(本地资源)中读取本地化信息,并将本地化信息装载到DefaultDictionary(IDictionary<string, ILocalizationDictionary> 对象)中。

XmlEmbeddedFileLocalizationDictionaryProvider:提供从Json文件(本地资源)中读取本地化信息,并将本地化信息装载到DefaultDictionary(IDictionary<string, ILocalizationDictionary> 对象)中。

ILocalizationManager/LocalizationManager:遍历LocalizationConfiguration中的ILocalizationSourceList实例,通过其ILocalizationSource的ILocalizationDictionaryProvider实例完成本地化资源的初始化。提供GetString方法返回本地化的string.LocalizationManager维护了一个ILocalizationSource对象的字典用于维护所有的本地化资源。

LocalizationManager通过调用InitializeSources初始化和load本地化资源文件中的内容到IDictionary<string,ILocalizationSource>实例对象 _sources中

返回ABP源码分析系列文章目录

最新文章

  1. NBUT 1457 莫队算法 离散化
  2. php读取大文件
  3. vijos1910解方程
  4. iOS 获取键盘相关信息
  5. php底层运行原理
  6. Group Anagrams
  7. 数据结构和算法 &ndash; 10.集合
  8. AFNetworking 3.0 版本使用
  9. 【WPF】提高InkAnalyer手写汉字识别的准确率
  10. Android Studio NDK 学习之接受Java传入的字符串
  11. 在Android的webview中定做js的alert,confirm和prompt对话框的方法
  12. Android ViewPager 应该及技巧
  13. msfconsole弄外网手机木马
  14. [Luogu4175][CTSC2008]网络管理Network
  15. C++11:使用 auto/decltype/result_of使代码可读易维护
  16. 安装Mysql时端口号3306被占用,解决方法
  17. HDFS二.HDFS实现分布式文件存储---体系结构
  18. 【Linux】深入理解Linux中内存管理
  19. Struts2自定义Field级别的错误提示信息
  20. BGP - 2,BGP报文和BGP状态

热门文章

  1. SDWebImage源码解读之SDWebImageDownloaderOperation
  2. ASP.NET Aries 入门开发教程4:查询区的下拉配置
  3. 前端学HTTP之安全HTTP
  4. JavaScript实现常用的排序算法
  5. 深入研究Visual studio 2017 RC新特性
  6. UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)
  7. 简记用ArcGIS处理某项目需求中数据的步骤
  8. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
  9. TFS 安装错误
  10. spring mvc 数据校验