Spring MVC i18n

背景

不少網站的用戶分佈在世界各地,所以網站須要針對不一樣國家的用戶展現不一樣語言的內容,所以就有了國際化實現的需求,大多數網站都會在網站的頭部或尾部設置語言切換連接,這樣就能夠直接切換成相應的內容。html

解決思路

  1. 直接根據Request.getLocale()方法獲得本地化信息,實際就是從Http Request Headers裏面取「accept-language」對應的值,該值擁有瀏覽器端的語言信息;
  2. 在瀏覽器端保存一個自定義名字的cookie,默認狀況下指定一個值,對應的切換經過語言切換連接的點擊修改對應的值;
  3. 在請求URL上面添加帶本地化信息的參數或者地址裏面包含本地化信息

代碼實現

  • 步驟一 建立國際化資源文件
    國際化資源文件爲 properties 文件,properties 文件命名規則爲 basename_語言代碼_國家代碼.properties,假設咱們的程序須要中文和英文兩種語言支持,資源文件的 basename 爲 i18n,那麼classpath下須要建立一下兩個properties文件:i18n_zh_CN.properties、i18n_en_US.properties。前端

  • 步驟二 建立 ResourceBundleMessageSource 實例
    Spring MVC 中國際化資源文件被抽象成 ResourceBundleMessageSource 類,咱們能夠從該類中根據不一樣的 locale 和 key 獲取對應的內容。經過 basenames 屬性指定屬性文件基名,經過 defaultEncoding 指定屬性文件的編碼java

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames" value="i18n" />
    <property name="defaultEncoding" value="utf-8" />
</bean>
複製代碼

注意:該 bean 的 id 必須爲 messageSource ,不然 spring 將會找不到該 bean!!web

  • 步驟三 定義 LocaleResolver
    Spring MVC 中 LocaleResolver 用來從 request 中解析 locale 以及設置 locale,能夠是 request、session、cookie級別,典型的實現類有 AcceptHeaderLocaleResolver、SessionLocaleResolver、CookieLocaleResolver,默認狀況是 AcceptHeaderLocaleResolver,也就是根據請求頭中的 Accept-Language 來解析出 locale,即瀏覽器的語言,這個解析器只支持根據瀏覽器語言自動匹配,不支持手動切換語言環境.
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="zh_CN"/>
</bean>
複製代碼

注意:該 bean 的 id 必須爲 localeResolver,不然 spring 將會找不到該解析器!!spring

  • 步驟四 定義LocaleChangeInterceptor
    想要可以經過超連接等切換語言還須要定義 LocaleChangeInterceptor 攔截器,該攔截器的做用時攔截全部請求,若是請求中含有 locale 參數,則嘗試將 locale 參數解析成 Locale 對象,並設置基於 session 或者 cookie 的參數以便全部頁面語言都被切換.
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
複製代碼
  • 步驟五 後端代碼
@RequestMapping("signupsession")
public String signupsession(String request_locale, Model model, HttpServletRequest request) {
    if (request_locale != null) {
        if (request_locale.equals("zh_CN"))
            request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh","CN"));
        else if (request_locale.equals("en_US"))
            request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en","US"));
    }
    User user = new User();
    model.addAttribute("user", user);
    return "signup_session";
}

複製代碼
  • 步驟六 前端代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
    <title>SessionLocaleResovler</title>
</head>
<body>
<a href="/user/signupsession?request_locale=zh_CN">中文</a>|<a href="/user/signupsession?request_locale=en_US">英文</a>
<form:form method="post" action="regist" modelAttribute="user">
    <table>
        <tr>
            <td><spring:message code="language.username"/></td>
            <td><form:input path="name"/></td>
        </tr>
        <tr>
            <td><spring:message code="language.password"/></td>
            <td><form:password path="password"/></td>
        </tr>
    </table>
</form:form>
</body>
</html>
複製代碼
  • message標籤
    Spring MVC中顯示本地化消息一般使用Spring的message標籤。
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
複製代碼

參考連接: 代碼實現 工做原理後端

相關文章
相關標籤/搜索