国际化
国际化,也叫 i18n
,这是因为国际化英文是 internationalization ,在 i 和 n 之间有 18 个字母,所以叫 i18n。我们的应用如果做了国际化就可以在不同的语言环境下,方便的进行切换,最常见的就是中文和英文之间的切换。
SpringBoot支持国际化,帮助满足不同语言需求的用户。
在Spring中,就通过 AcceptHeaderLocaleContextResolver
对国际化提供了支持。
1、基本使用
SpringBoot对于国际化的支持,默认是通过 AcceptHeaderLocaleResolver
解析器来完成的,这个解析器是通过请求头中的 Accept-Language
字段来判断当前请求所属环境的。
默认的国际化配置是放在resource目录下,下面我们写几个测试文件:
#messages.properties
user.name=名字
#messages_zh_CN.properties
user.name=name
##messages_en_US.properties
user.name=姓名~
需要注意的是:
在创建上面三个文件时,IDE编译器会自动把添加到
Resource Bundle messages
,这个不需要我们手动去创建;默认的文件名称是
messages
,如果没有配置,就不能更改。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbGJvW8A-1583473493428)(file:///Users/yanjundong/Documents/typora/JAVA/SpringBoot-img/WX20200306-102146.png?lastModify=1583461383)]
配置完成后,我们就可以直接开始使用了。在需要使用值的地方,直接注入 MessageSource 实例即可。如下例:
/*HelloController.java*/
@RestController
public class HelloController {
@Autowired
private MessageSource messageSource;
@GetMapping("/hello")
public String hello() {
return messageSource.getMessage("user.name", null, LocaleContextHolder.getLocale());
}
}
getMessage
方法:
第一个参数是要获取变量的 key
第二个参数是如果 value 中有占位符,可以从这里传递参数进去
第三个参数传递一个 Locale 实例即可,这里传入了当前的语言环境。
下面是使用 Postman
对这个接口的测试:
配置文件中messages.properties
是默认配置,当没有语言匹配时,就会返回其中的内容(我们上面没有配置 zh_TW
语言):
2、自定义切换
参数可以当成普通参数放在地址栏上,通过如下配置可以实现我们的需求。
/*WebConfig.java*/
@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;
}
}
在上面的配置中,我们先配了一个
Bean
,这个 bean 会替换掉默认的 AcceptHeaderLocaleResolver(因此该bean 的名字必须为localResolver,否则检测不到),不同于 AcceptHeaderLocaleResolver 通过请求头来判断当前的环境信息,SessionLocaleResolver 将客户端的 Locale 保存到 HttpSession 对象中。(这意味着当前环境信息,前端发送一次即可记住,只要 session 有效,浏览器不必再次告诉服务端当前的环境信息)。另外还配置了一个拦截器,这个拦截器会拦截请求中 key 为 lang 的参数(不配置的话默认是 locale),这个参数则指定了当前的环境信息。
在第二次请求时,就不需要携带lang这个参数。
3、其他自定义
默认情况下,配置文件是放在 resources 目录下,如果想自定义,也是可以的,例如定义在 resources/i18n 目录下:
但是,还需要在 application.properties
中进行额外配置,否则系统不能找到(注意这是一个相对路径):
spring.messages.basename=i18n/messages
另外还有一些编码格式的配置等,一般不需要更改这些默认配置,内容如下:
spring.messages.cache-duration=3600
spring.messages.encoding=UTF-8
spring.messages.cache-duration
表示 messages 文件的缓存失效时间,如果不配置则缓存一直有效。
4、语言简称表
语言 | 简称 |
---|---|
简体中文(中国) | zh_CN |
繁体中文(中国台湾) | zh_TW |
繁体中文(中国香港) | zh_HK |
英语(中国香港) | en_HK |
英语(美国) | en_US |
英语(英国) | en_GB |
英语(全球) | en_WW |
英语(加拿大) | en_CA |
英语(澳大利亚) | en_AU |
英语(爱尔兰) | en_IE |
英语(芬兰) | en_FI |
芬兰语(芬兰) | fi_FI |
英语(丹麦) | en_DK |
丹麦语(丹麦) | da_DK |
英语(以色列) | en_IL |
希伯来语(以色列) | he_IL |
英语(南非) | en_ZA |
英语(印度) | en_IN |
英语(挪威) | en_NO |
英语(新加坡) | en_SG |
英语(新西兰) | en_NZ |
英语(印度尼西亚) | en_ID |
英语(菲律宾) | en_PH |
英语(泰国) | en_TH |
英语(马来西亚) | en_MY |
英语(阿拉伯) | en_XA |
韩文(韩国) | ko_KR |
日语(日本) | ja_JP |
荷兰语(荷兰) | nl_NL |
荷兰语(比利时) | nl_BE |
葡萄牙语(葡萄牙) | pt_PT |
葡萄牙语(巴西) | pt_BR |
法语(法国) | fr_FR |
法语(卢森堡) | fr_LU |
法语(瑞士) | fr_CH |
法语(比利时) | fr_BE |
法语(加拿大) | fr_CA |
西班牙语(拉丁美洲) | es_LA |
西班牙语(西班牙) | es_ES |
西班牙语(阿根廷) | es_AR |
西班牙语(美国) | es_US |
西班牙语(墨西哥) | es_MX |
西班牙语(哥伦比亚) | es_CO |
西班牙语(波多黎各) | es_PR |
德语(德国) | de_DE |
德语(奥地利) | de_AT |
德语(瑞士) | de_CH |
俄语(俄罗斯) | ru_RU |
意大利语(意大利) | it_IT |
希腊语(希腊) | el_GR |
挪威语(挪威) | no_NO |
匈牙利语(匈牙利) | hu_HU |
土耳其语(土耳其) | tr_TR |
捷克语(捷克共和国) | cs_CZ |
斯洛文尼亚语 | sl_SL |
波兰语(波兰) | pl_PL |
瑞典语(瑞典) | sv_SE |
西班牙语(智利) | es_CL |