Javaweb切换中英文功能

来源:互联网 发布:1962年中印战争知乎 编辑:程序博客网 时间:2024/06/07 15:05

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类的基础上进行的修改,还是致敬前人!每个人遇到的问题可能不一样,但是理清逻辑结构后再进行问题的定位是非常有必要的!