1. 程式人生 > >Spring Web舊專案國際化的一種方式[筆記]

Spring Web舊專案國際化的一種方式[筆記]

[避免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" + "&currentPageName=" + 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" + "&currentPageName=" + 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

具體的更改看你具體的專案,這裡只是我的解決方法,期間碰到了很多問題,慢慢解決.