Javaweb 切换中英文功能实现——国际化
小博也是小白,自己参与了一个javaweb项目,项目要求加入一个中英文转换的功能,自己也是断断续续弄了一个星期,这里分享下自己的心路历程。由于这个项目中有些页面使用Spring mvc的框架写的,有些则是jsp+servlet的架构。所以这里把这两种架构下的解决方式都进行说明。
这里也说明一下项目中关于国际化的基本情况。项目中本来就有很多资源文件.properties,有中英两种语言。以admin.properties为例,admin.properties是英文的资源文件,那么admin_zh.properties就为中文的资源文件。
- Spring mvc
- jsp+servlet
jsp页面的修改
不论哪种架构下,在页面上都需要添加中英文切换的链接。除此之外还需要用js来为URL加上对应的语言参数,如点击id=”change_language_zh”则会在本页的URL后面加上一个参数“?choiceLanguage=zh”,这些参数传入后端进行处理。
<li>
<a href="#" id="change_language_zh" style="padding-right: 1px">中文</a>
</li>
<li style="margin-top: 10px">
|
</li>
<li>
<a href="#" id="change_language_en" style="padding-left: 1px">Engilsh</a>
</li>
<script type="text/javascript">
var url = window.location.search;
var dom_zh = document.getElementById("change_language_zh");
var dom_en = document.getElementById("change_language_en");
if(url.length > 0) {
var theinx = url.indexOf("choiceLanguage=");
if(theinx > 0) {
var temp = url.substring(theinx, theinx+17);
dom_zh.href = window.location.href.replace(temp, "choiceLanguage=zh");
dom_en.href = window.location.href.replace(temp,"choiceLanguage=en");
} else {
dom_zh.href = window.location.href+"?choiceLanguage=zh";
dom_en.href = window.location.href+"?choiceLanguage=en";
}
} else {
dom_zh.href = window.location.href+"?choiceLanguage=zh";
dom_en.href = window.location.href+"?choiceLanguage=en";
}
</script>
Spring mvc框架
小博查过很多资料,Spring mvc有很多国际化的一些功能,参考到博文“Spring MVC之LocaleResolver(解析用户区域)”中的方法。在Spring的配置文件中设置localeChangeInterceptor来进行语言的切换,这个方法非常的简单方便,但只适用于项目中的部分页面(用Spring mvc的页面)。设置如下:
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="choiceLanguage"/>
</bean>
这样这些页面就可以根据参数choiceLanguage的值来改变语言。
jsp+servlet
从上文Spring的配置文件中可以看出,Spring框架下的localeResolver直接使用的Springmvc框架里提供的关于国际化的SessionLocaleResolver,jsp+servlet架构下可以自行写一个localeResolver类然后重写getLocale方法。
public final static Locale getLocale(HttpServletRequest request) {
String lang = request.getParameter("choiceLanguage");
Locale locale = null;
if(lang != null) {
if (lang.equals("zh")) {
locale = new Locale("zh", "CN");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
return locale;
} else if (lang.equals("en")) {
locale = new Locale("en");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
return locale;
}
}else {
locale = getLocaleInSession(request.getSession(false));
}
if(locale == null) {
return resolveLocale(request);
}
return locale;
}
这个方法的主要思想如下:首先如果URL的choiceLanguage参数不为空则根据参数值来设置session中locale的值并返回locale。其次,若参数值为空,就调用resolveLocale方法(这个方法是根据request.getLocales()的顺序来取locale值的)
注意:这里改完之后如果还是不能成功,可以考虑是不是localeFilter里面又重新根据浏览器的语言顺序来取locale值,要在这个页面进行修改。
此次修改经历是在前人已经写过一部分localeResolver类的基础上进行的修改,还是致敬前人!每个人遇到的问题可能不一样,但是理清逻辑结构后再进行问题的定位是非常有必要的!