來(lái)源:北大青鳥(niǎo)總部 2023年03月21日 17:20
不知道大家在平常訪問(wèn)一些網(wǎng)站的時(shí)候有沒(méi)有注意到,很多網(wǎng)站都是有中英兩個(gè)版面的,比如京東,我們就可以選擇很多不同國(guó)家的語(yǔ)言,這其實(shí)都是為了滿足不同國(guó)家和語(yǔ)言的人使用的需求。
通常情況下,一些比較復(fù)雜而且內(nèi)容個(gè)性化的網(wǎng)站都會(huì)針對(duì)不同的國(guó)家,在內(nèi)容上做一些調(diào)整,甚至是在不同的國(guó)家有獨(dú)立站點(diǎn);淘寶、京東、亞馬遜都是這樣在不同的國(guó)家有不同的站點(diǎn)。而一些內(nèi)容比較標(biāo)準(zhǔn)化(網(wǎng)站內(nèi)容一般不變化)的公司,如果切換成英語(yǔ),也只是網(wǎng)站的語(yǔ)言從中文變成英文而已(下面Bing網(wǎng)頁(yè)可以看到)
這樣我們就可以根據(jù)我們自己的情況,來(lái)訪問(wèn)不同語(yǔ)言的網(wǎng)站,這個(gè)其實(shí)應(yīng)用程序國(guó)際化的體現(xiàn)。
國(guó)際化,簡(jiǎn)單說(shuō)就是應(yīng)用程序的能夠根據(jù)訪問(wèn)者所在的地區(qū),展示相應(yīng)語(yǔ)言的網(wǎng)頁(yè)。
比如猿小二在中國(guó)訪問(wèn)外國(guó)的網(wǎng)站,這個(gè)時(shí)候,猿小二看到網(wǎng)站就應(yīng)該是中文的,因?yàn)樵承《谥袊?guó),需要的是中文的內(nèi)容;包括時(shí)間也是東八區(qū)的;相反如果是在國(guó)外某個(gè)國(guó)家,那看到的就應(yīng)該是當(dāng)?shù)氐恼Z(yǔ)言文字和時(shí)間,這樣就可以一個(gè)網(wǎng)站根據(jù)不同的國(guó)家的用戶來(lái)展示相應(yīng)的內(nèi)容。
而那些沒(méi)有國(guó)際化的網(wǎng)站,就不能提供這么友好的體驗(yàn)。
國(guó)際化 ,英文叫 internationalization由于單詞太長(zhǎng),而程序猿又是一個(gè)比較講究效率的群體(比較懶)有給他起了個(gè)簡(jiǎn)稱(chēng)叫i18n(在i 和 n 之間有18 個(gè)字母)這樣一張嘴就能說(shuō)完!類(lèi)似的還有Kubernetes(k8s);可見(jiàn)程序猿的創(chuàng)造力還是很豐富的,了解的什么是國(guó)際化了,接下來(lái)就要開(kāi)始干了。
咱么先拿瀏覽器測(cè)試一下,看看效果!
其實(shí)大家也可以通過(guò)設(shè)置自己的瀏覽器語(yǔ)言來(lái)訪問(wèn)一些網(wǎng)站試試效果,比如我們把瀏覽器的語(yǔ)言改成英文之后(火狐瀏覽器)
讓后我們?cè)谥匦麓蜷_(kāi)瀏覽器看下,網(wǎng)頁(yè)的文字都變成了英文:
相反如果設(shè)置成中文,對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容就變成了中文,是不是很神奇呢?
這就說(shuō)明這些網(wǎng)站其實(shí)都做了對(duì)應(yīng)的國(guó)際化處理,接下來(lái)咱么就要自己來(lái)實(shí)現(xiàn)一下了,搓搓小手......
同學(xué)們上手操練一把!
在 SpringBoot中要實(shí)現(xiàn)國(guó)際化是比較簡(jiǎn)單的,但如果要是在整個(gè)項(xiàng)目中實(shí)現(xiàn)國(guó)際化,還需要看前端使用的什么技術(shù),比如是JSP、還是Vue等;但是作為優(yōu)秀的后端工程師,當(dāng)然要先搞定后端為主,所以咱么今兒個(gè)就先把SpringBoot后端這部分搞定~
首先,使用SpringInitializr創(chuàng)建Spring Boot基礎(chǔ)工程,直接在pom文件中加入web的依賴(lài)就可以。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
由于SpringBoot默認(rèn)就支持國(guó)際化的,所以我們只需要在resources文件夾下創(chuàng)建國(guó)際化配置文件即可,這里為了方便演示效果,咱么需要?jiǎng)?chuàng)建3個(gè)配置文件:
messages.properties 默認(rèn)處理國(guó)際化的配置文件,要注意文件名是messages是固定的
messages_zh_CN.properties zh_CN 是中文簡(jiǎn)體
messages_en_US.properties en_US 是美國(guó)英語(yǔ)
Tips:
文件名也要以messages開(kāi)頭,如:messages_xxx.properties,如果不指定國(guó)際化語(yǔ)言則使用默認(rèn)配置文件。
然后,在三個(gè)配置文件中分別添加配置屬性。
在messages.properties添加中文配置信息,表示默認(rèn)是使用的使用中文。
# 默認(rèn)使用中文 i18n配置 username=課工場(chǎng) |
在messages_zh_CN.properties添加中文配置信息,表示默認(rèn)是使用的使用中文。
# 使用中文i18n配置 username=課工場(chǎng) |
在messages_en_US.properties添加中文配置信息,表示默認(rèn)是使用的使用中文。
# 使用美國(guó)英語(yǔ)i18n配置 username=kegongchang |
只需要以上這么簡(jiǎn)單的配置就可以了。
加下來(lái)就可以寫(xiě)一個(gè)controller類(lèi)來(lái)處理國(guó)際化了
/** * 國(guó)際化測(cè)試 */ @RestController public class I18nController { @Autowired private MessageSource messageSource; @GetMapping("i18n") public String i18n() { // 獲取當(dāng)前請(qǐng)求的區(qū)域Locale Locale locale = LocaleContextHolder.getLocale(); return messageSource.getMessage("language", null, locale); } } |
接下來(lái)就是見(jiàn)證奇跡的時(shí)刻...
這里為了方便測(cè)試,我們使用IDEA的自定的HTTPClient工具,在請(qǐng)求頭中,添加請(qǐng)求參數(shù),注意參數(shù)的使用的-,而不是_下劃線:
Accept-Language 語(yǔ)言設(shè)置成英文(en-US),效果如下,這個(gè)是在模擬用戶使用的瀏覽器是語(yǔ)言,也就是用戶是使用英語(yǔ)的
Accept-Language 語(yǔ)言設(shè)置成中文(注意參數(shù)是zh-CN),同上,這里模擬用戶是使用中文作為瀏覽器的語(yǔ)言
這里咱么測(cè)試的使用的英語(yǔ),中文同理只需要把Accept-Language的設(shè)置成zh_CN就可以了!
我們將請(qǐng)求頭里面的Accept-Language設(shè)置成英文,就說(shuō)明用戶使用的瀏覽器語(yǔ)言英文,那用戶就應(yīng)該是歐美國(guó)家,所以對(duì)應(yīng)服務(wù)器返回的內(nèi)容就會(huì)是英文的內(nèi)容。
可以看到返回的結(jié)果是messages_en_US.properties配置文件配置的英語(yǔ),是不是很簡(jiǎn)單呢!
大家也可以使用瀏覽器測(cè)試,需要先設(shè)置瀏覽器的語(yǔ)言,如果瀏覽器的語(yǔ)言是英文就測(cè)試結(jié)果就是kegongchang,如果瀏覽器的語(yǔ)言是中文測(cè)試的結(jié)果就是課工場(chǎng)。