ABP源碼分析十二:本地化


本文逐個分析ABP中涉及到locaization的接口和類,以及相互之間的關系。本地化主要涉及兩個方面:一個是語言(Language)的管理,這部分相對簡單。另一個是語言對應得本地化資源(Localization)的管理,這部分稍顯復雜。

 


 

LanguageInfo用於封裝language的基本信息

 

ILanguageProvider接口定義一個返回本地化語言集合的方法。這里使用接口做隔離是有必要的,因為ABP底層框架的DefaultLanguageProvider只是返回通過代碼hardcode到系統中的LanguageInfo信息。如果需要從其他source(比如數據庫)中獲取配置的LanguageInfo信息,那么我們就必須實現自定義的LanguageProvider。

DefaultLanguageProviderLocalizationConfiguration讀取LanguageInfo的集合。

ILanguageManager/LanguageManager:通過調用ILanguageProvider接口返回LanguageInfo的一個集合。以及返回服務器的當前語言設置,如果服務器的當前語言不在LocalizationConfiguration本地化語言集合中,則返回LocalizationConfiguration本地化語言集合中的第一項。

 

以下是上面介紹的接口和類之間的關系

 


 

ILocalizationConfiguration/LocalizationConfiguration: 用於配置支持本地化的語言的一個LanguageInfo集合,以及這些語言所對應的本地化資源。這兩者分別對應ILocalizationConfiguration中的LanugagesSources屬性。注意這個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方法(調用ILocalizationManagerGetString方法)返回本地化的string. SourceName指定其從那個本地化資源讀取本地化文本。

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

 

ILocalizationContext/LocalizationContext: 上下文類封裝了LocalizationManager。一般用作方法調用時的參數。

 

ILocalizationSource/IDictionaryBasedLocalizationSource/DictionaryBasedLocalizationSource: 從下面的圖可以看出這組接口和類大致就相當於Facade模式的實現。ILocalizationManager對象通過ILocalizationSource對象調用各種本地化相關的邏輯。一組本地化資源只對應一個ILocalizationSource實例。

 

 

ILocalizationDictionary提供了索引器this[]方法的接口,該方法接受一個string返回的是本地化的string。當LocalizationManager初始化動作結束后,每一種本地化語言的都對應有且僅有的一個ILocalizationDictionary對象,這個對象用於保存該語言的所有本地化信息。

LocalizationDictionary實現了ILocalizationDictionaryIEnumerable兩個接口,他本身就是一個具有集合操作的類。其內部封裝了一個Dictionary的實例,用於提供真正的集合操作。這個基類只提供了從其內部的Dictionary中根據原string查找返回本地化的string 其本身並沒有將本地化資源文件中的數據加載到其內部的Dictionary的功能,這部分是在其子類中實現的。

XmlLocalizationDictionary實現BuildFomFileBuildFomXmlString方法用於從XML文件讀取本地化數據

JsonLocalizationDictionary實現BuildFromFileBuildFromJsonString方法用於從Json文件讀取本地化數據

JsonLocalizationFile: 反序列化Json字符串到JsonLocalizationFile對象。

 

ILocalizationDictionaryProvider它封裝了一個IDictionary<string, ILocalizationDictionary>實例(這是ABP在runtime時候,唯一持有本地化資源的對象),其中key就是sourceName(比如上面的"SimpleTaskSystem")。並且提供了一個方法Initialize來初始化本地化這個Dictionary。可以通過實現這個接口來提供其他類型的本地化資源。比如Abp.Zero 就實現了數據庫的本地化資源。

LocalizationDictionaryProviderBase實現了ILocalizationDictionaryProvider的抽象類,實現了extend本地化Dictionary的方法,這個方法主要用於初始化完成以后,用於擴展相應的ILocalizationDictionary對象。

XmlFileLocalizationDictionaryProvider提供從xml文件中讀取本地化信息,並將本地化信息裝載到DefaultDictionaryIDictionary<string, ILocalizationDictionary> 對象)中。

JsonFileLocalizationDictionaryProvider提供從Json文件中讀取本地化信息,並將本地化信息裝載到DefaultDictionaryIDictionary<string, ILocalizationDictionary> 對象)中。

JsonEmbeddedFileLocalizationDictionaryProvider:提供從xml文件(本地資源)中讀取本地化信息,並將本地化信息裝載到DefaultDictionaryIDictionary<string, ILocalizationDictionary> 對象)中。

XmlEmbeddedFileLocalizationDictionaryProvider:提供從Json文件(本地資源)中讀取本地化信息,並將本地化信息裝載到DefaultDictionaryIDictionary<string, ILocalizationDictionary> 對象)中。

 

 

ILocalizationManager/LocalizationManager:遍歷LocalizationConfiguration中的ILocalizationSourceList實例,通過其ILocalizationSource的ILocalizationDictionaryProvider實例完成本地化資源的初始化提供GetString方法返回本地化的string.LocalizationManager維護了一個ILocalizationSource對象的字典用於維護所有的本地化資源。

 

 

LocalizationManager通過調用InitializeSources初始化和load本地化資源文件中的內容到IDictionary<string,ILocalizationSource>實例對象 _sources

 

返回ABP源碼分析系列文章目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM