使用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 2013
common.language=language
common.bookname=HTTP by picture

 

i18n_zn_CN.properties:

common.copyright=\u7248\u6743\u6240\u6709 \u00A9 2013
common.language=\u7cfb\u7edf\u8bed\u8a00
common.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圖,沒有鼠標放到鏈接上的小手,所以顯示的有點不太清楚):

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM