I18n攔截器


I18nInterceptor 攔截器是針對於 web 應用程式提供的一個國際化元件,以下是在 freemarker 範本中使用的範例:

##//先將I18nInterceptor設定成全域攔截器
public void configInterceptor(Interceptors me) { me.add(new I18nInterceptor());
}
 
// 然後在freemarker中即可透過_res物件來取得國際化資料
${_res.get("msg")}
以上程式碼透過設定了 I18nInterceptor 攔截 action 請求,然後即可在 freemarker 範本檔案中透過名為_res 物件來取得國際化數據,I18nInterceptor 的具體工作流程如下:


  • l試圖從請求中透過controller.getPara(“_locale”)取得 locale 參數,如果取得到則將其保存到cookie 之中
  • 如 果 controller.getPara(“_locale”)  沒 有 獲 取 到 參 數 值 , 則試圖試圖透過controller.getCookie(“_locale”)得到 locale 參數
  • 如果以上兩步驟仍然沒有取得 locale 參數值,則使用 I18n. defaultLocale 的值做為 locale 值來使用
  • 使用 前 面 三 步 中 得 到 的 locale  值 , 透過 I18n.use #controller.setAttr(“_res”, res)將 Res 物件傳遞給頁面使用如果 I18nInterceptor. isSwitchView 為 true 值的話還會改變 render 的 view 值,實現整體範本檔案的切換,詳情可查看原始碼。


以上步驟 I18nInterceptor 中的變數名稱」_locale」、」_res」都可以在建立 I18nInterceptor 物件時進行指定,不指定時將使用預設值。也可以透過繼承 I18nInterceptor 並且覆寫 getLocalPara、 getResName、getBaseName 來客製化更個人化的功能。

在有些web 系統中,頁面需要國際化的文本過多,並且css 以及html 也因為國際化而大不相同,對於這種應用場景先直接製做多套同名稱的國際化視圖,並將這些視圖以locale 為子目錄分類存放,最後使用I18nInterceptor 攔截器根據locale 動態切換視圖,而不必對視圖中的文本逐個進行國

際化切換,只需將 I18nInterceptor.isSwitchView 設定為true 即可,省時省力。