1、通过浏览器语言设置国际化(根据请求头中的language)
* ·基于浏览器设置的语言切换国际化
* 1.新建jsp对应的国际化属性资源文件
* login.properties
* login_zh_CN.properties 简体中文-中国
* login_en_US.properties 英文-美国
* 2.配置spring-mvc.xml,将国际化支持和资源文件注入到spring容器中
* <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
* <property name="basenames">
* <array>
* <value>i18n/login</value>
* 如果还有别的jsp页面需要国际化,继续在这里加
* </array>
* </property>
* <property name="defaultEncoding" value="UTF-8"/>
* </bean>
* 3.在jsp页面调用对应的属性资源内容:<spring:message code="绑定属性资源中对应的key"/>
1.1、属性文件
login.properties
Email.user.email=请输入正确的邮箱!
NotEmpty.user.email=邮箱地址不能为空!
NotEmpty.user.password=密码必须输入!
text.birthday=生日
text.email=邮箱地址
text.login=登录
text.login_error=邮箱:{0}或密码:{1}错误!
text.password=密码
text.remember=记住我
text.welcome=欢迎来到聚义二手车
typeMismatch.user.birthday=日期格式不正确!
login_en_US.properties
Email.user.email=Please check your email format!
NotEmpty.user.email=Emial cant not be empty.
NotEmpty.user.password=Password required!
text.birthday=Birthday
text.email=Email Adress
text.login=Log in
text.login_error=Email or password error!
text.password=Password
text.remember=Remember me
text.welcome=Welcome to loyal second car
typeMismatch.user.birthday=Date format is wrong!
login_zh_CN.properties
Email.user.email=请输入正确的邮箱!
NotEmpty.user.email=邮箱地址不能为空!
NotEmpty.user.password=密码必须输入!
text.birthday=生日
text.email=邮箱地址
text.login=登录
text.login_error=邮箱:{0}或密码:{1}错误!
text.password=密码
text.remember=记住我
text.welcome=欢迎来到聚义二手车
typeMismatch.user.birthday=日期格式不正确!
1.2、配置文件spring-mvc.xml
<!--设置国际化支持,配置国际化属性资源-->
<bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
<property name="basenames">
<array>
<value>i18n/login</value>
</array>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<!--
步骤1.
使用SessionLocaleResolver来在session中获取Locale对象,
而不是在requset中获取Locale对象
-->
<bean class="org.springframework.web.servlet.i18n.SessionLocaleResolver" id="localeResolver"></bean>
<!--
步骤2.
方式2:使用springmvc 提供的拦截器接收locale参数(en_US,cn_ZH),然后设置到Session中去
-->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>
1.3、login.jsp(使用bootsrap前端页面)
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2021/3/13
Time: 15:30
To change this template use File | Settings | File Templates.
--%>
<%@ 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" %>
<% request.setAttribute("basePath",request.getContextPath()); %>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>登录页面——国际化</title>
<link rel="canonical" href="https://getbootstrap.com/docs/4.5/examples/floating-labels/">
<!-- Bootstrap core CSS -->
<link href="${basePath}/assets/dist/css/bootstrap.css" rel="stylesheet">
<style>
.bd-placeholder-img {
font-size: 1.125rem;
text-anchor: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
@media (min-width: 768px) {
.bd-placeholder-img-lg {
font-size: 3.5rem;
}
}
</style>
<!-- Custom styles for this template -->
<link href="${basePath}/assets/dist/css/floating-labels.css" rel="stylesheet">
<title>登录界面</title>
</head>
<body>
<form:form class="form-signin" action="${basePath}/login" method="post" modelAttribute="user">
<div class="text-center mb-4">
<img class="mb-4" src="${basePath}/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal"><spring:message code="text.login"></spring:message></h1>
<p><spring:message code="text.welcome"></spring:message></p>
<div class="row">
<a class="col-md-6" href="${basePath}/i18n/zh_CN">中文</a>
<a class="col-md-6" href="${basePath}/i18n/en_US">English</a>
</div>
<div class="row">
<a class="col-md-6" href="${basePath}/i18n?locale=zh_CN">中文-拦截器</a>
<a class="col-md-6" href="${basePath}/i18n?locale=en_US">English-Interceptor</a>
</div>
</div>
<div class="form-label-group">
<input type="input" id="inputEmail" name="email" class="form-control" placeholder="邮箱地址" autofocus>
<label for="inputEmail"><spring:message code="text.email"></spring:message></label>
<form:errors path="email"></form:errors>
</div>
<div class="form-label-group">
<input type="password" id="inputPassword" name="password" class="form-control" placeholder="密码">
<label for="inputPassword"><spring:message code="text.password"></spring:message></label>
<form:errors path="password"></form:errors>
</div>
<div class="form-label-group">
<input type="text" id="inputBirthday" name="birthday" class="form-control" placeholder="生日">
<label for="inputBirthday"><spring:message code="text.birthday"></spring:message></label>
<form:errors path="birthday"></form:errors>
</div>
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"><spring:message code="text.remember"></spring:message>
</label>
</div>
${errMsg}
<button class="btn btn-lg btn-primary btn-block" type="submit"><spring:message code="text.login"></spring:message></button>
<p class="mt-5 mb-3 text-muted text-center">© 2017-2021</p>
</form:form>
</body>
</html>
2、通过超链接来切换国际化
* ·使用超链接的方式实现国际化
* 1.在spring-mvc.xml中更改默认本地化语言解析器LocaleResolver为SessionLocaleResolver(使用session)
* 而不是应用请求头request
* 方式1:创建一个请求方法接受locale参数(en_US,cn_ZH),然后设置到Session中去
* 方式2:使用springmvc 提供的拦截器接收locale参数(en_US,cn_ZH),然后设置到Session中去
SpringMVC还允许装配--个动态更改本地化类型的拦截器,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
I18NController.java
package cn.qqa.controllers;
import cn.qqa.entity.User;
import com.sun.deploy.net.HttpResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
* ·基于浏览器设置的语言切换国际化
* 1.新建jsp对应的国际化属性资源文件
* login.properties
* login_zh_CN.properties 简体中文-中国
* login_en_US.properties 英文-美国
* 2.配置spring-mvc.xml,将国际化支持和资源文件注入到spring容器中
* <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
* <property name="basenames">
* <array>
* <value>i18n/login</value>
* 如果还有别的jsp页面需要国际化,继续在这里加
* </array>
* </property>
* <property name="defaultEncoding" value="UTF-8"/>
* </bean>
* 3.在jsp页面调用对应的属性资源内容:<spring:message code="绑定属性资源中对应的key"/>
*
* ·使用超链接的方式实现国际化
* 1.在spring-mvc.xml中更改默认本地化语言解析器LocaleResolver为SessionLocaleResolver(使用session)
* 而不是应用请求头request
* 方式1:创建一个请求方法接受locale参数(en_US,cn_ZH),然后设置到Session中去
* 方式2:使用springmvc 提供的拦截器接收locale参数(en_US,cn_ZH),然后设置到Session中去
*
*
*/
@Controller
public class I18NController {
@RequestMapping("/i18n")
public String i18n(User user){
return "login";
}
@RequestMapping("/i18n/{language}_{country}")
public String changeLocale(@PathVariable(value = "language") String language,
@PathVariable(value = "country") String country,
@Autowired SessionLocaleResolver sessionLocaleResolver,
HttpServletRequest request, HttpServletResponse response){
Locale locale = new Locale(language, country);
sessionLocaleResolver.setLocale(request, response, locale);
return "login";
}
}
3、国际化类型转换和验证失败的信息
验证失败:如果是JRS303验证的信息: key的前缀为:注解+对象.属性 。
3.1、UserController.java
package cn.qqa.controllers;
import cn.qqa.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.validation.Valid;
import java.util.Locale;
/**
* ·解决java硬编码的国际化
* 1.在属性资源文件中加入需要国际化的硬编码内容
* 2.将MessageSource自动注入
* 3.使用messageSource.getMessage获取国际化内容
* (1)String code 资源文件中的key
* (2)args 文本中的参数,可以用占位符的方式在资源文件中设置占位符:以{0}的方式
* (3)locale 当前的本地化语言
*
*
*/
@Controller
public class UserController {
@Autowired
MessageSource messageSource;
@RequestMapping("/login")
public String login(@Valid User user, BindingResult bindingResult, Model model, Locale locale){
if(bindingResult.hasErrors()){
return "login";
}
//验证用户名或密码是否正确
if(!user.getEmail().equals("123@qq.com")&&!user.getPassword().equals("123456")){
String message = messageSource.getMessage("text.login_error", new Object[]{user.getEmail(),user.getPassword() }, locale);
model.addAttribute("errMsg", message);
return "login";
}
return "admin";
}
}
3.2、User.java
package cn.qqa.entity;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;
public class User {
private Integer id;
@NotEmpty//(message = "邮箱地址不能为空!")
@Email//(message = "请输入正确的邮箱!")
private String email;
@NotEmpty//(message = "密码必须输入!")
private String password;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", email='" + email + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
'}';
}
}