cctrans 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Roy Jiang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.hi.md ADDED
@@ -0,0 +1,116 @@
1
+ # cctranslate
2
+
3
+ [English](README.md) | [简体中文](README.zh-Hans.md) | [繁體中文](README.zh-Hant.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Русский](README.ru.md) | **हिन्दी**
4
+
5
+ Claude Code के लिए एक **द्विभाषी ओवरले**: हर जवाब में, मूल अंग्रेज़ी पंक्ति के नीचे अनुवाद की एक पंक्ति (चीनी / जापानी / कोरियाई / रूसी / हिन्दी) — **सीधे बातचीत के अंदर**।
6
+
7
+ ```
8
+ ● I will refactor the auth module to use async tokens.
9
+ ↳ मैं auth मॉड्यूल को async टोकन इस्तेमाल करने के लिए रीफ़ैक्टर करूँगा।
10
+ This touches 3 files and adds a retry layer.
11
+ ↳ यह 3 फ़ाइलों को प्रभावित करता है और एक retry layer जोड़ता है।
12
+ ```
13
+
14
+ - **गैर-विनाशकारी**: अनुवाद केवल स्क्रीन पर दिखता है — ट्रांसक्रिप्ट और मॉडल का कॉन्टेक्स्ट **शुद्ध अंग्रेज़ी में ही रहता है**, इसलिए skills, दस्तावेज़ और कोड अप्रभावित रहते हैं।
15
+ - **हिस्ट्री प्रदूषित नहीं होती, मुख्य लूप के टोकन खर्च नहीं होते**: अनुवाद एक **अलग सस्ते बैकएंड** से होता है, जो आपके Claude Code सत्र से पूरी तरह बाहर है।
16
+ - **एक कुंजी से टॉगल**: डिफ़ॉल्ट रूप से चालू; शुद्ध अंग्रेज़ी/कोड पढ़ना हो तो तुरंत बंद करें।
17
+
18
+ ## यह कैसे काम करता है
19
+
20
+ Claude Code के नेटिव **`MessageDisplay` हुक** (v2.1.152+) पर आधारित: यह हर असिस्टेंट संदेश के रेंडर होते समय सक्रिय होता है और पूर्ण टेक्स्ट खंड (`delta`) हुक को सौंपता है; हुक द्वारा लौटाया गया `displayContent` **केवल स्क्रीन प्रदर्शन को बदलता है**, संग्रहीत संदेश को कभी नहीं।
21
+
22
+ ```
23
+ Claude अंग्रेज़ी स्ट्रीम करता है
24
+ │ हर पूर्ण खंड पर सक्रिय (stdin: turn_id/message_id/index/final/delta)
25
+
26
+ hook/message-display.js ──► src/interleave.js ──► src/translate.js
27
+ (delta पढ़ें, टॉगल जाँचें) (गद्य/कोड/पहले से लक्ष्य भाषा) (बैकएंड + कैश)
28
+
29
+ ▼ displayContent = "अंग्रेज़ी पंक्ति\n↳ अनुवाद पंक्ति" लौटाता है
30
+ Claude Code प्रदर्शन को उसी जगह बदल देता है (मूल ट्रांसक्रिप्ट/कॉन्टेक्स्ट में रहता है)
31
+ ```
32
+
33
+ > CC 2.1.169 पर सत्यापित: `delta` खंड **गैर-अतिव्यापी** पूर्ण खंड हैं (संचित टेक्स्ट नहीं), सामान्य `\n` दोनों भाषाओं को अलग पंक्तियों में दिखाता है, और कोड ब्लॉक / पथ / पहले से लक्ष्य भाषा वाली पंक्तियाँ स्वतः छोड़ दी जाती हैं।
34
+
35
+ ## इंस्टॉल
36
+
37
+ ```bash
38
+ npm install -g cctrans && tt install
39
+
40
+ # from source:
41
+ git clone https://github.com/roy-jiang-opus/cctranslate.git
42
+ cd cctranslate
43
+ node bin/tt.js install # हुक पंजीकृत करता है, tt को ~/.local/bin में लिंक करता है, फिर setup विज़ार्ड चलाता है
44
+ ```
45
+
46
+ फिर **Claude Code को पुनः आरंभ करें** (नया सत्र) ताकि हुक लोड हो। कोई भी संदेश भेजें — जवाब द्विभाषी हो जाएँगे।
47
+
48
+ > `~/.local/bin` आपके PATH में होना चाहिए; अन्यथा alias इस्तेमाल करें:
49
+ > `alias tt='node /path/to/cctranslate/bin/tt.js'`
50
+
51
+ ## उपयोग
52
+
53
+ | कमांड | काम |
54
+ |-------|-----|
55
+ | `tt on` / `tt off` / `tt toggle` | अनुवाद चालू / बंद / टॉगल |
56
+ | `tt status` | स्थिति देखें (टॉगल, हुक, बैकएंड, भाषा) |
57
+ | `tt lang [code]` | लक्ष्य भाषा देखें/सेट करें: `zh-Hans` `zh-Hant` `ja` `ko` `ru` `hi` |
58
+ | `tt backend <id>` | अनुवाद इंजन बदलें |
59
+ | `tt backends` | सभी इंजन और उनकी उपलब्धता सूचीबद्ध करें |
60
+ | `tt setup` | इंटरैक्टिव विज़ार्ड: भाषा, बैकएंड, API कुंजियाँ |
61
+ | `tt key [id] [value]` | `~/.cc-translate/keys.json` में API कुंजियाँ प्रबंधित करें |
62
+ | `tt input on` / `tt input off` | गैर-अंग्रेज़ी इनपुट का अंग्रेज़ी अनुवाद (संदर्भ के रूप में भेजा जाता है) |
63
+ | `tt last [N]` | नवीनतम (या N पीछे का) जवाब टर्मिनल में अनुवाद करें |
64
+ | `tt test <टेक्स्ट>` | इंजन जाँचने के लिए कोई टेक्स्ट अनुवाद करें |
65
+ | `tt install` / `tt uninstall` | हुक पंजीकृत / हटाएँ |
66
+
67
+ **सबसे तेज़ टॉगल**: Claude Code के इनपुट बॉक्स में सीधे `!tt off` या `!tt on` टाइप करें (`!` CC का बिल्ट-इन bash मोड है — कोई मॉडल कॉल नहीं, कोई टोकन नहीं)।
68
+
69
+ ## अनुवाद बैकएंड
70
+
71
+ | बैकएंड | आवश्यक | गति | गुणवत्ता | टिप्पणी |
72
+ |--------|--------|-----|----------|---------|
73
+ | `openai` (key होने पर डिफ़ॉल्ट) | `tt key openai` | ~1.4s/खंड | उच्च | `gpt-4o-mini` बैच पंक्ति अनुवाद, कोड/पथ सुरक्षित |
74
+ | `anthropic` | `tt key anthropic` | ~1s/खंड | उच्च | `claude-haiku-4-5` + structured outputs, सख़्त समान-लंबाई पंक्ति सरणियाँ (~$0.0005/खंड) |
75
+ | `deepl` | `tt key deepl` (मुफ़्त: 5 लाख वर्ण/माह) | ~0.5s/खंड | उच्च | सर्वश्रेष्ठ पारंपरिक MT; array API से पंक्तियाँ स्वतः संरेखित |
76
+ | `azure` | `tt key azure` (मुफ़्त: 20 लाख वर्ण/माह) | ~0.5s/खंड | मध्यम-उच्च | वैकल्पिक `tt key azure-region` |
77
+ | `google` | कुछ नहीं | ~0.3s/खंड | मध्यम | मुफ़्त अनौपचारिक endpoint; **बाक़ी सब विफल होने पर fallback** |
78
+ | `claude-code` | `claude` CLI लॉग-इन | ~3-6s/खंड | उच्च | आपकी **Claude सदस्यता** पर चलता है (`claude -p` headless) — कोई अतिरिक्त लागत नहीं पर धीमा |
79
+
80
+ प्राथमिक बैकएंड विफल/टाइमआउट होने पर शृंखला **स्वतः google पर fallback** करती है — सत्र कभी अवरुद्ध नहीं होता। हर अनुवादित पंक्ति बैकएंड + भाषा + सामग्री हैश से कैश होती है।
81
+
82
+ API कुंजियाँ **केवल** `~/.cc-translate/keys.json` (chmod 600) में रहती हैं — उन्हें `tt setup` / `tt key` से सेट करें या फ़ाइल को सीधे संपादित करें। शेल के पर्यावरण चर कभी नहीं पढ़े जाते, इसलिए इस टूल की कुंजियाँ और टर्मिनल की कुंजियाँ एक-दूसरे को दूषित नहीं करतीं।
83
+
84
+ बाक़ी सेटिंग्स (बैकएंड, भाषा, मार्कर, मॉडल, Azure एंडपॉइंट) `~/.cc-translate/state.json` में हैं — `tt` कमांड से बदलें या फ़ाइल को सीधे संपादित करें।
85
+
86
+ ## भाषाएँ
87
+
88
+ लक्ष्य भाषाएँ **CJK + रूसी + हिन्दी** हैं (गैर-लैटिन लिपियाँ, इसलिए "यह पंक्ति पहले से लक्ष्य भाषा में है" Unicode रेंज से मुफ़्त में पहचानकर छोड़ी जा सकती है):
89
+
90
+ ```bash
91
+ tt lang ja # जापानी
92
+ tt lang ko # कोरियाई
93
+ tt lang ru # रूसी
94
+ tt lang hi # हिन्दी
95
+ tt lang zh-Hant # पारंपरिक चीनी
96
+ tt lang zh-Hans # सरलीकृत चीनी (डिफ़ॉल्ट)
97
+ ```
98
+
99
+ चीनी के लिए BCP-47 **लिपि कोड** (`zh-Hans`/`zh-Hant`) इस्तेमाल होते हैं — पारंपरिक चीनी एक लिपि है, क्षेत्र नहीं; `zh-CN` / `zh-TW` उपनाम के रूप में स्वीकार्य हैं और स्वतः सामान्यीकृत होते हैं। भाषा बदलना तुरंत प्रभावी होता है (हुक हर कॉल पर स्थिति पढ़ता है); हर भाषा का कैश स्वतंत्र है।
100
+
101
+ ## इनपुट अनुवाद
102
+
103
+ `tt input on` एक `UserPromptSubmit` हुक सक्षम करता है: जब आपका प्रॉम्प्ट अधिकतर गैर-अंग्रेज़ी हो, तो अंग्रेज़ी अनुवाद संदर्भ के रूप में मॉडल को संलग्न होता है जिसे वह आधिकारिक निर्देश मानता है — आप अपनी भाषा में लिखते रहें, मॉडल अंग्रेज़ी में काम करता है। (CC 2.1.169 पर सत्यापित: हुक प्रॉम्प्ट को फिर से लिख नहीं सकते, इसलिए मूल इतिहास में रहता है और अंग्रेज़ी साथ में।) अंग्रेज़ी इनपुट अपरिवर्तित गुज़रता है; किसी त्रुटि पर प्रॉम्प्ट सुरक्षित रूप से ज्यों का त्यों भेजा जाता है।
104
+
105
+ ## व्यवहार और सीमाएँ (सत्यापित)
106
+
107
+ - हुक **स्ट्रीमिंग के दौरान** हर खंड पर सक्रिय होता है; हर खंड का अनुवाद होकर उसी जगह बदला जाता है — अनुवाद अंग्रेज़ी के साथ-साथ क्रमिक रूप से दिखता है।
108
+ - हुक का टाइमआउट **10 सेकंड** है; यह टूल आंतरिक रूप से 9s पर गार्ड करता है। कोई भी त्रुटि / टाइमआउट / अधिक लंबाई (>9,000 वर्ण) **सुरक्षित रूप से मूल अंग्रेज़ी पर fallback** करती है — सत्र कभी नहीं अटकता।
109
+ - हर अनुवादित पंक्ति सामग्री हैश से **कैश** होती है (`~/.cc-translate/cache`); री-पेंट और दोहराए टेक्स्ट की लागत शून्य।
110
+ - `openai` के साथ हर खंड लगभग एक API कॉल (~$0.0001) और शुद्ध अंग्रेज़ी की तुलना में ~1s/खंड की देरी; `google` तेज़ है पर गुणवत्ता थोड़ी कम।
111
+
112
+ ## अनइंस्टॉल
113
+
114
+ ```bash
115
+ node bin/tt.js uninstall # हुक हटाता है; Claude Code पुनः आरंभ करने पर प्रभावी
116
+ ```
package/README.ja.md ADDED
@@ -0,0 +1,116 @@
1
+ # cctranslate
2
+
3
+ [English](README.md) | [简体中文](README.zh-Hans.md) | [繁體中文](README.zh-Hant.md) | **日本語** | [한국어](README.ko.md) | [Русский](README.ru.md) | [हिन्दी](README.hi.md)
4
+
5
+ Claude Code に**バイリンガル表示**を追加:すべての返信で、元の英語行の下に訳文(中/日/韓/露/ヒンディー)が一行ずつ、**会話の中にそのまま**表示されます。
6
+
7
+ ```
8
+ ● I will refactor the auth module to use async tokens.
9
+ ↳ auth モジュールを非同期トークンを使うようにリファクタリングします。
10
+ This touches 3 files and adds a retry layer.
11
+ ↳ これは 3 つのファイルに影響し、リトライ層を追加します。
12
+ ```
13
+
14
+ - **非破壊**:画面に訳文が追加されるだけで、トランスクリプトとモデルのコンテキストは**純粋な英語のまま**——技術ドキュメント、skills、コードには一切影響しません。
15
+ - **履歴を汚さない・メインループのトークンを消費しない**:翻訳は**独立した低コストのバックエンド**で実行され、Claude Code セッションとは完全に無関係です。
16
+ - **ワンキーでオン/オフ**:デフォルトは常時オン;英語/コードだけ読みたいときはすぐオフにできます。
17
+
18
+ ## 仕組み
19
+
20
+ Claude Code ネイティブの **`MessageDisplay` フック**(v2.1.152+)を利用:アシスタントメッセージのレンダリング時に発火し、完成したテキスト断片(`delta`)をフックに渡します。フックが返す `displayContent` は**画面表示のみを置き換え**、保存されたメッセージは変更しません。
21
+
22
+ ```
23
+ Claude が英語をストリーミング出力
24
+ │ 断片完成ごとに発火(stdin: turn_id/message_id/index/final/delta)
25
+
26
+ hook/message-display.js ──► src/interleave.js ──► src/translate.js
27
+ (delta 読取・トグル確認) (散文/コード/既に目標言語を判別) (マルチバックエンド + キャッシュ)
28
+
29
+ ▼ displayContent = "英語行\n↳ 訳文行" を返す
30
+ Claude Code がその場で表示を置換(原文はトランスクリプト/コンテキストに残る)
31
+ ```
32
+
33
+ > CC 2.1.169 で実測済み:`delta` は**重複しない**完成済み断片(累積テキストではない)、通常の `\n` で 2 言語が別行に表示され、コードブロック/パス/既に目標言語の行は自動スキップされます。
34
+
35
+ ## インストール
36
+
37
+ ```bash
38
+ npm install -g cctrans && tt install
39
+
40
+ # from source:
41
+ git clone https://github.com/roy-jiang-opus/cctranslate.git
42
+ cd cctranslate
43
+ node bin/tt.js install # フック登録・tt を ~/.local/bin にリンク後、setup ウィザードを実行
44
+ ```
45
+
46
+ その後 **Claude Code を再起動**(新セッション)してフックを読み込みます。メッセージを送ると、返信がバイリンガルになります。
47
+
48
+ > `~/.local/bin` が PATH に必要;なければエイリアスを:
49
+ > `alias tt='node /path/to/cctranslate/bin/tt.js'`
50
+
51
+ ## 使い方
52
+
53
+ | コマンド | 動作 |
54
+ |----------|------|
55
+ | `tt on` / `tt off` / `tt toggle` | 翻訳のオン / オフ / 切替 |
56
+ | `tt status` | 状態表示(トグル、フック、バックエンド、言語) |
57
+ | `tt lang [code]` | 目標言語の表示/設定:`zh-Hans` `zh-Hant` `ja` `ko` `ru` `hi` |
58
+ | `tt backend <id>` | 翻訳エンジンの切替 |
59
+ | `tt backends` | 全エンジンと利用可否を一覧 |
60
+ | `tt setup` | 対話式ウィザード:言語、バックエンド、API キー |
61
+ | `tt key [id] [value]` | `~/.cc-translate/keys.json` の API キーを管理 |
62
+ | `tt input on` / `tt input off` | 非英語の入力を英語に翻訳(コンテキストとして送信) |
63
+ | `tt last [N]` | 最新(または N 個前)の返信をターミナルに翻訳 |
64
+ | `tt test <テキスト>` | テキストを翻訳してエンジンを検証 |
65
+ | `tt install` / `tt uninstall` | フックの登録 / 削除 |
66
+
67
+ **最速のトグル**:Claude Code の入力欄に `!tt off` / `!tt on` と直接入力(`!` は CC 内蔵の bash モード——モデル呼び出しなし、トークン消費なし)。
68
+
69
+ ## 翻訳バックエンド
70
+
71
+ | バックエンド | 前提 | 速度 | 品質 | 備考 |
72
+ |--------------|------|------|------|------|
73
+ | `openai`(キーがあればデフォルト) | `tt key openai` | ~1.4s/断片 | 高 | `gpt-4o-mini` の行バッチ翻訳、コード/パスを保持 |
74
+ | `anthropic` | `tt key anthropic` | ~1s/断片 | 高 | `claude-haiku-4-5` + structured outputs、厳密な等長行配列(約 $0.0005/断片) |
75
+ | `deepl` | `tt key deepl`(無料枠 50 万字/月) | ~0.5s/断片 | 高 | 従来型 MT の最高品質;配列 API で行が自然に揃う |
76
+ | `azure` | `tt key azure`(無料 200 万字/月) | ~0.5s/断片 | 中高 | `tt key azure-region` も指定可 |
77
+ | `google` | 不要 | ~0.3s/断片 | 中 | 無料の非公式エンドポイント;**全バックエンド失敗時のフォールバック** |
78
+ | `claude-code` | `claude` CLI ログイン済み | ~3-6s/断片 | 高 | あなたの **Claude サブスクリプション**で実行(`claude -p` headless)——追加費用ゼロだが明らかに遅い |
79
+
80
+ プライマリが失敗/タイムアウトすると自動的に **google にフォールバック**——セッションが止まることはありません。訳文は「バックエンド+言語+内容」のハッシュでキャッシュされます。
81
+
82
+ API キーは `~/.cc-translate/keys.json`(chmod 600)**のみ**に保存されます——`tt setup` / `tt key` で設定するか、ファイルを直接編集してください。シェルの環境変数は一切読み取られないため、このツールのキーとターミナルのキーが互いに汚染されることはありません。
83
+
84
+ その他の設定(バックエンド、言語、マーカー、モデル、Azure エンドポイント)は `~/.cc-translate/state.json` にあります——`tt` コマンドで変更するか、ファイルを直接編集してください。
85
+
86
+ ## 多言語
87
+
88
+ 目標言語は **CJK + ロシア語 + ヒンディー語**(非ラテン文字なので、Unicode 範囲により「この行は既に目標言語」をゼロコストで判定してスキップできます):
89
+
90
+ ```bash
91
+ tt lang ja # 日本語
92
+ tt lang ko # 韓国語
93
+ tt lang ru # ロシア語
94
+ tt lang hi # ヒンディー語
95
+ tt lang zh-Hant # 繁体字中国語
96
+ tt lang zh-Hans # 簡体字中国語(デフォルト)
97
+ ```
98
+
99
+ 中国語は BCP-47 の**文字コード**(`zh-Hans`/`zh-Hant`)を採用——繁体字は地域ではなく文字体系です;`zh-CN` / `zh-TW` はエイリアスとして引き続き使え、自動的に正規化されます。言語切替は即座に有効(フックは呼び出しごとに状態を読む);言語ごとにキャッシュは独立しています。
100
+
101
+ ## 入力翻訳
102
+
103
+ `tt input on` で `UserPromptSubmit` フックが有効になります:入力の大半が非英語の場合、英語訳がコンテキストとしてモデルに添付され、正規の指示として扱われます——あなたは母語で入力し続け、モデルは英語で動きます。(CC 2.1.169 で検証済み:フックは prompt 自体を書き換えられないため、原文は履歴に残り英語が併記されます。)英語の入力はそのまま通過;エラー時は安全にそのまま送信されます。
104
+
105
+ ## 動作と制限(検証済み)
106
+
107
+ - フックは**ストリーミング中**に断片ごとに発火し、断片ごとに翻訳してその場で置換——訳文は英語と並んで段階的に現れます。
108
+ - フックのタイムアウトは **10 秒**;本ツールは内部で 9 秒のガードを持ちます。エラー/タイムアウト/超過(>9,000 文字)はすべて**元の英語に安全にフォールバック**——セッションを止めることはありません。
109
+ - 訳文は内容ハッシュで**キャッシュ**(`~/.cc-translate/cache`);再描画や繰り返しテキストはコストゼロ。
110
+ - `openai` 使用時は断片ごとに約 1 回の API 呼び出し(~$0.0001)、純英語より約 1 秒/断片の遅延;`google` はより速いが品質はやや低め。
111
+
112
+ ## アンインストール
113
+
114
+ ```bash
115
+ node bin/tt.js uninstall # フックを削除;Claude Code の再起動で反映
116
+ ```
package/README.ko.md ADDED
@@ -0,0 +1,116 @@
1
+ # cctranslate
2
+
3
+ [English](README.md) | [简体中文](README.zh-Hans.md) | [繁體中文](README.zh-Hant.md) | [日本語](README.ja.md) | **한국어** | [Русский](README.ru.md) | [हिन्दी](README.hi.md)
4
+
5
+ Claude Code에 **이중 언어 오버레이**를 추가합니다: 모든 응답에서 원본 영어 줄 아래에 번역(중/일/한/러/힌디)이 한 줄씩, **대화 안에 그대로** 표시됩니다.
6
+
7
+ ```
8
+ ● I will refactor the auth module to use async tokens.
9
+ ↳ auth 모듈을 비동기 토큰을 사용하도록 리팩토링하겠습니다.
10
+ This touches 3 files and adds a retry layer.
11
+ ↳ 이 작업은 3개 파일에 영향을 주고 재시도 레이어를 추가합니다.
12
+ ```
13
+
14
+ - **비파괴적**: 화면에 번역이 추가될 뿐, 트랜스크립트와 모델의 컨텍스트는 **순수 영어 그대로** 유지됩니다 — 기술 문서, skills, 코드에 전혀 영향이 없습니다.
15
+ - **히스토리 오염 없음, 메인 루프 토큰 소비 없음**: 번역은 **독립적인 저비용 백엔드**에서 실행되며 Claude Code 세션과 완전히 무관합니다.
16
+ - **원키 토글**: 기본은 항상 켜짐; 영어/코드만 읽고 싶을 때 즉시 끌 수 있습니다.
17
+
18
+ ## 작동 원리
19
+
20
+ Claude Code 네이티브 **`MessageDisplay` 훅**(v2.1.152+)을 활용합니다: 어시스턴트 메시지가 렌더링될 때 발화하여 완성된 텍스트 조각(`delta`)을 훅에 전달하고, 훅이 반환하는 `displayContent`는 **화면 표시만 교체**하며 저장된 메시지는 변경하지 않습니다.
21
+
22
+ ```
23
+ Claude가 영어를 스트리밍 출력
24
+ │ 조각 완성마다 발화 (stdin: turn_id/message_id/index/final/delta)
25
+
26
+ hook/message-display.js ──► src/interleave.js ──► src/translate.js
27
+ (delta 읽기·토글 확인) (산문/코드/이미 대상 언어 분류) (멀티 백엔드 + 캐시)
28
+
29
+ ▼ displayContent = "영어 줄\n↳ 번역 줄" 반환
30
+ Claude Code가 그 자리에서 표시 교체 (원문은 트랜스크립트/컨텍스트에 유지)
31
+ ```
32
+
33
+ > CC 2.1.169에서 검증됨: `delta`는 **겹치지 않는** 완성 조각(누적 텍스트 아님)이며, 일반 `\n`으로 두 언어가 별도 줄에 표시되고, 코드 블록/경로/이미 대상 언어인 줄은 자동으로 건너뜁니다.
34
+
35
+ ## 설치
36
+
37
+ ```bash
38
+ npm install -g cctrans && tt install
39
+
40
+ # from source:
41
+ git clone https://github.com/roy-jiang-opus/cctranslate.git
42
+ cd cctranslate
43
+ node bin/tt.js install # 훅 등록, tt를 ~/.local/bin에 링크 후 setup 마법사 실행
44
+ ```
45
+
46
+ 그다음 **Claude Code를 재시작**(새 세션)하여 훅을 로드합니다. 아무 메시지나 보내면 응답이 이중 언어로 표시됩니다.
47
+
48
+ > `~/.local/bin`이 PATH에 있어야 합니다; 아니면 별칭을 사용하세요:
49
+ > `alias tt='node /path/to/cctranslate/bin/tt.js'`
50
+
51
+ ## 사용법
52
+
53
+ | 명령 | 동작 |
54
+ |------|------|
55
+ | `tt on` / `tt off` / `tt toggle` | 번역 켜기 / 끄기 / 전환 |
56
+ | `tt status` | 상태 표시 (토글, 훅, 백엔드, 언어) |
57
+ | `tt lang [code]` | 대상 언어 표시/설정: `zh-Hans` `zh-Hant` `ja` `ko` `ru` `hi` |
58
+ | `tt backend <id>` | 번역 엔진 전환 |
59
+ | `tt backends` | 모든 엔진과 가용성 나열 |
60
+ | `tt setup` | 대화형 마법사: 언어, 백엔드, API 키 |
61
+ | `tt key [id] [value]` | `~/.cc-translate/keys.json`의 API 키 관리 |
62
+ | `tt input on` / `tt input off` | 비영어 입력을 영어로 번역 (컨텍스트로 전송) |
63
+ | `tt last [N]` | 최신(또는 N개 전) 응답을 터미널에 번역 |
64
+ | `tt test <텍스트>` | 텍스트를 번역하여 엔진 검증 |
65
+ | `tt install` / `tt uninstall` | 훅 등록 / 제거 |
66
+
67
+ **가장 빠른 토글**: Claude Code 입력창에 `!tt off` / `!tt on`을 직접 입력 (`!`는 CC 내장 bash 모드 — 모델 호출 없음, 토큰 소비 없음).
68
+
69
+ ## 번역 백엔드
70
+
71
+ | 백엔드 | 요구사항 | 속도 | 품질 | 비고 |
72
+ |--------|----------|------|------|------|
73
+ | `openai` (키 있으면 기본) | `tt key openai` | ~1.4s/조각 | 높음 | `gpt-4o-mini` 줄 배치 번역, 코드/경로 보존 |
74
+ | `anthropic` | `tt key anthropic` | ~1s/조각 | 높음 | `claude-haiku-4-5` + structured outputs, 엄격한 등길이 줄 배열 (~$0.0005/조각) |
75
+ | `deepl` | `tt key deepl` (무료 50만 자/월) | ~0.5s/조각 | 높음 | 전통 MT 최고 품질; 배열 API로 줄이 자연히 정렬 |
76
+ | `azure` | `tt key azure` (무료 200만 자/월) | ~0.5s/조각 | 중상 | `tt key azure-region` 추가 가능 |
77
+ | `google` | 없음 | ~0.3s/조각 | 중 | 무료 비공식 엔드포인트; **모든 백엔드 실패 시 폴백** |
78
+ | `claude-code` | `claude` CLI 로그인됨 | ~3-6s/조각 | 높음 | **Claude 구독**으로 실행 (`claude -p` headless) — 추가 비용 없지만 눈에 띄게 느림 |
79
+
80
+ 기본 백엔드가 실패/타임아웃하면 자동으로 **google로 폴백** — 세션이 멈추는 일은 없습니다. 모든 번역 줄은 "백엔드+언어+내용" 해시로 캐시됩니다.
81
+
82
+ API 키는 **오직** `~/.cc-translate/keys.json`(chmod 600)에만 저장됩니다 — `tt setup` / `tt key`로 설정하거나 파일을 직접 편집하세요. 셸 환경 변수는 절대 읽지 않으므로 이 도구의 키와 터미널의 키가 서로 오염되지 않습니다.
83
+
84
+ 나머지 설정(백엔드, 언어, 마커, 모델, Azure 엔드포인트)은 `~/.cc-translate/state.json`에 있습니다 — `tt` 명령으로 변경하거나 파일을 직접 편집하세요.
85
+
86
+ ## 다국어
87
+
88
+ 대상 언어는 **CJK + 러시아어 + 힌디어**를 지원합니다 (비라틴 문자이므로 유니코드 범위로 "이 줄은 이미 대상 언어"를 무비용 판별하여 건너뜁니다):
89
+
90
+ ```bash
91
+ tt lang ja # 일본어
92
+ tt lang ko # 한국어
93
+ tt lang ru # 러시아어
94
+ tt lang hi # 힌디어
95
+ tt lang zh-Hant # 번체 중국어
96
+ tt lang zh-Hans # 간체 중국어 (기본)
97
+ ```
98
+
99
+ 중국어는 BCP-47 **문자 코드**(`zh-Hans`/`zh-Hant`)를 사용합니다 — 번체는 지역이 아니라 문자 체계입니다; `zh-CN` / `zh-TW`는 별칭으로 계속 사용 가능하며 자동으로 정규화됩니다. 언어 전환은 즉시 적용됩니다 (훅이 호출마다 상태를 읽음); 언어별 캐시는 독립적입니다.
100
+
101
+ ## 입력 번역
102
+
103
+ `tt input on`은 `UserPromptSubmit` 훅을 활성화합니다: 입력이 대부분 비영어일 때 영어 번역이 컨텍스트로 모델에 첨부되어 정식 지시로 취급됩니다 — 당신은 모국어로 계속 입력하고 모델은 영어로 작동합니다. (CC 2.1.169에서 검증됨: 훅은 prompt 자체를 재작성할 수 없으므로 원문은 히스토리에 남고 영어가 함께 첨부됩니다.) 영어 입력은 그대로 통과; 오류 시 안전하게 원문 그대로 전송됩니다.
104
+
105
+ ## 동작과 제한 (검증됨)
106
+
107
+ - 훅은 **스트리밍 중** 조각마다 발화하며, 조각별로 번역하여 그 자리에서 교체 — 번역이 영어와 함께 점진적으로 나타납니다.
108
+ - 훅 타임아웃은 **10초**; 이 도구는 내부적으로 9초 가드를 둡니다. 오류/타임아웃/초과(>9,000자)는 모두 **원본 영어로 안전하게 폴백** — 세션을 멈추지 않습니다.
109
+ - 모든 번역 줄은 내용 해시로 **캐시**됩니다 (`~/.cc-translate/cache`); 다시 그리기와 반복 텍스트는 비용이 없습니다.
110
+ - `openai` 사용 시 조각당 약 1회 API 호출(~$0.0001), 순수 영어 대비 조각당 약 1초 지연; `google`은 더 빠르지만 품질이 약간 낮습니다.
111
+
112
+ ## 제거
113
+
114
+ ```bash
115
+ node bin/tt.js uninstall # 훅 제거; Claude Code 재시작으로 반영
116
+ ```
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # cctranslate
2
+
3
+ **English** | [简体中文](README.zh-Hans.md) | [繁體中文](README.zh-Hant.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Русский](README.ru.md) | [हिन्दी](README.hi.md)
4
+
5
+ A **bilingual overlay** for Claude Code: every reply gets a translated line (Chinese / Japanese / Korean / Russian / Hindi) under each original English line, **right in the conversation**.
6
+
7
+ ```
8
+ ● I will refactor the auth module to use async tokens.
9
+ ↳ 我将重构 auth 模块以使用异步令牌。
10
+ This touches 3 files and adds a retry layer.
11
+ ↳ 这涉及 3 个文件并添加重试层。
12
+ ```
13
+
14
+ - **Non-destructive**: the translation only appears on screen — the transcript and the model's context **stay pure English**, so skills, docs, and code are unaffected.
15
+ - **No history pollution, no main-loop tokens**: translation runs through a **separate cheap backend**, completely outside your Claude Code session.
16
+ - **One-key toggle**: on by default; switch it off instantly when you want plain English.
17
+
18
+ ## How it works
19
+
20
+ Built on Claude Code's native **`MessageDisplay` hook** (v2.1.152+): it fires while each assistant message renders, handing the hook each completed text chunk (`delta`); the `displayContent` the hook returns **replaces the on-screen rendering only**, never the stored message.
21
+
22
+ ```
23
+ Claude streams English
24
+ │ fires per completed chunk (stdin: turn_id/message_id/index/final/delta)
25
+
26
+ hook/message-display.js ──► src/interleave.js ──► src/translate.js
27
+ (read delta, check toggle) (prose / code / already-target) (backends + cache)
28
+
29
+ ▼ returns displayContent = "EN line\n↳ translated line"
30
+ Claude Code replaces the display in place (original stays in transcript/context)
31
+ ```
32
+
33
+ > Verified on CC 2.1.169: deltas are **non-overlapping** completed chunks (not accumulated text), a plain `\n` renders the two languages on separate lines, and code blocks / paths / already-translated lines are skipped automatically.
34
+
35
+ ## Install
36
+
37
+ ```bash
38
+ npm install -g cctrans && tt install
39
+
40
+ # from source:
41
+ git clone https://github.com/roy-jiang-opus/cctranslate.git
42
+ cd cctranslate
43
+ node bin/tt.js install # registers the hooks, links tt into ~/.local/bin, then runs the setup wizard
44
+ ```
45
+
46
+ Then **restart Claude Code** (new session) so the hook loads. Send any message — replies become bilingual.
47
+
48
+ > Requires `~/.local/bin` on your PATH; otherwise use an alias:
49
+ > `alias tt='node /path/to/cctranslate/bin/tt.js'`
50
+
51
+ ## Usage
52
+
53
+ | Command | What it does |
54
+ |---------|--------------|
55
+ | `tt on` / `tt off` / `tt toggle` | turn translation on / off / toggle |
56
+ | `tt status` | show state (toggle, hook, backend, language) |
57
+ | `tt lang [code]` | show/set target language: `zh-Hans` `zh-Hant` `ja` `ko` `ru` `hi` |
58
+ | `tt backend <id>` | switch translation engine |
59
+ | `tt backends` | list engines and their availability |
60
+ | `tt setup` | interactive wizard: language, backend, API keys |
61
+ | `tt key [id] [value]` | manage API keys in `~/.cc-translate/keys.json` |
62
+ | `tt input on` / `tt input off` | translate non-English input to English (sent as context) |
63
+ | `tt last [N]` | translate the latest (or N-back) reply to the terminal |
64
+ | `tt test <text>` | translate ad-hoc text to verify the engine |
65
+ | `tt install` / `tt uninstall` | register / remove the hook |
66
+
67
+ **Fastest toggle**: type `!tt off` or `!tt on` inside Claude Code's input box (`!` is CC's built-in bash mode — no model call, no tokens).
68
+
69
+ ## Translation backends
70
+
71
+ | Backend | Requires | Speed | Quality | Notes |
72
+ |---------|----------|-------|---------|-------|
73
+ | `openai` (default when key present) | `tt key openai` | ~1.4s/chunk | high | `gpt-4o-mini` batched line translation, preserves code/paths |
74
+ | `anthropic` | `tt key anthropic` | ~1s/chunk | high | `claude-haiku-4-5` + structured outputs, strict same-length line arrays (~$0.0005/chunk) |
75
+ | `deepl` | `tt key deepl` (free tier: 500k chars/mo) | ~0.5s/chunk | high | best traditional MT; array API aligns lines natively |
76
+ | `azure` | `tt key azure` (free: 2M chars/mo) | ~0.5s/chunk | mid-high | optionally `tt key azure-region` |
77
+ | `google` | nothing | ~0.3s/chunk | mid | free unofficial endpoint; **the fallback when everything else fails** |
78
+ | `claude-code` | `claude` CLI logged in | ~3-6s/chunk | high | runs on your **Claude subscription** (`claude -p` headless) — zero extra cost but noticeably slower |
79
+
80
+ If the primary backend fails or times out, the chain **falls back to google** — the session is never blocked. Every translated line is cached by backend + language + content hash.
81
+
82
+ API keys live **only** in `~/.cc-translate/keys.json` (chmod 600) — set them with `tt setup` / `tt key`, or edit the file directly. Shell environment variables are never read, so this tool's keys and your terminal's keys can't contaminate each other.
83
+
84
+ All other settings (backend, language, marker, models, Azure endpoint) live in `~/.cc-translate/state.json` — change them via `tt` commands or edit the file directly.
85
+
86
+ ## Languages
87
+
88
+ Target languages cover **CJK + Russian + Hindi** (non-Latin scripts, so "this line is already in the target language" can be detected for free via Unicode ranges and skipped):
89
+
90
+ ```bash
91
+ tt lang ja # Japanese
92
+ tt lang ko # Korean
93
+ tt lang ru # Russian
94
+ tt lang hi # Hindi
95
+ tt lang zh-Hant # Traditional Chinese
96
+ tt lang zh-Hans # Simplified Chinese (default)
97
+ ```
98
+
99
+ Chinese uses BCP-47 **script** codes (`zh-Hans`/`zh-Hant`) — Traditional Chinese is a script, not a region; `zh-CN` / `zh-TW` are accepted as aliases and normalized. Switching takes effect immediately (the hook re-reads state on every call); each language has its own cache.
100
+
101
+ ## Input translation
102
+
103
+ `tt input on` enables a `UserPromptSubmit` hook: when your prompt is mostly non-English, an English translation is attached as context the model treats as the canonical instruction — you keep typing in your language, the model works in English. (Verified on CC 2.1.169: hooks cannot rewrite the prompt itself, so the original stays in history with the English alongside.) English prompts pass through untouched; any error falls back to sending your prompt as-is.
104
+
105
+ ## Behavior & limits (verified)
106
+
107
+ - The hook fires **per chunk during streaming**; each chunk is translated and replaced in place — translations appear progressively alongside the English.
108
+ - The hook has a **10-second** timeout; this tool guards at 9s internally. Any error / timeout / oversized chunk (>9,000 chars) **falls back safely to the original English** — it never stalls the session.
109
+ - Every translated line is **cached** by content hash (`~/.cc-translate/cache`); repaints and repeated text cost nothing.
110
+ - With `openai`, each chunk is roughly one API call (~$0.0001) and adds about 1s of latency vs. plain English; `google` is faster with slightly lower quality.
111
+
112
+ ## Uninstall
113
+
114
+ ```bash
115
+ node bin/tt.js uninstall # removes the hook; restart Claude Code to take effect
116
+ ```
package/README.ru.md ADDED
@@ -0,0 +1,117 @@
1
+ # cctranslate
2
+
3
+ [English](README.md) | [简体中文](README.zh-Hans.md) | [繁體中文](README.zh-Hant.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | **Русский** | [हिन्दी](README.hi.md)
4
+
5
+ **Двуязычный оверлей** для Claude Code: в каждом ответе под каждой строкой оригинального английского текста появляется строка перевода (китайский / японский / корейский / русский / хинди) — **прямо в диалоге**.
6
+
7
+ ```
8
+ ● I will refactor the auth module to use async tokens.
9
+ ↳ Я отрефакторю модуль auth для использования асинхронных токенов.
10
+ This touches 3 files and adds a retry layer.
11
+ ↳ Это затрагивает 3 файла и добавляет слой повторных попыток.
12
+ ```
13
+
14
+ - **Неразрушающий**: перевод появляется только на экране — транскрипт и контекст модели **остаются чисто английскими**, так что skills, документация и код не затрагиваются.
15
+ - **Не загрязняет историю, не тратит токены основного цикла**: перевод выполняется через **отдельный дешёвый бэкенд**, полностью вне вашей сессии Claude Code.
16
+ - **Переключение одной командой**: включён по умолчанию; мгновенно выключается, когда нужен чистый английский.
17
+
18
+ ## Как это работает
19
+
20
+ Использует нативный хук **`MessageDisplay`** Claude Code (v2.1.152+): он срабатывает при рендеринге каждого сообщения ассистента, передавая хуку завершённый фрагмент текста (`delta`); возвращаемый хуком `displayContent` **заменяет только отображение на экране**, не меняя сохранённое сообщение.
21
+
22
+ ```
23
+ Claude стримит английский текст
24
+ │ срабатывает на каждый фрагмент (stdin: turn_id/message_id/index/final/delta)
25
+
26
+ hook/message-display.js ──► src/interleave.js ──► src/translate.js
27
+ (читает delta, проверяет (проза / код / уже на целевом (бэкенды + кэш)
28
+ переключатель) языке)
29
+
30
+ ▼ возвращает displayContent = "строка EN\n↳ строка перевода"
31
+ Claude Code заменяет отображение на месте (оригинал остаётся в транскрипте/контексте)
32
+ ```
33
+
34
+ > Проверено на CC 2.1.169: фрагменты `delta` **не перекрываются** (это не накапливающийся текст), обычный `\n` выводит два языка на отдельных строках, а блоки кода / пути / строки уже на целевом языке пропускаются автоматически.
35
+
36
+ ## Установка
37
+
38
+ ```bash
39
+ npm install -g cctrans && tt install
40
+
41
+ # from source:
42
+ git clone https://github.com/roy-jiang-opus/cctranslate.git
43
+ cd cctranslate
44
+ node bin/tt.js install # регистрирует хуки, линкует tt в ~/.local/bin, затем запускает мастер настройки
45
+ ```
46
+
47
+ Затем **перезапустите Claude Code** (новая сессия), чтобы хук загрузился. Отправьте любое сообщение — ответы станут двуязычными.
48
+
49
+ > Требуется `~/.local/bin` в PATH; иначе используйте алиас:
50
+ > `alias tt='node /path/to/cctranslate/bin/tt.js'`
51
+
52
+ ## Использование
53
+
54
+ | Команда | Действие |
55
+ |---------|----------|
56
+ | `tt on` / `tt off` / `tt toggle` | включить / выключить / переключить перевод |
57
+ | `tt status` | показать состояние (переключатель, хук, бэкенд, язык) |
58
+ | `tt lang [code]` | показать/задать целевой язык: `zh-Hans` `zh-Hant` `ja` `ko` `ru` `hi` |
59
+ | `tt backend <id>` | сменить движок перевода |
60
+ | `tt backends` | список движков и их доступность |
61
+ | `tt setup` | интерактивный мастер: язык, бэкенд, API-ключи |
62
+ | `tt key [id] [value]` | управление ключами в `~/.cc-translate/keys.json` |
63
+ | `tt input on` / `tt input off` | переводить неанглийский ввод на английский (отправляется как контекст) |
64
+ | `tt last [N]` | перевести последний (или N-й с конца) ответ в терминал |
65
+ | `tt test <текст>` | перевести произвольный текст для проверки движка |
66
+ | `tt install` / `tt uninstall` | зарегистрировать / удалить хук |
67
+
68
+ **Самый быстрый способ переключения**: набрать `!tt off` или `!tt on` прямо в поле ввода Claude Code (`!` — встроенный bash-режим CC: без вызова модели, без токенов).
69
+
70
+ ## Бэкенды перевода
71
+
72
+ | Бэкенд | Требует | Скорость | Качество | Примечание |
73
+ |--------|---------|----------|----------|------------|
74
+ | `openai` (по умолчанию при наличии ключа) | `tt key openai` | ~1.4с/фрагмент | высокое | `gpt-4o-mini`, пакетный перевод строк, сохраняет код/пути |
75
+ | `anthropic` | `tt key anthropic` | ~1с/фрагмент | высокое | `claude-haiku-4-5` + structured outputs, строгие массивы строк равной длины (~$0.0005/фрагмент) |
76
+ | `deepl` | `tt key deepl` (бесплатно: 500 тыс. симв./мес) | ~0.5с/фрагмент | высокое | лучший классический MT; массивный API нативно выравнивает строки |
77
+ | `azure` | `tt key azure` (бесплатно: 2 млн симв./мес) | ~0.5с/фрагмент | среднее+ | опционально `tt key azure-region` |
78
+ | `google` | ничего | ~0.3с/фрагмент | среднее | бесплатный неофициальный эндпоинт; **резерв при отказе остальных** |
79
+ | `claude-code` | выполнен вход в `claude` CLI | ~3-6с/фрагмент | высокое | работает на вашей **подписке Claude** (`claude -p` headless) — без доплат, но заметно медленнее |
80
+
81
+ При сбое/таймауте основного бэкенда цепочка **автоматически откатывается на google** — сессия никогда не блокируется. Каждая переведённая строка кэшируется по хэшу «бэкенд + язык + содержимое».
82
+
83
+ API-ключи хранятся **только** в `~/.cc-translate/keys.json` (chmod 600) — задавайте их через `tt setup` / `tt key` или редактируйте файл напрямую. Переменные окружения оболочки никогда не читаются, поэтому ключи инструмента и ключи терминала не загрязняют друг друга.
84
+
85
+ Остальные настройки (бэкенд, язык, маркер, модели, эндпоинт Azure) находятся в `~/.cc-translate/state.json` — меняйте их командами `tt` или правьте файл напрямую.
86
+
87
+ ## Языки
88
+
89
+ Целевые языки — **CJK + русский + хинди** (нелатинские письменности, поэтому «строка уже на целевом языке» определяется бесплатно по диапазонам Unicode и пропускается):
90
+
91
+ ```bash
92
+ tt lang ja # японский
93
+ tt lang ko # корейский
94
+ tt lang ru # русский
95
+ tt lang hi # хинди
96
+ tt lang zh-Hant # традиционный китайский
97
+ tt lang zh-Hans # упрощённый китайский (по умолчанию)
98
+ ```
99
+
100
+ Для китайского используются **коды письменности** BCP-47 (`zh-Hans`/`zh-Hant`) — традиционный китайский это письменность, а не регион; `zh-CN` / `zh-TW` принимаются как алиасы и нормализуются автоматически. Смена языка применяется мгновенно (хук перечитывает состояние при каждом вызове); кэши языков независимы.
101
+
102
+ ## Перевод ввода
103
+
104
+ `tt input on` включает хук `UserPromptSubmit`: когда ваш промпт в основном не на английском, английский перевод прикрепляется как контекст, который модель считает каноничной инструкцией — вы продолжаете печатать на родном языке, модель работает на английском. (Проверено на CC 2.1.169: хуки не могут переписать сам промпт, поэтому оригинал остаётся в истории рядом с английским.) Английский ввод проходит без изменений; при любой ошибке промпт безопасно отправляется как есть.
105
+
106
+ ## Поведение и ограничения (проверено)
107
+
108
+ - Хук срабатывает **во время стриминга** на каждый фрагмент; каждый фрагмент переводится и заменяется на месте — перевод появляется постепенно вместе с английским.
109
+ - Таймаут хука — **10 секунд**; внутренний гард инструмента — 9с. Любая ошибка / таймаут / превышение размера (>9000 символов) **безопасно откатывается к оригинальному английскому** — сессия никогда не зависает.
110
+ - Каждая переведённая строка **кэшируется** по хэшу содержимого (`~/.cc-translate/cache`); перерисовки и повторяющийся текст бесплатны.
111
+ - С `openai` каждый фрагмент — примерно один вызов API (~$0.0001) и ~1с задержки по сравнению с чистым английским; `google` быстрее, но качество чуть ниже.
112
+
113
+ ## Удаление
114
+
115
+ ```bash
116
+ node bin/tt.js uninstall # удаляет хук; вступает в силу после перезапуска Claude Code
117
+ ```