概述
国际化的需求是为了适应不同的语言环境,能够提供不同的语言文字,以便更好地服务使用不同语言文字的人群。我们在开发过程中,一般为了快速实现需求,比较容易忽视国际化的需求,直接在代码里 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 通过数据库来管理国际化,也适合一些需要在线修改语言内容,动态管理的场景。所以,最终选择什么样的方案,还是要根据业务场景来选择。
网友评论