SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言

我的上一篇博客介绍了SpringBoot如何根据浏览器环境切换语言实现国际化
SpringBoot国际化处理示例(一)—— 浏览器环境下切换语言


现在我们想实现通过按钮点击切换中英文
  1. 实现国际化事要是依靠LocaleResolver接口及其实现起作用,SpringBoot为我们自动配置了LocaleResolver组件,我们看源码分析一下
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言
    WebMvcAutoConfiguration中,注册了这个组件,大致意思就是如果配置了LocaleResolver是固定的话,那就注册FixedLocaleResolver;不然,注册AcceptHeaderLocaleResolver
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言
    继续来看AcceptHeaderLocaleResolver是怎么处理获取Locale

    request.getLocale();
    

    这个方法就是通过请求获得请求头中携带的国际化参数,如"zh_CN、en_US"

    看到这里大致就懂了吧,SpringBoot为我们自动配置的LocaleResolver组件实际是根据请求头中的 参数创建Locale,实现国际化


    但是现在我们的需求是从url路径上寻找是否有国际化语言变量,如果没有再从请求头的"Accept-Language"中获取

    所以我们需要自定义LocaleResolver

  2. 大致思路就是判断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();
        }
    
  3. 在相应的页面使用Thymeleaf,对a标签的href属性覆盖
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言

  4. 最终效果
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言
    从请求头中获取语言值,正常加载
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言
    点击下面的中英名切换
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言
    请求头中的仍然是zh_CN
    SpringBoot国际化处理示例(二)—— 自定义LocaleResolver点击按钮切换语言

    如有错误,欢迎指正