前言:國際化是企業級系統必修課
Struts 1.x 已簡化 i18n 工作,Struts 2.0 在此基礎上更進一步:更靈活的資源檔查找機制、原生支援 EL 表達式、內建語言切換攔截器。
Hello World 國際化範例
配置檔案
- struts.properties:`struts.custom.i18n.resources=globalMessages` 指定全域資源基底名
- globalMessages_en_US.properties:`HelloWorld=Hello World!`
- globalMessages_zh_CN.properties:`HelloWorld=你好,世界!`
視圖頁面
兩種顯示方式輸出相同結果(程式碼區塊 1):
<s:text name="HelloWorld" />
<s:property value="%{getText('HelloWorld')}" />(利用 EL 簡潔取值)
瀏覽器語言切換測試
- 預設中文環境 → 顯示「你好,世界!」(圖 1)
- 瀏覽器語言改為 English (US) → 顯示 "Hello World!"(圖 2)


四層資源檔範圍與查找優先序
Struts 2.0 支援四種層級資源檔,範圍由大到小(圖 3):

- Action 級:`ActionName_xx_XX.properties`,僅該 Action 可訪問,同名鍵可差異化
- 介面/父類級:實作介面或繼承父類的同名資源檔
- ModelDriven 級:`getModel()` 回傳物件類型的資源檔
- Package 級:`package.properties` 及父包遞迴查找
- 全域級:`struts.properties` 指定的基底資源檔
查找順序:Action → 介面 → 父類 → ModelDriven → Package → 全域 → 最後回傳鍵名作為預設值。
參數化國際化訊息
兩種參數語法
- OGNL 表達式:`validation.require=${getText(fileName)} is required`
- MessageFormat 格式:`validation.between=Date must between {0, date, short} and {1, date, short}`
兩種參數傳遞方式
使用者自主切換語言:i18n 攔截器實戰
原理
預設註冊的 `i18n` 攔截器檢查請求參數 `request_locale`,實例化 `Locale` 存入 Session 屬性 `WW_TRANS_I18N_LOCALE`,後續請求自動套用。
完整實作
語言選單 Bean(程式碼區塊 2):`Locales.getLocales()` 回傳 `Map`(American English → Locale.US, Simplified Chinese → Locale.CHINA)
語言選擇器片段(`LangSelector.jsp`,程式碼區塊 3):
- `` 從 Session 讀取目前 Locale
- `` 實例化 `Locales`
- `` 綁定語言清單,`name="request_locale"` 觸發攔截器
- JavaScript `onchange` 自動提交表單
- 值優先序:Session Locale → ValueStack `locale`(瀏覽器預設)
整合方式
- 單頁:``
- 全站:`struts.xml` 通用映射 `/{1}.jsp`
關鍵驗證:必須透過 Action 訪問
直接訪問 JSP(繞過 Filter)→ 攔截器鏈不執行 → 語言切換失效。必須用 `HelloWorld.action` 等 Action 路徑(圖 4-5)。


推薦工具:Eclipse Properties 編輯器外掛
免 `native2ascii` 編碼,直接編輯中文 Unicode。透過 Software Update 安裝 `https://propedit.sourceforge.jp/eclipse/updates/`,重啟後 `.properties` 檔顯示綠色 P 圖示。