“國際化”是指一個應用程式在運行時能夠根據用戶端請求所來自的省/地區,語言的不同而顯示不同的使用者介面。例如,請求來自一台中文的作業系統的用戶端電腦,則應用程式響應介面中的各種標籤,錯誤提示和協助資訊均使用 中文文字;如果用戶端電腦採用的是英文作業系統,則應用程式也應能識別並自動以英文介面做出響應。
可以看出引入國際化機制的目的在於提供自適應的,更友好的使用者介面,而並未改變程式的其他功能/商務邏輯。人們常用I18N這個記事作為”國際化“的簡稱,其來源是英文單詞Internationalization的首字母I和N及它們之間的字元數18。
Struts架構通過使用<bean:messgae>標記,以及使用java.util資料包中定義的Locale和ResourceBundle類來支援國際化。java.text.MessageFormat類定義的技術可以支援訊息的格式。利用此功能,開發人員無須瞭解這些細節就可以進行國際化處理並設定訊息的格式。
資源檔和資源套件
要用Struts實現國際化和本地化,首先要定義資源檔的名稱,這個檔案會包含用預設語言編寫的會在程式中出現的所有訊息。這些訊息以”鍵-值“對的形式儲存,如下:
error.validation.localtion = The entered location is invalid
當對一個應用程式進行國際化處理時,所要用的各種語言版本的”標籤“資訊應該存放在不同的屬性檔案中,每一個這樣的檔案對應一種語言版本。所有屬性檔案合在一起稱為資源套件(Resource Bundle)。
屬性檔案的命名格式可分為以下兩種:
a)檔案名稱首碼.properties
b)檔案名稱首碼_語言種類.properties
檔案名稱尾碼必須是properties,首碼可自由書寫,其中語言種類欄位必須是有效ISO語言代碼。例如現在我們針對(Struts)ActionForm類及表單資料驗證中最後的驗證來做國際化
我們先來編寫一個預設的英文版資源檔ApplicationResources.properties
#ApplicationResources.properties
error.login.userName=userName's length must more than 3 and not null
error.login.userPwd=userPwd's length must more than 3 and not null
然後編寫一個中文版本的ApplicationResources_zh_CN.properties
#ApplicationResources_zh_CN.properties
error.login.userName=使用者名稱必須填寫且長度不小於3
error.login.userPwd=密碼必須填寫且長度不小於3
然後我們在struts的設定檔中設定資源檔即可!在設定 的時候我們只需要
<!-- 資源檔 -->
<message-resources parameter="struts.ApplicationResources" />
設定ApplicationResources即可,而ApplicationResources_zh_CN不必,因為Struts在運行時會自動擷取同名不同語言種類的資源檔!
這樣當來自中文作業系統的客戶瀏覽時就會自動顯示 中文,而來其它的則統一使用預設的資源檔ApplicationResources.properties英文。那麼程式究竟中如何知道的呢,其它這是通過IE的語言設定來擷取!我IE屬性---常規---語言 中其實就已經設定,如下:
我們可以看到我們都是簡體中文如果將 英語上移或刪除中文,再瀏覽剛才的頁面,就會變成英文。那麼其實也就知道為什麼我設定中文資源檔的語言種類為_zh_CN了,就是來自這!
另外如果在設定檔中有多個資源套件要配置,用KEY屬性來區分,如下:
<!-- 資源檔 -->
<message-resources parameter="struts.ApplicationResources" />
<message-resources key="Image" parameter="ApplicationImageResources"/>
<message-resources key="xxx" parameter="ApplicationXXXResources"/>
其中,不帶key屬性的就是預設的資源套件。
資源套件應該放在WEB應用程式的WEB-INF/classes目錄下,當系統初始化時,會裝載這些資源檔。如果修改了資源檔,則需要重新啟動應用伺服器。
資源套件的訪問:
資源套件有了後我們就可以對其進行訪問了,訪問方主要有二種:一種是在JSP頁面訪問,通過<bean:message>標記來訪問,另一種是在程式中訪問!
在JSP中訪問如下:<bean:message key="error.login.userName"/>
在程式中訪問資源套件主要是在Action類中用到。Action提供了getResources()方法,可以獲得org.apache.struts.MessageResources類的一個執行個體。MessageResources代表資源套件的一個類,它是一個抽象類別,因此需要由Action的基類中的getResources()方法來返回它的一個執行個體。以下是程式樣本: //擷取資源套件樣本
//擷取使用者的Locale資訊
Locale locale = getLocale(request);
//擷取資源套件
MessageResources message = getResources(request);
//從資源套件中得到訊息文本
String title = message.getMessage(locale,"error.login.userName");
System.out.println(title);
/** *//**可以看到在調用了getResources()方法後,便可以獲得相應的資源套件,
* 接下來,就可以按照request對象中的Locale資訊來擷取相應資源套件中
* 的文本。值得注意的是getMessage()有幾種形式,如下:
getMessage(String key);
getMessage(Locale locale,String key);
getMessage(Locale locale,String key,Object[] args)
其中,最後一種getMessage()方法可以傳入參數給資源套件中的檔案,
更加靈活地實現訊息的輸出。*/