Spring Web舊專案國際化的一種方式[筆記]
阿新 • • 發佈:2018-12-21
[避免CSDN亂象,轉載請註明]
專案突然要求完成全頁面的國際化, 其中有新聞等動態資料,
第一種情況:如果只是簡單實現靜態文字的國際化,可以用i18n外掛.
第二種情況:如果頁面因語言切換造成樣式大修改,或者頁面修改較大可以用session快取來實現
我這裡用的第二種方法
我只是寫了一寫了一下我大概思路,最終完成了整個專案的國際化,實現了動態國際化
例如我有個首頁叫 index.html ,那麼 我將英文版本的命名為了 EN_index.html
先更改首頁,先去controller中找到跳轉首頁的控制器, 在該方法裡面加入:
假設 httpSession.getAttribute("lang") :1為中文,2為英文
@RequestMapping(value = "index", method = RequestMethod.GET) public String index(ModelMap model, HttpSession httpSession,HttpServletRequest request, HttpServletResponse response) { ...省略程式碼 // 先得到當前語言,為空則預設為中文(例如首次開啟頁面) int currentLanguage = 1; if ((Integer) httpSession.getAttribute("lang") == null) { httpSession.setAttribute("lang", 1); currentLanguage = 1; } else { currentLanguage = (Integer) httpSession.getAttribute("lang"); } return currentLanguage == 1 ? "index" : "EN_index"; }
這裡跳轉對應了 index和EN_index, 看當前session有沒有語言切換的值,預設為中文
接著完成一個統一的中英文切換controller
首先我對所有要進行中英文切換的頁面寫1個<span>中|en</span>公共模組:
<span style="text-align: right;display:block;"> <a id="changelanguage_ch" href="javascript:void(0)" style="margin-left:2px; margin-top:0.5px;">中</a> |<a id="changelanguage_en" href="javascript:void(0)" style="margin-left:2px; margin-top:0.5px;">En</a> </span>
然後在各個頁面中新增js指令碼
<script>
var currentPageName = "當前頁面名稱";
document.getElementById("changelanguage_ch").onclick = function() {
console.log( "currentPageName is "+currentPageName );
var newHref="changelanguage?new_lang=1" + "¤tPageName=" + currentPageName;
console.log(newHref);
document.getElementById("changelanguage_ch").setAttribute("href",newHref);
};
document.getElementById("changelanguage_en").onclick = function() {
console.log( "currentPageName is "+currentPageName );
var newHref="changelanguage?new_lang=2" + "¤tPageName=" + currentPageName;
console.log(newHref);
document.getElementById("changelanguage_en").setAttribute("href",newHref);
};
</script>
控制器寫法
@RequestMapping(value = "changelanguage", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
public String changeLanguage(ModelMap modelMap,
@RequestParam String new_lang,
@RequestParam String currentPageName,
HttpSession httpSession,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 先得到當前語言,為空則預設為中文
int currentLanguage = 1;
if ((Integer) httpSession.getAttribute("lang") == null) {
currentLanguage = 1;
} else {
currentLanguage = (Integer) httpSession.getAttribute("lang");
}
log.info("當前Session語言:"+currentLanguage);
log.info("使用者選擇:"+new_lang);
// 語言一致,直接跳轉到當前頁面
if (currentLanguage == Integer.valueOf(new_lang)) {
return currentPageName;
} else { // 切換語言
// 去掉"EN_"字首, 如果有
boolean isStartsWith_EN_ = currentPageName.startsWith("EN_");
String zh_CH_PageName = "";
if (isStartsWith_EN_ == true) {
zh_CH_PageName = currentPageName.substring("EN_".length(),currentPageName.length());
} else {
zh_CH_PageName = currentPageName;
}
// 重置session中的語言標誌
httpSession.setAttribute("lang", new_lang.equals("1") ? 1 : 2);
return new_lang.equals("1") ? zh_CH_PageName : ("EN_" + zh_CH_PageName);
}
}
可以看出, 當你的頁面為 abc.html的時候,你點選"英文",那麼會跳轉到這個方法, 得到session的值,然後進行比較,返回對應的中|英頁面,英文則是 EN_abc.html
具體的更改看你具體的專案,這裡只是我的解決方法,期間碰到了很多問題,慢慢解決.