JAVA (Springboot) i18n國際化語言配置

JAVA i18n國際化語言配置
  • 一、簡介
  • 二、功能
  • 三、Java配置國際化步驟
  • 四、Java國際化配置工具類
  • 五、Spring Boot配置
  • 六、測試

一、簡介

在Java中,國際化(Internationalization,通常簡稱為i18n)是一個過程,它允許應用程序適應不同的語言和地區設置,從而能夠支持全球用戶。Java平臺為國際化提供了強大的支持,包括Locale類、ResourceBundle類以及用于格式化日期、數字和貨幣的類。

二、功能

1.支持多語言:

應用程序可以顯示多種語言的文本,包括但不限于英文、中文、法文等。
通過使用ResourceBundle,可以為每種語言提供獨立的資源文件(通常是.properties文件),其中包含該語言的文本。

2.自動選擇語言:
Java的Locale類允許應用程序根據用戶的偏好或系統設置自動選擇適當的語言。
例如,如果用戶的操作系統設置為法語,那么應用程序將嘗試加載法語的資源文件。格式化日期、數字和貨幣

3.用戶手動切換語言:
應用程序通常還允許用戶手動切換語言,即使他們的系統設置或瀏覽器默認語言不是他們想要使用的語言。這可以通過在應用程序中提供語言選擇界面或設置選項來實現。

4.前后端文字、校驗、消息提醒的國際化:
國際化不僅限于用戶界面上的文本,還包括后端代碼中的字符串、錯誤消息、驗證提示等。
通過使用外部化的字符串和消息,可以確保整個應用程序的文本都是可翻譯的。

5.通過AOP切面實現多語言的配置:
這是一個高級特性,允許開發人員使用面向切面編程(AOP)來自動處理對象的字符串屬性,并根據配置文件中的語言設置進行替換。
這種方法可以確保即使在復雜的業務邏輯中,字符串也能被正確地翻譯成用戶所需的語言。
配置文件命名規則:
在Java國際化中,配置文件必須遵循特定的命名規則,以便Java能夠正確識別。
例如,一個名為“messages”的資源束文件可以有以下命名的資源文件:messages.properties(默認)、messages_en_US.properties(英語(美國))、messages_fr_FR.properties(法語(法國))等。

三、Java配置國際化步驟

3.1 創建資源文件夾
在src/main/resources目錄下新建一個文件夾,用于存放國際化配置文件。
例如,您可以創建一個名為i18n或messages的文件夾。

3.2 添加語言文件

3.2.1 選擇Resource Bundle 進行添加配置文件

在這里插入圖片描述
3.2.2 配置要添加的語言配置文件
在i18n或messages文件夾下,為每個要支持的語言和地區添加.properties文件。文件名的命名規則通常是basename_language_country.properties,其中basename是您的基本文件名(如messages),language是ISO 639語言代碼(如en代表英語),country是ISO 3166國家代碼(如US代表美國)。

例如:
messages_en_US.properties(美國英語)
messages_en_GB.properties(英國英語)
messages_zh_CN.properties(簡體中文)
messages_zh_TW.properties(繁體中文,臺灣)

(會有一個Default locale默認的語言配置文件)
在這里插入圖片描述

3.2.3、 在對應的配置文件添加對應的語言信息

1.zh_CN:(中文)

sys.config.newParameters=新增參數
sys.config.changeParameters=修改參數
sys.config.newParametersExists=失敗,參數鍵名已存在

2.en_US:(英文)

sys.config.newParameters=New parameters
sys.config.changeParameters=Modify parameters
sys.config.newParametersExists=Failed, parameter key name already exists

四、Java國際化配置工具類

4.1、創建MessageUtils工具類

MessageUtils 工具類在國際化(i18n)應用中扮演著非常重要的角色,它封裝了與消息資源相關的常用操作,使得在應用程序的不同部分中都能夠方便地獲取和格式化本地化消息,而無需重復編寫代碼,通過key來獲取目前系統語言的value值。

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;/*** 獲取i18n資源文件** @author cccl*/
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());}
}

4.2、添加國際化(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;/**  * 國際化(i18n)配置類  */  
@Configuration   
@Slf4j 
// 實現WebMvcConfigurer接口,用于自定義Spring MVC的配置  
public class I18nConfig implements WebMvcConfigurer { /**  * 添加攔截器到Spring MVC的攔截器鏈中  *  * @param registry 攔截器注冊器,用于添加和配置攔截器  */  @Override  public void addInterceptors(InterceptorRegistry registry) {  // 創建一個自定義的國際化攔截器實例  MyI18nInterceptor myHandlerInterceptor = new MyI18nInterceptor();  // 使用攔截器注冊器注冊自定義的國際化攔截器  InterceptorRegistration loginRegistry = registry.addInterceptor(myHandlerInterceptor);  // 設置需要攔截的路徑模式,這里配置為攔截所有路徑("/**")  loginRegistry.addPathPatterns("/**");  }  }

4.3、添加國際化(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請求頭中獲取國際化參數,并設置當前線程的Locale。  */  
@Slf4j  
public class MyI18nInterceptor implements HandlerInterceptor {  /**  * 在請求處理之前進行調用。  *  * @param request  HttpServletRequest對象,提供對客戶端請求信息的訪問  * @param response HttpServletResponse對象,提供對HTTP響應的控制  * @param handler  被調用的處理器,通常是HandlerMethod  * @return 如果返回false,則請求處理流程將被中斷并返回給客戶端;如果返回true,則繼續執行后續流程  * @throws Exception 拋出異常將中斷請求處理流程  */  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  // 假設請求頭中存儲語言信息的鍵名為"Language"  final String key = "Language"; // 從請求頭中獲取語言信息  String language = request.getHeader(key); // 使用自定義的字符串工具類判斷語言信息是否非空  if (JoventStringUtils.isNotEmpty(language)) {// 假設語言信息格式為"zh_CN"或"en_US",這里通過下劃線分割獲取語言和地區信息  String[] languageParts = language.split("_");  // 確保分割后有兩個部分  if (languageParts.length == 2) { // 創建Locale對象  Locale locale = new Locale(languageParts[0], languageParts[1]); // 設置當前線程的Locale  LocaleContextHolder.setLocale(locale); } else {  // 如果格式不正確,可以記錄日志或進行其他處理  log.warn("Invalid language format: {}", language);  }  }  // 繼續執行后續流程 return true;  }  /**  * 在請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后)  * 通常用于處理一些需要在請求處理之后、視圖渲染之前執行的邏輯  *  * @param request   HttpServletRequest對象  * @param response  HttpServletResponse對象  * @param handler   被調用的處理器  * @param modelAndView 如果處理器方法的返回值是ModelAndView類型,則為該方法的返回值,否則為null  */  @Override  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {  // 可以在這里添加處理請求處理之后、視圖渲染之前的邏輯  }  /**  * 在整個請求結束之后被調用,也就是在DispatcherServlet渲染了對應的視圖之后執行(主要是用于進行資源清理工作)  *  * @param request   HttpServletRequest對象  * @param response  HttpServletResponse對象  * @param handler   被調用的處理器  * @param ex        如果在請求處理過程中發生異常,則為該異常,否則為null  */  @Override  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {  // 可以在這里添加請求處理完畢后的清理邏輯,例如關閉資源等  }  
}

五、Spring Boot配置

spring:  # 資源信息配置  messages:  # 國際化資源文件的基礎名稱(不包含文件后綴),Spring將會在這個基礎上添加語言代碼和地區代碼(例如messages_zh_CN.properties)來查找具體的資源文件  basename: i18n/messages # 國際化資源文件路徑  # 當找不到特定Locale的資源文件時,是否回退到系統默認的Locale。如果設置為true,并且找不到特定Locale的資源文件,Spring將嘗試使用系統默認的Locale來加載資源文件  fallback-to-system-locale: true # 回退到系統Locale  # 指定資源文件的編碼格式。在讀取資源文件時,Spring將使用此編碼格式  encoding: UTF-8 # 編碼格式  # 國際化資源文件的緩存時間(以秒為單位)。在這段時間內,相同的資源請求將不會再次加載資源文件,而是從緩存中獲取。設置為-1將禁用緩存  cache-duration: 3600 # 緩存持續時間(秒)

六、測試

6.1、接口

@Log(title = "參數管理", businessType = BusinessType.INSERT)
@GetMapping("/add")
public AjaxResult add() {return AjaxResult.success(MessageUtils.message("sys.config.newParameters"));
}

此處截取的是請求頭的Language參數,那么我們在請求的時候添加一個Language參數 (具體的截取字段名自行配置)

6.2 、英文請求(en_US)

在這里插入圖片描述
6.3 、中文請求(zh_CN)
在這里插入圖片描述

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

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

相關文章

如何創建基于udp的客戶端和服務端

1.先創建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…

【上線文檔】系統上線方案模板,計算機系統上線保障計劃,系統運維信息系統運行保障方案,系統上線方案模板(Word原件)

一、項目背景和目標 二、項目需求分析 2.1 功能需求 2.2 非功能需求 三、系統設計 3.1 系統架構設計 3.2 數據庫設計 3.3 接口設計 3.4 用戶界面設計 四、系統開發 4.1 開發環境搭建 4.2 業務邏輯開發 4.3 數據庫實現 4.4 接口實現 4.5 用戶界面實現 五、系統測…

大模型應用的數字能源數據集

除了尚須時日的量子計算解決算力效率和能源問題&#xff0c;以及正在路上的超越transformer的全新模型架構外&#xff0c;無疑是“數據集”&#xff0c;準確講是“高質量大規模多樣性的數據集”。數據集是大模型發展的核心要素之一&#xff0c;是大計算的標的物&#xff0c;是實…

【OpenCV】圖像轉換

理論 傅立葉變換用于分析各種濾波器的頻率特性。對于圖像&#xff0c;使用 2D離散傅里葉變換&#xff08;DFT&#xff09; 查找頻域。快速算法稱為 快速傅立葉變換&#xff08;FFT&#xff09; 用于計算DFT。 Numpy中的傅立葉變換 首先&#xff0c;我們將看到如何使用Numpy查…

如何使用Java編寫Jmeter函數

Jmeter 自帶有各種功能豐富的函數&#xff0c;可以幫助我們進行測試&#xff0c;但有時候提供的這些函數并不能滿足我們的要求&#xff0c;這時候就需要我們自己來編寫一個自定義的函數了。例如我們在測試時&#xff0c;有時候需要填入當前的時間&#xff0c;雖然我們可以使用p…

【2024版】最新kali linux入門及常用簡單工具介紹(非常詳細)從零基礎入門到精通,看完這一篇就夠了

前言 相信很多同學了解到和學習網絡安全的時候都聽過kali系統&#xff0c;大家都稱之為黑客最喜愛的系統&#xff0c;那么什么是kali&#xff0c;初學者用kali能做些什么&#xff0c;大白我將在本文中做詳細的介紹&#xff1a; 一、kali linux是什么&#xff1f; Kali Linux…

使用 electron 把 vue 項目打包成客戶端

1. 新建一個Vue項目 新建一個vue項目&#xff0c;或者在已經寫好的vue項目上操作 2. 安裝依賴包 需要安裝的包有2個 electron electron-builder 安裝失敗的&#xff0c;可看另外一篇解決方法https://blog.csdn.net/Anorry/article/details/144061069?spm1001.2014.3001.5501 3…

六大排序算法:插入排序、希爾排序、選擇排序、冒泡排序、堆排序、快速排序

本章講述數據結構中的六大排序算法 歡迎大佬們踴躍討論&#xff0c;感謝大家支持&#xff01; 我的博客主頁鏈接 六大排序算法 一.插入排序1.1 直接插入排序1.2 希爾排序 二.選擇排序2.1 單向選擇排序2.2雙向選擇排序2.3 堆排序 三.交換排序3.1 冒泡排序3.2 快速排序3.2.1 Hoa…

el-table手動觸發懶加載

二次修改了一下&#xff0c;確保點擊某一單元格格元素觸發 // 隱藏懶加載箭頭后手動觸發懶加載 expandRows(scope){scope.row.isExpanded !scope.row.isExpanded // 切換展開狀態let isExpanded scope.row.isExpandedconst { table: { toggleRowExpansion, store }} this.$r…

【MySQL】數據庫 Navicat 可視化工具與 MySQL 命令行基本操作

&#x1f4af; 歡迎光臨清流君的博客小天地&#xff0c;這里是我分享技術與心得的溫馨角落 &#x1f4af; &#x1f525; 個人主頁:【清流君】&#x1f525; &#x1f4da; 系列專欄: 運動控制 | 決策規劃 | 機器人數值優化 &#x1f4da; &#x1f31f;始終保持好奇心&…

threejs相機輔助對象cameraHelper

為指定相機創建一個輔助對象&#xff0c;顯示這個相機的視錐。 想要在場景里面顯示相機的視錐&#xff0c;需要創建兩個相機。 舉個例子&#xff0c;場景中有個相機A&#xff0c;想要顯示相機A的視錐&#xff0c;那么需要一個相機B&#xff0c;把B放在A的后面&#xff0c;兩個…

反向代理-緩存篇

文章目錄 強緩存一、Expires(http1.0 規范)二、cache-control(http1.1 出現的 header 信息)Cache-Control 的常用選項Cache-Control 常用選項的選擇三、弊端協商緩存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since瀏覽器的三種刷新方式靜態資源部署策略…

深度學習小麥頭檢測-基于Faster-RCNN的小麥頭檢測——附項目源碼

比賽描述 為了獲得有關全世界麥田的大量準確數據,植物科學家使用“小麥頭”(包含谷物的植物上的穗)的圖像檢測。這些圖像用于估計不同品種的小麥頭的密度和大小。但是,在室外野外圖像中進行準確的小麥頭檢測可能在視覺上具有挑戰性。密集的小麥植株經常重疊,并且風會使照片…

健康管理系統(Koa+Vue3)

系統界面(源碼末尾獲取) 系統技術 Vue3 Koa Nodejs Html Css Js ....... 系統介紹 系統比較簡單,輕輕松松面對結業課堂作業.采用的是基于nodejs開發的Koa框架作為后端,采用Vue框架作為前端,完成快速開發和界面展示. 系統獲取 啊啊啊寶/KoaVue3https://gitee.com/ah-ah-b…

數據清洗代碼:缺失值,異常值,離群值Matlab處理

目錄 基本介紹程序設計參考資料基本介紹 一、過程概述 本過程適用于處理SCADA系統采集到的數據,以及具有類似需求的數據集。處理步驟包括缺失值處理、異常值處理和離群值處理,旨在提升數據質量,增強數據的相關性,同時保持數據的原始特征和隨機性。 二、缺失值處理 對于SC…

Leetcode 每日一題 202.快樂數

目錄 題意 算法思路 過題圖片 算法實現 代碼解析 復雜度分析 題目鏈接 結論 題意 判斷正整數 n 是不是快樂數。 快樂數定義&#xff1a; &#xff08;1&#xff09;每次將正整數替換為它每個位置上的數字的平方和。 &#xff08;2&#xff09;重復這個過程直到這個數…

【鴻蒙生態崛起】開發者如何把握機遇,應對挑戰,打造卓越應用體驗?

文章目錄 每日一句正能量前言鴻蒙簡析鴻蒙生態的認知和了解鴻蒙生態的崛起分析 鴻蒙生態下開發時遇到的挑戰開發工具不完善技術難度生態競爭抓住機遇、應對挑戰 鴻蒙生態未來的發展趨勢1. 全場景智慧生活的推動者2. 技術創新的引領者3. 開放合作的倡導者對鴻蒙生態和開發者的建…

Nignx部署Java服務測試使用的Spring Boot項目Demo

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

文本域設置高度 加上文字限制并show出來:

文本域設置高度 :rows"4" 加上文字限制并show出來&#xff1a; maxlength"30" show-word-limit 效果: <el-form-item label"產品備注" prop"remark"><el-input v-model"form.remark" type"textarea"…

區塊鏈軟件系統海外宣發:全球化市場中的策略與實施

隨著區塊鏈技術的快速發展&#xff0c;越來越多的區塊鏈軟件系統進入全球市場&#xff0c;涉及加密貨幣、智能合約、去中心化金融&#xff08;DeFi&#xff09;、供應鏈管理等多個行業應用。為了在激烈的競爭中脫穎而出&#xff0c;區塊鏈軟件系統不僅需要具備卓越的技術能力&a…