springBoot有許多的自動化配置,其中就包括多語言的autoConfiguration,打開org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
可查看相關的配置。
關於多語言的配置文件,系統默認爲項目根路徑下的message.properties,當然,這個配置可以在yaml中修改,比如下面的配置信息就將國際化多語言的配置文件地址指向根路徑下的i18n目錄下的message文件。
spring:
messages:
basename: i18n.message
springBoot關於webMvc有關於域組件的默認配置,如果我們想要自定義頁面語言信息的顯示,就需要自定義一個LocaleResolver並加入到容器中才行。
下面通過簡單的步驟來實現一個登陸也的多語言登錄頁。
- 創建多語言配置文件
在resources目錄下創建i18n目錄,並新建message.properties,message_en_US.properties,message_zh_CN.properties。在創建過程中,idea會識別到這是國際化多語言配置文件,顯示Resource Bundle。我們打開其中一個文件,點擊頁面左下角的Resource Bundle,切換到多語言文件的配置頁面。
點擊左上角的加號可添加屬性信息,在右側,可以同時添加多個語言的信息,並且分別保存到對應的文件,非常方便。
- 配置message文件的位置
由於我們沒有使用默認的多語言文件路徑,需要在配置文件中設置message的basename爲對應的自定義路徑。
- 使用#{ }表達式替換頁面的字面量
使用thymeleaf的#{xxx}表達式,動態替換標籤體的內容。
<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tips}">Please sign in</h1>
如果是input這種,則使用行內表達式:[[#{xxx}]]
<input type="checkbox" value="remember-me">[[#{login.remember}]]
在頁面的底部,我們放置兩個超鏈接,通過不同的參數信息來動態調整頁面的語言信息。這裏需要注意一下超鏈接的表達式寫法和參數寫法。
<a class="btn btn-sm" th:href="@{/index.html(lan=zh_CN)}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(lan=en_US)}">English</a>
步驟執行到這裏,我們可以通過設置瀏覽器的語言配置,顯示頁面的語言類型,但是達不到在頁面上就能動態切換。點擊頁面底部的超鏈接,我們的url是帶有對應參數的,但是這個參數想要被系統解析爲域對象,還需要我們自定義一個LocaleResolver組件,來替代springBoot默認的域組件。
4. 自定義LocaleResolver組件並加入容器
1)自定義LocaleResolver 組件
public class MyLocalResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
Locale locale = Locale.getDefault();
String lan = httpServletRequest.getParameter("lan");
if(!StringUtils.isEmpty(lan)){
String [] params = lan.split("_");
locale = new Locale(params[0],params[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
2)加入容器中
@Bean
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}
多提一嘴,在org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
中有下面這段代碼,@ConditionalOnMissingBean註解表示在容器中沒有LocaleResolver組件時纔會注入默認的。所以將我們自定義的LocaleResolver組件加入容器後,這段代碼就不會再添加默認的組件了。
5. 測試
登錄後的默認首頁:
點擊English超鏈接:
點擊中文超鏈接: