前言
前天来个新需求,由于客户群体分中国内地、香港和国外,产品那边需要根据客户地区语言来决定系统里面的文案表现。于是给这个SpringBoot项目做上国际化配置。
实例代码
第一步,在resources资源目录下,创建i18n目录,然后分别创建四个文件:messages.properties、messages_zh_CN.properties、messages_zh_TW.properties和messages_en_US.properties。
第二步,在application.yml配置文件里面配置i18n目录。
spring:
# 语言包
messages:
basename: i18n/messages
第三步,配置国际化解析器。Spring现有提供的解析器有:SessionLocaleResolver、CookieLocaleResolver和AcceptHeaderLocaleResolver。
SessionLocaleResolver
SessionLocaleResolver允许你从session中取得可能与用户请求相关联的地区Locale和时区TimeZone信息。与CookieLocaleResolver不同,这种存取策略仅将Servlet容器的HttpSession中相关的地区信息存取到本地。因此,这些设置仅会为该会话(session)临时保存,session结束后,这些设置就会失效。
不过请注意,该解析器与其他外部session管理机制,比如Spring的Session项目等,并没有直接联系。该SessionLocaleResolver仅会简单地从与当前请求HttpServletRequest相关的HttpSession对象中,取出对应的属性,并修改其值,仅此而已。
CookieLocaleResolver
CookieLocaleResolver解析会检查客户端是否有Cookie,里面可能存放了地区Locale或时区TimeZone信息。如果检查到相应的值,解析器就使用它们。通过该解析器的属性,你可以指定cookie的名称和其最大的存活时间。
AcceptHeaderLocaleResolver
AcceptHeaderLocaleResolver解析器会检查客户端(比如,浏览器,等)所发送的请求中是否携带accept-language请求头。通常,该请求头字段中包含了客户端操作系统的地区信息。不过请注意,该解析器不支持时区信息的解析。
根据业务应用场景分析,我们采用的是SessionLocaleResolver。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
/**
* 国际化语言配置
* @author rokcy
* @date 2021/4/12 9:33
*/
@Configuration
public class LocaleConfig {
/**
* 默认解析器 其中locale表示默认语言
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.CHINA);
return localeResolver;
}
/**
* 默认拦截器 其中lang表示切换语言的参数名
*/
@Bean
public WebMvcConfigurer localeInterceptor() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// LocaleChangeInterceptors只支持从URL参数读取语言参数,为了也能从headers头部读取语言参数,我们继承了LocaleChangeInterceptors,并重写了preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)方法
CustomerLocaleChangeInterceptors localeInterceptor = new CustomerLocaleChangeInterceptors();
localeInterceptor.setParamName