一步一步使用ABP框架搭建正式項目系列教程之本地化詳解


返回總目錄《一步一步使用ABP框架搭建正式項目系列教程》


本篇目錄

扯扯本地化 ###

本節來說說本地化,也有叫國際化、全球化的,不管怎么個叫法,反正道理都是一樣的,就是一個系統具有選擇多種語言的能力。比如,我們用的電腦或手機,可以在設置中選擇語言,但是這並不影響系統已經具有的功能,只是顯示的文字變成你所選語言的文字了。再比如說微信,功能設置里面也能選擇語言,比如你選擇的是英語,那么我們在中文看到的朋友圈就變成了“Moments”。

圖片 圖片

想要更詳細地了解本地化的理論知識,請查看本地化文檔

其實本地化,一般來說我們用不上,因為我們大多數開發人員開發的軟件還是供國人使用的,只需要中文就夠了。但是也有些軟件的用戶是老外(雖然軟件很小型),或者軟件做大了,需要向國外擴張,也需要本地化,這篇文章就獻給有需要的人或者想要了解一下本地化的人。

ABP中的本地化 ###

ABP提供了一個強大而又靈活的本地化系統。你可以將本地化文本存儲到資源文件,XML文件,數據庫,甚至自定義的數據源。接下來,逐一介紹這幾種本地化。

首先從ABP官網的啟動模板生成一個項目(包含了Module-zero模塊),取名ABPMVCTest,截圖如下:

圖片

然后,接下來就是還原Nuget包,以及更新數據庫了。還不熟悉的園友,可以查看該系列之前的文章。

XML文件

首先,打開Core項目,找到本地化Localization文件夾,將下面的Source文件夾重命名為XmlSource(這里只是為了演示需要),如下所示:
圖片

然后打開Core項目的對應的Module模塊文件(此處是ABPMVCTestCoreModule.cs文件),修改代碼如下:

圖片

打開xml資源對應的中文文件ABPMVCTestABPMVCTest-zh-CN.xml,更改下面一句代碼:

圖片
圖片

編譯,生成,刷新頁面,可以看到UI上顯示的文本已經變成了我們更改后的文本:

圖片

此外,還要注意,Module文件中還有另一種寫法,見下:

Configuration.Localization.Sources.Add(new DictionaryBasedLocalizationSource(
    ABPMVCTestConsts.LocalizationSourceName,
    new XmlFileLocalizationDictionaryProvider(
        HttpContext.Current.Server.MapPath("~/Localization/XmlSource")
         )
    )
 );


與上一種寫法不一樣的是,這種寫法針對的是文件系統,需要寫明資源文件的路徑,而上一種寫法,需要指定xml文件為可嵌入的資源。更多信息請看《ABP理論學習之本地化》。

注意:在Web項目中建立一個Localization文件夾,再在其下建立一個文件夾XmlSource,放置各類語言的Xml文件,因為Core層的MapPath方法的根目錄就是Web項目的根目錄。其實本人覺得,將本地化放在Web層是更為合理的,因為這本來就是跟UI相關的東西嘛,而且使用文件系統訪問的方式必須將本地化資源放在web項目。

資源文件

如下圖所示,在Core層的Localization文件夾下再建立一個文件夾ResSource,在該文件夾下為每種語言建立一個文件,這里只建立兩個文件,一個是中文的文本本地化,以en后綴結尾的是英文文本本地化。
圖片

在Core層的Module中的PreInitialize方法中加入下面的代碼:

  Configuration.Localization.Sources.Add(
                    new ResourceFileLocalizationSource(
                         ABPMVCTestConsts.LocalizationSourceName,
                        AbpMvcTest.ResourceManager)
            );

修改之后的效果(取到的就是上面資源文件定義的文本):

圖片

Json文件

Json文件也可以存儲本地化的文本,和xml文件用法很相似。
首先在Localization文件夾下建立文件夾JosnSource,分別建立兩個json文件,對應中文和英文的本地化資源。

圖片

然后需要在Core層的Module的PreInitialize方法中進行配置,Json文件可以存儲到文件系統中,也可以內嵌到程序集中,可以參考xml文件的配置:

文件系統的json文件,配置方法如下:
因為路徑問題(MapPath會到網站的根目錄下去找,所以core層中的資源找不到),應該在web項目下創建json本地化資源文件。

Configuration.Localization.Sources.Add(new DictionaryBasedLocalizationSource(
    ABPMVCTestConsts.LocalizationSourceName,
    new JsonFileLocalizationDictionaryProvider(
        HttpContext.Current.Server.MapPath("~/Localization/JsonSource")
         )
    )
 );


內嵌在程序集中的json文件,配置方法如下:

首先將所有的json文件在屬性面板中設置為“可嵌入的資源”,然后在Module中配置代碼

 Configuration.Localization.Sources.Add(
     new DictionaryBasedLocalizationSource(
         ABPMVCTestConsts.LocalizationSourceName,
         new JsonEmbeddedFileLocalizationDictionaryProvider(
             Assembly.GetExecutingAssembly(),
             "ABPMVCTest.Localization.JsonSource"
             )
         )
     );

效果都是一樣的,效果如下:

圖片

注意:這里一定要注意Json文件的命名空間。在官方文檔中,命名空間是程序集名稱+json文件的層次,而我在這次實踐中,應該是“默認命名空間+json文件的層次”。

數據庫

要將本地化資源存儲到數據庫中,可以在ABP項目中添加Module-zero模塊(在使用啟動模板創建項目時勾選包含module-zero模塊即可)。

關於使用module-zero模塊將本地化資源存儲到數據庫的理論知識,您可以參考:《Module Zero之語言管理

在一開始的步驟中,我們已經更新了數據庫,然后數據庫中就會生成下面兩張跟語言相關的表AbpLanguages和AbpLanguageTexts。

圖片

AbpLanguages表用來存儲應用程序支持哪些國家的語言,AbpLanguageTexts表存儲的是同一個key,對應顯示不同的文本。

語言也是一個實體,也需要對它進行CRUD操作,因此一般我們也需要創建一個語言管理的菜單,在語言管理的頁面上對所有語言文本進行統一管理。這里只為了演示,就直接在數據庫中插入兩條數據(以數據庫表中的截圖為准),如下:

圖片

圖片

顯示的效果如下:
圖片

圖片

這里需要注意一下幾點:

  • 在webmodule的PreInitialize中開啟Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization();
  • AbpLaguages表和AbpLanguageTexts表中要有數據。尤其注意AbpLanguageTexts表的TenantId,Source,LanguageName,Key這幾個字段的值一定是存在的(TenantId是AbpTenants表中的值,Source是你在代碼中定義的資源名稱,LanguageName是AbpLaguages表的Name字段,Key是代碼中使用到的L("Key")),因為這幾張表之間沒有外鍵約束,所以出錯你也很難找到原因,樓主就是這樣,耽誤了不少時間。
  • 已經存在的xml或者json本地化資源不要移除,因為這些都是次級資源或者回退資源,數據庫中找不到時就去這些靜態資源中去找。
  • 每次更改數據庫中的文本數據時,要重置你的應用程序,因為這些本地化文本都是從緩存中取得的。

小結

ABP中的本地化系統很強大、健壯。可以從靜態資源中(xml文件和json文件)獲得,也可以從數據庫中獲得,最主要的是配置很簡單,我們只需要寫一點兒代碼(甚至一句代碼)就可以搞定,最主要工作就是我們根據自己的需要添加本地化文本。這個需要我們以后專門寫一個功能,來實現在界面上進行對數據庫中的本地化文本進行CRUD。這里就不實現這個功能了,大家知道原理就可以了。


免責聲明!

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



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