ABP源码分析十二:本地化
本文逐个分析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源码分析十二:本地化的更多相关文章
- [Abp 源码分析]十二、多租户体系与权限验证
0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的 ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...
- ABP源码分析十四:Entity的设计
IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型 IEntity: 封装了PrimaryKey:Id,这是一个int类型 Entity< ...
- ABP源码分析十五:ABP中的实用扩展方法
类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attribu ...
- ABP源码分析十六:DTO的设计
IDTO:空接口,用于标注Dto对象. ComboboxItemDto:用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于na ...
- ABP源码分析十八:UI Inputs
以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...
- ABP源码分析十九:Auditing
审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作. AuditInfo:定义如下图中需要被Audit的信息. Aud ...
- jQuery 源码分析(十二) 数据操作模块 html特性 详解
jQuery的属性操作模块总共有4个部分,本篇说一下第1个部分:HTML特性部分,html特性部分是对原生方法getAttribute()和setAttribute()的封装,用于修改DOM元素的特性 ...
随机推荐
- 深入理解JS 执行细节
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等 ...
- 利用on和off方法编写高效的js代码
先说下将这个话题的起因:最近发现公司的功能代码,很多在dom对象删除以后,其声明的绑定在window上的resize事件还一直存在,导致相同的功能代码执行了几次.对于我这种轻微代码洁癖的人来说,简直是 ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- Android带加减的edittext
看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...
- 【云知道】究极秒杀Loadrunner乱码
Loadrunner乱码一击必杀 之前有介绍一些简单的针对Loadrunner脚本或者调试输出内容中乱码的一些设置,但是并没能完全解决一些小伙伴的问题,因为那些设置实在能力有限,还是有很多做不到的事情 ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- “风投云涌”:那些被资本看中的IT企业的风光与辛酸
进入七月份以来,纷享销客获得D轮融资1亿美元,撼动业界,资本与IT联姻令一部分创业者眼红的同时,没有人注意到背后的风险. 科技与资本的结合,是当今经济社会前行的宏大主题.相关统计显示,软件行 ...
- Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...
- 小程序用户反馈 - HotApp小程序统计仿微信聊天用户反馈组件,开源
用户反馈是小程序开发必要的一个功能,但是和自己核心业务没关系,主要是产品运营方便收集用户的对产品的反馈.HotApp推出了用户反馈的组件,方便大家直接集成使用 源码下载地址: https://gith ...
- C#事件-使用事件需要的步骤
事件是C#中另一高级概念,使用方法和委托相关.奥运会参加百米的田径运动员听到枪声,比赛立即进行.其中枪声是事件,而运动员比赛就是这个事件发生后的动作.不参加该项比赛的人对枪声没有反应. 从程序员的角度 ...