SpringMVC 19. 国际化

xiaoxiao2021-02-28  14

国际化

概述

默认情况下,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.文件上传

转载请注明原文地址: https://www.6miu.com/read-2800199.html

最新回复(0)