在專案的類別路徑resources下建立名稱為i18n的資料夾,並在該資料夾中根據需要編寫對應的多語言國際化檔案login.properties、login_zh_CN. properties和login_en_US.properties檔案
login.properties
#login.tip=請登入
login.username=使用者名稱
login.password=密碼
login.rememberme=記得我
login.button=登入
login_zh_CN.properties
login.tip=請登入
login.username=用戶名
login.password=密碼
login.rememberme=記得我
login.button=登入
login_en_US.properties
#login. tip=Please sign in
login.username=Username
login.password=Password
login.rememberme=Remember me
login.button=Login
login.properties為自訂預設語言設定文件,login_zh_CN.properties為自訂中文國際化文件,login_en_US.properties為自訂英文國際化文件
需要說明的是,Spring Boot預設識別的語言設定檔為類路徑resources下的messages.properties;其他語言國際化文件的名稱必須嚴格按照「文件前綴名語言代碼國家代碼.properties」的形式命名
本範例中,在項目類路徑resources下自訂了一個i18n套件用於統一配置管理多語言設定文件,並將專案預設語言設定檔名稱自訂為login.properties,因此,後續也必須在專案全域設定檔中進行國際化檔案基礎名稱配置,才能引用自訂國際化文件
開啟專案的application.properties全域設定文件,在該檔案中新增國際化檔案基礎名設置,內容如檔案
設定國際化檔案基礎名
spring.messages.basename=i18n.login
spring.messages.basename=i18n.login」設定了自訂國際化檔案的基礎名稱。其中,i18n表示國際化檔案相對專案類路徑resources的位置,login表示多語言檔案的前綴名稱。如果開發者完全依照Spring Boot預設辨識機制,在專案類路徑resources下編寫messages.properties等國際化文件,可以省略國際化檔案基礎名的配置
在完成上一步中多語言國際化文件的編寫與設定後,就可以正式在前端頁面中結合Thymeleaf模板相關屬性進行國際化語言設定和展示了,不過這種實作方式預設是使用請求頭中的語言資訊(瀏覽器語言資訊)自動進行語言切換的,有些專案還會提供手動語言切換的功能,這就需要客製化區域解析器了
在專案中建立名為com.lagou.config的包,並在該包下建立一個用於自訂國際化功能區域資訊解析器的自訂組態類別MyLocalResovel
package com.lagou.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; import org.springframework.web.servlet.LocaleResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; @Configuration public class MyLocalResolver implements LocaleResolver { // 完成自定义 区域解析方式 @Override public Locale resolveLocale(HttpServletRequest request) { // 获取页面手动传递的语言参数值 : zh_CN en_US "" String l = request.getParameter("l"); Locale locale = null; if (!StringUtils.isEmpty(l)) { // 如果参数不为空,就根据参数值,进行手动语言切换 String[] s = l.split("_"); locale = new Locale(s[0], s[1]); } else { // Accept-Language: zh-CN,zh;q=0.9 String header = request.getHeader("Accept-Language"); String[] split = header.split(","); String[] split1 = split[0].split("-"); locale = new Locale(split1[0], split1[1]); } return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { } // 将自定义的LocaleResolver重新注册成一个类型为LocaleResolver的Bean组件 @Bean public LocaleResolver localeResolver() { return new MyLocalResolver(); } }
MyLocalResolver自訂區域解析器配置類別實作了LocaleResolver接口,並重寫了其中的resolveLocale()方法進行自訂語言解析,最後使用@Bean註解將當前配置類別註冊成Spring容器中的一個類型為LocaleResolver的Bean元件,這樣就可以覆寫預設的LocaleResolver元件。其中,在resolveLocale()方法中,根據不同需求(手動切換語言資訊、瀏覽器請求頭自動切換語言資訊)分別取得了請求參數l和請求頭參數Accept-Language,然後在請求參數l不為空的情況下就以l參數攜帶的語言為標準進行語言切換,否則就定制通過請求頭信息進行自動切換。
#需要注意的是,在請求參數l的語言手動切換組裝時,使用的是下劃線「_」進行的切割,這是由多語言設定檔的格式決定的(例如login_zh_CN.properties);而在請求頭參數Accept-Language的語言自動切換組裝時,使用的是短橫線「-」進行的切割,這是由瀏覽器發送的請求頭資訊樣式決定的(例如Accept-Language: en-US,en;q=0.9,zh-CN ;q=0.8,zh;q=0.7)
開啟專案templates範本資料夾中的使用者登入頁面login.html,結合Thymeleaf範本引擎實現國際化功能
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1,shrinkto- fit=no"> <title>用户登录界面</title> <link th:href="@{/login/css/bootstrap.min.css}" rel="external nofollow" rel="stylesheet"> <link th:href="@{/login/css/signin.css}" rel="external nofollow" rel="stylesheet"> </head> <body class="text-center"> <!-- 用户登录form表单 --> <form class="form-signin"> <img class="mb-4" th:src="@{/login/img/login.jpg}" style="max-width:90%" style="max-width:90%" alt="Spring boot Thymeleaf怎麼配置國際化頁面" > <h2 class="h4 mb-3 font-weight-normal" th:text="#{login.tip}">请登录</h2> <input type="text" class="form-control" th:placeholder="#{login.username}" required="" autofocus=""> <input type="password" class="form-control" th:placeholder="#{login.password}" required=""> <div class="checkbox mb-3"> <label> <input type="checkbox" value="remember-me" > [[#{login.rememberme}]] </label> </div> <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.button}">登录</button> <p class="mt-5 mb-3 text-muted">© <span th:text="${currentYear}">2019</span>-<span th:text="${currentYear}+1">2020</span></p> <a class="btn btn-sm" th:href="@{/toLoginPage(l='zh_CN')}" rel="external nofollow" >中文</a> <!--注意这个路径是我们controller访问页面的路径,不同的是这次携带了参数,可以帮我们用来区分locale--> <a class="btn btn-sm" th:href="@{/toLoginPage(l='en_US')}" rel="external nofollow" >English</a> </form> </body> </html>
使用Thymeleaf範本的#{}訊息表達式設定了國際化展示的部分資訊。在對記住我rememberme國際化設定時,需要國際化設定的rememberme在input標籤外部,所以這裡使用了行內表達式[[#login.rememberme}]]動態取得國際化檔案中的login.rememberme資訊。另外,在表單尾部還提供了中文、English手動切換語言的功能鏈接,在單擊鏈接時會分別攜帶國家語言參數向“/”路徑請求跳轉,通過後台定制的區域解析器進行手動語言切換。
註:省略了controller控制層處理
點擊後
點擊「English」連結進行語言國際化切換時攜帶了指定的「l=zh_CN」參數,後台定制的區域解析器配置類別MyLocalResovel中的解析方法會根據定制規則進行語言切換,從而達到了手動切換國際化語言的效果
以上是Spring boot Thymeleaf怎麼配置國際化頁面的詳細內容。更多資訊請關注PHP中文網其他相關文章!