經常看到一些關於DNN的網站上有相應的語言包下載。通過下載語言包並安裝可以可以起到對DNN應用程序本地化的效果(我們通常叫漢化)。現在就讓我們看看DNN是如何進行本地化的。(想把整個本地化的來龍去脈說清楚實在太難,我組織了幾天的語言也沒能表達清楚,只能是列舉幾個概念希望能對大家看這方面的內容有幫助)
原理:
DNN中的頁面全部是由用戶控件組成的。本地化應用程序只需對每一個用戶控件進行本地化就行了。對控件進行本地化的資源都在相應的資源文件中。
幾個相關名詞(DNN程序本地化中常用的幾個名詞自己根據理解翻譯的也不知對不對):
ResourceFileRoot:本地資源文件基本名稱。
如:GlobalResources.resx就是一個基本名稱。
GlobalResources的其它本地化資源文件的名稱就可以是GlobalResources.zh-CN.resx(中文)
GlobalResources的站點級本地化資源文件文件的名稱就可以是GlobalResources.zh-CN.Portal-0.resx(中文)
resourcekey:在資源文件中查找特定的本地化內容的key
地區信息:無論是在用戶注冊時,還是在站點時都有相應的地區信息選擇。它是決定呈現何種語言界面的依據。如下圖:
在應用程序加載時,程序按照:注冊用戶的地區信息-->訪問站點的地區信息-->系統默認的地區信息(en-US)就決定呈現界面的語言。正是因為這個順序說明了為什麼有人安裝語言包後人沒有得到漢化後的界面。主要是因為沒有將站點、用戶的語言設置為指定區域語言。
在讀取本地化資源文件的順序:先讀取站點級本地化資源文件(如:*.zh-CN.Portal-0.resx)-->主機級本地化資源文件(如:*.zh-CN.resx)-->系統默認(如:*.resx)。另外每種語言還可設置一個後備語言(fallback),當第一語言本地化資源文件加載失敗時可加載後備語言的本地化資源文件。這一功能程序中沒有給出操作界面,只能在Locales.xml文件中修改。比如我將Chinese的第一語言設置為zh-CH(簡體中文),後備語言設置為zh-TW(繁體中文)。當某一控件沒有簡體中文的資源文件時它就會去找繁體中文的資源文件。
<?xmlversion="1.0"encoding="UTF-8"?>
<root>
<languagename="English"key="en-US"fallback=""/>
<languagename="Deutsch"key="de-DE"fallback="en-US"/>
<languagename="Chinese"key="zh-CN"fallback="zh-TW"/>
</root>
語言包的內容:(語言包的內容都分布在各個相應App_GlobalResources文件夾下)
全局語言包文件(只列舉ResourceFileRoot,相應的.zh-CH等就是本地化的資源文件)
GlobalResources.resx:存放本地化菜單的信息
SharedResources.resx:存放本地化按鈕、提示信息等一些頁面通用的控件的信息
TimeZones.xml:存放時區信息。
模塊語言包文件:(用戶模塊也就是第三方模塊,DesktopModules中的各個App_GlobalResources文件夾下的)
控制語言包文件:(通用的用戶控件,controls中的各個App_GlobalResources文件夾下的)
管理語言包文件:(管理模塊也就是實施網站後台管理的各個功能模塊,admin中的各個App_GlobalResources文件夾下的)
本地化相關的程序:
admin\Localization文件中的各中操作語言包的用戶控件,它們實現了主機管理下的語言管理的全部功能。這些控件有:創建語言包(Languages.ascx),編輯語言包(LanguageEditor.ascx),生成語言包(LanguagePack.ascx),編輯時區信息(TimeZoneEditor.ascx),效驗語言包檢查本地化文件的完整性(ResourceVerifier.ascx)。
依然存在的問題:
DNN提供的程序是可以適應全球化的。我們開發的第三方控件也可做成可適用於全球化的。但是在DNN中建設的網站內容如何進行全球化呢。比如我新建一個標簽Home,我需要中國用戶訪問時時“首頁”,美國用戶訪問是“Home”。同樣頁面中的內容也是如此。如果有這種要求該如何解決呢?我想在開發用戶模塊控件的時候是不是應該考慮進去。在用戶添加模塊時做一個語言選擇。按照不同的語言輸入不同的內容。這也就是說,比如我添加一個Text/HTML模塊輸入一段內容就可以同時多種語言版本的在呈現時就可以選擇需要的一個了。