SpringBoot——国际化

国际化

国际化,也叫 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值