banner
jzman

jzman

Coding、思考、自觉。
github

Spring Boot系列之專案國際化

PS: 21 號,中行原油寶碰到了歷史上最低結算價,按照 - 37.63 美元 / 桶結算,要投資者按照 - 266.12 元 / 桶結算價平倉,事後發短信要求投資者即刻補足交割款,這意味著投資者,不但除了虧光保證金,剩下的要按 - 266 塊 / 桶倒貼,這裡面有一個投資常識,不懂的一定不投,不要盲目去抄底。

前面幾篇文章嘗試了接口開發、Thymeleaf 模板、常用語法及模板佈局,閱讀本文之前可以閱讀前面幾篇:

Spring Boot 項目的國際化實現起來非常簡單,為了保證 Spring Boot 系列的連續性,其項目的國際化也單獨為一篇文章,主要內容如下:

  1. 區域解析器
  2. 創建國際化配置文件
  3. 創建配置類
  4. 測試效果

區域解析器#

Spring 中提供區域解析器來識別用戶區域,依次來實現 Web 應用程序的國際化,區域解析器必須實現 LocalResolver 接口,也可以實現該接口創建自己的區域解析器

  • AcceptHeaderLocaleResolver:默認區域解析器,通過 HTTP 請求的 accept-language 參數來解析區域;
  • SessionLocaleResolver:在當前會話有效,否則還原為默認狀態;
  • CookieLocaleResolver:在當前 Cookie 有效期內有效,否則還原為默認狀態;
  • FixedLocaleResolver:設置固定的 Local,不便於動態改變 Local;
  • 使用 LocaleChangeInterceptor 攔截器解析用戶區域。

下面將以 LocaleChangeInterceptor 攔截器和 SessionLocaleResolver 為例實現 Spring Boot 項目的國際化。

創建國際化配置文件#

Spring Boot 是支持國際化的,使用起來也比較方便,創建 Spring Boot 項目,在 resources 下創建一個名稱為 i18n 的文件夾,然後右擊依次選擇 New->Resourc Bundle 創建與個語言對應的配置文件 home.properties 文件,如下:

躬行之

然後在配置文件 application.properties 文件中配置 Message 路徑,如下:

# Message路徑
spring.messages.basename=i18n.home

home.properties 屬性文件中的值如何獲取呢,如下:

mMessageSource.getMessage("home.title", null, LocaleContextHolder.getLocale());

創建配置類#

使用 LocaleChangeInterceptor 攔截器和 SessionLocaleResolver,其設置的參數就是對應的 Local ,如下:

/**
 * I18nConfig
 */
@Configuration
public class I18nConfig {

    @Bean
    public LocaleResolver localeResolver (){
        return new SessionLocaleResolver();
    }

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                LocaleChangeInterceptor changeInterceptor = new LocaleChangeInterceptor();
                changeInterceptor.setParamName("lang");
                registry.addInterceptor(changeInterceptor);
            }
        };
    }
}

案例代碼#

I18nController 如下:

@Controller
public class I18nController {
    
    @GetMapping(value = "/i18n")
    public String il8n() {
        return "i18n";
    }
}

模板文件如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
	<head>
		<meta charset="UTF-8">
		<title>Spring Boot I18n Sample.</title>

		<script>
			/**
			 * 頁面加載完成後調用
			 */
			onload = function() {
				let href = window.location.toString();
				let suffix = href.substring(href.length - 2, href.length);
				let lang = document.getElementsByClassName("lang");
				console.log("--suffix--" + suffix);
				switch (suffix) {
					case "CN":
						setStatus(lang[0], lang[1], lang[2]);
						break;
					case "TW":
						setStatus(lang[1], lang[0], lang[2]);
						break;
					case "US":
						setStatus(lang[2], lang[1], lang[0]);
						break;
					default:
						setStatus(lang[0], lang[1], lang[2]);
				}
			};

			/**
			 * 設置語言標籤狀態
			 * @param show 已選擇的語言標籤
			 * @param def1 未選擇的語言標籤
			 * @param def2 未選擇的語言標籤
			 */
			function setStatus(show, def1, def2) {
				show.style.color = "rgb(0,0,255)";
				def1.style.color = "rgb(0,0,0)";
				def2.style.color = "rgb(0,0,0)";
			}
		</script>
	</head>
	<body>
		<h3 th:text="#{home.title}">default</h3>
		<p style="font-size: 12px">
			<a class="lang" href="i18n?lang=zh_CN"> 簡體中文 </a>|
			<a class="lang" href="i18n?lang=zh_TW"> 繁體中文 </a>|
			<a class="lang" href="i18n?lang=en_US"> English</a>
		</p>
	</body>
</html>

測試效果#

運行效果如下:

image

可以添加在公眾號回復關鍵字【加群】邀你進微信交流群,回復關鍵字【Spring Boot】獲取對應案例源碼鏈接。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。