9.3 I18nInterceptor

2022-07-11 10:36 更新

I18nInterceptor 攔截器是針對于 web 應(yīng)用提供的一個國際化組件,以下是在 freemarker 模板 中使用的例子:

//先將I18nInterceptor配置成全局攔截器
public void configInterceptor(Interceptors me) { me.add(new I18nInterceptor());
}
 
// 然后在freemarker中即可通過_res對象來獲取國際化數(shù)據(jù)
${_res.get("msg")}

以上代碼通過配置了 I18nInterceptor 攔截 action 請求,然后即可在 freemarker 模板文件中 通過名為_res 對象來獲取國際化數(shù)據(jù),I18nInterceptor 的具體工作流程如下:

  • l試圖從請求中通過 controller.getPara(“_locale”)獲取 locale 參數(shù),如果獲取到則將其保存到cookie 之中
  • 如 果 controller.getPara(“_locale”)  沒 有 獲 取 到 參 數(shù) 值 , 則試圖通過controller.getCookie(“_locale”)得到 locale 參數(shù)
  • 如果以上兩步仍然沒有獲取到 locale 參數(shù)值,則使用 I18n. defaultLocale 的值做為 locale 值 來使用
  • 使用 前 面 三 步 中 得 到 的 locale  值 , 通過 I18n.use(locale) 得到 Res  對象,并通過controller.setAttr(“_res”, res)將 Res 對象傳遞給頁面使用
  • 如果 I18nInterceptor. isSwitchView 為 true 值的話還會改變 render 的 view 值,實現(xiàn)整體模板 文件的切換,詳情可查看源碼。


以上步驟 I18nInterceptor 中的變量名”_locale”、”_res”都可以在創(chuàng)建 I18nInterceptor 對象時 進行指定,不指定時將使用默認值。還可以通過繼承 I18nInterceptor 并且覆蓋 getLocalPara、 getResName、getBaseName 來定制更加個性化的功能。


在有些 web 系統(tǒng)中,頁面需要國際化的文本過多,并且 css 以及 html 也因為國際化而 大不相同,對于這種應(yīng)用場景先直接制做多套同名稱的國際化視圖,并將這些視圖以 locale 為 子目錄分類存放,最后使用 I18nInterceptor 攔截器根據(jù) locale 動態(tài)切換視圖,而不必對視圖中 的文本逐個進行國際化切換,只需將 I18nInterceptor.isSwitchView 設(shè)置為 true 即可,省時省力。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號