springboot中國際化實現

1、國際化怎麼肯定語言。

springboot國際化的時候,是經過interface LocaleResolver 接口的實現類的bean來肯定是哪一種語言的。這個接口有2個方法:
一、resolveLocale 用來獲取當前語言環境。
二、setLocale 修改語言環境。(針對Cookie、Session這種有狀態的請求。)html

LocaleResolver有下面4個實現。如圖:

上面的圖中LocaleResolver的實現類只有4個:java

  • AcceptHeaderLocaleResolver (我使用這個)
  • CookieLocaleResolver
  • FixedLocaleResolver
  • SessionLocaleResolver 默認使用AcceptHeaderLocaleResolver實現。

2、LocaleResolver的實現類。

一、AcceptHeaderLocaleResolver 肯定語言。

查看AcceptHeaderLocaleResolver的源碼後知道,每次請求的時候,AcceptHeaderLocaleResolver獲取http的名字叫Accept-Language的header參數。來肯定是哪一種語言。
若是是API使用這種方式就須要在請求中加Accept-Language的header參數。web瀏覽器(好比:chrom)在請求的時候會自動把當前系統的語言附加到Accept-Language參數中。web

二、SessionLocaleResolver 肯定語言。

這個須要配置bean,把默認的AcceptHeaderLocaleResolver覆蓋掉。spring

@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

3、國際化配置文件。

根據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
  • 這裏spring.messages.basename表示國際化的文件的存儲在src\main\resources 文件夾下的什麼位置。我這裏i18n/login 表示是放在i18n文件夾下面,而且以login開始的配置文件。以下圖:

    spring.messages.basename能夠配置多個,以逗號分隔。
  • spring.messages.fallback-to-system-locale 表示若是找不到語言,是否是返回服務器系統語言。
    好比:Accept-Language=123的header參數。顯然是沒這個語言的配置文件的。若是spring.messages.fallback-to-system-locale=true,就會找服務器的語言環境對應的配置文件。若是spring.messages.fallback-to-system-locale=false或找login.properties這個默認的配置文件。

4、代碼中使用國際化。

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

@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");
    }
相關文章
相關標籤/搜索