美文网首页SpringBoot
SpringBoot 国际化配置

SpringBoot 国际化配置

作者: 帅大叔的简书 | 来源:发表于2019-07-01 14:35 被阅读0次

    一、配置LocaleResolver

    @Configuration
    public class LocaleConfig extends WebMvcConfigurerAdapter{
    
        @Bean
        public LocaleResolver localeResolver() {
            SessionLocaleResolver slr = new SessionLocaleResolver();
            // 默认语言
            slr.setDefaultLocale(Locale.CHINA);
            return slr;
        }
     
        @Bean
        public LocaleChangeInterceptor localeChangeInterceptor() {
            LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
            // 参数名
            lci.setParamName("lang");
            return lci;
        }
     
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(localeChangeInterceptor());
            super.addInterceptors(registry);
        }
    
    }
    

    二、创建国际化文件

    messages.properties
    messages_zh_CN.properties
    messages_en_US.properties
    messages_ja_JP.properties
    ...
    
    
    内容如下:
    top.lrshuai.text=简体
    top.lrshuai.name=帅哥
    top.lrshuai.age=20
    message=国际化
    
    
    

    三、配置国际化文件路径

    在application.yml 配置国际化文件所在位置

    spring:
        messages:
            encoding: UTF-8  
            cache-seconds: 1  
            basename: static/i18n/messages
    

    四、前端页面调用国际化

    在Thymeleaf模板中通过 th:text#{国际化文件的KEY} 即可使用国际化
    前端需要传的语言参数为lang示例如下:

    <body>
        <div class="language">
        <div th:switch="${#locale.getCountry()}">
            <span th:case="'CN'" >简体中文</span>
            <span th:case="'TW'" >繁體中文</span>
            <span th:case="'US'" >English</span>
            <span th:case="'JP'" >日语</span>
            <span th:case="'KR'" >韩语</span>
        </div>
            <ul class="langBody">
                <li><a href="?lang=zh_CN">简体中文</a></li>
                <li><a href="?lang=zh_TW">繁體中文</a></li>
                <li><a href="?lang=en_US">English</a></li>
                <li><a href="?lang=ja_JP">日语</a></li>
                <li><a href="?lang=ko_KR">韩语</a></li>
            </ul>
        </div>
        <div class="language">
            <div th:text="#{top.lrshuai.text}">asdfSW</div>
            <div th:text="#{top.lrshuai.name}">asdf</div>
            <div th:text="#{top.lrshuai.age}">asdf</div>
            <span th:text="#{message}">ffff</span><br/>
        </div>
    </body>
    

    五、接口返回值国际化

    通过前端传上来的语言,我们接口返回值需要通过转上来的语言,返回对应的数据。
    在Spring中,我们只需要实现ResponseBodyAdvice<T> 接口即可,代码如下

    /**
    * 别忘了加注解,basePackages 是对哪些包进行扫描
    */
    @ControllerAdvice(basePackages={"top.lrshuai.controller"})
    public class I18nResponseAdvice implements ResponseBodyAdvice<Object> {
    
        protected Logger log = LoggerFactory.getLogger(this.getClass());
    
        @Override
        public boolean supports(MethodParameter returnType,
                Class<? extends HttpMessageConverter<?>> converterType) {
            return true;
        }
    
        /**
        *这个方法获取到返回数据,对其进行拦截修改即可
        */
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType,
                MediaType selectedContentType,
                Class<? extends HttpMessageConverter<?>> selectedConverterType,
                ServerHttpRequest request, ServerHttpResponse response) {
            try {
                //body 就是返回的数据体
                HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
                String value = getMessage(req, "name");
                //TODO
                
                
            } catch (Exception e) {
                e.printStackTrace();
                log.error("返回值国际化拦截异常",e);
            }
            return body;
        }
        
        /**
         * 返回国际化的值
         * @param request
         * @param key
         * @return
         */
        public String getMessage(HttpServletRequest request, String key){
            RequestContext requestContext = new RequestContext(request);
            String value = requestContext.getMessage(key);
            return value;
        }
    
    }
    

    在上面的代码中 getMessage(HttpServletRequest request, String key) 就是获取国际化的值,通过key 获取对应国际化的文件值

    代码地址

    相关文章

      网友评论

        本文标题:SpringBoot 国际化配置

        本文链接:https://www.haomeiwen.com/subject/kzpgcctx.html