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

Java 國際化(i18n)實戰:基於 Locale 與 ResourceBundle 的多語言資源管理

     編輯:Java 綜合教學

核心機制:Locale 定位 + ResourceBundle 載入對應屬性文件

Java 內建國際化支持,通過「語言代碼_國家代碼」命名規約(如 `zh_CN`、`en_US`),自動匹配當前環境或指定語言的資源包。

資源文件命名與內容

# errorMap_en_US.properties
RetrievingRequestXMLError=Error retrieving requestXML from HTTP POST
RequestXMLParsingError=Error parsing request. Invalid XML format.
InvalidServiceTypeError=Invalid service type specified.
POSError=Invalid POS node.
IdentifyAirportCodeError=Failure to identify airport code:
GetCountryCodeError=Failure to get country code of airport code:
TagError1=Service type:
TagError2=and root tag:
TagError3=can not matching
Generic=Generic error!
RootElementNullError=Root element is null
RootTagNullError=Root tag is null
GetODError=Can not get OD information
IATACodeError=LocationCode can not be empty!
# errorMap_zh_CN.properties
RetrievingRequestXMLError=\u83B7\u53D6xml\u8BF7\u6C42\u7684\u5931\u8D25\uFF01
RequestXMLParsingError=\u8BF7\u6C42XML\u89E3\u6790\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u8BF7\u6C42XML\u7684\u683C\u5F0F.
InvalidServiceTypeError=\u65E0\u6548\u7684\u64CD\u4F5C\u7C7B\u578B\uFF1A
POSError=\u8BF7\u68C0\u67E5POS\u8282\u70B9\u662F\u5426\u6B63\u786E\uFF01
IdentifyAirportCodeError=\u672A\u80FD\u8BC6\u522B\u7684\u4E09\u5B57\u7801\uFF1A
GetCountryCodeError=\u65E0\u6CD5\u5F97\u5230\u4E09\u5B57\u7801\u7684\u56FD\u5BB6\u4EE3\u7801\uFF1A
TagError1=\u64CD\u4F5C\u7C7B\u578B\uFF1A
TagError2=\u548C\u6839\u8282\u70B9\uFF1A
TagError3=\u4E0D\u5339\u914D
Generic=\u5904\u7406\u8BF7\u6C42\u7684\u5F02\u5E38\uFF01
RootElementNullError=\u6839\u5143\u7D20\u4E0D\u80FD\u4E3A\u7A7A
RootTagNullError=\u6839\u6807\u7B7E\u4E0D\u80FD\u4E3A\u7A7A
GetODError=\u4E0D\u80FD\u83B7\u53D6OD\u4FE1\u606F
IATACodeError=LocationCode\u4E0D\u80FD\u4E3A\u7A7A\uFF01

注意:中文屬性值需使用 `native2ascii` 轉義或 IDE 自動處理 Unicode 轉義序列(`\uXXXX`)。

核心工具類實現

import java.util.Locale;
import java.util.ResourceBundle;

public class ErrorMap {
    public static String getErrorText(String errorTag, String language) {
        Locale currentLocale;
        if ("en".equals(language)) {
            currentLocale = new Locale("en", "US");
        } else if ("zh".equals(language)) {
            currentLocale = new Locale("zh", "CN");
        } else {
            currentLocale = Locale.getDefault(); // 系統默認
        }
        // 基礎名 errorMap,自動拼接 _語言_國家.properties
        ResourceBundle rb = ResourceBundle.getBundle("i18n.errorMap", currentLocale);
        return rb.getString(errorTag);
    }

    public static void main(String[] args) {
        System.out.println(getErrorText("IdentifyAirportCodeError", "zh")); // 輸出中文
        System.out.println(getErrorText("IdentifyAirportCodeError", "en")); // 輸出英文
    }
}

關鍵點總結

  1. 基礎名固定:`errorMap`,放在 `i18n` 包下,完整路徑 `i18n.errorMap`。
  2. Locale 匹配規則:先找 `_語言_國家`,再找 `_語言`,最後退回默認(無後綴)文件。
  3. 編碼統一:屬性文件建議存為 UTF-8,Java 9+ 支持 UTF-8 直接讀取,舊版需轉義。
  4. 參數化佔位符:配合 `MessageFormat` 實現動態參數(如 `Error {0} at {1}`)。
  5. Spring 整合:`ReloadableResourceBundleMessageSource` 支持熱加載、緩存控制、編碼設置。

生產環境最佳實踐

  • 按模塊/業務域拆分資源文件(如 `validation_zh_CN.properties`、`email_zh_CN.properties`)。
  • 建立翻譯管理流程,避免硬編碼字串散落代碼中。
  • 前端同樣需國際化(i18next、vue-i18n),後端僅提供 API 錯誤碼,前端自行匹配多語言文案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved