4.2.4 配置国际化页面
1.编写多语言国际化配置文件
在项目的类路径 resources 下创建名称为 i18n 的文件夹,并在该文件夹中根据需要编写对应的多语言国际化文件 login.properties、login_zh_CN.properties 和 login_en_US.properties 文件
login.properties
properties
login.tip= 请登录
login.username= 用户名
login.password= 密码
login.rememberme= 记住我
login.button= 登录
login_zh_CN.properties
properties
login.tip= 请登录
login.username= 用户名
login.password= 密码
login.rememberme= 记住我
login.button= 登录
login_en_US.properties
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 全局配置文件,在该文件中添加国际化文件基础名设置,内容如文件
properties
配置国际化文件基础名
spring.messages.basename=i18n.login
spring.messages.basename=i18n.login”设置了自定义国际化文件的基础名。其中,i18n 表示国际化文件相对项目类路径 resources 的位置,login 表示多语言文件的前缀名。如果开发者完全按照 Spring Boot 默认识别机制,在项目类路径 resources 下编写 messages.properties 等国际化文件,可以省略国际化文件基础名的配置
定制区域信息解析器
在完成上一步中多语言国际化文件的编写和配置后,就可以正式在前端页面中结合 Thymeleaf 模板相关属性进行国际化语言设置和展示了,不过这种实现方式默认是使用请求头中的语言信息(浏览器语言信息)自动进行语言切换的,有些项目还会提供手动语言切换的功能,这就需要定制区域解析器了
在项目中创建名为 com.lagou.config 的包,并在该包下创建一个用于定制国际化功能区域信息解析器的自定义配置类 MyLocalResovel
java
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)
刚学了拉勾教育的《Java 工程师高薪训练营》,看到刚学到的点就回答了。希望拉勾能给我推到想去的公司,目标:字节!!