JAVA?Springboot配置i18n國(guó)際化語(yǔ)言詳細(xì)步驟
一、簡(jiǎn)介
在Java中,國(guó)際化(Internationalization,通常簡(jiǎn)稱為i18n)是一個(gè)過程,它允許應(yīng)用程序適應(yīng)不同的語(yǔ)言和地區(qū)設(shè)置,從而能夠支持全球用戶。Java平臺(tái)為國(guó)際化提供了強(qiáng)大的支持,包括Locale類、ResourceBundle類以及用于格式化日期、數(shù)字和貨幣的類。
二、功能
1.支持多語(yǔ)言:
應(yīng)用程序可以顯示多種語(yǔ)言的文本,包括但不限于英文、中文、法文等。
通過使用ResourceBundle,可以為每種語(yǔ)言提供獨(dú)立的資源文件(通常是.properties文件),其中包含該語(yǔ)言的文本。
2.自動(dòng)選擇語(yǔ)言:
Java的Locale類允許應(yīng)用程序根據(jù)用戶的偏好或系統(tǒng)設(shè)置自動(dòng)選擇適當(dāng)?shù)恼Z(yǔ)言。
例如,如果用戶的操作系統(tǒng)設(shè)置為法語(yǔ),那么應(yīng)用程序?qū)L試加載法語(yǔ)的資源文件。格式化日期、數(shù)字和貨幣
3.用戶手動(dòng)切換語(yǔ)言:
應(yīng)用程序通常還允許用戶手動(dòng)切換語(yǔ)言,即使他們的系統(tǒng)設(shè)置或?yàn)g覽器默認(rèn)語(yǔ)言不是他們想要使用的語(yǔ)言。這可以通過在應(yīng)用程序中提供語(yǔ)言選擇界面或設(shè)置選項(xiàng)來(lái)實(shí)現(xiàn)。
4.前后端文字、校驗(yàn)、消息提醒的國(guó)際化:
國(guó)際化不僅限于用戶界面上的文本,還包括后端代碼中的字符串、錯(cuò)誤消息、驗(yàn)證提示等。
通過使用外部化的字符串和消息,可以確保整個(gè)應(yīng)用程序的文本都是可翻譯的。
5.通過AOP切面實(shí)現(xiàn)多語(yǔ)言的配置:
這是一個(gè)高級(jí)特性,允許開發(fā)人員使用面向切面編程(AOP)來(lái)自動(dòng)處理對(duì)象的字符串屬性,并根據(jù)配置文件中的語(yǔ)言設(shè)置進(jìn)行替換。
這種方法可以確保即使在復(fù)雜的業(yè)務(wù)邏輯中,字符串也能被正確地翻譯成用戶所需的語(yǔ)言。
配置文件命名規(guī)則:
在Java國(guó)際化中,配置文件必須遵循特定的命名規(guī)則,以便Java能夠正確識(shí)別。
例如,一個(gè)名為“messages”的資源束文件可以有以下命名的資源文件:messages.properties(默認(rèn))、messages_en_US.properties(英語(yǔ)(美國(guó)))、messages_fr_FR.properties(法語(yǔ)(法國(guó)))等。
三、Java配置國(guó)際化步驟
3.1 創(chuàng)建資源文件夾
在src/main/resources目錄下新建一個(gè)文件夾,用于存放國(guó)際化配置文件。
例如,您可以創(chuàng)建一個(gè)名為i18n或messages的文件夾。
3.2 添加語(yǔ)言文件
3.2.1 選擇Resource Bundle 進(jìn)行添加配置文件
3.2.2 配置要添加的語(yǔ)言配置文件
在i18n或messages文件夾下,為每個(gè)要支持的語(yǔ)言和地區(qū)添加.properties文件。文件名的命名規(guī)則通常是basename_language_country.properties,其中basename是您的基本文件名(如messages),language是ISO 639語(yǔ)言代碼(如en代表英語(yǔ)),country是ISO 3166國(guó)家代碼(如US代表美國(guó))。
例如:
messages_en_US.properties(美國(guó)英語(yǔ))
messages_en_GB.properties(英國(guó)英語(yǔ))
messages_zh_CN.properties(簡(jiǎn)體中文)
messages_zh_TW.properties(繁體中文,臺(tái)灣)
(會(huì)有一個(gè)Default locale默認(rèn)的語(yǔ)言配置文件)
3.2.3、 在對(duì)應(yīng)的配置文件添加對(duì)應(yīng)的語(yǔ)言信息
1.zh_CN:(中文)
sys.config.newParameters=新增參數(shù) sys.config.changeParameters=修改參數(shù) sys.config.newParametersExists=失敗,參數(shù)鍵名已存在
2.en_US:(英文)
sys.config.newParameters=New parameters sys.config.changeParameters=Modify parameters sys.config.newParametersExists=Failed, parameter key name already exists
四、Java國(guó)際化配置工具類
4.1、創(chuàng)建MessageUtils工具類
MessageUtils 工具類在國(guó)際化(i18n)應(yīng)用中扮演著非常重要的角色,它封裝了與消息資源相關(guān)的常用操作,使得在應(yīng)用程序的不同部分中都能夠方便地獲取和格式化本地化消息,而無(wú)需重復(fù)編寫代碼,通過key來(lái)獲取目前系統(tǒng)語(yǔ)言的value值。
import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; /** * 獲取i18n資源文件 * * @author cccl */ public class MessageUtils { /** * 根據(jù)消息鍵和參數(shù) 獲取消息 委托給spring messageSource * * @param code 消息鍵 * @param args 參數(shù) * @return 獲取國(guó)際化翻譯值 */ public static String message(String code, Object... args) { MessageSource messageSource = SpringUtils.getBean(MessageSource.class); return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); } }
4.2、添加國(guó)際化(i18n配置類)
import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 國(guó)際化(i18n)配置類 */ @Configuration @Slf4j // 實(shí)現(xiàn)WebMvcConfigurer接口,用于自定義Spring MVC的配置 public class I18nConfig implements WebMvcConfigurer { /** * 添加攔截器到Spring MVC的攔截器鏈中 * * @param registry 攔截器注冊(cè)器,用于添加和配置攔截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 創(chuàng)建一個(gè)自定義的國(guó)際化攔截器實(shí)例 MyI18nInterceptor myHandlerInterceptor = new MyI18nInterceptor(); // 使用攔截器注冊(cè)器注冊(cè)自定義的國(guó)際化攔截器 InterceptorRegistration loginRegistry = registry.addInterceptor(myHandlerInterceptor); // 設(shè)置需要攔截的路徑模式,這里配置為攔截所有路徑("/**") loginRegistry.addPathPatterns("/**"); } }
4.3、添加國(guó)際化(i18n攔截器)
import com.github.pagehelper.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; /** * i18n攔截器:用于從HTTP請(qǐng)求頭中獲取國(guó)際化參數(shù),并設(shè)置當(dāng)前線程的Locale。 */ @Slf4j public class MyI18nInterceptor implements HandlerInterceptor { /** * 在請(qǐng)求處理之前進(jìn)行調(diào)用。 * * @param request HttpServletRequest對(duì)象,提供對(duì)客戶端請(qǐng)求信息的訪問 * @param response HttpServletResponse對(duì)象,提供對(duì)HTTP響應(yīng)的控制 * @param handler 被調(diào)用的處理器,通常是HandlerMethod * @return 如果返回false,則請(qǐng)求處理流程將被中斷并返回給客戶端;如果返回true,則繼續(xù)執(zhí)行后續(xù)流程 * @throws Exception 拋出異常將中斷請(qǐng)求處理流程 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 假設(shè)請(qǐng)求頭中存儲(chǔ)語(yǔ)言信息的鍵名為"Language" final String key = "Language"; // 從請(qǐng)求頭中獲取語(yǔ)言信息 String language = request.getHeader(key); // 使用自定義的字符串工具類判斷語(yǔ)言信息是否非空 if (JoventStringUtils.isNotEmpty(language)) { // 假設(shè)語(yǔ)言信息格式為"zh_CN"或"en_US",這里通過下劃線分割獲取語(yǔ)言和地區(qū)信息 String[] languageParts = language.split("_"); // 確保分割后有兩個(gè)部分 if (languageParts.length == 2) { // 創(chuàng)建Locale對(duì)象 Locale locale = new Locale(languageParts[0], languageParts[1]); // 設(shè)置當(dāng)前線程的Locale LocaleContextHolder.setLocale(locale); } else { // 如果格式不正確,可以記錄日志或進(jìn)行其他處理 log.warn("Invalid language format: {}", language); } } // 繼續(xù)執(zhí)行后續(xù)流程 return true; } /** * 在請(qǐng)求處理之后進(jìn)行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后) * 通常用于處理一些需要在請(qǐng)求處理之后、視圖渲染之前執(zhí)行的邏輯 * * @param request HttpServletRequest對(duì)象 * @param response HttpServletResponse對(duì)象 * @param handler 被調(diào)用的處理器 * @param modelAndView 如果處理器方法的返回值是ModelAndView類型,則為該方法的返回值,否則為null */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { // 可以在這里添加處理請(qǐng)求處理之后、視圖渲染之前的邏輯 } /** * 在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用,也就是在DispatcherServlet渲染了對(duì)應(yīng)的視圖之后執(zhí)行(主要是用于進(jìn)行資源清理工作) * * @param request HttpServletRequest對(duì)象 * @param response HttpServletResponse對(duì)象 * @param handler 被調(diào)用的處理器 * @param ex 如果在請(qǐng)求處理過程中發(fā)生異常,則為該異常,否則為null */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { // 可以在這里添加請(qǐng)求處理完畢后的清理邏輯,例如關(guān)閉資源等 } }
五、Spring Boot配置
spring: # 資源信息配置 messages: # 國(guó)際化資源文件的基礎(chǔ)名稱(不包含文件后綴),Spring將會(huì)在這個(gè)基礎(chǔ)上添加語(yǔ)言代碼和地區(qū)代碼(例如messages_zh_CN.properties)來(lái)查找具體的資源文件 basename: i18n/messages # 國(guó)際化資源文件路徑 # 當(dāng)找不到特定Locale的資源文件時(shí),是否回退到系統(tǒng)默認(rèn)的Locale。如果設(shè)置為true,并且找不到特定Locale的資源文件,Spring將嘗試使用系統(tǒng)默認(rèn)的Locale來(lái)加載資源文件 fallback-to-system-locale: true # 回退到系統(tǒng)Locale # 指定資源文件的編碼格式。在讀取資源文件時(shí),Spring將使用此編碼格式 encoding: UTF-8 # 編碼格式 # 國(guó)際化資源文件的緩存時(shí)間(以秒為單位)。在這段時(shí)間內(nèi),相同的資源請(qǐng)求將不會(huì)再次加載資源文件,而是從緩存中獲取。設(shè)置為-1將禁用緩存 cache-duration: 3600 # 緩存持續(xù)時(shí)間(秒)
六、測(cè)試
6.1、接口
@Log(title = "參數(shù)管理", businessType = BusinessType.INSERT) @GetMapping("/add") public AjaxResult add() { return AjaxResult.success(MessageUtils.message("sys.config.newParameters")); }
此處截取的是請(qǐng)求頭的Language參數(shù),那么我們?cè)谡?qǐng)求的時(shí)候添加一個(gè)Language參數(shù) (具體的截取字段名自行配置)
6.2 、英文請(qǐng)求(en_US)
6.3 、中文請(qǐng)求(zh_CN)
總結(jié)
到此這篇關(guān)于JAVA Springboot配置i18n國(guó)際化語(yǔ)言的文章就介紹到這了,更多相關(guān)Springboot配置i18n國(guó)際化語(yǔ)言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Idea 2020.2 創(chuàng)建web、Spring項(xiàng)目的教程圖解
這篇文章主要介紹了Idea 2020.2 創(chuàng)建web、Spring項(xiàng)目的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08SpringMVC使用自定義驗(yàn)證器進(jìn)行數(shù)據(jù)驗(yàn)證的方法
SpringMVC?提供了強(qiáng)大的數(shù)據(jù)驗(yàn)證機(jī)制,可以方便地驗(yàn)證表單提交的數(shù)據(jù),除了自帶的驗(yàn)證器之外,SpringMVC?還支持自定義驗(yàn)證器,允許開發(fā)者根據(jù)業(yè)務(wù)需求自定義驗(yàn)證規(guī)則,本文將介紹如何在?SpringMVC?中使用自定義驗(yàn)證器2023-07-07Java并發(fā)編程中的CyclicBarrier使用解析
這篇文章主要介紹了Java并發(fā)編程中的CyclicBarrier使用解析,CyclicBarrier從字面意思上來(lái)看,循環(huán)柵欄,這篇文章就來(lái)分析下是到底是如何實(shí)現(xiàn)循環(huán)和柵欄的,需要的朋友可以參考下2023-12-12Java通過JNI調(diào)用C++動(dòng)態(tài)庫(kù)的完整流程詳解
JNI(Java Native Interface),是實(shí)現(xiàn)Java/Kotlin與C/C++語(yǔ)言之間交互的橋梁,本文主要為大家介紹了Java通過JNI調(diào)用C++動(dòng)態(tài)庫(kù)的完整流程,需要的可以參考下2025-04-04解決@SpringBootTest 單元測(cè)試遇到的坑
這篇文章主要介紹了解決@SpringBootTest 單元測(cè)試遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10spring cloud服務(wù)連接超時(shí)問題及解決
這篇文章主要介紹了spring cloud服務(wù)連接超時(shí)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01