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)