本文逐個分析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中