1. 程式人生 > >淺談struts2的國際化----i18n

淺談struts2的國際化----i18n

可能大家在使用struts框架的時候,偶爾會看到這個詞: i18n。也就是 Internationalization    i 開頭,n 結尾, 總共18個字母,今天的主要內容就是圍繞這 四個字母。

struts2國際化是建立在 java 國際化的基礎上的,通過提供不同國家、語言環境的訊息資源,然後通過 ResourceBundle 載入指定Locale 對應的資原始檔,取得檔案中指定的 key 對應的資訊。

Locale 物件表示了特定的地理、政治和文化地區。需要 Locale 來執行其任務的操作稱為語言環境敏感的 操作,它使用 Locale 為使用者量身定製資訊。例如,顯示一個數值就是語言環境敏感的操作,應該根據使用者的國家、地區或文化的風俗/傳統來格式化該數值。

ResourceBundle : public abstract class ResourceBundle extends Object  
 資源包包含特定於語言環境的物件。當程式需要一個特定於語言環境的資源時(如 String),程式可以從適合當前使用者語言環境的資源包中載入它。使用這種方式,可以編寫很大程度上獨立於使用者語言環境的程式程式碼,它將資源包中大部分(即便不是全部)特定於語言環境的資訊隔離開來。

可能大家對於 ResourceBundle 不太熟悉,但是它的子類,我們可是用的不能再熟悉的。

public class PropertyResourceBundle extends ResourceBundle
讀取 xxx.properties 的內容    類載入器 以流的形式讀取資原始檔
    PropertyResourceBundle.class.getClassLoader().getResourceAsStream(   "db.properties")

連線資料庫、log4j的配置,我們都用到了  xxx.properties 的配置檔案  ,注意,這些配置檔案要放在 類路徑之下。

struts2的國際化分為三類:類級別的、包級別的和全域性的。 優先順序從左至右依次降低。

1、全域性的配置方式為: a、在struts.xml中的<constant name="struts.custom.i18n.resources"value="message"></constant>指定baseName 國際化檔名為:baseName_語言名_國家名.properties(如:message_zh_CN.properties)
           b、全域性的國際化資原始檔放在src下面

2、包級別的: a、包級別的國際化資原始檔放在該包下面

                           b、命名規則為:package_語言名_國名.properties(如:package_zh_CN.properties)    其中package不變,不是指的是包名,每個包的國際化檔案命名都這樣

3、類級別的:  a、與該類放在同一目錄中

                             b、命名規則為:類名_語言名_國家名.properties(如:RegisterAction_zh_CN.properties) 

訪問國際化訊息的三種方式:

                              1、JSP頁面輸出國際化訊息:使用struts 的標籤<s:text.../> name 屬性指定了國際化資原始檔的 key
                               2、Action 類中訪問國際化訊息,該 Action 繼承 ActionSupport 實現 getText( ) ,接收一個 String 型別的引數,引數指定了國際化資原始檔的 key

                               3、表單元素 Label 中輸出國際化訊息,為表單標籤指定一個 key屬性,指定了國際化資原始檔的 key

知道大家覺得理論很枯燥,下面來結合例項講解: 配置步驟(以全域性配置JSP輸出國際化訊息為例)

1、在 src 目錄下新增資原始檔,命名方式:baseName_language_country.properties,資原始檔的編寫: 以鍵值對的形式,注意名稱一定要匹配

2、在struts.xml檔案中進行國際化配置,配置常量:<constant name="struts.custom.i18n.resources" value="baseName" /> 注意不要寫錯,要是你來質問我為什麼沒有效果,。。。。
Struts 2提供了一個名i18n的攔截器(Interceptor),並且將其住註冊在預設的攔截器棧中(defaultStack)
<interceptor-ref name="i18n"/>
所以我們不需要再次配置一次國際化的攔截器

3、jsp頁面表單元素記得新增一個 key 的屬性 ,key的值就是資原始檔中配置好的 name

4、大家可以看到頁面上有兩個超連結,傳遞的引數為 request_locale ,引數值與我們寫好的資原始檔命名的 language_country 相匹配。在這裡起到的作用就是切換語言環境。struts2 的 I18nInterceptor攔截器會攔截所有的Action,它主要做的事情為從客戶端傳送過來的請求引數中尋找是否存在名為 request_locale 的引數。若有,則將request_locale 的 value 轉化為 locale 儲存起來,該locale是儲存在以WW_TRANS_I18N_LOCALE所命名的session裡面的。如果我們不做任何配置的話,客戶端是不會發送request_locale引數的。它預設會用request的getLocale()方法得到預設locale,將其存放在session中。下面我們來看一看效果

這個就是今天的內容了。