美文网首页程序员
jeecg 国际化处理

jeecg 国际化处理

作者: 码语生活 | 来源:发表于2018-05-31 23:00 被阅读4次

    概述

    国际化的需求是为了适应不同的语言环境,能够提供不同的语言文字,以便更好地服务使用不同语言文字的人群。我们在开发过程中,一般为了快速实现需求,比较容易忽视国际化的需求,直接在代码里 hardcode 了中文方案。在真正有客户反映要切换不同语言时,才将原来 hardcode 的代码转换为字符码,根据 locale 环境做转换。

    jeecg 的国际化方案

    在 jeecg 的管理后台界面,我们可以看到有一个“国际化语言”的模块,用来管理需要国际化资源。


    国际化语言.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 通过数据库来管理国际化,也适合一些需要在线修改语言内容,动态管理的场景。所以,最终选择什么样的方案,还是要根据业务场景来选择。

    相关文章

      网友评论

        本文标题:jeecg 国际化处理

        本文链接:https://www.haomeiwen.com/subject/aiwcsftx.html