Springboot 国际化通过Header中Accept-Language的值切换语言实战与源码解析
前言
接到将系统进行国际化改造的需求,简单理解就是系统要跟随浏览器进行中英文语言切换,但由于老系统返回的数据有些是用中文的,导致还需要把所有中文改成英文字段,然后再配置中英文配置文件进行映射(不管在什么场景下,请不要用中文或者拼音,太难搞了)
实战操作
一、添加配置文件
1、在resource文件夹下新建 i18n 文件夹
2、新建 Resource Bundle 资源文件,包括中英文的配置文件
3、配置 i18n
新增一个配置类,只需要在这个配置类中,注入这个bean,LocaleResolver即可
这里选用的是 AcceptHeaderLocaleResolver()这个类,目的是使用请求头中的Accept-Language的属性进行语言切换
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver slr = new AcceptHeaderLocaleResolver();
//设置默认语言,中文
slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return slr;
4、从配置文件中获取中英文
可以使用MessageSource这个类获取中英文
/**
* 根据消息键和参数 获取消息 委托给spring messageSource
*
* @param code 消息键
* @param args 参数
* @return 获取国际化翻译值
*/
public static String message(String code, Object... args)
{
MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
String message = code;
try{
message = messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
}catch (NoSuchMessageException e){
return message;
}
return message;
}
MessageSource会从配置文件中获取对应的中英文,如果没有获取到这个配置就会抛出
NoSuchMessageException
这个异常
然后就可以直接调用这个静态方法获取中英文了
MessageUtils.message("success") //英:Success ,中:成功
重点:AcceptHeaderLocaleResolver 源码解析
AcceptHeaderLocaleResolver是如何获取到 accept-language 中的值的呢
找到resolverLocale方法,如果已经默认且accept-language的值为空,则直接返回默认语言
,否则使用 request.getLocale()方法获取
进入ServletRequest接口中,找到实现getLocale()的方法
发现是获取request中的属性locale, 这里有个 localesParsed 这个属性,初始化时是false,也就是说第一次要先调用parseLocales()方法,解析Accept-Language
继续跟进,重点关注 parseLocalesHeader()这个方法,会把请求头中的Accept-Language中的值获取并且根据英文逗号进行分割(,),
获取到所有的属性后,会调用addLocale()方法
此时再回到第一步,这里就可以getLocale()成功获取国际化属性了
至此,Accept-Language的值就获取成功了
在请求头中添加属性
Accept-Language:en-US,zh-CN
Accept-Language:zh-CN
即可看到效果
我们通过看源码就知道,存的是一个List,所以也只会取第一个