springboot~國際化Locale正確的姿勢

張佔嶺發表於2023-05-19

Java中的Locale.getDefault()獲取的是作業系統的預設區域設定,如果需要獲取客戶端瀏覽器的區域設定,可以從HTTP頭中獲取"Accept-Language"的值來進行解析。

使用說明

Java網站中實現國際化(多語言支援)通常需要涉及以下幾個方面:

  1. 為所有可見的文字(如按鈕、標籤、提示等)都提供多語言的支援,遵循國際化的標準,建議使用標準的屬性檔案進行配置。

  2. 根據使用者請求或瀏覽器設定來選擇合適的Locale,以便在資料儲存和顯示時使用相應的語言和地區格式。最常用的方法是使用Java的Locale類來獲取、設定當前的Locale,可以透過呼叫Locale類的getAvailableLocales()方法獲取支援的區域列表,也可以根據使用者的請求或瀏覽器的設定來檢測使用者當前所使用的Locale。

  3. 針對國際化後的日期、時間、數字等資料型別進行格式化處理,以便在不同的語言、地區環境下使資料顯示更加友好和易讀。可以使用Java的SimpleDateFormat類等進行處理。

正確的姿勢

在Java Web應用中使用MessageSource物件實現國際化功能時,可以透過以下步驟使用瀏覽器語言動態設定Locale區域。

  • 國際化檔案在resources/i18n目錄,檔名是message_{語言}.properties
  • 透過MessageSource物件進行國際化配置資訊的管理
  1. 配置類
@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;
   }

}
  1. 靜態工具類
 /**
 * 國際化訊息配置 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);
   }

}
  1. 配置檔案有中文和英文兩個版本
# message_en_US.properties
title=System
# message_zh_CN.properties
title=\u7cfb\u7edf # 中文我們們使用unicode編碼

  1. 在前臺控制器中獲取配置資訊
	@GetMapping("get-title")
	public ResponseEntity title() {
		return ResponseEntity.ok(
				LocaleMessageUtils.getMessage("title")
		);
	}

  1. 透過切換瀏覽器的語言,來實現中文和英文的輸出


透過這個國際化,我們可以更優雅的實現多語言的系統設計了,不硬編碼在程式裡是程式設計師永遠追求的方向

相關文章