1. 程式人生 > >ABP原始碼分析十二:本地化

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原始碼分析本地化

本文逐個分析ABP中涉及到locaization的介面和類,以及相互之間的關係。本地化主要涉及兩個方面:一個是語言(Language)的管理,這部分相對簡單。另一個是語言對應得本地化資源(Localization)的管理,這部分稍顯複雜。 LanguageInfo:用於封裝language的基本

ABP原始碼分析Entity的設計

IEntity<TPrimaryKey>: 封裝了PrimaryKey:Id,這是一個泛型型別 IEntity: 封裝了PrimaryKey:Id,這是一個int型別 Entity<TPrimaryKey> :支援主鍵是泛型型別的Entity Entity:支援主鍵是int型別的

ABP原始碼分析DTO的設計

IDTO:空介面,用於標註Dto物件。 ComboboxItemDto:用於combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用於name value鍵值對的DTO, name為string型別, value為泛型或string型別。

ABP原始碼分析DTO 自動校驗的實現

對傳給Application service物件中的方法的DTO引數,ABP都會在方法真正執行前自動完成validation(根據標註到DTO物件中的validate規則)。 ABP是如何做到的? 思路無外乎通過Castle的攔截器實現AOP。本文主要分析ABP是如何設計。 Ivalidate: 空介面,用

ABP原始碼分析Auditing

審計跟蹤(也叫審計日誌)是與安全相關的按照時間順序的記錄,它們提供了活動序列的文件證據,這些活動序列可以在任何時間影響一個特定的操作。 AuditInfo:定義如下圖中需要被Audit的資訊。 AuditedAttribute: 用於標識一個方法或一個類的所有方法都需要啟用Auditing功能

ABP原始碼分析Timing

Timing這個簡單實用的功能主要用於以統一的方式表示時間。因為ABP中有大量的module,還支援自定義module,所以將時間統一表示為local時間(預設)或utc時間是必要的。 IClockProvider:提供獲取當前時間和標準化時間的介面。 UtcClockProvider:實現了以UTC

ABP原始碼分析UI Inputs

以下圖中描述的介面和類都在Abp專案的Runtime/Validation, UI/Inputs目錄下的。在當前版本的ABP(0.83)中這些介面和類並沒有實際使用到。閱讀程式碼時可以忽略,無需浪費時間去尋找其是如何被ABP使用的(本文的目的)。 這些介面和類最終都是通過IInputType被Feature

Spring Security原始碼分析Spring Security OAuth2基於JWT實現單點登入

單點登入(英語:Single sign-on,縮寫為 SSO),又譯為單一簽入,一種對於許多相互關連,但是又是各自獨立的軟體系統,提供訪問控制的屬性。當擁有這項屬性時,當用戶登入時,就可以獲取所有

ABP原始碼分析四十三ZERO的本地化

ABP Zero模組擴充套件了ABP基礎框架中的本地化功能,實現了通過資料庫管理本地化的功能。其通過資料庫儲存本地化語言及其資源。 ApplicationLanguage:代表本地化語言的實體類。一種語言就是一個ApplicationLanguage例項。 ApplicationLanguag

ABP原始碼分析Unit Of Work

ABP以AOP的方式實現UnitOfWork功能。通過UnitOfWorkRegistrar將UnitOfWorkInterceptor在某個類被註冊到IOCContainner的時候,一併新增到該類在容器中對應的ComponentModel的Interceptors集合中。總結一句話就是,UOW的功能是通過

[Abp 原始碼分析]四、DTO 自動驗證

0.簡介 在平時開發 API 介面的時候需要對前端傳入的引數進行校驗之後才能進入業務邏輯進行處理,否則一旦前端傳入一些非法/無效資料到 API 當中,輕則導致程式報錯,重則導致整個業務流程出現問題。 用過傳統 ASP.NET MVC 資料註解的同學應該知道,我們可以通過在 Model 上面指定各種資料特性,然

[Abp 原始碼分析]五、自動審計記錄

0.簡介 Abp 框架為我們自帶了審計日誌功能,審計日誌可以方便地檢視每次請求介面所耗的時間,能夠幫助我們快速定位到某些效能有問題的介面。除此之外,審計日誌資訊還包含有每次呼叫介面時客戶端請求的引數資訊,客戶端的 IP 與客戶端使用的瀏覽器。有了這些資料之後,我們就可以很方便地復現介面產生 BUG 時的一些環

[Abp 原始碼分析]六、後臺作業與後臺工作者

0. 簡介 在某些時候我們可能會需要執行後臺任務,或者是執行一些週期性的任務。比如說可能每隔 1 個小時要清除某個臨時資料夾內的資料,可能使用者會要針對某一個使用者群來群發一組簡訊。前面這些就是典型的應用場景,在 Abp 框架裡面為我們準備了後臺作業和後臺工作者來幫助我們解決這個問題。 後臺作業與後臺工作者的

[Abp 原始碼分析]七、ASP.NET Core 整合

0. 簡介 整個 Abp 框架最為核心的除了 Abp 庫之外,其次就是 Abp.AspNetCore 庫了。雖然 Abp 本身是可以用於控制檯程式的,不過那樣的話 Abp 就基本沒什麼用,還是需要集合 ASP.NET Core 才能發揮它真正的作用。 在 Abp.AspNetCore 庫裡面,Abp 通過 W

[Abp 原始碼分析]一、許可權驗證

0.簡介 Abp 本身集成了一套許可權驗證體系,通過 ASP.NET Core 的過濾器與 Castle 的攔截器進行攔截請求,並進行許可權驗證。在 Abp 框架內部,許可權分為兩塊,一個是功能(Feature),一個是許可權項(Permission),在更多的時候兩者僅僅是概念不同而已,大體處理流程還是一樣

[Abp 原始碼分析]、異常處理

0.簡介 Abp 框架本身針對內部丟擲異常進行了統一攔截,並且針對不同的異常也會採取不同的處理策略。在 Abp 當中主要提供了以下幾種異常型別: 異常型別 描述 AbpException Abp 框架定義的基本異常型別,Abp 所有內部定義的異常型別都繼承自本類。 AbpInitializa

Spring Security原始碼分析Spring Security OAuth2整合JWT

Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準(RFC 7519).該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者

Spring Security原始碼分析Spring Security專案實戰

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr

Spring Security原始碼分析Spring Security 頁面許可權控制

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr

ABP原始碼分析三十三ABP.Web

ABP.Web模組並不複雜,主要完成ABP系統的初始化和一些基礎功能的實現。 AbpWebApplication : 繼承自ASP.Net的HttpApplication類,主要完成下面三件事一,在Application_Start完成AbpBootstrapper的初始化。整個ABP系統的初始化就是通過A