JavaJava 杂谈

springboot中国际化实现

2019-05-14  本文已影响4人  cd4bd3aa39ec

一、国际化怎么确定语言。

springboot国际化的时候,是通过interface LocaleResolver 接口的实现类的bean来确定是哪种语言的。这个接口有2个方法: 1、resolveLocale 用来获取当前语言环境。 2、setLocale 修改语言环境。(针对Cookie、Session这种有状态的请求。)

LocaleResolver有下面4个实现。如图: 上面的图中LocaleResolver的实现类只有4个:

二、LocaleResolver的实现类。

1、AcceptHeaderLocaleResolver 确定语言。

查看AcceptHeaderLocaleResolver的源码后知道,每次请求的时候,AcceptHeaderLocaleResolver获取http的名字叫Accept-Language的header参数。来确定是哪种语言。 如果是API使用这种方式就需要在请求中加Accept-Language的header参数。web浏览器(比如:chrom)在请求的时候会自动把当前系统的语言附加到Accept-Language参数中。

2、SessionLocaleResolver 确定语言。

这个需要配置bean,把默认的AcceptHeaderLocaleResolver覆盖掉。

   @Bean
   public LocaleResolver localeResolver() {
      SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
      sessionLocaleResolver.setDefaultLocale(Locale.US);
      return sessionLocaleResolver;
   }

因为语言环境是存在session里面。如果需要改变语言环境。配置一个拦截器监听改变。

@Bean
   public LocaleChangeInterceptor localeChangeInterceptor() {
      LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
      localeChangeInterceptor.setParamName("language");
      return localeChangeInterceptor;
   }

上面的拦截器从request中获取language参数来改变语言环境。如:127.0.0.1:8080/tests?language=zh_CN。 其他几个就不说了。

三、国际化配置文件。

根据springboot文档。https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/htmlsingle/#boot-features-internationalization 里面的Internationalization。 需要在配置文件application.yml中配置:

spring.messages.basename=i18n/login
spring.messages.fallback-to-system-locale=false

四、代码中使用国际化。

就是注入使用MessageSource。使用getMessage方法。

@Component
public class MessageUtils {

    @Autowired
    private MessageSource messageSource;

    /**
     * get message
     */
    public String get(String msgKey) {
        try {
            return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
        } catch (Exception e) {
            return msgKey;
        }
    }
}

    @Autowired
    private MessageUtils messageUtils;

    @GetMapping
    public String testReq(HttpServletRequest request) {
        Locale locale = LocaleContextHolder.getLocale();
        System.out.println(RequestContextUtils.getLocale(request));
        return messageUtils.get("login.username");
    }

最后针对于互联网公司java程序员涉及到的绝大部分难题我做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。
资料领取方式:Java高级架构;603619042

上一篇 下一篇

猜你喜欢

热点阅读