前言
什么是国际化改造?就是说,代码中存在的各种输出(日志、异常或是业务上)的内容,都可以提取出来做国际化改造,把这些内容按照一定的规定,提取成一个key
,前端发送请求的时候,来判断究竟需要获取哪个语言的内容。
国际化改造
首先,要确保自己有web依赖,向maven中添加下面的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建WebConfig
定义拦截器和初始语言
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang");
registry.addInterceptor(interceptor);
}
@Bean
LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return localeResolver;
}
}
通过实现WebMvcConfigurer
接口的addInterceptors
方法
即可添加一个"lang"的拦截器,当访问接口后面带上lang=?
即可触发相应的语言localeResolver
定义了默认的语言
在resource
下建立 i18n 文件夹,并按照相应格式创建对应的文件
在server.properties
中,需要配置国际化内容的路径以及一些其他配置
接下来随便写一个Controller,在里面注入 MessageSource
内容
@Resource
MessageSource messageSource;
@GetMapping("/message")
public String message() {
return messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale());
}
我分别将 messages.properties的user.name=1
messages_zh_CH.properties的user.name=2
messages_en_US.properties的user.name=3
当我对GET http://localhost:8088/message?lang=en_US
进行访问时,返回的结果是3
访问后缀为zh_CH时,会变为2
只需要访问一次,项目便会记录下来你的Cookie,以后不需要带后面的lang,就可以访问对应的结果
额外说明
所以说为什么要用messageSource的getMessage?而不是直接用原生的server.properties,我在起初要做国际化改造的时候也有同样的疑问。因为当我们拦截器获取到一次路径上的lang
时,就会记录下来,并且指向对应的properties,也就是说,在代码中你不需要对其进行任何修改,以后可以“无痛”扩容各种国家的语言,在代码中依旧使用一样的路径。
像这样,Idea会自动解析你的messages们,把他们变成可读的内容。
为什么我说只需要获取路径上一次lang
?因为在他第一次获取的时候,就已经把你的语言状态记录了下来,以后再怎么访问其他内容,系统会默认把你设置为刚才访问的语言对象。我们经常可以看到,当访问外国网站,切换成中文时,链接路径上会出现zh
的字样,这便是获取出来的语言设定。
当我们点击页面的切换其他语言,就会重新对lang
进行设定,也会把之前的对象替换成你现在刷新的lang
对象。