java.util.Locale 代表特定的地理、政治與文化區域,是日期/時間格式化、數字格式化、訊息國際化(i18n)的基礎。本文系統整理 Locale 的建立方式、常用 API 以及配合 ResourceBundle 實現多語系資源載入。
Locale locale = Locale.getDefault(); // 依 JVM 啟動環境決定
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 等
// 語言代碼(ISO-639)
new Locale("zh"); // 僅語言
new Locale("zh", "CN"); // 語言 + 國家(ISO-3166)
new Locale("zh", "CN", ""); // 語言 + 國家 + 變體(罕用)
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 表示日語、日本、日本變體。
| 方法 | 說明 |
|---|---|
getLanguage() | 語言代碼(小寫),如 "zh" |
getCountry() | 國家代碼(大寫),如 "CN" |
getVariant() | 變體代碼 |
getDisplayName() | 預設 Locale 下的顯示名稱 |
getDisplayName(Locale locale) | 指定 Locale 下的顯示名稱 |
getDisplayLanguage() | 語言的顯示名稱 |
getDisplayCountry() | 國家的顯示名稱 |
toString() | 格式:language_country_variant |
static setDefault(Locale) | 設定 JVM 全域預設 Locale |
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
基礎名稱: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 將 Locale 存放於 Session,透過 this.setLocale(request, locale) 切換,JSP 使用 <bean:message key="key"/> 顯示。現代框架(Spring MVC、Struts 2)皆有更完善的 i18n 攔截器與標籤支援,原理相同。
Locale 是國際化的「身分證」,決定格式化規則與資源檔選擇。ResourceBundle 將可本地化字串外部化,支援多語系無縫切換。Accept-Language 標頭、使用者偏好設定、Session/Cookie 自動解析當前 Locale。