前言
由於歷史發展與地域文化差異,中文書寫主要分為正體中文(Traditional Chinese)與簡體中文(Simplified Chinese)兩大系統。對於華語使用者而言,兩者本質上是同一種語言的不同載體,通常稍加學習便能無礙閱讀。然而,若網頁能主動貼合不同地區訪客的閱讀習慣,提供對應的語系文字,無疑能顯著提升使用者體驗,為網站注入加分亮點。
本文將深入探討在網頁中實作「正簡(繁簡)轉換」的相關議題與解決方案。
中文轉換演算法
與跨語言的「文字翻譯」相比,正簡(繁簡)轉換的實作相對單純。因為正體字與簡體字屬於同種語言的字體變體,語序結構幾乎完全相同。正簡轉換的核心在於「字詞對應」,依據轉換的粒度(Granularity),主要分為以下兩種層次:
字對字轉換(Character-to-Character)
這是最基礎的轉換方式。實作時僅需準備一份「正簡字元對照表(Character Map)」,將文本中的字元逐一替換,不需使用複雜的演算法。
- 缺點:無法顧及各地用詞習慣。例如將簡體字逐字轉為正體字後,專有名詞仍保留大陸用語,對台灣讀者來說不夠道地。
- 風險:簡體字存在大量「一字多意」或「多字合一」的現象(如:干、乾、幹),單純逐字轉換極易造成語意錯誤(如:將「乾燥」誤轉為「干燥」)。
詞對詞轉換(Term-to-Term)
此方式需搭配「正簡詞彙對照表(Term Translation Table)」。若直接進行盲目替換,容易發生斷詞錯誤。
- 正確實作:應先對句子進行「中文斷詞(Word Segmentation)」解析,切分出正確的詞彙串列(List),再逐一進行詞彙轉換。
- 優缺點:能產出符合在地閱讀習慣(在地化)的文本,但演算法複雜度較高,且受限於斷詞精準度,仍難以達到 100% 完美的轉換。
折衷方案:有限度的詞彙轉換
若想兼顧「道地用詞」與「輕量化實作」,可採用折衷的複合策略:僅針對文本中的「技術專有名詞」或「高頻差異詞」進行詞對詞轉換(因為這類名詞的斷詞錯誤率較低),其餘日常文字則一律採用字對字轉換。
伺服器端預先轉換(靜態多語系網頁)
此方案是在伺服器端或建置期(Build time),就已經產生好兩種文字語系的獨立頁面,並透過 URL 路徑進行區隔。例如:
https://example.com/section/post/:原始頁面,以正體中文撰寫。https://example.com/zh-cn/section/post/:對應的簡體中文轉換頁面。
實作要點與 SEO 宣告
為了確保使用者體驗的一致性,兩個語系的網頁必須套用完全相同的佈景主題(Theme)與樣式,僅在文本內容上做語系切換。
此外,必須在網頁的 <head> 區塊內正確埋入 hreflang 標籤,告訴搜尋引擎(如 Google)這兩個頁面的對應關係,以利 SEO 權重分配並避免重複內容(Duplicate Content)懲罰:
<link rel="alternate" hreflang="zh-hans" href="https://example.com/zh-cn/section/post/" />
<link rel="alternate" hreflang="zh-hant" href="https://example.com/section/post/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/section/post/" />
語系切換與自動跳轉的 UX 考量
- 提供手動切換按鈕:建議在網頁顯眼處(如 Header 或 Footer)放置語系切換選單,讓使用者能自由且直覺地切換想閱讀的語系。
- 不建議強制自動跳轉:強烈不建議利用用戶端 JavaScript 或 Edge Function 根據瀏覽器語系進行強制跳轉。雖然自動跳轉表面上看似「貼心」,但若使用者(例如身處海外的華人)因環境限制使用英文或簡體瀏覽器,卻仍想閱讀正體中文原著時,強制跳轉反而會剝奪其選擇權,導致糟糕的使用者體驗。
網頁前端即時轉換
此方案是將轉換邏輯與字元表完全下載到使用者的瀏覽器,並透過網頁前端(Client-side)的 JavaScript 進行即時轉換。
前端轉換的優缺點
- 優點:能大幅減輕伺服器端的運算負擔與儲存空間,不需要維護多套靜態 HTML 檔案。
- 缺點(視覺閃爍問題):在網頁載入或 DOM 解析較慢時,使用者可能會在畫面上目睹文字從「正體突然變成簡體」的閃爍現象(Flash of Untranslated Text)。若想徹底避免這種不良體驗,則需要改在後端(Server-side)或邊緣運算層(Edge)處理,其架構將與本節截然不同。
準備字元對照表
實作時不需自己通靈打造字元表。我們可以利用現有的開源資源,例如 chinese-conv 專案中便收錄了新同文堂經典的字元對照表(如 Tongwen-ts)。
實作小技巧:在引入該指令碼時,我們核心只需要其定義好的字元對照表物件(Object),專案最下方的執行函式並不需要,引入前可自行將該部分移除。
前端實作原始碼拆解
我們將完整的即時轉換範例程式碼託管在 GitHub Gist,讀者可以前往查閱完整架構。接下來,本文將逐步拆解這套程式碼。
前提假設:以下範例均假定正簡字元對照表(如 Tongwen 相關變數)已成功載入至全域環境。
為了確保轉換時能夠完整抓取到網頁上的所有文字,此程式必須在整個 DOM 架構與頁面元素都載入完成後才觸發。因此,我們會將主要邏輯包裹在以下事件監聽器(Event Listener)的監聽回呼函式(Callback Function)中:
document.addEventListener("DOMContentLoaded", function () {
// Implement your code here.
});
撰寫判斷簡體中文語系的函式如下:
var isSimplifiedChinese = function (lang) {
var l = lang.toLowerCase();
return l === "zh-cn" || l === "zh_zn" ||
l === "zh-sg" || l === "zh_sg" ||
l === "zh-hans" || l === "zh_hans" ||
l === "zh";
};
lang 是一個表示語系的字串,我們將其轉小寫,減少因大小寫相異而造成的誤判。理論上簡體中文最常用的語系是 zh-CN,但不一定每個瀏覽器都會使用這個語系,所以我們多用幾個相關的語系來判定,減少誤判。
實際轉換字串的函式如下:
var zhmap = TongWen_ts;
var convertZh = function (selector) {
let es = document.querySelectorAll(selector);
for (let i = 0; i < es.length; i++) {
es[i].innerHTML = es[i].innerHTML.replace(/[^\x00-\xFF]/g, function (s) {
return s in zhmap ? zhmap[s] : s;
});
}
};
selector 是代表 CSS selector 的字串,我們會根據 selector 選出所有的 HTML 元素 (elements)。接著,走訪這些元素;對於每個元素,我們以 innerHTML 取出內部的 HTML 字串,將文字的部分代換掉即可。要注意不能用 innerText,因為使用 innerText 代換後該元素內部的子元素會消失。
實際執行程式的過程如下:
var lang = navigator.language || navigator.userLanguage;
if (isSimplifiedChinese(lang)) {
let elements = ["h1", "h2", "p", "li", "a"];
for (let i = 0; i < elements.length; i++) {
convertZh(elements[i]);
}
}
判斷使用者瀏覽器語系
我們會透過 JavaScript 的 navigator 物件來偵測網站訪客的偏好語系(Locale)。使用者可以透過調整作業系統或瀏覽器的語言設定,來改變這個偵測值:
navigator.language:現代瀏覽器的標準 API。navigator.userLanguage:早期 Internet Explorer(IE)限定的舊版 API(可作為相容性備用方案)。
當偵測到使用者的偏好語系為簡體中文(例如以 zh-CN 或 zh-Hans 開頭)時,程式便會啟動轉換機制。
選擇欲轉換的網頁元素
至於網頁中哪些範圍需要進行文字轉換,則取決於各個網站的實際版面需求,不需硬性規定。常見的做法包含:
- 僅轉換主要內容區塊(如
<article>或main元素)。 - 全域轉換(包含導覽列、側邊欄、頁尾等所有可見文字)。
進階優化方向
透過本文介紹的輕量化前端指令碼,我們已經能為網頁實現基礎的正簡轉換功能。然而,在實際的生產環境(Production environment)中,這套機制仍有許多可持續精進與擴充的維度:
- 增設語系切換選單:打破僅能由系統自動偵測的限制,賦予使用者主動選擇的權利。
- 持久化儲存偏好設定:利用瀏覽器儲存機制記住使用者的選擇,避免每次重新載入網頁都需要手動點選。
- 升級為詞對詞轉換(在地化):引入詞彙表與簡易斷詞邏輯,提供更道地、更符合閱讀習慣的文本。
- 納入港澳(粵語環境)用語轉換:針對不同正體中文市場進行精細的語意微調。
增設語系切換選單與事件監聽
目前程式的轉換完全屬於被動觸發。若能在網頁 UI 上加入下拉式選單或切換按鈕,並綁定對應的點擊事件監聽器(Event Listener),便能讓使用者一鍵自主切換。如此一來,訪客無需大費周章進入瀏覽器的設定深處調整語系,大幅提升網頁的友善度(Accessibility)。
利用 Cookie 或 Web Storage 記住使用者偏好
為了不讓使用者每次重新造訪都重複點選語系,必須將其「偏好語系」記錄下來。由於語系屬於不涉及資安的非機密資料,若網站本身沒有完整的會員系統,不建議為了記住語系而大費周章去開發後端會員子系統,以下是更輕量的前端解決方案:
- Cookie:前端 JavaScript 可直接讀取與寫入,且每次發送 HTTP 請求時會自動帶上。
- LocalStorage:現代網頁更推薦的持久化儲存方式,容量更大且讀寫 API 更為直覺。
前端實作「有限度」的詞對詞轉換
純粹的字對字轉換容易流於機械化。若想升級為詞對詞轉換,卻又擔心載入完整的巨型詞彙表(Term Sheet)會導致網頁加載速度過慢、拖垮使用者體驗(UX),建議採用「有限度轉換」的折衷策略:僅在前端載入涵蓋高頻技術名詞、生活常用詞的輕量化詞彙對照表。
港澳與台灣用詞的差異化處理
雖然台灣與港澳地區均使用正體中文,但因文化與粵語影響,在許多日常詞彙上存在顯著差異(例如:台譯「網路、行動電話」,港譯「網絡、手提電話」)。因此,更好的做法是將語系細分為 zh-TW(台灣正體)與 zh-HK(香港正體),並各自維護一份專門的詞對詞轉換規則。