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

Java 國際化核心類 Locale 與 ResourceBundle 完整指南

     編輯:Java 相關知識

java.util.Locale 代表特定的地理、政治與文化區域,是日期/時間格式化、數字格式化、訊息國際化(i18n)的基礎。本文系統整理 Locale 的建立方式、常用 API 以及配合 ResourceBundle 實現多語系資源載入。

一、Locale 的三種建立方式

1. 取得預設 Locale

Locale locale = Locale.getDefault(); // 依 JVM 啟動環境決定

2. 使用內建靜態常數

JDK 提供常用區域常數,例如:

Locale.SIMPLIFIED_CHINESE  // zh_CN 簡體中文(中國大陸)
Locale.TRADITIONAL_CHINESE // zh_TW 繁體中文(台灣)
Locale.US                  // en_US 英文(美國)
Locale.JAPAN               // ja_JP 日文(日本)
Locale.KOREA               // ko_KR 韓文(韓國)
// 還有 FRANCE, GERMANY, ITALY, UK, CANADA 等

3. 透過建構子自訂

// 語言代碼(ISO-639)
new Locale("zh");           // 僅語言
new Locale("zh", "CN");     // 語言 + 國家(ISO-3166)
new Locale("zh", "CN", ""); // 語言 + 國家 + 變體(罕用)

列出所有支援的 Locale

Locale[] all = Locale.getAvailableLocales();
for (Locale loc : all) {
    System.out.println(loc); // 輸出如:zh_CN, en_US, ja_JP_JP ...
}

輸出格式:language_COUNTRY_VARIANT,以底線分隔。例如 ja_JP_JP 表示日語、日本、日本變體。

二、Locale 常用方法速查

方法說明
getLanguage()語言代碼(小寫),如 "zh"
getCountry()國家代碼(大寫),如 "CN"
getVariant()變體代碼
getDisplayName()預設 Locale 下的顯示名稱
getDisplayName(Locale locale)指定 Locale 下的顯示名稱
getDisplayLanguage()語言的顯示名稱
getDisplayCountry()國家的顯示名稱
toString()格式:language_country_variant
static setDefault(Locale)設定 JVM 全域預設 Locale

三、實戰:配合 DateFormat 進行本地化日期顯示

Date date = new Date(113, 8, 19, 14, 22, 30); // 2013-09-19 14:22:30

Locale cn = Locale.SIMPLIFIED_CHINESE;
Locale us = new Locale("en", "US");

String cnStr = DateFormat.getDateInstance(DateFormat.MEDIUM, cn).format(date);
String usStr = DateFormat.getDateInstance(DateFormat.MEDIUM, us).format(date);

System.out.println("cn=" + cnStr); // 2013年9月19日
System.out.println("us=" + usStr); // Sep 19, 2013

四、ResourceBundle:多語系資源檔管理

資源檔命名規範

基礎名稱:MessageBundle
語系檔:MessageBundle_zh_CN.properties、MessageBundle_en_US.properties
放置於 classpath 下(如 src/res/)。

範例內容

# MessageBundle_zh_CN.properties
welcome=歡迎登入
login.btn=登入

# MessageBundle_en_US.properties
welcome=Welcome
login.btn=Login

程式碼載入

Locale currentLocale = new Locale("zh", "CN"); // 或從請求/Session 取得
ResourceBundle rb = ResourceBundle.getBundle("res.MessageBundle", currentLocale);

String msg = rb.getString("welcome"); // 取得對應語系的值

優點:零程式碼修改即可新增語系,只需新增對應 .properties 檔案。

五、Struts 1.x 時代的國際化切換(參考)

Struts 1 將 Locale 存放於 Session,透過 this.setLocale(request, locale) 切換,JSP 使用 <bean:message key="key"/> 顯示。現代框架(Spring MVC、Struts 2)皆有更完善的 i18n 攔截器與標籤支援,原理相同。

總結

  • Locale 是國際化的「身分證」,決定格式化規則與資源檔選擇。
  • 善用 ResourceBundle 將可本地化字串外部化,支援多語系無縫切換。
  • 實務上常配合 Accept-Language 標頭、使用者偏好設定、Session/Cookie 自動解析當前 Locale。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved