首页 > 代码库 > 使用JSP的fmt标签实现国际化支持

使用JSP的fmt标签实现国际化支持

 使用JSP的fmt标签配置i18n国际化资源文件可以实现根据不同的地区和语言切换不同的显示.

具体做法如下:

1.在JSP页面中添加fmt标签的引用:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

2.设置需要用到的bundle :

<fmt:setBundle basename="i18n/i18n_${system_language}"/>

其中,system_language是从request中传入的

3.在需要显示变量的地方使用fmt标签来显示:

<div style="font-size: large;color: darkcyan">    <fmt:message key="common.bookname"/></div>

这里为了演示,假设我们需要显示的东西是是引用的资源文件里的common.bookname这个属性

4.在src/main/resources 路径下新建i18n文件夹(或者在其他的路径下也可以,编译之后,文件夹要在classes目录下),新建资源文件 i18n_en_US.properties 和 i18n_zh_CN.properties,内容如下:

 

i18n_en_US.properties:

common.copyright=Copyright \u00A9 2013common.language=languagecommon.bookname=HTTP by picture

 

i18n_zn_CN.properties:

common.copyright=\u7248\u6743\u6240\u6709 \u00A9 2013common.language=\u7cfb\u7edf\u8bed\u8a00common.bookname=\u56fe\u89e3HTTP

 

5.在服务器端添加一个filter,在请求中判断需要显示哪种语言,通过设置system_language的值,使页面的显示发生变化:

package com.jiaoyiping.websample; /*  * Created with Intellij IDEA  * USER: 焦一平  * Mail: jiaoyiping@gmail.com  * Date: 2016/10/19  * Time: 14:27  * To change this template use File | Settings | Editor | File and Code Templates */import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import java.io.IOException;import java.util.Locale;@WebFilter(urlPatterns = "/*")public class I18NFilter implements Filter {    private static final String COOKIE_LANGUAGE = "cookie_language";    private static final String SYSTEM_LANGUAGE = "system_language";    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest httpServletRequest = (HttpServletRequest) request;        String systemLanguage = getSystemLanguage(httpServletRequest);        request.setAttribute(SYSTEM_LANGUAGE, systemLanguage);        chain.doFilter(request, response);    }    @Override    public void destroy() {        System.out.println("init....");    }    private String getSystemLanguage(HttpServletRequest request) {        String systemLanguage = null;        Cookie[] cookies = request.getCookies();        if (cookies != null) {            for (Cookie cookie : cookies) {                if (COOKIE_LANGUAGE.equals(cookie.getName())) {                    systemLanguage = cookie.getValue();                    break;                }            }        }        if (systemLanguage == null || "".equals(systemLanguage)) {            systemLanguage = request.getLocale().toString();        }        if (systemLanguage == null || "".equals(systemLanguage)) {            systemLanguage = Locale.getDefault().toString();        }        return systemLanguage;    }}

我们通过request.setAttribute("system_language",${system_language}); 来改变JSP中的bundle的名字,实现切换显示语言的功能,

getSystemLanguage()方法,先是从cookie中找显示语言,若没有找到,则使用浏览器的语言,如果是空,则取操作系统的默认语言

 

 

5.为了能够动态显示出来效果,我们提供两个按钮,点击之后可以切换语言:

<div id="footer">    <div id="copyright">        <span><fmt:message key="common.copyright"/></span>    </div>    <div id="language">        <span><fmt:message key="common.language"/>:</span>        <a href="#" data-value="zh_CN">中文</a>        <span>|</span>        <a href="#" data-value="en_US">English</a>    </div></div>

引入jquery文件,在dom被加载完毕之后执行一些操作

<script type="text/javascript">        $(function () {            $(#language).find(a).click(function () {                var language = $(this).data(value);                document.cookie = "cookie_language=" + language +                        ";expires=365";                location.reload();            });        });    </script>

 

最终的结果实现了点击切换语言的功能(截取的git图,没有鼠标放到链接上的小手,所以显示的有点不太清楚):

 

技术分享

 

使用JSP的fmt标签实现国际化支持