springboot國際化的時候,是經過interface LocaleResolver
接口的實現類的bean來肯定是哪一種語言的。這個接口有2個方法:
一、resolveLocale 用來獲取當前語言環境。
二、setLocale 修改語言環境。(針對Cookie、Session這種有狀態的請求。)html
LocaleResolver有下面4個實現。如圖:
上面的圖中LocaleResolver的實現類只有4個:java
查看AcceptHeaderLocaleResolver的源碼後知道,每次請求的時候,AcceptHeaderLocaleResolver獲取http的名字叫Accept-Language的header參數。來肯定是哪一種語言。
若是是API使用這種方式就須要在請求中加Accept-Language的header參數。web瀏覽器(好比:chrom)在請求的時候會自動把當前系統的語言附加到Accept-Language參數中。web
這個須要配置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
根據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方法。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"); }