1. 程式人生 > >SpringMVC4.3x教程之七國際化的三種實現詳解

SpringMVC4.3x教程之七國際化的三種實現詳解

國際化(internationalization)是設計和製造容易適應不同區域要求的產品的一種方式。它要求從產品中抽離所有地域語言,國家/地區和文化相關的元素。換言之,應用程式的功能和程式碼設計考慮在不同地區執行的需要,其程式碼簡化了不同本地版本的生產。開發這樣的程式的過程,就稱為國際化。—摘自百度百科
SpringMVC也是支援國際化的操作,主要是前端控制器內部擁有國際化解析器
SpringMVC的國際化的支援方式:
1、Accept-Language
控制器無需寫額外的內容,是根據請求訊息頭自動獲取
2、HttpSession
使用Session傳輸語言環境
3、Cookie
使用Cookie傳送語音環境

第一種基於Accept-Language實現

使用步驟:
1、建立國際化配置檔案,存放到src下
英文
message_en_US.properties:
內容:

labeltime=Current Time

中文
message_zh_CN.properties:
內容:

labeltime=當前時間

2、設定配置檔案

<!--配置國際化檔案的格式:載入指定格式開頭的檔案  -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
>
<!--多個檔案開頭用basenames,檔案開頭都相同用basename--> <!-- <property name="basenames"> <list> <value>message</value> </list> </property> --> <property name="basename" value="message"/> </bean> <!--國際化實現的第一種方式:藉助訊息頭實現:Accept-Language -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean>

3、頁面中使用
通過SpringMVC的message獲取國際化文字內容

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!--配置標籤庫  -->
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>國際化的實現</title>
</head>
<body>
<!--使用Spring MVC的國際化支援, spring:message可以載入國際化檔案的key -->
<h1><spring:message code="labeltime"/>:${time}</h1>
</body>
</html>

上述在火狐瀏覽器測試最好用,直接設定內容的語言就可以,無需重啟,選項—-內容—語言—上移想要的語言

第二種使用HttpSession實現國際化

首先配置:
需要將之前配置的第一種給註釋掉

<!--如果國際化是通過Session或Cookie實現的,那麼需要配置攔截器  -->
    <mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>
    <!--國際化實現的第二種方式:藉助HttpSession  -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

控制器:


//國際化控制器
@Controller
public class LanguageController {

    @ModelAttribute
    public void test4(Model model) {
        model.addAttribute("time",
                new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS").format(Calendar.getInstance().getTime()));
    }
    // 基於Session的實現
    @RequestMapping("/gjhBySession")
    public String test2(String lge, HttpSession session) {
        Locale locale;// 國際化語言資訊
        System.out.println(lge);
        switch (lge) {
        case "zh":// 中文
            // 引數說明:1、語言2、國家
            locale = new Locale("zh", "CN");
            break;
        case "en":// 英文
            locale = new Locale("en", "US");
            break;
        default:
            // 獲取預設的國際化
            locale = LocaleContextHolder.getLocale();
            break;
        }

        // 設定屬性標記當前的語言環境
    session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
        return "index";
    }
}

頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!--配置標籤庫  -->
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>國際化的實現</title>
</head>
<body>
<div style="float:right">
<a href="gjhBySession?lge=zh">中文</a>|<a href="gjhBySession?lge=en">英文</a>
</div>
<h1><spring:message code="labeltime"/>:${time}</h1>
</body>
</html>

第三種基於Cookie實現國際化

配置檔案

<!--國際化實現的第一種方式:藉助訊息頭實現:Accept-Language  -->
    <!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean> -->
    <!--如果國際化是通過Session或Cookie實現的,那麼需要配置攔截器  -->
    <mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>
    <!--國際化實現的第三種方式:藉助Cookie  -->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"></bean>

控制器:

//國際化控制器
@Controller
public class LanguageController {
    @Autowired
    private CookieLocaleResolver localeResolver;
    @ModelAttribute
    public void test4(Model model) {
        model.addAttribute("time",
                new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS").format(Calendar.getInstance().getTime()));
    }
    //基於Cookie的實現
    @RequestMapping("/gjhByCookie")
    public String test3(String lge, HttpServletRequest request,HttpServletResponse response) {
        Locale locale;// 國際化語言資訊
        System.out.println(lge);
        switch (lge) {
        case "zh":// 中文
            // 引數說明:1、語言2、國家
            locale = new Locale("zh", "CN");
            break;
        case "en":// 英文
            locale = new Locale("en", "US");
            break;
        default:
            // 獲取預設的國際化
            locale = LocaleContextHolder.getLocale();
            break;
        }
        //CookieLocaleResolver localeResolver=new CookieLocaleResolver();
        localeResolver.setLocale(request, response, locale);
        return "index";
    }
}

頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!--配置標籤庫  -->
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>國際化的實現</title>
</head>
<body>
<div style="float:right">
<a href="gjhByCookie?lge=zh">中文</a>|<a href="gjhByCookie?lge=en">英文</a>
</div>
<h1><spring:message code="labeltime"/>:${time}</h1>
</body>
</html>

上述就是SpringMVC實現國際化的三種方式的詳細程式碼。