工具
幾何碎片從空白紙張穿過三道稜鏡關卡後重新排列,象徵網頁翻譯的擷取、驗證與回寫。

工程思考 · 研究筆記

一段文字,如何成為可靠的網頁譯文?

從 DOM 擷取、共用排程,到輸出驗證與安全回寫,透過 18 張圖解理解 Browser Script Manager 翻譯系統的架構、資料流與設計取捨。

這套翻譯的工程核心,是把持續變動的網頁,整理成可排程、可重用、能核對身分後回寫的工作。翻譯服務負責產生文字;擴充套件負責讓結果在正確的時間、正確的位置出現。

01

沿著一段原文,看資料如何流過整個系統

Browser Script Manager 將翻譯與其他功能組裝成同一個 Manifest V3 擴充套件。下面追蹤預設網頁段落的翻譯流程:每條箭頭都標示傳遞內容;方塊所在泳道表示執行邊界。選取文字與翻譯中心的入口差異接在下一節。

圖 01A端到端資料流:原文進來,譯文如何回到正確位置HTML 節點+明確連線
主線01 → 02 → 03;確認沒有可用譯文,才走 04 → 05 → 06。
本機旁路規則/記憶的結果或阻擋狀態,直接接到 07。
回程分岔06 → 07 → 08 → 09 處理呈現;06 → 10 處理保存。
網頁與頁面端腳本DOM 與每個頁面的生命週期
擴充套件背景/本機資料跨頁工作、政策、資源與儲存
外部服務翻譯 API 與可選同步
01擷取原文,宣告片段
抽取文字 → 註冊段落分句並保留原文範圍送出文字、版本與位置資料DOM 節點留在網頁端
02接收並建立需求身分
背景服務接收並交給排程系統依瀏覽器提供的發送者核對來源建立頁面綁定、正規化原文追蹤片段的版本與生命週期
C凍結文件背景候選
讀取文件前段的基準原文凍結首批候選;另送上下文訊息背景套用規則後才可採用
03規則、共享工作與本機查詢
規則/釘選譯文 → 相同工作共用已存翻譯記憶 → 舊版快取命中/未命中/錯誤分支見 01B
V更新閱讀位置
觀察可見範圍與捲動方向回報可見性、位置與前後方影響排隊工作的優先級這條更新不重新傳送原文
04排程、合批、預扣配額
優先層級 → 服務資源 → 相容批次派送核准:預留並行槽與配額先提交配額的 IndexedDB 交易成功後才啟動翻譯服務轉接
05呼叫翻譯服務
語言模型:指令+原文+上下文Microsoft:原文清單+目標語言由服務轉接層組裝實際請求原始回覆先交回轉接層
G保留目前的原文身分
基準原文與閱讀世代本機請求嘗試、節點連接狀態回寫 DOM 時再次核對
06終止檢查與結果驗證
核對請求與世代,再釋放並行槽再檢查提交權/結束原因驗證回覆格式、編號與保留標記錯誤/需修復項目交重試政策
07送出狀態與結果通知
版本、可呈現譯文、保存狀態原文/本機結果/受阻/完成片段完成不等於 DOM 已更新
08核對版本,組裝整段
頁面端拒絕過期通知依呈現節奏等待整段完成組合譯文與原文;失敗另回報
09排程並提交 DOM
建立內容片段與呈現計畫保護選取範圍+每幀工作量限制提交前核對原文與本機請求更新雙語容器或純譯文
10本機翻譯記憶與保存狀態
本機結果:保存佇列 → 交易同步回填:直接寫入翻譯記憶回報本機保存成功/失敗同步只讀取已保存的翻譯記憶
11雲端同步儲存
選擇加入翻譯記憶同步接收/提供加密資料物件本機解密、合併後寫入記憶同步不直接更新網頁 DOM
原文片段
版本資料
頁面綁定+原文
上下文
候選
凍結與連線確認後,釋出首批片段
本機結果
或原文/
阻擋狀態
本機未命中,且允許外送
閱讀位置
更新
API 請求
原始回覆/用量
轉接後確認終止
有效片段 → 譯文可用
失敗狀態另行回報
失敗/需修復項目
符合政策才重排
版本狀態
譯文內容
整段文字結果
目前來源
再次核對
有效且仍適用的
可呈現譯文
一般模式進保存佇列
本機保存作業
狀態更新
加密上傳
解密合併
寫入記憶
以文字讀取每條資料流
  1. 01 擷取原文,宣告片段 → 02 接收並建立需求身分:原文片段;版本資料
  2. 02 接收並建立需求身分 → 03 規則、共享工作與本機查詢:頁面綁定+原文
  3. C 凍結文件背景候選 → 03 規則、共享工作與本機查詢:上下文;候選
  4. C 凍結文件背景候選 → 01 擷取原文,宣告片段:凍結與連線確認後,釋出首批片段
  5. 03 規則、共享工作與本機查詢 → 07 送出狀態與結果通知:本機結果;或原文/;阻擋狀態
  6. 03 規則、共享工作與本機查詢 → 04 排程、合批、預扣配額:本機未命中,且允許外送
  7. V 更新閱讀位置 → 04 排程、合批、預扣配額:閱讀位置;更新
  8. 04 排程、合批、預扣配額 → 05 呼叫翻譯服務:API 請求
  9. 05 呼叫翻譯服務 → 06 終止檢查與結果驗證:原始回覆/用量;轉接後確認終止
  10. 06 終止檢查與結果驗證 → 07 送出狀態與結果通知:有效片段 → 譯文可用;失敗狀態另行回報
  11. 06 終止檢查與結果驗證 → 04 排程、合批、預扣配額:失敗/需修復項目;符合政策才重排
  12. 07 送出狀態與結果通知 → 08 核對版本,組裝整段:版本狀態;譯文內容
  13. 08 核對版本,組裝整段 → 09 排程並提交 DOM:整段文字結果
  14. G 保留目前的原文身分 → 09 排程並提交 DOM:目前來源;再次核對
  15. 06 終止檢查與結果驗證 → 10 本機翻譯記憶與保存狀態:有效且仍適用的;可呈現譯文;一般模式進保存佇列
  16. 10 本機翻譯記憶與保存狀態 → 07 送出狀態與結果通知:本機保存作業;狀態更新
  17. 10 本機翻譯記憶與保存狀態 → 11 雲端同步儲存:加密上傳
  18. 11 雲端同步儲存 → 10 本機翻譯記憶與保存狀態:解密合併;寫入記憶
實線:請求/結果主路徑本機分支/狀態回報虛線:輔助更新/可選同步
讀圖重點:保存與 DOM 提交從有效結果分岔,沒有固定的完成先後。文件背景在首批原文需求送出前凍結;閱讀位置更新只傳可見性與位置。圖面呈現資料依賴,沒有時間比例;交叉線未加接點時不表示合併。
兩個關鍵出口:07 發出帶版本的狀態與結果通知;片段完成後,仍要經過整段組裝與 DOM 提交。10 處理本機保存,失敗重試只回保存佇列。11 的同步回程寫入本機翻譯記憶,後續再由正常查詢使用。
展開圖 01B|本機判斷、查詢失敗與外送閘門,逐分支追蹤
圖 01B背景決策流:哪些需求會真的呼叫翻譯服務?HTML 分支圖
向下讀主線D1 → D2 → D3 → D4 → D5 → D6 → T。
向右讀出口P 回總覽 07;E 是讀取失敗;W 是等待/阻擋。
D1先套用規則與釘選譯文
停用頁面/保留原文/固定譯文/釘選譯文需要翻譯者建立語意條件與保留標記禁止外送仍允許使用已存譯文
P回傳本機狀態/結果
停用頁面 → 保持原文保留原文 → 本機決定,不附譯文固定或釘選譯文 → 本機決定並附譯文接總覽 07:狀態與結果通知
D2相同語意鍵的共享工作是否存在?
存在:加入結果訂閱者不存在:先登記待查詢的共享工作再開始非同步查詢翻譯記憶
P訂閱既有共享工作
可能正在查詢、排隊、翻譯或已完成沿用它的狀態/後續結果接總覽 07;不另建相同工作
D3查已保存的翻譯記憶
以完整語意鍵精確查找命中、未命中、讀取失敗分開處理讀取失敗預設不外送
P已有持久譯文
可呈現譯文+已保存狀態接總覽 07;不呼叫翻譯服務
E已存譯文讀取失敗
暫停外送:無法讀取已存譯文重試先回本機讀取明確選擇略過失敗,才繼續後續判斷
D4查舊版翻譯快取
有對應舊版鍵才查精確記錄未命中/讀取失敗/無對應鍵 → 下一關
P沿用舊譯文,升級保存
可呈現譯文+保存中狀態另交保存佇列,升級為新版翻譯記憶接總覽 07 + 總覽 10
D5確認未命中,才決定是否外送
檢查禁止外送規則、文件派送政策再檢查合格服務資源是否存在允許者才進入可派送佇列
P不派送的三種出口
禁止外送 → 阻擋並回報原因僅用本機譯文 → 保留原文,暫存需求無可用服務資源 → 阻擋並提示設定保留原文,回報對應狀態
D6排序、合批,再核准請求嘗試
優先層級/服務資源/相容批次並行槽+速率額度+時間窗配額預留成功後,先持久化配額預扣必須等寫盤成功,才能送 API
W等待/阻擋,不送 API
配額或並行槽不可用:等待時間/事件需求本身超限:暫停外送預扣寫盤失敗:停止新的派送條件恢復後重新判斷
T啟動翻譯服務轉接
接總覽 05:實際網路請求回覆驗證/修復與呈現接回總覽 06–10
本機處理
需要翻譯
已存在
新共享工作:先登記再查詢
命中
讀取失敗
重試讀取
確認未命中
命中
未命中/讀取失敗/無舊版鍵
不派送
允許外送,進入派送佇列
尚未就緒
或寫盤失敗
條件恢復
重新判斷
已提交保守扣帳
以文字讀取每條資料流
  1. D1 先套用規則與釘選譯文 → P 回傳本機狀態/結果:本機處理
  2. D1 先套用規則與釘選譯文 → D2 相同語意鍵的共享工作是否存在?:需要翻譯
  3. D2 相同語意鍵的共享工作是否存在? → P 訂閱既有共享工作:已存在
  4. D2 相同語意鍵的共享工作是否存在? → D3 查已保存的翻譯記憶:新共享工作:先登記再查詢
  5. D3 查已保存的翻譯記憶 → P 已有持久譯文:命中
  6. D3 查已保存的翻譯記憶 → E 已存譯文讀取失敗:讀取失敗
  7. E 已存譯文讀取失敗 → D3 查已保存的翻譯記憶:重試讀取
  8. D3 查已保存的翻譯記憶 → D4 查舊版翻譯快取:確認未命中
  9. D4 查舊版翻譯快取 → P 沿用舊譯文,升級保存:命中
  10. D4 查舊版翻譯快取 → D5 確認未命中,才決定是否外送:未命中/讀取失敗/無舊版鍵
  11. D5 確認未命中,才決定是否外送 → P 不派送的三種出口:不派送
  12. D5 確認未命中,才決定是否外送 → D6 排序、合批,再核准請求嘗試:允許外送,進入派送佇列
  13. D6 排序、合批,再核准請求嘗試 → W 等待/阻擋,不送 API:尚未就緒;或寫盤失敗
  14. W 等待/阻擋,不送 API → D6 排序、合批,再核准請求嘗試:條件恢復;重新判斷
  15. D6 排序、合批,再核准請求嘗試 → T 啟動翻譯服務轉接:已提交保守扣帳
讀圖重點:首次宣告時,已有相同工作就共用;新工作先登記再查詢。本機記憶的讀取失敗,不當成查無記錄。無痕或明確重新翻譯可略過記憶查詢,仍須經派送政策與資源核准;這張主線畫一般查詢路徑。
為什麼要考慮 service worker 重新啟動?

Chrome 的 extension service worker 是事件驅動的,可能在閒置時結束;一般 JavaScript 全域變數不會自動保存。本專案因此把翻譯記憶與配額寫進 IndexedDB,並讓頁面在重連後重新宣告活躍需求。這是生命週期設計,不能解讀成 worker 永遠不會中斷。

平台依據:Chrome 官方:service worker lifecycle(查閱 2026-10-25)。

02

入口不同,共用的部分也不同

各翻譯入口共用背景資源與派送核准機制。頁面批次、選取串流與翻譯中心,仍保留各自的輸出方式。

入口 送進系統的方式 目前如何顯示
網頁段落 段落 → 句子單位 → 共用翻譯流程 等待最終結果,確認仍適用後才更新畫面;不逐段顯示暫時預覽
文件標題 獨立文字單位,歸入鄰近可見區的優先級 只管理最上層文件;用請求版本避免舊結果覆蓋新標題
字幕 獨立文字單位,歸入可見內容的優先級 片段完成後交回字幕呈現流程
選取文字 · LLM 背景串流文字;共用資源與配額核准 累積的純文字可持續更新畫面;與頁面的批次回覆解析方式不同
翻譯中心 查詢翻譯記憶,再按需要發出翻譯請求 收到整筆回應後更新卡片;用請求身分隔離取消與舊回覆
各入口有自己的重試策略:頁面翻譯的自動服務切換預設關閉;選取文字另有「LLM 回空字串 → 嘗試已啟用標準翻譯」的備援,以及最多 2 次額外重試(等待 800/1600ms)。
03

先分清楚:位置、工作、請求

頁面綁定記錄畫面上的需求;共享工作代表一份可重用的翻譯任務;請求嘗試則是向特定翻譯資源執行的一次操作。

圖 02三種身分,三段生命週期SVG 架構示意
頁面綁定、共享工作、請求嘗試的三層生命週期 兩個頁面綁定共享工作①;相容工作可裝入同一次請求嘗試。圖為概念例,合批仍須通過文件等限制。 頁面需求 語意相同的工作 一次網路嘗試 頁面綁定 A1 頁面 A 的一段原文 位置、原文版本、訂閱 頁面綁定 B1 頁面 B 的同一語意需求 另有自己的 DOM/版本 共享工作 ① 同一語意鍵 共用結果與重試生命週期 共享工作 ② 另一個相容工作 請求嘗試 α 服務資源+配額預留 包含工作:①、② 背景世代/終止狀態 去重:語意契約完全相同才共用 合批:文件、上下文、優先層級 與服務資源必須相容 同一段文字的不同頁面綁定,不等於兩次 API 呼叫。取消其中一個訂閱,也不必撤銷其他訂閱。

寬圖可橫向捲動;文字可選取。

設計意義:重複需求能共用結果,重試不必重建 DOM 身分;某一頁離開,也不必取消其他頁仍需要的同一份工作。圖中合批只是概念例,仍須通過相容性條件。
同時到達的兩個相同需求,如何避免重複送出?

背景排程器在第一次非同步記憶查詢之前,就把「正在查詢」的工作放進索引。後到的頁面需求訂閱同一份工作;即使前一個查詢尚未返回,也不另外建立相同任務。這讓非同步查詢期間的重複需求仍能合併。

04

擷取的是可辨識的原文,不是一整包 HTML

圖 03一份 DOM,兩種讀取責任SVG · 合成範例
DOM 的兩條讀取責任與分句位置 DOM 分成來源身分核對與翻譯請求文字兩支,各自讀取所需的原文。分句 Hello 和 Goodbye 的 UTF-16 範圍是 [0,6) 與 [7,15)。 原始 DOM · 合成例 漢(かん)字:含讀音標註 + 工具加入的譯文容器 DOM 身分留在網頁端 來源核對/文件上下文 讀取基準原文:漢字(本例) 排除讀音與工具輸出,採用 OCR/閱讀標註原文 翻譯請求文字 抽取可翻文字 → 分句 背景正規化:CRLF → LF、NFC、去頭尾空白 另一個分句範例:Hello. Goodbye. 來源區塊 Hello. Goodbye. 以原始 UTF-16 位置記錄 片段 1 Hello. 範圍:[0, 6) 片段 2 Goodbye. 範圍:[7, 15) 分句 兩條 DOM 讀取路徑責任不同;分句範圍仍指向原始來源,正規化不會重寫來源位置。

寬圖可橫向捲動。

一條路徑擷取待翻文字並分句;另一條路徑讀取一致的原文表示,用來核對身分與建立文件背景。兩條路徑都避免把系統生成的譯文當成新原文。

先辨識段落

依 DOM、顯示類型與排除規則走訪,跳過自己的輸出、隱藏內容與發音標記。

再拆成句子

使用瀏覽器文字分段能力;超過 2000 UTF-16 單位時,先找子句標點,再找字素邊界。

最後保留身分

每個片段保留原始範圍、分段順序與原文版本;原文變更後重新建立文字單位。

UTF-16、字形與 token 為什麼不能混在一起?

UTF-16 編碼單位是 JavaScript 字串長度使用的單位;emoji 可能占多個單位,多個 Unicode 碼點也可能組成一個使用者看到的字形。字素(grapheme)描述這類可視文字單位的分群;token 則由模型的分詞器決定。

預設 2000 是每個文字單位的字串長度限制。若單一字素已超過上限,就回報輸入過大;瀏覽器不支援文字分段時,備援只逐碼點處理,不能保證完整複合字形分群。

短片段另有本機啟發式:移除 URL 等雜訊後,單一拉丁字母詞可能被略過;含中日韓文字的短片段可保留。這降低零碎請求,也可能漏掉有意義的單字。選取翻譯不套用同一個頁面短文門檻。

延伸閱讀:瀏覽器的文字分段能力。

05

先服務正在讀的地方,再預載前方

頁面知道「原文在哪裡」;背景決定「現在值得翻哪一段」。預載區隨閱讀方向與速度改變,排程優先級則跨頁面統一比較。

圖 04改變閱讀狀態,看看預載區怎麼變可互動公式示意 · 非效能測量
上方 · 閱讀後方400 px
目前畫面|可見文字優先可見畫面高度 H = 800 px
下方 · 閱讀前方2400 px

區域示意,長度不依畫面像素等比例繪製

翻譯前方範圍2400 px
段落註冊前方範圍2800 px
閱讀後方範圍400 px

閱讀中:前方 3 個畫面高度;段落註冊比翻譯再多 0.5 個畫面高度。

JavaScript 未啟用:以上保留 閱讀中、向下、高度 800px、邊距 1000px 的靜態範例。

設計意義:先把即將讀到的段落宣告給背景;慢讀與快滑使用不同範圍。預載邊距設為 0 時,前後預載都關閉。
展開預載公式與捲動演算法
前方範圍 = min(10000, max(設定邊距, round((倍數 + 提前量) × H))) 後方範圍 = min(設定邊距, round(0.5 × H)) 倍數:尚未捲動 1.5/閱讀中 3/快速掃讀 5 提前量:翻譯區 0/段落註冊區 0.5

當設定邊距≤0,兩邊都回 0。向上閱讀時交換上下方範圍。捲動速度用 EMA 平滑:α=1−exp(−dt/200),新速度=舊速度+(瞬時速度−舊速度)×α。dt 的單位為 ms,瞬時速度的單位為 px/s;間隔達 400ms 時直接採新樣本。

轉向要累積 max(120px, 0.35H) 的反向移動;前向速度達 2.5 viewport/s 可進入快速掃讀狀態,維持 2 秒。這些門檻減少少量回拉造成的 觀察範圍重建;它們是工程啟發式,不是閱讀意圖辨識模型。

圖 05排程優先級:從畫面需求到跨頁公平性HTML 排序圖
T0
焦點頁 · 可見優先處理眼前的內容
T1
其他頁 · 可見同一層各頁輪流派送
T2
焦點頁 · 鄰近可見區閱讀方向前方優先,再依文件順序
T3
其他可派送需求各頁輪流派送;明確在範圍外的內容不派送

排程示例:1 個並行槽、單筆請求;P1 為焦點頁,三頁各有 3 段可見文字

P1.1P1.2P1.3P2.1P3.1P2.2P3.2P2.3P3.3
設計意義:焦點切換會重排尚未送出的工作,正常執行中的請求不被搶占。輪流派送改善同層公平性;低優先層仍可能等待。
先讀位置,再更新畫面:頁面端先批次讀取段落位置,再插入佔位元素;後續翻譯流程重用可見性觀察器提供的位置資料,減少排版讀取與 DOM 寫入交錯。
06

規則先決定什麼能翻,再保護關鍵詞

圖 06詞彙表:先找命中,再決定替換HTML 演算法圖
1 · 找到全部候選Aho–Corasick 字典樹
一次尋找多個詞組
包含互相重疊的命中
2 · 排序最左 → 最長 → 優先級
再比規則精確度、識別編號
得到穩定的選取順序
3 · 選不重疊詞組游標單向前進
轉成 ⟦n⟧ 佔位符
已替換內容不再掃描

詞彙保護示例;模型回覆為示意文字

The Rust Belt uses Rust.
同起點先取較長詞組;短詞即使優先級較高,也不會搶走 Rust Belt

送給模型

The ⟦1⟧ uses ⟦2⟧.

回覆並還原

⟦1⟧使用⟦2⟧。
→ 鏽帶使用Rust 語言。
設計意義:把受控詞彙變成可驗證的保留標記。每個佔位符 必須剛好出現一次;缺少、重複或模型捏造的新標記,都不能直接上屏。
規則優先順序與 Aho–Corasick 的精確分工

先處理整頁停用,再看整句保留原文/固定譯文、使用者釘選譯文、禁止外送,最後才做詞組佔位符替換。禁止外送仍允許顯示本機已保存的譯文。

Aho–Corasick 負責找到多個詞組;「最左、最長」是後續排序與游標選取共同決定的結果。掃描以 UTF-16 編碼單位進行,並不理解自然語言詞界。完整流程還包含命中展開與排序,不能直接把全部成本寫成 O(n)。

匹配範圍包含任意文字、整句精確比對與字面詞組,不提供任意正規表示式。編譯或比對失敗時,可退回較直接的參考掃描方式。

07

上下文要穩定,也要遵守同一套外送規則

啟用文件背景的翻譯設定,會在第一批送出前凍結候選文字。背景端再依目前政策挑出合格內容,避免「禁止翻的段落」透過其他句子的上下文被間接送出。

圖 07從文件候選到有限的翻譯背景HTML 資料流
文件第一批候選50ms 靜默/最長 200ms 擷取視窗
最多 16 個內文區塊
候選合計 ≤6000 UTF-16
背景套用政策排除禁止外送、保留原文、固定譯文、僅用釘選譯文及受佔位符保護的候選
最終文件背景合格標題+前 8 個合格內文區塊
總長最多 1500 UTF-16
計算上下文指紋
凍結候選的意義:同一份快照不因消息分批、重連順序或開始捲動的位置而改變

與待翻句子分開

上下文只提供背景,不需要另外輸出譯文。不同上下文可形成不同語意鍵。

限制仍然存在

有限的文件前段視窗不保證涵蓋全文;各翻譯入口使用的上下文也有差異。

設計意義:穩定快照有助於可重用的語意身分;政策檢查也必須涵蓋「間接外送」的背景文字。
08

先問本機:這個語意契約,是否已經翻過?

圖 08本機優先,讀取錯誤與查無記錄分開HTML 決策圖
01
規則與釘選譯文
固定結果/保留原文,可在本機決定
02
已保存的翻譯記憶
命中 → 直接使用;讀取失敗 → 預設停止外送
03
舊版精確快取
命中 → 使用,並嘗試升級保存
04
確認查無記錄,再看派送政策
允許外送 → 資源核准;僅限本機 → 保留原文

語意鍵:是哪一份翻譯?

正規化原文翻譯入口來源/目標語言翻譯設定提示詞版本詞彙表版本上下文指紋規則指紋輸出約定隱私分區
一致的資料表示 → SHA-256 → 語意鍵

頁面鍵:重新開頁要還原什麼?

頁面鍵管理還原意圖與頁面關聯;語意鍵才決定哪句原文對應哪份譯文。

設計意義:「讀不到已存譯文」與「從來沒有譯文」是不同狀況。暫時讀取失敗,不自動等於同意重新外送原文、重新付出一次翻譯成本。
資料層 保存策略 設計取捨
翻譯記憶 不設有效期限、不自動驅逐;預設 512 MiB 內容計數/20 萬筆/單筆 1 MiB 滿了拒絕新寫入,保住已有紀錄。數值不含整個 IndexedDB 索引與額外儲存成本。
舊版快取 預設 30 天/128 MiB;LRU 驅逐 可重建的快取,採用不同於已保存譯文的保留策略。
規則/釘選譯文 持久政策資料 使用者指定的行為,不是一般 LRU 快取。
換模型、換頁面,哪些結果可以重用?

頁面翻譯的語意身分不直接包含供應商或模型。其他語意條件相同時,換模型仍可能命中舊結果;「強制重新翻譯」才跳過翻譯記憶與舊版快取,結果驗證成功後替換同一語意鍵的記憶。

選取翻譯與翻譯中心使用各自的入口約定,翻譯設定中也包含供應商識別。因此翻譯中心的 A 供應商卡片不會使用 B 供應商卡片的結果;同一供應商設定更換模型,則保留原有身分。

上下文、規則與版本也納入語意契約,透過精確雜湊比對尋找譯文。不同頁面的相同句子,只有其他語意條件也相同才可共用;相似的文字不會自動命中。

09

合批節省請求,派送核准守住資源與配額

候選工作先依閱讀需求排序,再選擇可用的翻譯資源,最後嘗試合併成一批。批次大一點能合併工作;可見內容則採較小門檻,讓第一批結果不用等太多句。

圖 09兩種批次門檻,仍要經過同一組相容性檢查HTML 條件圖
可見內容 · T0/T1追加合批門檻:最多 3 項/900 個 UTF-16 單位
取使用者設定與可見門檻中較小者
其他可派送內容初始預設:8 項/2400 個 UTF-16 單位
依翻譯流程的批次設定合併
按候選順序追加;遇到不相容的下一項便停止擴展

同批必須相容

文件與頁面連線優先層級翻譯設定上下文隱私分區翻譯資源token 配額

T1/T3 的候選視窗內若出現多個頁面,維持單筆派送,避免為了填滿某頁的批次跳過另一頁。需要單獨修復的工作也不合批。

設計意義:吞吐與首筆等待時間需要折衷,公平性也不能被合批繞過。批次門檻限制合併規模,實際速度與成本仍取決於內容及服務回應。
900 不是每次請求的絕對字數上限:第一個項目先加入批次,追加其他項目時才檢查總長。單一已分句的翻譯單位可能超過 900;提示詞與上下文也不算在這個原文長度裡。UTF-16 編碼單位、模型 token 與網路位元組是三套不同的計量。
圖 10並行槽與配額帳本:兩種不同的生命週期SVG 生命週期
並行槽與配額帳本分開管理 派送核准同時檢查並行槽、速率額度與配額群組,先持久化再送 API。確認網路請求終止後釋放並行槽;已提交的保守扣帳留到時間窗到期,速率額度另依速率補充。 一次 API 請求嘗試 需要並行槽 需要請求/詞元額度 並行槽 全域/服務資源/配額群組 預留或尚未結束的網路請求 時間窗配額帳本 請求/詞元的分窗計數 記錄保守的時間窗扣帳 同時核准 先提交 IndexedDB 交易 請求紀錄+速率與配額帳本 交易成功才允許送出 呼叫翻譯服務 送出前先留下預扣證據 寫盤失敗:不送 API 交易完成 網路請求已確認終止 已完成/已確認取消/失敗 釋放並行槽 後續工作可以使用空出的槽位 時間窗扣帳仍保留 等計數區間到期;實際用量 較小也不會自動退回預扣 與此分開 並行槽追蹤占用;時間窗配額保留預扣;請求速率額度另依速率補充。 網路請求結束不直接退回速率額度;預扣成功後取消,也可能保留未送出的扣帳。

寬圖可橫向捲動。

設計意義:請求結束只代表網路操作不再占用並行名額,並不代表供應商沒有計費。先保存保守扣帳紀錄,也讓背景服務重啟後能保留已知用量。控制送出速率的令牌另依時間補充,請求結束不會直接退還已消耗的令牌。

並行量

同時檢查全系統、單一翻譯資源與所有相關配額群組。初始預設上限分別是 16、12、16 個並行名額。

送出速率

每個翻譯資源的令牌桶預設每秒補充 8 次請求的容量,最多累積 16 次。它管理啟動節奏,不保證每秒完成 8 次。

時間窗配額

依設定檢查每分鐘請求數、每分鐘 token 數與每日請求數。實際用量較高時向上補記;較低或未回報時,不自動退還預扣量。

演算法:何時等待時間,何時等待事件?
D = S + P + a − L S = 已提交至時間窗帳本、尚未到期的保守扣帳 P = 尚未完成送出提交的預留量 a = 新需求  L = 設定上限
條件 派送判斷 含義
a > L 阻擋需求 這筆需求本身超限,設定不變時,等待也無法容納。
D ≤ 0 通過這項配額檢查 還要繼續通過並行名額、送出速率與其他配額檢查。
0 < D ≤ S 等待指定時間 掃描時間格,找出足夠扣帳到期的時刻。
D > S 等待狀態變更 即使已提交扣帳全到期,待提交預留加上新需求仍超限。

同一翻譯資源的時間條件取最晚門檻;若還需要釋放名額或完成寫入,就等待相應事件。不同候選工作之間則找最早可能喚醒的時刻。固定容量的環狀時間格,避免記憶體隨歷史請求數無限增加:分鐘窗 62 格、每格 1 秒;日窗 1442 格、每格 60 秒。

扣帳所屬的時間格編號為 ceil(歸屬時間 ÷ 每格長度),也就是向上取整。建立持久化快照時,待提交扣帳的歸屬時間至少設到當下加 1000ms;交易完成後,再確保它不早於當下,採保守到期。請求令牌桶使用整數計數,一次請求等於 1,000,000 個微量單位;這與模型切分文字的 token 無關。

演算法:資源選擇、token 估算與可選的自適應

多個翻譯資源可用時,先比較「候選視窗內的相容需求量 ÷ 可用並行數」,分母至少取 1;再比較負載、路由優先度與穩定的資源識別順序。這是從眼前候選中挑選資源的啟發式,沒有求解全域最佳配置。

估算基底 = ceil(所有字元權重之和)+ 4 字元權重:Unicode 碼位大於 0x2E80 時取 1,否則取 0.34 互動式完整提示詞:ceil(各非空片段基底之和 × 1.2)+ 256 互動式輸出預留:請求指定的上限,未指定則為 4096

這是本機決定能否派送時的估算,與供應商實際切分 token 的方式可能不同,也無法代替帳戶的剩餘額度。頁面批次還會把翻譯指令與上下文加入估算,不能只拿原文字數當每分鐘 token 用量。

自適應並行量預設關閉。啟用後,並行上限從硬上限的一半向上取整開始。成功回應到達時,若統計窗已滿 20 秒,就檢查前一窗是否至少成功 10 次、仍有待辦工作且沒有壅塞;符合才增加 1 個名額。容量壅塞時減半,同一調整週期最多下降一次。自動備援切換也預設關閉,需要明確啟用才會在符合條件時改用其他資源。

10

模型回傳的是資料協定,通過驗證才成為譯文

預設的頁面批次翻譯,使用簡短編號對應每一項結果。輸出順序可以不同;編號、譯文與佔位符都必須通過驗證。這讓「整包壞掉」與「只有幾個項目需要修復」可以分開處理。

圖 11從串流文字,到可提交的譯文HTML 協定與分支圖

合成資料示意。來源語言自動辨識,目標為臺灣繁體中文,不附額外上下文。回覆順序故意交換,仍以項目編號一一對應。

送出的翻譯項目

項目編號 原文
1 Hello.
2 Goodbye.

收到的翻譯結果

項目編號 譯文
2 再見。
1 你好。
串流回覆解析器|保留狀態,逐段掃描新字元外框 → JSON 結構 → 資料欄位 → 項目編號 → 文字與 Unicode;完整項目可產生暫時預覽。
網路操作成功結束,且模型正常完成回覆後,再做整份驗證
合法項目接受結果 → 還原佔位符
→ 可呈現譯文 → 最終結果
個別項目需修復已知編號缺漏/重複
譯文空白/超長/佔位符不符
→ 後續單筆重試
整包不合法未知編號/欄位、重複欄位名稱
版本錯誤、非法 JSON、額外散文
→ 拒絕整包回覆
設計意義:先確認「這是誰的完整結果」,再決定能否採用。預覽是可撤回的暫時結果,不會成為持久快取;頁面段落會等最終結果確認後才更新。
翻譯服務 實際網路行為 回覆要求
DeepSeek/OpenAI/Google 底層關閉自動重送,每次操作最多發出 1 次網路請求;重試交由上層排程管理。自訂服務網址仍須符合對應服務的連線規則。 串流文字交給回覆解析器,必須符合結構化資料格式。
Microsoft 一次操作內,先取得 Edge 認證,再送出翻譯;兩個階段各限 1 次網路請求,合計最多 2 次。 檢查回傳筆數,按原位置補上相同項目編號,轉成統一格式。
哪些容錯被允許?哪些數字不是 token 上限?

解析器容許以指定標記包住的前置思考段落,以及完整包住回覆、未標語言或標成 JSON 的Markdown 圍欄;合法空白與資料欄位換序也可接受。任意散文中的 JSON 不會被猜測擷取。大量串流增量會切成 32,768 個 UTF-16 單位的片段處理,跨片段保留文字、跳脫符號與 Unicode 的解析狀態。

界線 預設值 計量方式
整份文字回覆 262,144 2 × UTF-16 長度,含外框文字
模型回覆的網路資料量 16 MiB 文字回覆預算 × 64,包含 SSE 與 JSON 外框
單項譯文 24,000 UTF-16 編碼單位

產品方向是「來源自動辨識 → 臺灣繁體中文」。頁面翻譯與共用設定採用不同的繁體中文語言標記;Microsoft 另外透過 ISO 語言對照表轉換,找不到對應時使用繁體中文標記。跨服務連接時,需要處理這層語言表示的差異。

系統提示詞要求忽略原文與上下文中的指令,譯文內容使用純文字。這能表達預期行為,仍無法保證完全消除提示詞注入或翻譯錯誤。DeepSeek 預設關閉思考模式,使用者也可自行調整。

11

回來得再快,也要先確認頁面還是那一份

動態網頁可能在翻譯途中改字、換段落、離開頁面,使用者也可能正在反白。背景完成只代表取得候選結果;真正更新網頁節點前,還要核對當下的原文與操作狀態。

圖 12舊結果晚到,不該蓋掉新版原文SVG 時序 · 合成示意
非同步譯文如何避免覆蓋新原文 網站變更原文後,舊結果即使較晚回來也不能覆寫新版;接收結果與提交 DOM 時各自核對身分。時序是合成示意,無延遲量測。 網站/來源 翻譯背景 頁面驗證/呈現 原文版本 1 擷取請求 A 送出 A 請求嘗試 A 等待翻譯服務 網站改成版本 2 新片段/閱讀世代 送出 B 請求嘗試 B 新版語意需求 A 在原文更新後回覆 結果仍屬於舊來源 檢查版本 拒絕舊結果 不更新 DOM B 完成 完整譯文 再核對原文 符合當前身分 排入/提交呈現計畫 接收時核對:背景世代 → 文件世代 → 原文版本 → 結果通知版本 提交 DOM 前,再核對本機閱讀世代、請求嘗試、原文與節點連接狀態。

寬圖可橫向捲動。

設計意義:背景執行代次、文件版本、原文版本與結果更新序號分層核對;已排入呈現佇列的工作,還要確認本機翻譯輪次與請求身分。取消與版本核對一起處理非同步競爭。
圖 13同一批結果,可以在不同動畫影格更新HTML 呈現排程
段落 A · 可提交身分符合、沒有選取
這一影格的預算足夠
→ 現在更新
段落 B · 正在反白保護使用者的選取範圍
只留這段最新更新方案
→ 等保護條件解除
段落 C · 等下一幀這一影格已達工作預算
先保留更新方案
→ 下一影格再檢查
提交前再次核對原文;不清除使用者選取,也不凍結其他段落
4 ms分段讓出工作的時間預算
8區塊/觀測根節點/影格
256預估網頁節點
32 KiB以 UTF-16 計算的位元組

每完成一次區塊更新才檢查時間;第一個超過預算、卻必須完整更新的區塊仍可單獨提交。因此 4ms 是讓出工作的預算,不是每次網頁更新的硬性最長時間。

設計意義:把結果抵達的節奏與網頁寫入節奏分開,讓翻譯更新與閱讀、選取、輸入法組字共存。放開滑鼠或觸控後,若仍有一段文字被選取,保護仍然存在。
顯示模式 原文怎麼處理 譯文怎麼寫入
雙語 原文留在原位;已有舊譯文時,等新的更新方案提交才替換。 建立容納譯文的節點,再交由呈現佇列更新。
純譯文 暫存原來的節點物件,再移出頁面;還原時插回同一批節點。 主要路徑使用文字與換行節點組合譯文;模型文字不當作 HTML 執行。
更細的呈現策略:合併、延後與避免不必要的重寫

呈現節奏控制器合併陸續抵達的結果,依最近一次工作的耗時調整節奏:新成本估值 = 0.6 × 舊成本估值 + 0.4 × 本次耗時;下一輪間隔為 min(1000ms,2 × 新成本估值)。瀏覽器的動畫影格通知尚未到達時,另有 250ms 的計時器補位。這裡追蹤的是工作耗時,無法完整代表瀏覽器排版與繪製的成本。

同一區塊只保留最新的等待更新方案;最多保留 128 份延後方案,超過後可改記「需要重新整理」,這類記號上限為 4096。頁面變動的重新比對則合併成每段一個進行中的工作,再加一個待重跑記號。

呈現摘要使用「文字長度+32 位元 FNV-1a 雜湊」判斷能否略過重寫,與背景使用 SHA-256 的語意識別不同;不同內容仍可能得到相同摘要。多句譯文依原翻譯單位的順序組合,接縫以中、日、韓文字的空白規則推估,並不逐字還原原始空白。

保留同一批原始節點,有利於延續原有物件關係;事件綁定、排版與互動效果,仍受到網站本身的結構與更新方式影響。

12

讀得到譯文,不等於已經存好

圖 14一份結果,兩條完成路徑SVG 狀態圖
結果可用與保存成功是兩個狀態 片段譯文可在保存期間交給頁面組裝;本機交易完成才算保存成功,保存失敗只重試本機寫入。實際顯示仍經過頁面的呈現佇列。 結果通過驗證 回覆格式/保留標記已驗證 產生可呈現譯文 譯文結果可用 保存狀態:進行中 等待頁面組裝/排程呈現 本機保存佇列 等待 IndexedDB 交易 佇列本身不持久保存 保存失敗 材料仍保留且可重試時 「重試保存」只重做寫盤 交易完成 保存狀態:已完成 才可標示已儲存在此裝置 失敗 成功 保存佇列滿 → 暫停新的翻譯請求;已發出的仍可完成。背景重啟不會自動恢復未保存材料。

寬圖可橫向捲動。

設計意義:本機保存暫時失敗時,已通過驗證的譯文仍可留在畫面;「重試保存」只重做本機寫入,避免把儲存錯誤轉成另一筆模型請求。
保存佇列如何限制記憶體?
區域 筆數上限 估計位元組上限
主要保存佇列 32 16 MiB
額外等候區 64 8 MiB
保存失敗後保留的內容 64 8 MiB

等候或保存失敗的內容,有效保留期為 10 分鐘,於後續佇列操作或重試時檢查清理。容量估計為「原文 UTF-8 位元組+譯文 UTF-8 位元組 × 2+1024」,與實際記憶體占用可能不同。佇列滿時,會暫停新的頁面翻譯派送;已發出的請求可完成。

這個佇列只保存在執行中的記憶體。背景服務結束時,尚未完成寫入的內容,不會因重啟自動恢復。圖中呈現的是頁面翻譯的保存狀態;互動式入口只將內容排入保存工作,不等待同一套完整的畫面狀態流程。

13

取消是撤銷提交權,重試則需要明確理由

圖 15發出取消訊號,不等於網路操作已經結束SVG 生命週期
取消與重啟的不同生命週期 取消先撤銷結果提交權,再等待網路請求確認終止。預設 5 秒未確認終止會隔離服務資源;背景服務重啟會切換世代,並保留已知配額消耗。 執行中 並行槽已占用 保有結果提交權 要求取消 撤銷結果提交權 送出取消訊號 正在取消 仍等待網路請求確認終止 此時不先釋放並行槽 收到終止確認 釋放並行槽 遲到成功仍不能提交結果 預設 5 秒未確認 網路終止狀態不明 隔離服務資源、保留並行槽 超過寬限 遲到終止 背景服務重新啟動 切換新的背景世代 釋放舊槽位;保留扣帳計數 重新連線:頁面確認連線 → 重送上下文與活躍片段快照 → 背景重建需求。 保存中的文字不因重啟自動復活;已提交的翻譯記憶與配額帳本才具有持久性。

寬圖可橫向捲動。

設計意義:先防止已取消結果上屏,再等待真正終止的證據。若先歸還並行名額,底層請求卻仍在跑,就會低估實際並行量。
25 s等待第一份內容
20 s串流無新內容的期限
90 s單次嘗試的逾時門檻
5 s取消後等待終止的寬限期

以上為可調整的預設值。一般頁面重試策略以 4 次實際送出為預設門檻,包含首次;累計執行時間預算為 180 秒。過大的多項目批次另有拆成單筆重新排隊的修復路徑。從未嘗試、只在畫面外等待的需求,不套用一般 30 分鐘的需求到期限制。

失敗 處理方向 為什麼分開
HTTP 401/一般 403/404 視為認證、權限或模型設定問題,阻擋相關翻譯資源。 盲目重送不會修好設定。
HTTP 429 · 容量類 對受限的資源或配額範圍設定冷卻期;工作留在佇列,等待資源再次可用。 讓負載下降後才再試。
HTTP 402/429 · 付費或額度不足 預設不再重試;額度類 403 也屬此類。明確啟用備援切換,且有符合獨立備援條件的可用資源時,仍可轉送。 付費/帳戶額度問題不是瞬時壅塞。
HTTP 408/409/425/5xx 視為暫時性的伺服器失敗,可以重試。 有機會隨時間恢復,仍受次數與預算限制。
HTTP 413/過大輸入 多項目批次拆成單筆重試;單筆仍過大則阻擋該工作。 批次過大,不代表每個項目都無法單獨翻譯。
重試時間、喚醒與時鐘跳動

一般工作的延後重試,使用完整隨機抖動:每次從零到等待上界之間取一個隨機延遲。容量型 HTTP 429 則對受限的資源或配額範圍設定冷卻期,採用伺服器指定的等待時間;未提供時使用基礎延遲,不套用隨機抖動。

等待上界 = min(延遲上限,基礎延遲 × 2^(已嘗試次數−1)) 可重試時間 = max(伺服器指定時間, 現在 + floor(隨機值 × 等待上界)) 隨機值介於 0(含)與 1(不含);floor 表示向下取整

隨機抖動讓重試時間分散;回應標頭 Retry-After 指定的時間是額外下限,可接受秒數或 HTTP 日期,並考慮伺服器時間差。伺服器要求的等待時間最多保留 7 天。

喚醒排程合併成一個最早到期的計時器;預期等待至少 30 秒時,再以瀏覽器的背景鬧鐘補充喚醒。時鐘檢查會比較系統時間與單調時鐘各自經過了多久:偏移超過 5 秒,或系統時間倒退超過 5 秒,就暫停新的派送。沒有新異常且穩定期達 2 秒後,才依保守策略恢復。

取消圖描述已送出的網路嘗試。已保留名額但尚未送出的嘗試,可先結束並釋放名額;若進行中的扣帳交易隨後成功提交,即使沒有真的呼叫服務,也會保留該筆保守扣帳。無法確認是否終止的網路操作,會隔離相關資源並保留名額;收到遲來的終止通知後才釋放。背景服務重啟後建立新的執行代次,舊請求不再占用並行名額,已知的配額帳本則繼續保留。

14

「本機優先」要說清楚資料仍會去哪裡

圖 16原文、譯文與金鑰,各有不同邊界HTML 資料邊界圖
網頁與內容腳本
原文與 DOMDOM 節點留在網頁端
原文單位/文件背景傳往背景端
接收帶版本的狀態與結果通知
擴充套件的儲存空間
翻譯記憶正規化原文、譯文、產生者
同筆記錄包含頁面關聯
頁面還原意圖獨立保存
翻譯服務的敏感設定API 金鑰/請求標頭/服務選項
與網頁端可見設定分開
本機未另做應用層加密
外部網路
翻譯服務接收待翻文字
LLM 另可接收合格的上下文
依各服務協定回傳
選擇加入翻譯記憶同步包含正規化原文與譯文
由共用同步服務加密後上傳
同步回程寫入本機記憶
同步不帶:頁面關聯、最後使用時間、頁面還原意圖。
同步仍帶:翻譯內容本身;不能只稱為「同步少量中繼資料」。

提供給網頁端的設定會移除 API 金鑰、請求標頭與供應商選項;設定同步也排除這些欄位,只傳送允許同步的設定。

設計意義:設定隔離、傳輸加密與本機命中,解決的是不同問題。本機優先能避免部分重複請求;真正呼叫遠端翻譯服務時,文字仍會離開裝置。
機制 實際行為 需要保留的界線
禁止外送 禁止該工作送往翻譯服務;仍可查本機已保存譯文。 上下文候選也須通過政策檢查;翻譯記憶同步則另依使用者是否加入同步處理。
無痕 不查找/保存/同步該無痕工作產生的翻譯記憶。 仍保存不含文字內容的派送與配額中繼資料。
翻譯網路請求 不附帶瀏覽器憑證、拒絕重新導向、限制目標來源;遠端使用 HTTPS。 明確指定的本機/私有網路主機可使用 HTTP。
同步加密 HKDF-SHA-256 衍生金鑰,AES-256-GCM 加密同步資料物件。 加密保護同步內容;本機設定隔離仍是另一層責任。
15

把設計放回它要解決的問題

圖 17從閱讀需求,到可解釋的工程取捨HTML 設計對照
同一句話重複出現
頁面綁定/共享工作分離+語意鍵共用相同語意工作;上下文或規則改變時,保留不同身分。
多管理一層狀態,換取明確的重用邊界。
眼前內容等不到
可見性分層+小批次派送優先服務焦點可見區,再預載閱讀前方。
低優先層可能等待;不保證每頁同時等速。
模型輸出不穩定
項目編號對應+佔位符驗證整包錯誤與個別項目修復分開。
多一道解析成本;語意正確性仍依賴翻譯品質。
請求跨越取消/重啟
執行世代+持久配額扣帳撤銷提交權與保留已知消耗分開。
保守預扣可能高估使用量;未知終止會先停派。
網頁更新與使用者操作
版本核對+選取保護+每幀預算提交前再核對原文,受影響區塊延後寫入。
翻譯完成到真正上屏之間,可能還要等待。
本機儲存暫時故障
結果可用與保存完成分離已驗證譯文可用;保存失敗只重試寫盤。
未完成保存的結果,不保證在背景程序重啟後仍可恢復。
這套架構的價值,是把「翻譯」拆成可分別檢查的責任。每個結果都有來源身分,每次外送都經過核准,每次畫面更新都要重新證明自己仍然適用。

理解這套系統的八個關鍵界線

串流能力與頁面上屏分開底層能提供暫時預覽;網頁段落等待最終結果。選取文字的 LLM 翻譯使用串流文字更新。
共用資源,各入口仍有差異派送核准共用;回覆解析、上下文、入口重試與畫面狀態各有差異。
精確記憶與相似搜尋分開語意鍵是完整翻譯條件的 SHA-256;相似文字不會自動命中。
原文字串長度與 token 分開2000、900、2400 指不同處的 UTF-16 門檻;不能改寫成 token 數。
並行槽與配額扣帳分開終止可以釋放並行槽;已送消耗仍留在時間窗。
4ms 是合作式預算單一不可拆分的更新可能超出預算,頁面仍可能掉幀。
可見、已存、已同步分開結果可用、已保存、已完成同步,是三個分別推進的狀態。
保護措施與品質保證分開純文字輸出與版本檢查降低呈現風險;翻譯品質、成本與效能仍需另行量測。

留言與討論

正在連線到留言服務…