jeecg 國際化處理

weixin_33758863發表於2018-05-31

概述

國際化的需求是為了適應不同的語言環境,能夠提供不同的語言文字,以便更好地服務使用不同語言文字的人群。我們在開發過程中,一般為了快速實現需求,比較容易忽視國際化的需求,直接在程式碼裡 hardcode 了中文方案。在真正有客戶反映要切換不同語言時,才將原來 hardcode 的程式碼轉換為字元碼,根據 locale 環境做轉換。

jeecg 的國際化方案

在 jeecg 的管理後臺介面,我們可以看到有一個“國際化語言”的模組,用來管理需要國際化資源。


4962643-ed9835b4d720774c.png
國際化語言.png

從功能介面上展示的欄位,我們可以猜測出,jeecg 的實現方案是,定義一個 key ,然後為這個 key 提供不同語言對應的內容,然後在客戶端請求資料時,根據請求傳入的引數來決定選用哪種語言的內容。在錄入或編輯的彈出窗,“語言”欄位的選項只有“中文”和“English”兩種,說明目前系統只支援這兩種語言。從介面上無法看出的邏輯是,系統是怎麼從請求來判定該用什麼語言的?下面我們通過檢視程式碼來查詢答案。

國際化語言的服務實現類 MutiLangServiceImpl 提供了 getLang(String langKey) 方法來獲得對應的語言內容:

/**取 o_muti_lang.lang_key 的值返回當前語言的值**/
    public String getLang(String langKey)
    {
      //從請求頭Accept-Language獲得客戶端接受的語言
        String language = BrowserUtils.getBrowserLanguage(request);

        if(request.getSession().getAttribute("lang") != null)
        {
          //從session屬性取得繫結的語言
            language = (String)request.getSession().getAttribute("lang");
        }
        //從快取集合裡得到key對應的語言內容
        String langContext = ResourceUtil.mutiLangMap.get(langKey + "_" + language); 

        if(StringUtil.isEmpty(langContext))
        {
            langContext = ResourceUtil.mutiLangMap.get("common.notfind.langkey" + "_" + request.getSession().getAttribute("lang"));
            if("null".equals(langContext)||langContext==null ||langKey.startsWith("?")){
                langContext = "";
            }
            langContext = langContext  + langKey;
        }
        return langContext;
    }

以上便是 jeecg 實現國際化的主要流程,比較簡單。如果要擴充套件到更多語言,則需要增加可配置選項,這時會發現 jeecg 程式碼裡是用列舉類固定了可選的語言,因此要擴充套件還需要增加列舉項,以及修改相應的程式碼,這點就不太靈活了。如果要國際化的key都是比較固定的,一般會通過屬性檔案來配置,檔名的字首一樣,字尾為語言的 locale 字元,這種能用的處理方法也適用於客戶端處理國際化。而 jeecg 通過資料庫來管理國際化,也適合一些需要線上修改語言內容,動態管理的場景。所以,最終選擇什麼樣的方案,還是要根據業務場景來選擇。

相關文章