國際化(internationalization)是設計容易適應不同區域要求的產品的一種方式。它要求從產品中抽離所有地域語言元素。換言之,應用程序的功能和代碼設計考慮了在不同地區運行的需要。開發這樣的程序的過程,就稱為國際化。
那么當我們使用Spring Boot如何進行國際化呢?我們用一個例子來演示操作的步驟:
1、我們寫一個thymeleaf模板
<!DOCTYPE?html>
<html>
<head><meta?charset="UTF-8"?/><title>hello?spring?boot</title>
</head>
<body><p>歡迎你登錄到ybzy.ke.qq.com我的課程分享網站</p></body>
</html>
2、寫出對應的controller類
import?org.springframework.stereotype.Controller;
import?org.springframework.web.bind.annotation.RequestMapping;@Controller
public?class?HelloController?{@RequestMapping("/hello")public?String?hello(){return??"/hello";}}
我們觀察hello.html里面的信息直接就是中文顯示,但是我們現在的需求是當訪問語言是zh的時候顯示為中文,當語言為en的時候顯示為英文,那么怎么操作呢?
首先我們先定義國際化資源文件,spring boot默認就支持國際化的,而且不需要你過多的做什么配置,只需要在resources/這個根路徑下定義國際化配置文件,文件名稱必須以messages開頭。
注意:配置文件的名字和存放的位置SpringBoot的內部代碼里默認的就是messages和classpath,當然我們可以在配置文件中配置spring.messages.basename的值來改變這兩個東西。
我們先用默認的配置定義如下幾個文件:
messages.properties (默認,當找不到語言的配置的時候,使用該文件進行展示)。
messages.properties (默認,當找不到語言的配置的時候,使用該文件進行展示)。
messages_zh_CN.properties(中文)
messages_en_US.properties(英文)
分別寫上內容:
welcome = 歡迎你登錄到 ybzy.ke.qq.com 我的課程分析網站(default)
welcome?=?\u6b22\u8fce\u4f60\u767b\u5f55\u5230?\u963f\u91cc\u5df4\u5df4?\u7f51\u7ad9\uff08\u4e2d\u6587\uff09
welcome?=?welcome?to?login?to?ybzy.ke.qq.com website(English)
配置信息完畢后,那么在前端展示怎么修改呢,修改hello.html文件,使用#{key}的方式進行使用messages中的字段信息:
<!DOCTYPE?html>
<html>
<head><meta?charset="UTF-8"?/><title>hello?spring?boot</title>
</head>
<body><p><label?th:text="#{welcome}"></label></p>
</body>
</html>
修改火狐瀏覽器的國際化信息,看測試效果:
about:config
在搜索框輸入accept,然后找到intl.accept_languages修改對應的值,我這里原本是:
zh-CN, zh, zh-TW, zh-HK, en-US, en
為了看到效果,修改為:
en-us, en
通過三個問題,簡單說下原理:
第一個問題,為什么命名必須是messages開頭,需要看一個源碼文件:MessageSourceAutoConfiguration
如果我們沒有在application.properties中配置spring.messages.basename屬性,那么使用默認的messages,好了這個問題就這么簡單解決了。
第二個問題:為什么我看到的是中文(或者英文)呢?
為了讓web應用程序支持國際化,必須識別每個用戶的首選區域,并根據這個區域顯示內容。在Spring MVC應用程序中,用戶的區域是通過區域解析器來識別的,它必須是實現LocaleResolver接口。Spring MVC提供了幾個LocaleResolver實現,讓你可以按照不同的條件來解析區域。除此之外,你還可以實現這個接口創建自己的區域解析器。如果沒有做特殊的處理的話,Spring 采用的默認區域解析器是AcceptHeaderLocaleResolver。它通過檢驗HTTP請求的頭部信息accept-language來解析區域。這個頭部是由用戶的web瀏覽器底層根據底層操作系統的區域設置進行設定的。請注意,這個區域解析器無法改變用戶的區域,因為它無法修改用戶操作系統的區域設置。
第三個問題:怎么根據我們的需要切換語言環境呢?
我們可以自定義我們的區域解析器LocaleResolver,然后將它注冊到spring的ioc容器中。