以後會上傳自己寫的完整spring boot 基礎,敬請期待!
步驟:
1.編寫國際化配置文件:
在resource文件夾下建立一個:i18n的文件夾:
新建立一個login.properties,的文件,然後再建立一個login_zh_CN.properties的文件,
注意命名:login_語言_國家.properties。
這樣建立之後idea會自動識別出來這是一個國際化的文件夾。
之後,再右鍵,點擊new之後,只要輸入語言代碼_國家代碼,就可以自動創建了。
創建成功後,點擊任意一個語言文件,可以看到,下面有一個Resource Bundle選項,
點擊:
點擊左上角的加號就可以了(輸入見圖)。
spring Boot默認配置了國際化文件的位置:
String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
我們可以在配置文件application.properties中更改它:
spring.message.basename=i18n.login
這樣,就改好了國際化文件的位置了。
下面,要如何在界面中獲取呢?
可以在界面中用#{}來獲得國際化的內容!
<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
<label class="sr-only" th:text="#{login.username}">Username</label>
<input type="text" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">
<label class="sr-only" th:text="#{login.username}" >Password</label>
<input type="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"/> [[#{login.remember}]]
注意,在checkbox裏,不可以寫th:text=,因爲,它是一個閉合和HTML標籤。也沒有什麼placeholder可以用。所以,可以用thymeleaf提供的行內字符來寫。用[[ ]],前面也有說到,這個其實也相當於th:text。注意:寫[[]]這個的時候,寫裏面的內容是沒有提示的。
這樣,整個界面的語言就跟誰瀏覽器的語言來定了。
打開瀏覽器,把相應的語言移到頂部,這樣再重新刷新界面,就可以看到語言隨之更改了。
注意:這裏可能會亂碼,我們前面也有說過,可以通過更改idea中文件的編碼方式:
打開setting,輸入file coding,勾選相關的選項就可以了。
原理:
現在,我們要實現,點擊下面的語言按鈕,來切換語言,做法:
實現自己的配置類:
public class MyLocaleResovler implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String l = request.getParameter("l");
Locale locale=Locale.getDefault();
if(!StringUtils.isEmpty(l))
{
String[] s = l.split("_");
locale=new Locale(s[0],s[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
自己寫一個LocaleResolver來繼承LocaleResolver,
原碼裏面的:
,在配置類裏面注入進來:
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResovler();
}
界面上,用這個:
<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
@{/index.html(l='zh_CN')}等價於@{/index.html?l=’zh_CN’},在thymeleaf中可以中小括號來代替?的方法來傳遞參數。
這樣,在訪問的時候,就可以通過點擊按鈕來切換了。
ps:對於自己寫配置,其實也是參考着原來的webMvcAutoConfiguration配置類來寫,
下面是原碼的截圖:
可以看到,在原碼裏面有public LocaleResolver localeResolver() 方法,我們就寫這個方法,
這個方法要返回LocaleResolver類的對象,那我們就寫一個。
而原碼裏面的是這樣寫的:
public Locale resolveLocale(HttpServletRequest request) {
Locale defaultLocale = this.getDefaultLocale();
if (defaultLocale != null && request.getHeader("Accept-Language") == null) {
return defaultLocale;
} else {
Locale requestLocale = request.getLocale();
List<Locale> supportedLocales = this.getSupportedLocales();
if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {
Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);
if (supportedLocale != null) {
return supportedLocale;
} else {
return defaultLocale != null ? defaultLocale : requestLocale;
}
} else {
return requestLocale;
}
}
}
返回一個了Locale對象,那我們也返回一個。