首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring 國際化 (i18n) 實戰:MessageSource 配置與獲取策略詳解

     編輯:Java 綜合教學

為什麼需要框架級國際化支持

傳統方案:數據庫字典表 或 Java 常量類。痛點: 多語言切換需改代碼/改數據、維護成本高、無法優雅回退默認語言。Spring 通過 MessageSource 統一管理資源文件,支持 Locale 解析、參數佔位符、默認值回退,實現零侵入國際化。

MessageSource 核心 API

args 為 Object[],對應資源文件中 {0}、{1} 佔位符。

Spring 自動裝配機制

ApplicationContext 啟動時自動查找 id 為 messageSource 的 Bean。標準實現:ResourceBundleMessageSource (基於 JDK ResourceBundle) 或 ReloadableResourceBundleMessageSource (支持熱加載)。

實戰配置步驟

1. 定義資源文件 (類路徑下)

# messages.properties (默認/回退)
greeting=Hello, {0}!

# messages_zh_CN.properties (中文簡體)
greeting=你好,{0}!

# messages_en_US.properties (英文)
greeting=Hello, {0}!
項目結構圖

2. Spring XML 配置 MessageSource

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basenames">
    <list><value>messages</value></list> <!-- 基礎名,自動追加 _Locale -->
  </property>
  <property name="defaultEncoding" value="UTF-8"/>
  <property name="fallbackToSystemLocale" value="false"/> <!-- 不回退系統 Locale,改用默認文件 -->
</bean>

<!-- 可選:LocaleResolver 解析請求語言 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
  <property name="defaultLocale" value="zh_CN"/>
</bean>

<!-- 可選:LocaleChangeInterceptor 通過參數切換語言 -->
<mvc:interceptors>
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="lang"/> <!-- ?lang=en_US -->
  </bean>
</mvc:interceptors>

3. 代碼中獲取國際化消息

@Controller
public class DemoController {
    @Autowired private MessageSource messageSource;

    @RequestMapping("/greet")
    @ResponseBody
    public String greet(@RequestParam String name, Locale locale) {
        // 方式一:注入 MessageSource
        return messageSource.getMessage("greeting", new Object[]{name}, locale);
        
        // 方式二:繼承 WebApplicationObjectSupport 獲取
        // return getMessageSourceAccessor().getMessage("greeting", name, locale);
    }
}

4. JSP/Thymeleaf 視圖中使用

<!-- JSP Spring 標籤庫 -->
<%@ taglib prefix="spring" uri="https://www.springframework.org/tags" %>
<spring:message code="greeting" arguments="${userName}" />
<!-- Thymeleaf -->
<p th:text="#{greeting(${userName})}"></p>

進階特性

  • 參數化:user.welcome=Welcome {0}, your balance is {1} → getMessage("user.welcome", new Object[]{name, money}, locale)。
  • 巢狀消息:資源文件值可引用其他 key (需自定義解析)。
  • 熱加載:用 ReloadableResourceBundleMessageSource 設 cacheSeconds 實現修改即時生效。
  • 編碼統一:強制 UTF-8 避免中文亂碼。

常見坑點避雷

  1. 文件命名必須 基礎名_語言_國家.properties,如 messages_zh_CN.properties。
  2. 資源文件編碼必須 UTF-8,IDE 設置檢查。
  3. fallbackToSystemLocale=false 避免生產環境系統語言干擾,改回退默認文件 messages.properties。
  4. 佔位符索引從 0 開始,參數順序對應。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法特點
getMessage(code, args, defaultMsg, locale)找不到時返回 defaultMsg,不拋異常
getMessage(code, args, locale)找不到拋 NoSuchMessageException
getMessage(resolvable, locale)參數封裝為 MessageSourceResolvable,較少用