SpringBoot 国际化
SpringBoot进行国际化
-
编写国际化配置文件,抽取页面需要显示的国际化消息
-
在全局配置文件中写我们配置的位置
原理就是SpringBoot自动配置好了管理国际化资源文件的组件
MessageSourceAutoConfiguration会去全局配置文件中找spring.messages开头的 找到对应的国际化配置文件
其中etBasename()的默认返回值是messages,也就是我们的国际化资源文件的名字可以直接写成messages,这样就不用再在全局配置文件中配置我们自己写的名字了 -
去页面获取国际化的值
SpringBoot用的模板引擎是Thymeleaf, 通过#{}来获取国际化资源的值
properties中文乱码
properties中写中文后 会有乱码问题我们可以在Idea设置
SpringBoot 国际化的自动配置
在SpringBoot中的WebMvcAutoConfiguration类中的localeResolver方法就是关于国际化的自动配置
LocalResolver用来获取区域信息对象
localeResolver()方法:
属性有指定的固定的就用属性指定的
没有就 new AcceptHeaderLocaleResolver();
AcceptHeaderLocaleResolver
从AcceptHeaderLocaleResolver类中的resolveLocale方法中,我们可以看出 这个解析器是通过请求头request中拿到区域信息
所以我们用这个解析器的效果就是, 我们的浏览器设置的指定语言是什么,然后发送请求时的请求头就会对应。
如下图浏览器设置的中文在最前面, Request Headers 的Accept-Language的最前面就是zh-CN ,解析器获取的就是 中文,就会显示对应中文的信息
自定义LocaleResolver
我们想实现点击链接实现国际化,就要自己实现LocaleResolver
效果就是 点下面的English 然后 参数就会带l=en_US ,通过我们的LocaleResolver 返回 英文的locale
- 第一步:实现LocaleResolver
public class MyLocaleResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest httpServletRequest) { String l = httpServletRequest.getParameter("l"); Locale locale = Locale.getDefault(); //没带区域信息就用系统默认的 if(!StringUtils.isEmpty(l)){ //参数带了就用参数的 String[] split = l.split("_"); locale = new Locale(split[0],split[1]); } return locale; } @Override public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { } }
- 第二步:将我们的LocaleResolver加入到容器中
在MyMvcConfig中加入localeResolver()方法
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
}
原理
WebMvcAutoConfiguration自动配置的LocaleResolver上面有@ConditionalOnMissingBean注解
也就是容器中没有LocaleResolver的时候才会配,如果有就不会配。
所以我们把自己实现的LocaleResolver加入到容器中后,系统就不会配了