ツール
白紙から出た幾何学的な断片がプリズム内の三つの関門を通って再配置され、ウェブ翻訳の抽出・検証・書き戻しを表す。

エンジニアリング · 研究ノート

一つのテキストは、どのように信頼できるウェブページの訳文になるのか?

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バージョンを照合し、段落全体を組み立てる
ページ側で古い通知を拒否表示タイミングに合わせて段落全体の完了を待つ訳文と原文を組み合わせ、失敗は別途報告
09DOM 更新をスケジュールしてコミット
コンテンツフラグメントと表示計画を作成選択範囲を保護+フレームごとの処理量を制限コミット前に原文とローカルリクエストを照合対訳コンテナーまたは訳文のみの表示を更新
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 コミットは有効な結果から分岐し、完了の順序は決まっていません。文書コンテキストは最初の原文の翻訳需要を送信する前に固定します。閲覧位置の更新は可視性と位置のみを送ります。この図はデータの依存関係を示すもので、時間の比率は表しません。交差する線に接続点がない場合、合流を意味しません。
重要な 2 つの出口: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ディスパッチしない 3 つの出口
外部送信禁止 → ブロックし、理由を報告ローカル訳文のみ使用 → 原文を維持し、需要を一時保持利用可能なサービスリソースなし → ブロックし、設定を案内原文を維持し、対応する状態を報告
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 ディスパッチしない 3 つの出口:ディスパッチしない
  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

まず、位置・ジョブ・リクエストを区別する

ページバインディングは画面上の需要を記録し、共有ジョブは再利用可能な翻訳タスクを表し、リクエスト試行は特定の翻訳リソースに対する 1 回の操作です。

図 023 種類の識別情報、3 つのライフサイクルSVG アーキテクチャ図
ページバインディング、共有ジョブ、リクエスト試行の 3 層のライフサイクル 2 つのページバインディングがジョブ ① を共有します。互換性のあるジョブは同じリクエスト試行にまとめられます。これは概念例であり、バッチ化には文書などの制約を満たす必要があります。 ページの需要 意味条件が同一のジョブ 1 回のネットワーク試行 ページバインディング A1 ページ A の原文 位置、原文バージョン、購読 ページバインディング B1 ページ B の意味条件が同じ需要 独自の DOM/バージョンを持つ 共有ジョブ ① 同じセマンティックキー 結果と再試行のライフサイクルを共有 共有ジョブ ② 別の互換性のあるジョブ リクエスト試行 α サービスリソース+クォータ予約 含まれるジョブ:①、② バックグラウンド世代/終了状態 重複排除:意味上の契約が完全に同一の場合のみ共有 バッチ化:文書、コンテキスト、優先度の階層、 サービスリソースの互換性が必要 同じ文章の異なるページバインディングが、2 回の API 呼び出しになるとは限りません。ひとつの購読を取り消しても、他の購読を取り消す必要はありません。

横長の図は横方向にスクロールでき、テキストは選択できます。

設計上の意義:重複する需要は結果を共有でき、再試行のために DOM の識別情報を作り直す必要はありません。あるページを離れても、他のページがまだ必要としている同じジョブを取り消す必要はありません。図中のバッチ化は概念例であり、互換性の条件を満たす必要があります。
同時に届く 2 つの同じ需要の重複送信を、どう防ぐのか?

バックグラウンドスケジューラーは、最初の非同期メモリ検索を始める前に、「検索中」のジョブをインデックスへ登録します。後から届くページの需要は同じジョブを購読し、先の検索がまだ戻っていなくても、同じタスクを別途作りません。そのため、非同期検索中の重複需要も統合できます。

04

抽出するのは識別可能な原文であり、HTML 全体ではない

図 03ひとつの DOM、2 つの読み取り責務SVG · 合成例
DOM の 2 つの読み取り責務と文分割の位置 DOM の読み取りは、原文の識別情報の照合と翻訳リクエスト用テキストの 2 系統に分かれ、それぞれ必要な原文を読み取ります。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) 文分割 2 つの DOM 読み取り経路は責務が異なります。文の範囲は元の原文を指し続け、正規化によって原文の位置を書き換えることはありません。

横長の図は横方向にスクロールできます。

一方の経路は翻訳対象の文章を抽出して文に分割し、もう一方は一貫した原文表現を読み取り、識別情報の照合と文書コンテキストの作成に使います。どちらも、システムが生成した訳文を新たな原文として扱わないようにします。

まず段落を識別

DOM、表示タイプ、除外ルールに基づいて走査し、自身の出力、非表示コンテンツ、発音注釈を飛ばします。

次に文へ分割

ブラウザーのテキスト分割機能を使い、2000 UTF-16 単位を超えたら、まず節を区切る句読点、次に書記素の境界を探します。

最後に識別情報を保持

各セグメントは元の範囲、分割順序、原文バージョンを保持し、原文が変わったらテキスト単位を再構築します。

UTF-16、字形、token を混同してはいけない理由

UTF-16 コード単位は JavaScript の文字列長に使う単位です。emoji は複数の単位を占める場合があり、複数の Unicode コードポイントが、ユーザーに見えるひとつの字形を構成することもあります。書記素(grapheme)は、このような可視のテキスト単位のまとまりを表し、token はモデルのトークナイザーによって決まります。

既定値の 2000 は、各テキスト単位の文字列長の上限です。ひとつの書記素だけで上限を超えたら、入力が大きすぎると報告します。ブラウザーがテキスト分割をサポートしない場合、フォールバックはコードポイント単位で処理するだけなので、複合字形を完全にまとめることは保証できません。

短いセグメントにはローカルのヒューリスティックもあります。URL などのノイズを除いた後、ラテン文字の単語 1 つだけなら省略することがあり、中国語・日本語・韓国語の文字を含む短いセグメントは保持できます。細切れのリクエストを減らす一方、意味のある単語を見落とす可能性もあります。選択テキストの翻訳には、ページ翻訳と同じ短文のしきい値を適用しません。

関連情報:ブラウザーのテキスト分割機能。

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 ページにそれぞれ 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 言語。
設計上の意義:管理対象の用語を、検証可能な保持マーカーに変えます。各プレースホルダーは必ず 1 回だけ現れる必要があります。欠落、重複、モデルが捏造した新たなマーカーがある場合、そのまま画面には表示できません。
ルールの優先順序と 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 件あたり 1 MiB 容量がいっぱいになったら新たな書き込みを拒否し、既存の記録を保護します。数値には IndexedDB 全体のインデックスや追加のストレージコストは含まれません。
旧版キャッシュ 既定値は 30 日/128 MiB。LRU 方式で削除 再構築可能なキャッシュであり、保存済み訳文とは異なる保持戦略を採用します。
ルール/固定した訳文 永続化するポリシーデータ ユーザーが指定した動作であり、一般的な LRU キャッシュではありません。
モデルやページが変わっても再利用できる結果はどれか?

ページ翻訳の意味上の識別情報には、プロバイダーやモデルを直接含めません。他の意味条件が同じなら、モデルを変えても既存の結果にヒットする可能性があります。「強制再翻訳」の場合に初めて翻訳メモリと旧版キャッシュを飛ばし、結果の検証に成功した後、同じセマンティックキーのメモリを置き換えます。

選択テキスト翻訳と翻訳センターは、それぞれ固有の入口の取り決めを使い、翻訳設定にもプロバイダー識別子を含めます。そのため、翻訳センターの A プロバイダーのカードが B プロバイダーのカードの結果を使うことはありません。同じプロバイダー設定でモデルを変更した場合は、元の識別情報を維持します。

コンテキスト、ルール、バージョンも意味上の契約に含め、ハッシュの厳密一致で訳文を探します。異なるページの同じ文でも、他の意味条件まで一致して初めて共有できます。似ているだけの文章が自動的にヒットすることはありません。

09

バッチ化でリクエストを節約し、ディスパッチ承認でリソースとクォータを守る

候補ジョブをまず閲覧需要に従って並べ、次に利用可能な翻訳リソースを選び、最後にバッチへの統合を試みます。大きなバッチはジョブをまとめられますが、表示中のコンテンツには小さな基準を使い、最初の結果が多くの文を待たずに済むようにします。

図 092 種類のバッチ基準、共通の互換性確認HTML 条件図
表示中コンテンツ · T0/T1バッチ追加の基準:最大 3 項目/900 UTF-16 単位
ユーザー設定と表示中コンテンツの基準の小さい方を採用
その他のディスパッチ可能なコンテンツ初期既定値:8 項目/2400 UTF-16 単位
翻訳フローのバッチ設定に従って統合
候補順に追加し、次の項目に互換性がなければ拡張を停止

同じバッチ内では互換性が必要

文書とページ接続優先度の階層翻訳設定コンテキストプライバシー区分翻訳リソースtoken クォータ

T1/T3 の候補窓に複数のページが現れた場合は、単項目のディスパッチを維持し、あるページのバッチを埋めるために別のページを飛ばさないようにします。個別修復が必要なジョブもバッチ化しません。

設計上の意義:スループットと最初の結果までの待ち時間にはトレードオフがあり、バッチ化によって公平性を迂回してはいけません。バッチ基準は統合規模を制限しますが、実際の速度とコストはコンテンツとサービスの応答に依存します。
900 は、各リクエストの絶対的な文字数上限ではありません:最初の項目は先にバッチへ入り、他の項目を追加するときに初めて合計長を確認します。文分割済みの単一翻訳単位でも 900 を超えることがあります。プロンプトとコンテキストも、この原文長には含まれません。UTF-16 コード単位、モデルの token、ネットワークのバイト数は、それぞれ別の尺度です。
図 10同時実行枠とクォータ台帳:2 つの異なるライフサイクルSVG ライフサイクル図
同時実行枠とクォータ台帳を分けて管理 ディスパッチ承認では、同時実行枠、レート枠、クォータグループを同時に確認し、永続化してから API に送信します。ネットワークリクエストの終了確認後に同時実行枠を解放します。コミット済みの保守的な差し引きは時間窓の期限まで残し、レート枠は別途そのレートに従って補充します。 1 回の API リクエスト試行 同時実行枠が必要 リクエスト/token の枠が必要 同時実行枠 グローバル/サービスリソース/クォータグループ 予約済み、または未終了のネットワークリクエスト 時間窓クォータ台帳 時間窓ごとのリクエスト/token の計数 保守的な時間窓の差し引きを記録 同時に承認 先に IndexedDB トランザクションをコミット リクエスト記録+レート・クォータ台帳 トランザクション成功後にのみ送信を許可 翻訳サービスを呼び出す 送信前に事前差し引きの記録を残す ディスク書き込み失敗:API へ送信しない トランザクション完了 ネットワークリクエストの終了を確認済み 完了/キャンセル確認済み/失敗 同時実行枠を解放 後続ジョブが空いた枠を使用可能 時間窓の差し引きは維持 計数区間の期限まで待つ。実使用量が 少なくても事前差し引きは自動返却しない これとは別に 同時実行枠は占有状態を追跡し、時間窓クォータは事前差し引きを保持し、リクエストのレート枠は別途レートに従って補充します。 ネットワークリクエストの終了でレート枠を直接返却することはありません。事前差し引きに成功してからキャンセルした場合、未送信分の差し引きも残ることがあります。

横長の図は横方向にスクロールできます。

設計上の意義:リクエストの終了は、ネットワーク操作が同時実行枠を占有しなくなったことを意味するだけで、プロバイダーが課金しなかったことを意味しません。保守的な差し引き記録を先に保存すれば、バックグラウンドサービスの再起動後にも既知の使用量を保持できます。送信レートを制御するトークンは別途時間とともに補充され、リクエスト終了によって消費済みトークンを直接返すことはありません。

同時実行数

システム全体、単一の翻訳リソース、関連するすべてのクォータグループを同時に確認します。初期既定の上限は、それぞれ同時実行枠 16、12、16 です。

送信レート

各翻訳リソースのトークンバケットは、既定で毎秒 8 リクエスト分の容量を補充し、最大 16 回分を蓄積します。これは開始のペースを管理するもので、毎秒 8 回の完了を保証するものではありません。

時間窓クォータ

設定に従って、毎分のリクエスト数、毎分の token 数、1 日のリクエスト数を確認します。実使用量が多ければ追加計上しますが、少ない場合や報告されない場合に事前差し引きを自動返却することはありません。

アルゴリズム:いつ時間を待ち、いつイベントを待つのか?
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 回のリクエストは 1,000,000 マイクロ単位に相当します。これはモデルが文章を分割する token とは無関係です。

アルゴリズム:リソース選択、token 推定、任意の適応制御

複数の翻訳リソースが使える場合、まず「候補窓内の互換性のある需要量 ÷ 利用可能な同時実行数」を比較し、分母は少なくとも 1 とします。次に負荷、ルーティング優先度、安定したリソース識別子順を比較します。これは目の前の候補からリソースを選ぶヒューリスティックであり、グローバルな最適配分を求めるものではありません。

推定基底 = ceil(すべての文字重みの合計)+ 4 文字重み:Unicode コードポイントが 0x2E80 より大きければ 1、それ以外は 0.34 対話型の完全なプロンプト:ceil(空でない各フラグメントの基底の合計 × 1.2)+ 256 対話型の出力予約量:リクエストが指定した上限。未指定なら 4096

これはローカルでディスパッチ可否を決めるための推定です。プロバイダーの実際の token 分割とは異なる場合があり、アカウントの残り枠の代わりにもなりません。ページのバッチでは翻訳指示とコンテキストも推定に加えるため、原文の文字数だけを毎分の token 使用量とみなすことはできません。

適応的な同時実行数の調整は既定で無効です。有効にすると、同時実行上限はハード上限の半分を切り上げた値から始まります。成功応答が届き、統計窓が 20 秒に達していれば、前の窓で成功が少なくとも 10 回あり、未処理ジョブが残り、輻輳がなかったかを確認します。すべて満たした場合にのみ枠を 1 つ増やします。容量の輻輳時は半減し、同じ調整周期内の減少は最大 1 回です。自動フォールバック切り替えも既定で無効であり、明示的に有効にした場合のみ、条件に合えば別のリソースへ切り替えます。

10

モデルが返すのはデータプロトコル。検証を通過して初めて訳文になる

既定のページバッチ翻訳では、短い識別番号で各結果を対応付けます。出力順は異なっても構いませんが、識別番号、訳文、プレースホルダーのすべてが検証に通る必要があります。これにより、「応答全体が壊れている」と「一部の項目だけ修復が必要」を分けて扱えます。

図 11ストリーミングテキストからコミット可能な訳文へHTML プロトコル・分岐図

合成データの例です。原文の言語は自動判定し、翻訳先は台湾の繁体字中国語で、追加のコンテキストは付けません。応答順を意図的に入れ替えていますが、項目の識別番号で 1 対 1 に対応します。

送信した翻訳項目

項目の識別番号 原文
1 Hello.
2 Goodbye.

受信した翻訳結果

項目の識別番号 訳文
2 再見。
1 你好。
ストリーミング応答パーサー|状態を保持し、新しい文字を順次走査外枠 → JSON 構造 → データフィールド → 項目の識別番号 → テキストと Unicode。完全な項目から一時プレビューを生成できます。
ネットワーク操作が正常終了し、モデルが正常に応答を完了してから、応答全体を検証
有効な項目結果を受理 → プレースホルダーを復元
→ 表示可能な訳文 → 最終結果
個別項目の修復が必要既知の識別番号の欠落/重複
空の訳文/長すぎる訳文/プレースホルダーの不一致
→ 後で個別に再試行
応答全体が無効未知の識別番号/フィールド、フィールド名の重複
バージョン誤り、不正な JSON、余分な文章
→ 応答全体を拒否
設計上の意義:まず「これは誰の完全な結果か」を確認し、その後に採用可否を決めます。プレビューは撤回可能な一時結果であり、永続キャッシュには入りません。ページの段落は最終結果を確認してから更新します。
翻訳サービス 実際のネットワーク動作 応答の要件
DeepSeek/OpenAI/Google 下位層の自動再送は無効で、各操作のネットワークリクエストは最大 1 回です。再試行は上位のスケジューラーが管理します。カスタムサービス URL も、対応するサービスの接続ルールに従う必要があります。 ストリーミングテキストは応答パーサーへ渡し、構造化データ形式に適合する必要があります。
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 KiBUTF-16 で計算したバイト数

時間はブロックの更新が完了するたびに確認します。予算を超えても一括更新が必要な最初のブロックは、単独でコミットできます。したがって 4ms は制御を譲るための予算であり、各ウェブページ更新の厳密な最大時間ではありません。

設計上の意義:結果が届くタイミングとウェブページに書き込むタイミングを分けることで、翻訳更新と閲覧、選択、IME の変換入力を共存させます。マウスやタッチを離した後も文章が選択されたままなら、保護は続きます。
表示モード 原文の扱い 訳文の書き込み方
対訳 原文は元の位置に残します。旧訳文がある場合は、新しい更新計画のコミットを待って置き換えます。 訳文を入れるノードを作成し、表示キューへ渡して更新します。
訳文のみ 元のノードオブジェクトを一時保持してからページから外し、復元時には同じノードを戻します。 主経路ではテキストノードと改行ノードで訳文を組み立て、モデルの文章を HTML として実行しません。
より細かな表示戦略:統合、延期、不要な書き換えの回避

表示タイミングの制御器は、順次届く結果を統合し、直近の処理時間でタイミングを調整します。新コスト推定値 = 0.6 × 旧コスト推定値 + 0.4 × 今回の所要時間。次の間隔は min(1000ms,2 × 新コスト推定値)です。ブラウザーのアニメーションフレーム通知がまだ届かない場合は、250ms のタイマーが補います。ここで追跡するのは処理時間であり、ブラウザーのレイアウトと描画の全コストを表すものではありません。

同じブロックには最新の更新待ち計画だけを保持し、延期する計画は最大 128 件です。超えた場合は「再更新が必要」の印に切り替えられ、この印の上限は 4096 です。ページ変更後の再照合は、段落ごとに実行中のジョブ 1 つと再実行待ちの印 1 つにまとめます。

表示用の要約値は「テキスト長+32 ビット FNV-1a ハッシュ」で書き換えを省略できるかを判断し、バックグラウンドの SHA-256 による意味上の識別とは異なります。内容が異なっても同じ要約値になる可能性があります。複数文の訳文は元の翻訳単位の順番で組み合わせ、接合部は中国語・日本語・韓国語の空白規則から推定します。元の空白を一文字ずつ復元するわけではありません。

同じ元ノードを保持することは、既存のオブジェクト関係の維持に役立ちます。ただしイベントのバインディング、レイアウト、操作の動作は、サイト自体の構造や更新方法の影響を受けます。

12

訳文が読めることと、保存済みであることは別

図 14ひとつの結果、2 つの完了経路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 s1 回の試行のタイムアウト基準
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 日まで保持します。

起動スケジュールは、最も早い期限のタイマー 1 つにまとめます。予想待機時間が 30 秒以上なら、ブラウザーのバックグラウンドアラームで起動を補います。時計の確認では、システム時計と単調時計の経過時間を比較します。ずれが 5 秒を超える、またはシステム時刻が 5 秒を超えて戻った場合、新たなディスパッチを一時停止します。新たな異常がなく安定期間が 2 秒に達して初めて、保守的な方針で再開します。

キャンセル図が示すのは送信済みのネットワーク試行です。枠を予約済みでも未送信の試行は、先に終了して枠を解放できます。ただし、進行中の差し引きトランザクションがその後コミットに成功した場合、実際にサービスを呼び出していなくても保守的な差し引きは残ります。終了を確認できないネットワーク操作では関連リソースを隔離し、遅れて終了通知を受け取るまで枠を保持します。バックグラウンドサービスの再起動では新しい実行世代を作り、旧リクエストは同時実行枠を占有しなくなりますが、既知のクォータ台帳は保持し続けます。

14

「ローカル優先」でもデータの行き先を明確にする

図 16原文、訳文、キーにはそれぞれ異なる境界があるHTML データ境界図
ウェブページとコンテンツスクリプト
原文と DOMDOM ノードはウェブページ側に保持
原文単位/文書コンテキストをバックグラウンドへ送信
バージョン付きの状態・結果通知を受信
拡張機能のストレージ
翻訳メモリ正規化済み原文、訳文、生成元
同じレコードにページの関連付けを含む
ページ復元の意図は別途保存
翻訳サービスの機密設定API キー/リクエストヘッダー/サービスオプション
ページ側から見える設定と分離
ローカルでは追加のアプリケーション層暗号化なし
外部ネットワーク
翻訳サービス翻訳対象の文章を受信
LLM は適格なコンテキストも受信可能
各サービスのプロトコルに従って返す
翻訳メモリの同期はオプトイン正規化済み原文と訳文を含む
共有同期サービスが暗号化してからアップロード
同期の戻り経路はローカルメモリに書き込む
同期に含めないもの:ページの関連付け、最終使用時刻、ページ復元の意図。
同期に含まれるもの:翻訳内容そのもの。単に「少量のメタデータの同期」とは呼べません。

ページ側に渡す設定からは、API キー、リクエストヘッダー、プロバイダーオプションを除去します。設定の同期でもこれらのフィールドを除外し、同期を許可した設定のみを送信します。

設計上の意義:設定の分離、通信の暗号化、ローカルでのヒットは、それぞれ異なる問題を解決します。ローカル優先は一部の重複リクエストを避けられますが、リモートの翻訳サービスを実際に呼び出すときには、文章は依然としてデバイスの外へ出ます。
仕組み 実際の動作 維持すべき境界
外部送信禁止 そのジョブの翻訳サービスへの送信を禁止します。ローカルに保存済みの訳文は引き続き検索できます。 コンテキスト候補もポリシー確認を通る必要があります。翻訳メモリの同期は、ユーザーが同期に参加したかに従って別途処理します。
シークレットモード そのシークレットモードのジョブで使う翻訳メモリの検索と、生成した翻訳メモリの保存・同期を行いません。 文章内容を含まないディスパッチとクォータのメタデータは保存します。
翻訳ネットワークリクエスト ブラウザーの認証情報を付けず、リダイレクトを拒否し、宛先オリジンを制限します。リモート接続には HTTPS を使います。 明示的に指定したローカル/プライベートネットワークのホストには HTTP を使用できます。
同期の暗号化 HKDF-SHA-256 でキーを導出し、AES-256-GCM で同期データオブジェクトを暗号化します。 暗号化は同期内容を保護しますが、ローカル設定の分離は別の責務です。
15

設計を、解決すべき問題に立ち返って見る

図 17閲覧の需要から、説明可能な設計上のトレードオフへHTML 設計対照表
同じ文が繰り返し現れる
ページバインディング/共有ジョブの分離+セマンティックキー意味条件が同じジョブを共有し、コンテキストやルールが変われば異なる識別情報を保持します。
状態を 1 層多く管理する代わりに、再利用の境界を明確にします。
目の前のコンテンツがなかなか届かない
可視性の階層分け+小さなバッチでのディスパッチフォーカス中の表示範囲を先に処理し、その後で読む方向の前方をプリロードします。
低優先度の階層は待つ場合があり、各ページが同時に同じ速度で進む保証はありません。
不安定なモデル出力
項目識別番号による対応付け+プレースホルダー検証応答全体のエラーと個別項目の修復を分けます。
解析コストが 1 段増え、意味の正しさは引き続き翻訳品質に依存します。
リクエストがキャンセル/再起動をまたぐ
実行世代+永続化したクォータの差し引きコミット権限の撤回と、既知の消費量の保持を分けます。
保守的な事前差し引きは使用量を過大評価する場合があり、終了不明時はまずディスパッチを停止します。
ウェブページの更新とユーザー操作
バージョン照合+選択範囲の保護+フレームごとの予算コミット前に原文を再照合し、影響を受けるブロックの書き込みを延期します。
翻訳完了から実際の表示まで、さらに待つ場合があります。
ローカルストレージの一時障害
結果の利用可能性と保存完了を分離検証済みの訳文は利用でき、保存失敗時はディスク書き込みだけを再試行します。
保存未完了の結果は、バックグラウンドプロセスの再起動後に復元できる保証はありません。
このアーキテクチャの価値は、「翻訳」を個別に確認できる責務へ分解することにあります。すべての結果に原文の識別情報があり、外部送信のたびに承認を受け、画面更新のたびに現在も適用可能であることを改めて確認します。

このシステムを理解する 8 つの重要な境界

ストリーミング機能とページ表示は別下位層は一時プレビューを提供できますが、ウェブページの段落は最終結果を待ちます。選択テキストの LLM 翻訳はストリーミングテキストで更新します。
リソースは共有しても、入口ごとの差は残るディスパッチ承認は共有しますが、応答解析、コンテキスト、入口の再試行、画面状態はそれぞれ異なります。
厳密一致のメモリと類似検索は別セマンティックキーは完全な翻訳条件の SHA-256 であり、類似した文章が自動的にヒットするわけではありません。
原文の文字列長と token は別2000、900、2400 は異なる箇所の UTF-16 の基準であり、token 数に置き換えてはいけません。
同時実行枠とクォータの差し引きは別終了すれば同時実行枠は解放できますが、送信済みの消費量は時間窓に残ります。
4ms は協調的な予算分割できない単一の更新は予算を超える場合があり、ページのフレーム落ちも起こり得ます。
表示済み、保存済み、同期済みは別結果を利用可能、保存済み、同期完了は、別々に進む 3 つの状態です。
保護措置と品質保証は別プレーンテキスト出力とバージョン確認は表示リスクを減らしますが、翻訳品質、コスト、性能は別途測定する必要があります。

コメントと議論

コメントサービスに接続しています…