国际化概述
基于浏览器请求的国际化实现
新建实体类
package pers.zhang.entity;
/**
* @author zhang
* @date 2019/11/28 - 11:34
*/
public class User {
private String loginName;
private String password;
private int age;
private String email;
private String phone;
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"loginName='" + loginName + '\'' +
", password='" + password + '\'' +
", age=" + age +
", email='" + email + '\'' +
", phone='" + phone + '\'' +
'}';
}
}
在src根路径下,新建两个资源文件:
message_en_US.properties
loginName=LoginName
password=Password
age=Age
email=Email
phone=Phone
submit=Submit
welcome=Welcome {0}, Congratulations on your registration.
title=Register Page
userName=Administrator
info=Your registration information is as follows
message_zh_CH.properties
loginName=\u540D\u79F0
password=\u5BC6\u7801
age=\u5E74\u9F84
email=\u90AE\u7BB1
phone=\u7535\u8BDD
submit=\u6CE8\u518C
welcome=\u6B22\u8FCE {0},\u606D\u559C\u60A8\u6CE8\u518C\u6210\u529F
title=\u6CE8\u518C\u9875\u9762
userName=\u7BA1\u7406\u5458
info=\u60A8\u7684\u6CE8\u518C\u4FE1\u606F\u5982\u4E0B
在springmvc.xml中加载国际化资源文件:
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化资源文件名 -->
<property name="basename" value="message"/>
</bean>
<!-- AcceptHeaderLocaleResolver 因为是默认语言区域解析,可以不配置 -->
<bean name="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>
在webapp下的jsp文件夹中新建registerForm.jsp和success.jsp
registerForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%@ 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><spring:message code="title"/></title>
</head>
<body>
<a href="registerForm?request_locale=zh_CN">中文</a> |
<a href="registerForm?request_locale=en_US">英文</a>
<h3><spring:message code="title"/></h3>
<fm:form modelAttribute="user" action="register" method="post">
<spring:message code="loginName"/>:<fm:input path="loginName"/><br>
<spring:message code="password"/>:<fm:input path="password"/><br>
<spring:message code="age"/>:<fm:input path="age"/><br>
<spring:message code="email"/>:<fm:input path="email"/><br>
<spring:message code="phone"/>:<fm:input path="phone"/><br>
<input type="submit" value="<spring:message code="submit"/>"><br>
</fm:form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fm" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<font color="blue"><h4><spring:message code="welcome" arguments="${requestScope.user.loginName }"/> </h4></font>
<spring:message code="info"/><br>
<spring:message code="password"/>:${user.password }<br>
<spring:message code="age"/>:${requestScope.user.age }<br>
<spring:message code="email"/>:${requestScope.user.email }<br>
<spring:message code="phone"/>:${requestScope.user.phone }<br>
</body>
</html>
在controller包中新建UserController
package pers.zhang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.RequestContext;
import pers.zhang.entity.User;
import javax.servlet.http.HttpServletRequest;
/**
* @author zhang
* @date 2019/11/28 - 11:48
*/
@Controller
public class UserController {
@RequestMapping("/{formName}")
public String registerForm(@PathVariable String formName, Model model){
User user = new User();
model.addAttribute("user", user);
return formName;//动态跳转到页面
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(@ModelAttribute User user, Model model, HttpServletRequest request){
//从后台代码获取国际化资源文件中的信息 userName
RequestContext requestContext = new RequestContext(request);
String userName = requestContext.getMessage("userName");
model.addAttribute("user", user);
System.out.println(userName);
return "success";
}
}
测试:
修改浏览器的默认语言设置,并刷新页面,填入数据并提交:
基于HttpSession的国际化实现
基于HttpSession的国际化实现使用的是LocaleResolver接口的SessionLocaleResovler实现类,SessionLocaleResovler不是默认的语言区域解析器,需要对其进行显示配置。如果使用它,SpringMVC会从HttpSession作用域中获取用户所设置的语言区域,来确定使用哪个语言区域。通过请求参数改变国际化的值时,可使用Spring提供的国际化拦截器LocaleChangeInterceptor。
SessionLocaleResovler工作原理如下图:
修改springmvc.xml配置
注释默认的AcceptLanguageLocaleResolver
bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化资源文件名 -->
<property name="basename" value="message"/>
</bean>
<!-- <!– AcceptHeaderLocaleResolver 因为是默认语言区域解析,可以不配置 –>-->
<!-- <bean name="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>-->
<!-- SessionLocaleResolver 配置 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<mvc:interceptors>
<!-- 如果采用了基于Session/Cookie的国际化,必须配置国际化操作拦截器 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
修改获取跳转页面的registerForm()方法
@RequestMapping(value = "/{formName}")
public String registerForm(@PathVariable String formName, String request_locale,
Model model, HttpServletRequest request){
System.out.println("request_locale=" + request_locale);
if(request_locale != null){
if(request_locale.equals("zh_CN")){//设置中文环境
Locale locale = new Locale("zh", "CN");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
}else if(request_locale.equals("en_US")){//设置英文环境
Locale locale = new Locale("en", "US");
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, locale);
}else{//使用之前的语言环境
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, LocaleContextHolder.getLocale());
}
}
User user = new User();
model.addAttribute("user", user);
return formName;//动态跳转页面
}
测试
点击超链接切换语言:
基于Cookie的国际化实现
基于Cookie的国际化实现使用的是LocaleResolver接口CookieLocaleResolver 实现类,CookieLocaleResolver不是默认的语言区域解析器,需要对其进行显示配置。
修改springmvc.xml配置
<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化资源文件名 -->
<property name="basename" value="message"/>
</bean>
<!-- <!– AcceptHeaderLocaleResolver 因为是默认语言区域解析,可以不配置 –>-->
<!-- <bean name="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"/>-->
<!-- SessionLocaleResolver 配置 -->
<!-- <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>-->
<!-- CookieLocaleResolver 配置-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<mvc:interceptors>
<!-- 如果采用了基于Session/Cookie的国际化,必须配置国际化操作拦截器 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
</mvc:interceptors>
修改获取跳转页面的registerForm()方法
@RequestMapping(value = "/{formName}")
public String registerForm(@PathVariable String formName, String request_locale, Model model,
HttpServletRequest request, HttpServletResponse response){
System.out.println("request_locale=" + request_locale);
if(request_locale != null){
if(request_locale.equals("zh_CN")){//设置中文环境
Locale locale = new Locale("zh", "CN");
(new CookieLocaleResolver()).setLocale(request,response,locale);
}else if(request_locale.equals("en_US")){//设置英文环境
Locale locale = new Locale("en", "US");
(new CookieLocaleResolver()).setLocale(request,response,locale);
}else{//使用之前的环境
(new CookieLocaleResolver()).setLocale(request,response,LocaleContextHolder.getLocale());
}
}
User user = new User();
model.addAttribute("user", user);
return formName;
}
测试:点击标签切换语言环境
在浏览器调试窗口可以看到Cookie中的语言环境参数: