我的上一篇博客介绍了SpringBoot如何根据浏览器环境切换语言实现国际化
SpringBoot国际化处理示例(一)—— 浏览器环境下切换语言
现在我们想实现通过按钮点击切换中英文
-
实现国际化事要是依靠
LocaleResolver
接口及其实现起作用,SpringBoot为我们自动配置了LocaleResolver
组件,我们看源码分析一下
在WebMvcAutoConfiguration
中,注册了这个组件,大致意思就是如果配置了LocaleResolver
是固定的话,那就注册FixedLocaleResolver
;不然,注册AcceptHeaderLocaleResolver
继续来看AcceptHeaderLocaleResolver
是怎么处理获取Locale
的request.getLocale();
这个方法就是通过请求获得请求头中携带的国际化参数,如
"zh_CN、en_US"
看到这里大致就懂了吧,SpringBoot为我们自动配置的
LocaleResolver
组件实际是根据请求头中的 参数创建Locale
,实现国际化
但是现在我们的需求是从url路径上寻找是否有国际化语言变量,如果没有再从请求头的"Accept-Language"中获取所以我们需要自定义
LocaleResolver
-
大致思路就是判断url路径上是否有对应参数,如果没有就去请求头中寻找
import org.springframework.util.StringUtils; import org.springframework.web.servlet.LocaleResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; /** * @Author xiaoshijiu * @Date 2019/5/15 * @Description 自定义国际化处理器LocaleResolver * SpringBoot为我们自动配置的LocalResolver,是根据请求的请求头中的"Accept-Language"获取判断的 * 现在我们改写成先从url路径上寻找是否有国际化语言变量,如果没有再从请求头的"Accept-Language"中获取 */ public class MyLocaleResolver implements LocaleResolver { /** * 处理逻辑 * 接口核心方法,获取Locale,并返回 * @param request 请求 * @return Locale区域信息 */ @Override public Locale resolveLocale(HttpServletRequest request) { String l = request.getParameter("l"); if (StringUtils.isEmpty(l)) { //路径上没有国际化语言参数,采用默认的(从请求头中获取) return request.getLocale(); } else { String[] split = l.split("_"); //语言、国家构造器 return new Locale(split[0], split[1]); } } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { } }
再将自定义的
LocaleResolver
注册到spring容器中/** * 注册自定义的LocaleResolver */ @Bean public LocaleResolver localeResolver(){ return new MyLocaleResolver(); }
-
在相应的页面使用Thymeleaf,对a标签的href属性覆盖
-
最终效果
从请求头中获取语言值,正常加载
点击下面的中英名切换
请求头中的仍然是zh_CN
如有错误,欢迎指正