SpringMVC 19. 国际化

国际化

概述

  • 默认情况下,SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型。

  • 当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver),找到后使用它获取请求所对应的本地化类型信息。

  • SpringMVC 还允许装配一个动态更改本地化类型的拦截器,这样通过指定一个请求参数就可以控制单个请求的本地化类型。

  • 示例1:

in18_index.jsp

<html>
<head>
    <title>in18_index</title>
</head>
<body>
        <a  href="i18n">i18n page</a>
</body>
</html>

i18n.jsp :

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>i18n</title>
</head>
<body>
    <fmt:message key="i18n.username"></fmt:message>
    <a href="i18n2">i18n2 page</a>
</body>
</html>

i18n2.jsp:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>i18n2</title>
</head>
<body>
    <fmt:message key="i18n.password"></fmt:message>
    <a href="i18n">i18n page</a>
</body>
</html>

springmvc.xml加入:

 <!--配置国际化资源文件-->
    <bean  id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
    </bean>

<!--配置直接转发的页面-->
    <!--可以直接转发相应的页面,无需再经过Handler方法-->
    <mvc:view-controller path="i18n" view-name="i18n"></mvc:view-controller>
    <mvc:view-controller path="i18n2" view-name="i18n2"></mvc:view-controller>

  • 资源文件

i18n.properties

i18n.username=username
i18n.password=password

i18n_zh_CH.properties

i18n.username=用户名
i18n.password=密码

i18n_en_US.properties

i18n.username=Username
i18n.password=Password

SessionLocaleResolver &LocaleChangeInterceptor 工作原理

工作原理图

本地化解析器和本地化拦截器

  • AcceptHeaderLocaleResolver:根据 HTTP 请求头的Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器, SpringMVC 使用该解析器。

  • CookieLocaleResolver:根据指定的 Cookie 值确定本地化类型

  • SessionLocaleResolver:根据 Session 中特定的属性确定本地化类型

  • LocaleChangeInterceptor:从请求参数中获取本次请求对应
    的本地化类型。

修改springmvc.xml

<!--配置直接转发的页面-->
    <!--可以直接转发相应的页面,无需再经过Handler方法-->
    <mvc:view-controller path="success" view-name="success"></mvc:view-controller>
    <!--<mvc:view-controller path="i18n" view-name="i18n"></mvc:view-controller>-->
    <mvc:view-controller path="i18n2" view-name="i18n2"></mvc:view-controller>

springmvc.xml增加:

<!--配置:SessionLocaleResolver-->
    <!--此处id必须是localeResolver-->
    <!--否则发生Request processing failed; nested exception is java.lang.UnsupportedOperationException: Cannot change HTTP accept header - use a different locale resolution strategy-->
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

    <!--配置LocaleChangeInterceptor-->
    <mvc:interceptors>
        <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
    </mvc:interceptors>

i18n.jsp增加:

    <a href="i18n?locale=zh_CH">中文</a>
    <a href="i18n?locale=en_US">英文</a>

handler:I18nHandler.java


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Locale;


@Controller
public class I18nHandler {

        @Autowired
        private ResourceBundleMessageSource messageSource ;

        @RequestMapping("/i18n")
        public String testI18n(Locale locale ){
            String val = messageSource.getMessage("i18n.username",null ,locale) ;
            System.out.println(val);
            return "i18n" ;

        }
}

在i18n页面可以切换语言显示。

切换

猜你喜欢

转载自blog.csdn.net/hgx_suiyuesusu/article/details/80217051