隨著經濟全球化腳步加快,跨國企業對統一資訊系統的需求日益增長。Java 語言配合網路通訊技術,讓企業只需部署一套 Web 架構的 OA、ERP、CRM 系統,即可透過網路服務全球各地分支機構。這不僅降低授權成本,更能縮短資訊傳遞延遲,提升營運效率。然而,面向多國語言的系統在設計之初必須解決國際化(Internationalization,簡稱 i18n)問題:介面文字、日期時間格式、貨幣符號、排序規則乃至 UI 風格都需隨地區設定動態切換。本文將聚焦於「多語言文字管理」的兩種主流實作路徑,並提供完整可執行的程式碼範例。
Java として物件導向語言,原生提供 java.util.ResourceBundle 及其子類 PropertyResourceBundle、ListResourceBundle,能根據 JVM 的 Locale 自動載入對應的資源檔。這是最輕量、零依賴的方案。若專案需求涉及動態新增語言、權限控管、或文字內容須由後台管理系統維護,則適合採用「自定義類 + 資料庫/屬性檔」的擴展架構。兩者核心邏輯一致:鍵值分離、按 Locale 載入、介面統一呼叫。
Resource封裝資源載入邏輯,自動依系統預設 Locale 組合檔名(如 ATTR_zh_TW.properties),並處理中文編碼轉換(ISO-8859-1 → Big5/UTF-8)。
package i18n.article;
import java.io.*;
import java.util.*;
public class Resource {
private static final String PREFIX = "ATTR";
private static final String SUFFIX = ".properties";
private static final String PATH = "c:/i18n/"; // 建議改為 classpath 相對路徑
public synchronized String getString(String key) {
String value = key; // 找不到時回傳 key 本身,便於除錯
try {
Locale locale = Locale.getDefault();
String fileName = PATH + PREFIX + "_" + locale.toString() + SUFFIX;
try (InputStream is = new FileInputStream(fileName)) {
PropertyResourceBundle bundle = new PropertyResourceBundle(is);
value = bundle.getString(key);
// 若為中文環境且檔案以 ISO-8859-1 存儲,需轉碼
if (locale.equals(Locale.TAIWAN) || locale.equals(Locale.CHINA)) {
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
最佳實踐提示:生產環境建議將屬性檔放入src/main/resources,改用ResourceBundle.getBundle("ATTR", locale)由類載入器統一管理,避免硬編碼絕對路徑。
| 鍵 | ATTR_en_US.properties | ATTR_zh_TW.properties |
|---|---|---|
| LoginName | Login Name | 帳號 |
| Password | Password | 密碼 |
| Login | Sign In | 登入 |
| LogOff | Sign Out | 登出 |
| MainPage | Home | 首頁 |
| ChineseVersion | English Version | 中文版 |
新增語言只需新增 ATTR_<語言代碼>_<國家代碼>.properties,無需修改 Java 程式碼。
使用 <jsp:useBean> 將 Resource 註冊為 application 範圍 Bean,EL 表達式或 Scriptlet 均可調用:
<%@ page contentType="text/html; charset=UTF-8" %>
<jsp:useBean id="res" scope="application" class="i18n.article.Resource"/>
<html>
<body>
<form action="main.jsp" method="post">
<label><%= res.getString("LoginName") %></label>
<input name="username" type="text"/><br/>
<label><%= res.getString("Password") %></label>
<input name="password" type="password"/><br/>
<input type="submit" value="<%= res.getString("Login") %>"/>
</form>
</body>
</html>
同理套用於選單、訊息提示、報表欄位等所有需動態切換文字的位置。
當文字內容須由非技術人員在後台維護、或需支援多租戶差異化語系時,可設計 I18nProvider 介面:
public interface I18nProvider {
String getText(String locale, String key);
void reload(); // 支援熱加載
}
實作類可從資料庫表 i18n_messages(locale, msg_key, msg_value) 載入,搭配快取(如 Caffeine/Guava Cache)與定時刷新機制,JSP 呼叫方式保持不變,僅在 web.xml 或 Spring 配置中替換 Bean 實作即可。此處不再贅述程式碼細節。
測試步驟:切換作業系統語言/區域設定 → 重啟瀏覽器 → 觀察介面文字自動切換。