配置国际化页面
1.编写多语言国际化配置文件
在项目的类路径 resources 下创建名称为 i18n 的文件夹,并在该文件夹中根据需要编写对应的多语言国际化文件 login.properties、login_zh_CN.properties 和 login_en_US.properties 文件
login.properties
login.tip= 请登录
login.username= 用户名
login.password= 密码
login.rememberme= 记住我
login.button= 登录
login_zh_CN.properties
login.tip= 请登录
login.username= 用户名
login.password= 密码
login.rememberme= 记住我
login.button= 登录
login_en_US.properties
login.tip=Please sign in
login.username=Username
login.password=Password
login.rememberme=Remember me
login.button=Login
login.properties 为自定义默认语言配置文件,login_zh_CN.properties 为自定义中文国际化文件,login_en_US.properties 为自定义英文国际化文件
需要说明的是,Spring Boot 默认识别的语言配置文件为类路径 resources 下的 messages.properties;其他语言国际化文件的名称必须严格按照“文件前缀名_语言代码_国家代码.properties”的形式命名
本示例中,在项目类路径 resources 下自定义了一个 i18n 包用于统一配置管理多语言配置文件,并将项目默认语言配置文件名自定义为 login.properties,因此,后续还必须在项目全局配置文件中进行国际化文件基础名配置,才能引用自定义国际化文件
2. 编写配置文件
打开项目的 application.properties 全局配置文件,在该文件中添加国际化文件基础名设置,内容如文件
# 配置国际化文件基础名
spring.messages.basename=i18n.login
spring.messages.basename=i18n.login”设置了自定义国际化文件的基础名。其中,i18n 表示国际化文件相对项目类路径 resources 的位置,login 表示多语言文件的前缀名。如果开发者完全按照 Spring Boot 默认识别机制,在项目类路径 resources 下编写 messages.properties 等国际化文件,可以省略国际化文件基础名的配置
3. 制区域信息解析器
在完成上一步中多语言国际化文件的编写和配置后,就可以正式在前端页面中结合 Thymeleaf 模板相关属性进行国际化语言设置和展示了,不过这种实现方式默认是使用请求头中的语言信息(浏览器语言信息)自动进行语言切换的,有些项目还会提供手动语言切换的功能,这就需要定制区域解析器了
在项目中创建名为 com.lagou.config 的包,并在该包下创建一个用于定制国际化功能区域信息解析器的自定义配置类 MyLocalResovel
package com.lagou.config;
import
org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import
org.springframework.util.StringUtils;
import
org.springframework.web.servlet.LocaleResolver;
import
javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
@Configuration
public class MyLocaleResovel implements
LocaleResolver {
// 自定义区域解析方式
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
// 获取页面手动切换传递的语言参数 l
String l = httpServletRequest.getParameter("l");
// 获取请求头自动传递的语言参数 Accept-Language
String header =
httpServletRequest.getHeader("Accept-Language");
Locale locale=null;
// 如果手动切换参数不为空,就根据手动参数进行语言切换,否则默认根据请求头信息切换
if(!StringUtils.isEmpty(l)){String[] split = l.split("_");
locale=new Locale(split[0],split[1]);
}else {
// Accept-Language: en-US,en;q=0.9
,zh-CN;q=0.8,zh;q=0.7
String[] splits = header.split(",");
String[] split = splits[0].split("-");
locale=new Locale(split[0],split[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, @Nullable
HttpServletResponse
httpServletResponse, @Nullable Locale locale) { }
// 将自定义的 MyLocalResovel 类重新注册为一个类型 LocaleResolver 的 Bean 组件
@Bean
public LocaleResolver localeResolver(){return new MyLocalResovel();
}
}
MyLocalResolver 自定义区域解析器配置类实现了 LocaleResolver 接口,并重写了其中的 resolveLocale()方法进行自定义语言解析,最后使用 @Bean 注解将当前配置类注册成 Spring 容器中的一个类型为 LocaleResolver 的 Bean 组件,这样就可以覆盖默认的 LocaleResolver 组件。其中,在 resolveLocale()方法中,根据不同需求(手动切换语言信息、浏览器请求头自动切换语言信息)分别获取了请求参数 l 和请求头参数 Accept-Language,然后在请求参数 l 不为空的情况下就以 l 参数携带的语言为标准进行语言切换,否则就定制通过请求头信息进行自动切换。
需要注意的是,在请求参数 l 的语言手动切换组装时,使用的是下划线“_”进行的切割,这是由多语言配置文件的格式决定的(例如 login_zh_CN.properties);而在请求头参数 Accept-Language 的语言自动切换组装时,使用的是短横线“-”进行的切割,这是由浏览器发送的请求头信息样式决定的(例如 Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7)
4. 页面国际化使用
打开项目 templates 模板文件夹中的用户登录页面 login.html,结合 Thymeleaf 模板引擎实现国际化功能
<!DOCTYPE html>
<html lang="en"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1,shrink-to-fit=no">
<title> 用户登录界面 </title>
<link th:href="@{/login/css/bootstrap.min.css}"
rel="stylesheet">
<link th:href="@{/login/css/signin.css}"
rel="stylesheet">
</head>
<body class="text-center">
<!--
用户登录 form 表单 -->
<form class="form-signin">
<img class="mb-4"
th:src="@{/login/img/login.jpg}" width="72"
height="72">
<h1 class="h3 mb-3 font-weight-normal"
th:text="#{login.tip}"> 请登录 </h1>
<input type="text" class="form-control"
th:placeholder="#{login.username}" required=""autofocus="">
<input type="password" class="form-control"
th:placeholder="#{login.password}" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me">
[[#{login.rememberme}]]
</label>
</div>
<button class="btn btn-lg btn-primary btn-block"
type="submit" th:text="#{login.button}"> 登录 </button>
<p class="mt-5 mb-3 text-muted">© <span
th:text="${currentYear}">2018</span>-<span
th:text="${currentYear}+1">2019</span></p>
<a class="btn btn-sm"
th:href="@{/toLoginPage(l='zh_CN')}"> 中文 </a>
<a class="btn btn-sm" th:href="@{/toLoginPage(l='en_US')}">English</a>
</form>
</body>
</html>
使用 Thymeleaf 模板的 #{}消息表达式设置了国际化展示的部分信息。在对记住我 rememberme 国际化设置时,需要国际化设置的 rememberme 在 <input> 标签外部,所以这里使用了行内表达式 [[#{login.rememberme}]] 动态获取国际化文件中的 login.rememberme 信息。另外,在 <form> 表单尾部还提供了中文、English 手动切换语言的功能链接,在单击链接时会分别携带国家语言参数向“/”路径请求跳转,通过后台定制的区域解析器进行手动语言切换
5. 整合效果测试
ish”链接进行语言国际化切换时携带了指定的“l=zh_CN”参数,后台定制的区域解析器配置类 MyLocalResovel 中的解析方法会根据定制规则进行语言切换,从而达到了手动切换国际化语言的效果
这些内容,是从拉勾教育的《Java 工程师高薪训练营》里学到的,课程内容非常全面,还有拉勾的内推大厂服务,推荐你也看看。