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

Java 國際化實戰:基於 ResourceBundle 的多語言解決方案

     編輯:Java 相關知識

前言:為什麼企業級應用需要國際化?

隨著經濟全球化腳步加快,跨國企業對統一資訊系統的需求日益增長。Java 語言配合網路通訊技術,讓企業只需部署一套 Web 架構的 OA、ERP、CRM 系統,即可透過網路服務全球各地分支機構。這不僅降低授權成本,更能縮短資訊傳遞延遲,提升營運效率。然而,面向多國語言的系統在設計之初必須解決國際化(Internationalization,簡稱 i18n)問題:介面文字、日期時間格式、貨幣符號、排序規則乃至 UI 風格都需隨地區設定動態切換。本文將聚焦於「多語言文字管理」的兩種主流實作路徑,並提供完整可執行的程式碼範例。

核心思路:Java 內建機制 vs. 自定義擴展

Java として物件導向語言,原生提供 java.util.ResourceBundle 及其子類 PropertyResourceBundle、ListResourceBundle,能根據 JVM 的 Locale 自動載入對應的資源檔。這是最輕量、零依賴的方案。若專案需求涉及動態新增語言、權限控管、或文字內容須由後台管理系統維護,則適合採用「自定義類 + 資料庫/屬性檔」的擴展架構。兩者核心邏輯一致:鍵值分離、按 Locale 載入、介面統一呼叫。

方案一:標準 ResourceBundle 實作(零第三方依賴)

1. 核心工具類 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) 由類載入器統一管理,避免硬編碼絕對路徑。

2. 雙語屬性檔範例

鍵ATTR_en_US.propertiesATTR_zh_TW.properties
LoginNameLogin Name帳號
PasswordPassword密碼
LoginSign In登入
LogOffSign Out登出
MainPageHome首頁
ChineseVersionEnglish Version中文版

新增語言只需新增 ATTR_<語言代碼>_<國家代碼>.properties,無需修改 Java 程式碼。

3. JSP 頁面整合

使用 <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 實作即可。此處不再贅述程式碼細節。

部署與測試環境

  • 作業系統:Windows 2000 中/英文版
  • Servlet 容器:Resin 2.1.6
  • JDK:1.4+

測試步驟:切換作業系統語言/區域設定 → 重啟瀏覽器 → 觀察介面文字自動切換。

總結

  1. 標準 ResourceBundle:輕量、零配置、適合靜態文字、部署簡單。
  2. 自定義 Provider:靈活、支援動態管理、多租戶、權限隔離,適合大型平台化產品。
  3. 編碼統一使用 UTF-8,資料庫、連線池、JSP、屬性檔全鏈路保持一致,徹底杜亂碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved