隨著經濟全球化深入發展,跨國企業對統一資訊系統的需求日益迫切。Java 語言配合網路通訊技術的成熟,使企業僅需部署一套基於 Web 的企業級應用(如 OA、ERP、CRM 系統),即可透過網路滿足全球分支機構的共同使用需求。這不僅大幅降低軟體授權成本,更縮短資訊傳遞延遲,提升企業營運效率。然而,面向多國語言、多種文化習慣的應用系統,在設計之初必須解決國際化(Internationalization,簡稱 i18n)問題:支援多國語言介面、不同格式的日期、時間、貨幣顯示,以及操作介面風格與個性化定製等需求。本文將深入探討 Java 多語言支援的核心解決方案。
Java 作為物件導向語言,原生提供了完善的國際化支援套件,使系統能根據使用者的區域(Locale)與語言設定,自動判斷並載入對應的語言資源。這項機制讓開發者無需硬式編碼多語言邏輯,即可實現真正的「寫一次,到處執行」的全球化部署。
針對多語言資源的管理與存取,業界主要採用兩種架構模式:
java.util.ResourceBundle 及其子類 PropertyResourceBundle,管理存放於 Java 類別或 .properties 屬性檔案中的多語言鍵值對。以下展示一個典型的後端實作類別,負責根據系統預設 Locale 動態載入對應的屬性檔:
package i18n.article;
import java.io.*;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
/**
* 多國語言後端實作類別
* 根據屬性檔案與區域/語言設定,取得對應語言資源
*/
public class Resource {
private static final String HEAD_FILE = "ATTR"; // 屬性檔名前綴
private static final String LAST_FILE = ".properties"; // 屬性檔案後綴
private static final String FILE_PATH = "c://"; // 屬性檔案存放目錄
public Resource() {}
/**
* 根據傳入的鍵值,取得對應區域/語言設定的值
* @param disStr 屬性檔案中的鍵
* @return 對應的本地化字串
*/
public synchronized String srcStr(String disStr) {
String ret = "";
try {
Locale locale = Locale.getDefault(); // 取得系統預設區域/語言
String baseName = new StringBuffer()
.append(HEAD_FILE).append("_").append(locale.toString())
.append(LAST_FILE).toString(); // 組合檔案名:ATTR_zh_CN.properties
String fileName = new StringBuffer(FILE_PATH).append(baseName).toString();
InputStream is = new FileInputStream(fileName);
PropertyResourceBundle pr = new PropertyResourceBundle(is);
ret = pr.getString(disStr);
// 中文編碼轉換處理(ISO-8859-1 → GB2312)
if (locale.equals(Locale.CHINA)) {
ret = new String(ret.getBytes("ISO-8859-1"), "GB2312");
}
is.close();
return ret;
} catch (Exception e) {
e.printStackTrace();
return disStr; // 異常時回傳鍵值本身,避免畫面顯示錯誤
}
}
}
採用「基底檔名 + 語言代碼 + 國家代碼」的命名慣例:
ATTR.properties:預設語言(通常為英文)ATTR_en_US.properties:美式英文ATTR_zh_CN.properties:簡體中文ATTR_zh_TW.properties:繁體中文(可擴充)ATTR_en_US.properties 範例:
LoginName=Login Name
PassWord=Password
Login=Login
LoginTime=Login Time
LogOff=Logout
ChineseVersion=English Version
MainPage=Home
SoftWare=Software
Hardware=Hardware
YourLocationMainPage=Current Location: Home
MyCalendar=My Calendar
MyMails=My Mails
R&D=R&D
Forum=Forum
DeveloperProcess=Development Process
TechnologyCommunion=Technical Communication
ATTR_zh_CN.properties 範例:
LoginName=用戶
Password=密碼
Login=登陸
LoginTime=登陸時間
LogOff=註銷登陸
ChineseVersion=中文版
MainPage=首頁
SoftWare=軟體
Hardware=硬體
YourLocationMainPage=當前位置:首頁
MyCalendar=我的日程
MyMails=我的郵件
R&D=研發區
Forum=討論區
DeveloperProcess=開發進程
TechnologyCommunion=技術交流
在 JSP 頁面中透過 <jsp:useBean> 實例化 Resource Bean,並以 EL 運算式或 Scriptlet 呼叫 srcStr() 取得本地化文字:
<%@ page contentType="text/html; charset=UTF-8" %>
<jsp:useBean id="resource" scope="application" class="i18n.article.Resource"/>
<form name="login" method="post" action="main.jsp">
<table>
<tr>
<td align="right"><%= resource.srcStr("LoginName") %></td>
<td><input type="text" name="loginName" /></td>
</tr>
<tr>
<td align="right"><%= resource.srcStr("Password") %></td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td><input type="submit" value="<%= resource.srcStr("Login") %>" /></td>
</tr>
</table>
</form>
自訂類別封裝資料庫或檔案存取邏輯,核心優勢在於:
JSP 前端呼叫方式保持不變,僅需替換 Bean 實作類別,實現「介面不變,實作可換」的設計原則。
本方案已在 Windows 2000(英文版/中文版)與 Resin 2.1.6 環境下完整驗證通過。生產環境部署建議:
Java 國際化的核心在於「資源外部化」與「Locale 敏感式載入」。ResourceBundle 機制適合中小型專案、靜態資源較少的場景;自訂存取層則適合大型企業級應用、需支援動態多語言管理的複雜系統。無論採用哪種方案,遵循以下原則至關重要:
透過完善的國際化架構,Java 應用系統才能真正支撐全球化業務拓展,為跨國企業創造無縫的多語言使用體驗。