springboot~國際化Locale正確的姿勢
Java中的Locale.getDefault()獲取的是操作系統的默認區域設置,如果需要獲取客戶端瀏覽器的區域設置,可以從HTTP頭中獲取"Accept-Language"的值來進行解析。
使用說明
Java網站中實現國際化(多語言支持)通常需要涉及以下幾個方面:
-
為所有可見的文本(如按鈕、標簽、提示等)都提供多語言的支持,遵循國際化的標準,建議使用標準的屬性文件進行配置。
-
根據用戶請求或瀏覽器設置來選擇合適的Locale,以便在數據保存和顯示時使用相應的語言和地區格式。最常用的方法是使用Java的Locale類來獲取、設置當前的Locale,可以通過調用Locale類的getAvailableLocales()方法獲取支持的區域列表,也可以根據用戶的請求或瀏覽器的設置來檢測用戶當前所使用的Locale。
-
針對國際化后的日期、時間、數字等數據類型進行格式化處理,以便在不同的語言、地區環境下使數據顯示更加友好和易讀。可以使用Java的SimpleDateFormat類等進行處理。
正確的姿勢
在Java Web應用中使用MessageSource對象實現國際化功能時,可以通過以下步驟使用瀏覽器語言動態設置Locale區域。
- 國際化文件在resources/i18n目錄,文件名是message_{語言}.properties
- 通過MessageSource對象進行國際化配置信息的管理
- 配置類
@Configuration
public class LocalMessageConfig {
/**
* 系統國際化文件配置
* @return MessageSource
*/
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:i18n/message");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
- 靜態工具類
/**
* 國際化消息配置 LocalMessageConfig中配置了resources/i18n/messages_zh_CN.properties.
* 通過 LocaleContextHolder.getLocale()獲取客戶端瀏覽器的語言環境,就是請求頭中的Accept-Language的值,再根據它進行國際化消息的獲取。
*
* @UtilityClass所有的方法和屬性都會被加上static關鍵字,并且該類會創建一個私有的空參構造器
*/
@UtilityClass
public class LocaleMessageUtils {
/**
* 通過code 獲取錯誤信息
* @param code
* @return
*/
public String getMessage(String code) {
return getMessage(code, null);
}
/**
* 通過code 和參數獲取錯誤信息
* @param code
* @return
*/
public String getMessage(String code, Object... objects) {
MessageSource messageSource = SpringContextUtils.getBean("messageSource");
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(code, null,locale);
}
}
- 配置文件有中文和英文兩個版本
# message_en_US.properties
title=System
# message_zh_CN.properties
title=\u7cfb\u7edf # 中文咱們使用unicode編碼
- 在前臺控制器中獲取配置信息
@GetMapping("get-title")
public ResponseEntity title() {
return ResponseEntity.ok(
LocaleMessageUtils.getMessage("title")
);
}
- 通過切換瀏覽器的語言,來實現中文和英文的輸出




通過這個國際化,我們可以更優雅的實現多語言的系統設計了,不硬編碼在程序里是程序員永遠追求的方向!
浙公網安備 33010602011771號