SpringBoot 接口國際化i18n 多語言返回 中英文切換 全球化 語言切換

介紹

Spring Boot通過MessageSource接口來實現國際化,它可以加載不同的消息資源文件,通常是.properties格式。通過定義不同的語言文件(例如:messages_en.properties、messages_zh.properties等),可以根據用戶的語言環境來自動選擇對應的文件,提供不同的翻譯和文本來實現業務的國際化操作。

效果

英文

{"msg": "success","code": 200,"data": null
}

中文

{"msg": "操作成功","code": 200,"data": null
}

其他語言也可以自行配置

配置文件

spring:messages:# 國際化資源文件路徑basename: i18n/messages

在這里插入圖片描述
messages表示匹配以messages開頭的文件

創建語言文件

message.properties
公共的語言文件

system.error.tip=請聯系管理員操作

messages_en_US.properties
英文語言文件

system.user.tip.name=Please enter the user name
system.user.tip.password=Please enter the user password

messages_zh_CN.properties
中文語言文件

system.user.tip.name=請輸入用戶名
system.user.tip.password=請輸入用戶密碼

多語言情況下請保持語言文件的格式和字段

攔截器配置

這個攔截器主要識別前端傳遞的語言字符串并根據字符串返回對應的語言

/*** 該類是一個自定義的攔截器,用于從HTTP請求的頭部獲取語言參數,并根據該參數設置當前請求的語言。* 它繼承自Spring的`LocaleChangeInterceptor`,并重寫了`preHandle`方法來實現自定義的語言切換邏輯。*/
public class CustomLocaleChangeInterceptor extends LocaleChangeInterceptor {// 設置請求頭中獲取語言的字段名private static final String LANG_HEADER = "lang";/*** 這個方法會在每個請求處理之前被調用,用來獲取請求頭中的語言設置,* 如果存在有效的語言參數,就會設置當前請求的語言環境。* @param request  當前的HTTP請求對象* @param response 當前的HTTP響應對象* @param handler  當前請求的處理器(一般是控制器方法)* @return 如果返回true,表示繼續執行后續的處理器鏈,否則會中斷請求的處理*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 從請求頭中獲取指定的語言字段("lang")String lang = request.getHeader(LANG_HEADER);// 如果lang參數存在且不為空if (lang != null && !lang.isEmpty()) {// 按照"-"分割語言和地區信息String[] parts = lang.split("_");// 設置語言環境// parts[0]是語言(例如:en、zh)// parts[1]是地區(例如:US、CN),如果沒有地區則使用空字符串LocaleContextHolder.setLocale(new Locale(parts[0], parts.length > 1 ? parts[1] : ""));}// 返回true放行return true;}
}

還有一種方法可以從瀏覽器自帶的:Accept-Language:zh-CN,zh;q=0.9 來獲取但是各瀏覽器的參數有所不同所以沒采用,好處就是可以自動識別用戶的語言。

I18n配置類

/*** 資源文件配置加載* 該配置類用于設置國際化資源文件的加載和管理。它配置了語言環境解析器以及自定義的攔截器。* 通過此配置,Spring Web應用能夠根據用戶的請求來切換不同的語言環境(Locale)。*/
@Configuration
public class I18nConfig implements WebMvcConfigurer {/*** 定義一個 LocaleResolver bean,用于處理當前用戶會話中的語言環境。* * LocaleResolver 用于解析當前請求的語言環境,通常會根據Session中的信息來判斷。* 在這里我們使用的是 SessionLocaleResolver,它會將用戶選擇的語言存儲在Session中,* 這樣用戶在后續請求中可以保持相同的語言環境。** @return 返回配置好的 LocaleResolver*/@Beanpublic LocaleResolver localeResolver() {// 創建一個 SessionLocaleResolver 實例SessionLocaleResolver slr = new SessionLocaleResolver();// 設置默認的語言環境為簡體中文 (zh_CN)// 當用戶沒有明確設置語言時,應用默認使用簡體中文slr.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);return slr;}/*** 配置國際化攔截器,用于監聽用戶請求中的語言切換參數。** 該方法會添加一個自定義的攔截器 CustomLocaleChangeInterceptor,目的是監聽用戶請求中的語言切換請求,* 并更新當前會話的語言環境。** @param registry 攔截器注冊器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注冊自定義的語言環境切換攔截器// 該攔截器會監聽請求中是否包含語言參數(例如:?lang=zh_CN),// 如果有,就會根據該參數改變當前用戶的語言環境。registry.addInterceptor(new CustomLocaleChangeInterceptor());}
}

封裝Bean工具類

該代碼來著若依管理系統

/*** spring工具類,方便在非Spring管理環境中獲取bean* 提供一些用于獲取Spring上下文中的Bean,環境配置,AOP代理對象等功能的方法。* 該類實現了 BeanFactoryPostProcessor 和 ApplicationContextAware 接口,* 用于在非Spring管理環境中操作Spring容器中的bean。** @author ruoyi*/
@Component
public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware
{/** Spring應用上下文環境的BeanFactory */private static ConfigurableListableBeanFactory beanFactory;/** Spring應用上下文環境 */private static ApplicationContext applicationContext;/*** 實現 BeanFactoryPostProcessor 接口的 postProcessBeanFactory 方法* 用于在Spring容器啟動時獲取Spring容器中的BeanFactory。** @param beanFactory Spring的BeanFactory* @throws BeansException 如果發生異常*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{SpringUtils.beanFactory = beanFactory;  // 保存 BeanFactory 實例}/*** 實現 ApplicationContextAware 接口的 setApplicationContext 方法* 用于在Spring容器啟動時獲取Spring應用上下文環境。** @param applicationContext Spring的應用上下文* @throws BeansException 如果發生異常*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException{SpringUtils.applicationContext = applicationContext;  // 保存應用上下文實例}/*** 根據bean名稱獲取Spring容器中的Bean實例** @param name bean的名稱* @return 返回與給定名稱相對應的bean實例* @throws org.springframework.beans.BeansException 如果沒有找到bean實例*/@SuppressWarnings("unchecked")public static <T> T getBean(String name) throws BeansException{return (T) beanFactory.getBean(name);  // 獲取bean}/*** 根據給定的bean類型獲取Spring容器中的Bean實例** @param clz bean的類型* @return 返回與給定類型相對應的bean實例* @throws org.springframework.beans.BeansException 如果沒有找到bean實例*/public static <T> T getBean(Class<T> clz) throws BeansException{T result = (T) beanFactory.getBean(clz);  // 根據類型獲取beanreturn result;}/*** 檢查BeanFactory中是否包含指定名稱的Bean定義** @param name bean的名稱* @return 如果包含該bean,返回true,否則返回false*/public static boolean containsBean(String name){return beanFactory.containsBean(name);  // 檢查bean是否存在}/*** 判斷指定名稱的bean是singleton類型還是prototype類型* 如果指定名稱的bean沒有定義,將拋出NoSuchBeanDefinitionException異常。** @param name bean的名稱* @return 如果是singleton類型返回true,prototype類型返回false* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException 如果沒有找到該bean*/public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException{return beanFactory.isSingleton(name);  // 判斷bean類型}/*** 獲取指定名稱bean的類型* 如果沒有找到bean,將拋出NoSuchBeanDefinitionException異常。** @param name bean的名稱* @return 返回指定bean的類型* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException 如果沒有找到該bean*/public static Class<?> getType(String name) throws NoSuchBeanDefinitionException{return beanFactory.getType(name);  // 獲取bean的類型}/*** 獲取指定名稱bean的別名* 如果該bean有別名,則返回所有別名,否則返回空數組。** @param name bean的名稱* @return 返回該bean的所有別名* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException 如果沒有找到該bean*/public static String[] getAliases(String name) throws NoSuchBeanDefinitionException{return beanFactory.getAliases(name);  // 獲取bean的別名}/*** 獲取當前bean的AOP代理對象* 通過AOP上下文獲取代理對象,并返回代理對象或原始bean實例。** @param invoker 需要代理的bean實例* @return 返回代理對象或者原始對象*/@SuppressWarnings("unchecked")public static <T> T getAopProxy(T invoker){Object proxy = AopContext.currentProxy();  // 獲取當前的AOP代理if (((Advised) proxy).getTargetSource().getTargetClass() == invoker.getClass()){return (T) proxy;  // 如果是代理類,返回代理對象}return invoker;  // 否則返回原始對象}/*** 獲取當前的激活環境配置* 如果有多個激活環境配置,返回所有的配置。** @return 返回當前的所有激活環境配置*/public static String[] getActiveProfiles(){return applicationContext.getEnvironment().getActiveProfiles();  // 獲取當前環境配置}/*** 獲取配置文件中的某個key對應的值* 從環境配置中獲取指定的屬性值,如果沒有找到該key,會拋出異常。** @param key 配置文件中的key* @return 返回配置文件中指定key對應的值*/public static String getRequiredProperty(String key){return applicationContext.getEnvironment().getRequiredProperty(key);  // 獲取配置項的值}
}

封裝語言工具類

/*** 獲取i18n資源文件*/
public class MessageUtils
{/*** 根據消息鍵和參數 獲取消息 委托給spring messageSource** @param code 消息鍵* @param args 參數* @return 獲取國際化翻譯值*/public static String message(String code, Object... args){MessageSource messageSource = SpringUtils.getBean(MessageSource.class);return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());}}

接口使用

@RequestMapping("/user")
public R user() {return R.success(I18NUtils.message("system.user.tip.name"));
}

前端請求

lang:en_US
返回英文

lang:zh_CN
返回中文

在請求頭中攜帶

傳入參數

語言文件
system.user.tip.name=請輸入用戶名:{0}

后端使用

System.out.println(I18NUtils.message("system.user.tip.name","admin"));

輸出結果

請輸入用戶名:admin

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78772.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78772.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78772.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個crackme例子

文件下載地址&#xff1a;https://download.csdn.net/download/m0_37567738/90713354 將cipher.txt文件內容解密后&#xff1a; 恭喜你解出了這一關&#xff0c;flag為 zjwa{36_23121136a28d0d15} 好了現在告訴你最后一層的獲取方式&#xff0c; 在系統內找到 手機鏡像的 ra…

賬戶解封無望?3步高效申訴取回亞馬遜凍結資金

近年來&#xff0c;隨著全球跨境電商市場的飛速擴張&#xff0c;亞馬遜&#xff08;Amazon&#xff09;作為其中的巨頭&#xff0c;持續強化其平臺治理力度。然而&#xff0c;隨之而來的是賣家賬戶因各種原因被凍結、關閉的事件頻頻發生。根據Marketplace Pulse發布的2024年第一…

【C++ Qt】快速上手 顯?類控件(Label、LCDNumber、ProcessBar、CalendarWidget)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本文圍繞Qt中常用的顯示類控件展開&#xff0c;重點講解了 QLabel&#xff08;文本/圖片顯示&#xff09;、QLCDNumber&#xff08;數字顯示&#xff0…

從困局到破局的AI+數據分析

從困局到破局的AI數據分析 困局&#xff1a;數據分析的四道高墻破局&#xff1a;AI賦能全流程數據分析遠見&#xff1a;AI數據分析的革命性意義 數據是新時代的石油&#xff0c;人工智能是煉油廠。當兩者強強聯合&#xff0c;一場數據分析的革命正悄然發生。 多少次你面對Excel…

IGH 匯川SV660N調試

EoE 目前的方式是將eoe 關閉, 這需要重新配置編譯ec_master sudo ./configure --disable-8139too --enable-generic --enable-r8169 --disable-eoe --enable-coe[426163.348589] EtherCAT 0: Master thread exited. [426163.348592] EtherCAT 0: Stopping EoE thread. [426163.…

Java基礎361問第16問——枚舉為什么導致空指針?

我們看一段代碼 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 極具迷惑性&#xff0c;大家日常開發肯定這么寫過switch (color) {case RED:break;c…

10.Excel:快速定位目標值

一 批量刪除 1.如何使用 快捷鍵 CTRLG 補充&#xff1a;直接選擇定位條件。 2.作用 1.批量刪除工作表中的圖片 補充&#xff1a;無法通過框選的方式選中這些圖片進行刪除。 這樣只框選了表格&#xff0c;無法框選圖片。因為圖片在excel中被認為是一個對象&#xff0c;對象無法通…

快樂數(雙指針解法)

題目鏈接202. 快樂數 - 力扣&#xff08;LeetCode&#xff09; 題目拆解 1 取一個正整數每一位的平方和為&#xff0c;如果為1那么直接可以判定為快樂數&#xff0c;如果不為1&#xff0c;就重復這個過程&#xff0c;直到出現1 2 實際上&#xff0c;這道題只有兩種情況&#xf…

進程控制的學習

進程控制&#xff08;Process Control&#xff09;是指操作系統對進程的創建、執行、暫停、恢復、終止等一系列狀態變化進行管理和協調的過程。 簡單說&#xff0c;就是系統讓各個程序能有序地運行&#xff0c;合理地使用CPU和資源&#xff0c;而不會互相沖突或者出錯。 主要包…

818協議知識筆記

一、概念 Fibre CHannel-Audio Vedio standard;FC-AV FC-FS:Fibre channel framing and signaling interface; FC-PI:fibre channel physical interfaces 二、術語 VGA,SVGA,XGA,WXGA,SXGA,SXGA,WSXGA,UXGA,1440P; ICD:interface control document接口控制文檔 CRC對幀頭和數據…

AI大模型學習十二:?嘗鮮ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio對象存儲測試和漫長修改之路

一、說明 前面已經安裝完成&#xff0c;這里我們測試對象存儲 AI大模型學習十一&#xff1a;?嘗鮮ubuntu 25.04 桌面版私有化sealos cloud devboxminio&#xff0c;實戰運行成功-CSDN博客https://blog.csdn.net/jiangkp/article/details/147424823?spm1011.2415.3001.5331 二…

SpringBoot的自動掃描特性-筆記

1.Spring Boot 的自動掃描特性介紹 Spring Boot 的自動掃描&#xff08;Component Scanning&#xff09;是其核心特性之一。通過注解SpringBootApplication 簡化了 Bean 的管理&#xff0c;允許框架自動發現并注冊帶有特定注解的類為 Spring 容器中的 Bean&#xff08;特定注解…

基于nodeJS代碼的通過爬蟲方式實現tiktok發布視頻(2025年4月)

1、將真實的tiktokstudio平臺的cookie填到代碼里的cookie變量里,修改python代碼里的ticket,ts, privateKey,以及videoPath,timing等變量的值,最后運行python腳本即可; 2、運行之前根據import提示安裝一些常見依賴,比如node-fetch等; 3、運行時候可能系統需要科學上網…

數據一致性問題剖析與實踐(四)——競態條件競爭導致的一致性問題

一、前言 之前我們討論了幾種場景的一致性問題 冗余數據存儲中的一致性問題分布式共識中的一致性問題單機事務中的一致性問題分布式事務中的一致性問題 本文將圍繞競態條件競爭中的一致性問題展開討論分析。 二、 問題定義 競態條件&#xff08;Race Condition&#xff09…

PCL點云處理之基于FPFH特征的SAC-IA全局配準算法 (二百四十六)

提示: 有相關點云需求的可以私信 PCL 點云處理之基于 FPFH 特征的 SAC - IA 全局配準算法 一、前言二、相關概念介紹2.1 點云2.2 FPFH 特征2.3 SAC - IA 算法三、SAC - IA 全局配準算法原理3.1 FPFH 特征提取3.2 SAC - IA 配準過程四、代碼實現與分析4.1 完整代碼4.2 代碼分析…

JavaScript性能優化實戰:從瓶頸定位到極致提速

JavaScript作為現代Web應用的核心&#xff0c;其性能直接影響用戶體驗。本文將從性能瓶頸定位、高頻優化場景、現代API利用三個維度&#xff0c;結合代碼示例和Chrome DevTools實戰&#xff0c;為你構建完整的性能優化體系。 一、性能分析&#xff1a;精準定位瓶頸 1.1 Chrome…

JavaScript 頁面刷新:從傳統到現代的全面解析

在 Web 開發中&#xff0c;"刷新"是一個基礎但極其重要的功能。本文將全面探討頁面刷新的實現方式&#xff0c;從傳統方法到現代最佳實踐&#xff0c;深入解析每一種方案的原理和適用場景&#xff0c;并給出實用代碼示例。 一、理解頁面刷新的本質 在 Web 開發中&am…

NLP高頻面試題(五十五)——DeepSeek系列概覽與發展背景

大型模型浪潮背景 近年來,大型語言模型(Large Language Model, LLM)領域發展迅猛,從GPT-3等超大規模模型的崛起到ChatGPT的橫空出世,再到GPT-4的問世,模型參數規模和訓練數據量呈指數級增長。以GPT-3為例,參數高達1750億,在570GB文本數據上訓練,顯示出模型規模、數據…

鴻蒙系統應用開發全棧指南

一、開發環境搭建與工具鏈配置 1. DevEco Studio深度解析 作為鴻蒙生態的官方IDE&#xff0c;DevEco Studio 4.2版本已集成ArkTS 3.0編譯器與AI代碼助手功能。安裝過程需注意&#xff1a; 系統要求&#xff1a;Windows 10 21H2或macOS Monterey以上環境依賴&#xff1a;Node…

iOS18 MSSBrowse閃退

iOS18 MSSBrowse閃退 問題方案結果 問題 最近升級了電腦系統(15.4.1)&#xff0c;并且也升級了xcode(16.3)開發工具。之后打包公司很早之前開發的項目。 上線之后發現在蘋果手機系統18以上&#xff0c;出現了閃退問題。 涉及到的是第三方MSSBrowse&#xff0c;在選擇圖片放大的…