SpringMVC 19. 国际化

本文介绍了SpringMVC中实现国际化的方法,包括如何根据客户端请求设置语言偏好,使用SessionLocaleResolver和LocaleChangeInterceptor来动态改变本地化设置,并展示了具体的配置步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

国际化

概述

  • 默认情况下,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页面可以切换语言显示。

切换

上一篇:SpringMVC 18.处理 JSON:使用 HttpMessageConverter
下一篇:SpringMVC 20.文件上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值