本章将講解如何在Spring Boot和Thymeleaf中做頁面模闆國際化的支援,根據系統語言環境或者session中的語言來自動讀取不同環境中的文字。
國際化自動配置
Spring Boot中已經對國際化這一塊做了自動配置。
國際化自動配置類:
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
檢視自動配置源碼有以下主要幾個參數:
private String basename = "messages";
private Charset encoding = Charset.forName("UTF-8");
private int cacheSeconds = -1;
private boolean fallbackToSystemLocale = true;
basename:預設的掃描的國際化檔案名為messages,即在resources建立messages_xx.properties檔案,可以通過逗号指定多個,如果不指定包名預設從classpath下尋找。
encoding:預設的編碼為UTF-8。
cacheSeconds:加載國際化檔案的緩存時間,機關為秒,預設為永久緩存。
fallbackToSystemLocale:當找不到目前語言的資源檔案時,如果為true預設找目前系統的語言對應的資源檔案如messages_zh_CN.properties,如果為false即加載系統預設的如messages.properties檔案。
國際化實戰
1、國際化配置
spring:
messages:
fallbackToSystemLocale: false
basename: i18n/common, i18n/login, i18n/index
2、在i18n目錄下建立以下幾個檔案
如index.properties,index_zh_CN.properties,index.properties作為找不到定義語言的資源檔案時的預設配置檔案。
建立對應的key/value,如:
index_zh_CN.properties
index.welcome=歡迎
index.properties
index.welcome=welcome
3、添加語言解析器,并設定預設語言為US英文
LocaleResolver接口有許多實作,如可以從session、cookie、Accept-Language header、或者一個固定的值來判斷目前的語言環境,下面是使用session來判斷。
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.US);
return sessionLocaleResolver;
}
4、添加切換語言過濾器
private LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
return localeChangeInterceptor;
}
添加以上過濾器并注冊到spring mvc中
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
然後頁面通過通路指定的url?lang=zh_CN進行切換。
5、通過
#{}
來讀取資源檔案
如Thymeleaf模闆檔案中使用:
<label th:text="#{index.welcome}"></label>
預設會讀取英文的資源檔案并顯示:welcome