Spring Boot REST國(guó)際化的實(shí)現(xiàn)代碼
本指南將向您展示如何輕松只需幾個(gè)簡(jiǎn)單的步驟即可實(shí)現(xiàn)Spring Boot應(yīng)用的國(guó)際化,從而總是在一個(gè)地方處理語(yǔ)言環(huán)境問(wèn)題。
我們將討論如何在現(xiàn)有的Spring Boot項(xiàng)目中添加國(guó)際化。當(dāng)您處理應(yīng)該為來(lái)自不同國(guó)家/地區(qū)的用戶(hù)提供不同語(yǔ)言服務(wù)的項(xiàng)目時(shí),app國(guó)際化的問(wèn)題變得很常見(jiàn)。比如,你需要向中國(guó)用戶(hù)提供中文回復(fù)信息,并向法國(guó)用戶(hù)提供法語(yǔ)信息,那么讓我們來(lái)看看如何在Spring Boot中實(shí)現(xiàn)它。
讓我們使用Spring Initializer創(chuàng)建項(xiàng)目 ,這使得項(xiàng)目的創(chuàng)建更容易。選擇Web,Security,JPA,Actuator,Devtools等模塊。
下載項(xiàng)目后,解壓縮,并用打開(kāi)IntelliJ IDEA打開(kāi)。
第一件事是創(chuàng)建CustomLocaleResolver類(lèi),它將負(fù)責(zé)定義用戶(hù)的語(yǔ)言環(huán)境。
@Configuration
<b>public</b> <b>class</b> CustomLocaleResolver
<b>extends</b> AcceptHeaderLocaleResolver
implements WebMvcConfigurer {
List<Locale> LOCALES = Arrays.asList(
<b>new</b> Locale(<font>"en"</font><font>),
<b>new</b> Locale(</font><font>"fr"</font><font>));
@Override
<b>public</b> Locale resolveLocale(HttpServletRequest request) {
String headerLang = request.getHeader(</font><font>"Accept-Language"</font><font>);
<b>return</b> headerLang == <b>null</b> || headerLang.isEmpty()
? Locale.getDefault()
: Locale.lookup(Locale.LanguageRange.parse(headerLang), LOCALES);
}
@Bean
<b>public</b> ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource rs = <b>new</b> ResourceBundleMessageSource();
rs.setBasename(</font><font>"messages"</font><font>);
rs.setDefaultEncoding(</font><font>"UTF-8"</font><font>);
rs.setUseCodeAsDefaultMessage(<b>true</b>);
<b>return</b> rs;
}
}
</font>
這里告訴我們項(xiàng)目中支持2個(gè)語(yǔ)言環(huán)境:en和fr。在名為“ Accept-Language ” 的http的Header中傳遞語(yǔ)言環(huán)境。因此,如果Header存在這個(gè)變量名且它不為空,我們將使用它的語(yǔ)言環(huán)境,否則 - 我們將使用默認(rèn)語(yǔ)言環(huán)境,即en。
接下來(lái)讓我們創(chuàng)建一個(gè)類(lèi),負(fù)責(zé)根據(jù)指定的語(yǔ)言環(huán)境選擇正確的語(yǔ)言信息。我將其稱(chēng)為T(mén)ranslator,它將有一個(gè)單獨(dú)的方法,它將接受應(yīng)翻譯的信息代碼。
@Component
<b>public</b> <b>class</b> Translator {
<b>private</b> <b>static</b> ResourceBundleMessageSource messageSource;
@Autowired
Translator(ResourceBundleMessageSource messageSource) {
Translator.messageSource = messageSource;
}
<b>public</b> <b>static</b> String toLocale(String msgCode) {
Locale locale = LocaleContextHolder.getLocale();
<b>return</b> messageSource.getMessage(msg, <b>null</b>, locale);
}
}
messageSource.getMessage(...)接受入?yún)ⅰ癿sg”。但這并不是應(yīng)該翻譯的信息,它只是信息代碼?,F(xiàn)在我們還沒(méi)有任何信息代碼定義,所以現(xiàn)在定義信息代碼。
在resources文件夾下,創(chuàng)建兩個(gè)文件:messages.properties和messages_fr.properties。
這是messages.properties的內(nèi)容:
hello=Hello World! welcome=Welcome to this guide!
這里是messages_fr.properties的內(nèi)容:
hello=Bonjour le Monde! welcome=Bienvenue dans ce guide!
在這里我們已經(jīng)定義了我們的消息代碼。他們是“ hellp ”和“ welcome ”?,F(xiàn)在你可以指導(dǎo)我們應(yīng)該將哪些代碼傳遞給toLocale(String msgCode)方法,這樣才能根據(jù)用戶(hù)的語(yǔ)言環(huán)境獲取適當(dāng)?shù)南ⅰ?/p>
可能最后一步是創(chuàng)建簡(jiǎn)單的控制器,讓我們將它命名為MainController,它只有一個(gè)端點(diǎn),它將接受消息代碼,我們將其作為請(qǐng)求參數(shù)傳遞給HTTP請(qǐng)求。
@RestController
@RequestMapping(value =“/ api”)
<b>public</b> <b>class</b> MainController {
@GetMapping()
<b>public</b> String getMessage(@RequestParam(“msg”)String msg){
<b>return</b> Translator。toLocale(msg) ;
}
}
現(xiàn)在已經(jīng)完成!
使用CURL發(fā)出簡(jiǎn)單的請(qǐng)求:
curl -X GET -H "Accept-Language: fr" 'http://localhost:8080/api?msg-welcome'
這個(gè)將返回法語(yǔ)的welcome信息:
Bienvenue dans ce guide!
再發(fā)出請(qǐng)求:
curl -X GET -H "Accept-Language: en" 'http://localhost:8080/api?msg-welcome'
這個(gè)將返回英語(yǔ)的welcome信息:
welcome to this guide!
正如你看到:響應(yīng)會(huì)根據(jù)請(qǐng)求中傳遞的“ Accept-Language ”標(biāo)頭的值而有所不同。這樣,我們不需要檢查每個(gè)控制器方法中請(qǐng)求中傳遞的內(nèi)容,然后將其進(jìn)一步傳遞給服務(wù)層。我們現(xiàn)在可以在一個(gè)單獨(dú)的地方執(zhí)行此操作,即CustomLocaleResolver類(lèi)。
源碼: GitHub
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中的錯(cuò)誤處理機(jī)制源碼解析
這篇文章主要介紹了SpringBoot中的錯(cuò)誤處理機(jī)制源碼解析,springboot根據(jù)訪問(wèn)者的request中的Accept屬性來(lái)判斷要返回什么樣的數(shù)據(jù),SpringBoot存在一個(gè)錯(cuò)誤處理機(jī)制,會(huì)根據(jù)不同請(qǐng)求返回不同的結(jié)果,需要的朋友可以參考下2023-12-12
微服務(wù)架構(gòu)之使用RabbitMQ進(jìn)行異步處理方式
本文介紹了RabbitMQ的基本概念、異步調(diào)用處理邏輯、RabbitMQ的基本使用方法以及在Spring Boot項(xiàng)目中使用RabbitMQ解決高并發(fā)問(wèn)題,RabbitMQ是一種流行的消息隊(duì)列實(shí)現(xiàn),支持異步通信,可以有效解耦應(yīng)用程序的不同部分,并將任務(wù)分發(fā)給多個(gè)消費(fèi)者2025-02-02
詳解hibernate雙向多對(duì)多關(guān)聯(lián)映射XML與注解版
本篇文章主要介紹了詳解hibernate雙向多對(duì)多關(guān)聯(lián)映射XML與注解版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Java存儲(chǔ)過(guò)程調(diào)用CallableStatement的方法
這篇文章主要介紹了Java存儲(chǔ)過(guò)程調(diào)用CallableStatement的方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-11-11
Springboot中如何通過(guò)yml為實(shí)體類(lèi)注入屬性
這篇文章主要介紹了Springboot中如何通過(guò)yml為實(shí)體類(lèi)注入屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析
這篇文章主要介紹了spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
模仿Spring手寫(xiě)一個(gè)簡(jiǎn)易的IOC
這篇文章主要介紹了模仿Spring手寫(xiě)一個(gè)簡(jiǎn)易的IOC,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下2020-11-11
spring-boot-maven-plugin引入出現(xiàn)爆紅(已解決)
這篇文章主要介紹了spring-boot-maven-plugin引入出現(xiàn)爆紅(已解決),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

