orca-zh-tw-installer 1.0.10 → 1.2.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/README.md +45 -10
- package/TRANSLATION-PLAN.md +363 -0
- package/index.js +149 -75
- package/orca_zh_TW_translation.json +2240 -2240
- package/package.json +7 -2
- package/scripts/audit-batch.js +72 -0
- package/scripts/audit-hash-conflicts.js +78 -0
- package/scripts/build-nested.js +45 -0
- package/scripts/plan-batches.js +126 -0
- package/scripts/sweep-spacing.js +80 -0
- package/scripts/sweep-terms.js +132 -0
- package/scripts/verify-install.js +91 -0
- package/zh-TW-nested.cjs.js +13697 -0
- package/zh-TW-nested.js +2240 -2240
package/README.md
CHANGED
|
@@ -30,8 +30,12 @@
|
|
|
30
30
|
|------|------|
|
|
31
31
|
| **一鍵跨平臺安裝** | 透過 `npx` 自動偵測作業系統並完成替換 |
|
|
32
32
|
| **自動破解白名單** | 突破官方限制,將 `zh-TW` 寫入前端與核心白名單 |
|
|
33
|
-
|
|
|
34
|
-
|
|
|
33
|
+
| **解除繁中強制降級** | 官方新版會把 `zh-TW`/`zh-HK`/`zh-Hant` 明確打回英文,本包一併解除 |
|
|
34
|
+
| **原生選單也中文化** | 除了介面,系統匣、原生選單、系統對話框(main process)同樣套用繁中 |
|
|
35
|
+
| **專業工程術語** | 對照 VS Code 官方 zh-TW 語系包精修,303 條術語鎖定表確保一詞一譯(如 存放庫、終端機、Worktree)|
|
|
36
|
+
| **高曝光介面已逐句校對** | 側邊欄、原始碼控制、編輯器、狀態列、分頁等 3,502 句完成兩輪複查,修正約 2,500 處誤譯與不一致 |
|
|
37
|
+
| **安裝後自動驗證** | 重新封裝前檢查全部注入點,任一失敗即中止且不改動 `app.asar`,不會「安裝成功卻沒效果」|
|
|
38
|
+
| **無痛備份機制** | 首次安裝自動備份 `app.asar.bak`;重複執行會偵測既有補丁,不會用已修補版覆蓋乾淨備份 |
|
|
35
39
|
| **自動追蹤更新** | npm 發布機制確保未來套用更新時始終取得最新版本 |
|
|
36
40
|
|
|
37
41
|
---
|
|
@@ -45,11 +49,24 @@ npx orca-zh-tw
|
|
|
45
49
|
```
|
|
46
50
|
|
|
47
51
|
腳本將自動執行以下流程:
|
|
48
|
-
1. 自動定位作業系統對應的 Orca
|
|
49
|
-
2. 備份官方 `app.asar
|
|
50
|
-
3.
|
|
51
|
-
4.
|
|
52
|
-
5.
|
|
52
|
+
1. 自動定位作業系統對應的 Orca 安裝路徑並解包。
|
|
53
|
+
2. 備份官方 `app.asar`(已含補丁時會保留原本的乾淨備份)。
|
|
54
|
+
3. 破解主程式(Main)語言限制與 locale 解析。
|
|
55
|
+
4. 破解渲染器(Renderer)語言限制、下拉選單與 locale 解析。
|
|
56
|
+
5. 注入 11,000 句繁體中文字典(ESM 給 Renderer、CJS 給 Main)。
|
|
57
|
+
6. 驗證全部注入點後重新封裝。
|
|
58
|
+
|
|
59
|
+
若想在不改動 Orca 的前提下先確認相容性(**可在 Orca 執行中安全使用**):
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm run dry-run
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
安裝後可驗證實際封裝結果:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npm run verify
|
|
69
|
+
```
|
|
53
70
|
|
|
54
71
|
---
|
|
55
72
|
|
|
@@ -89,9 +106,27 @@ npm start
|
|
|
89
106
|
|
|
90
107
|
### 檔案結構
|
|
91
108
|
|
|
92
|
-
- `index.js
|
|
93
|
-
- `
|
|
94
|
-
- `
|
|
109
|
+
- `index.js`:核心安裝腳本,處理 asar 解包、修補、驗證與封裝。支援 `--dry-run`。
|
|
110
|
+
- `orca_zh_TW_translation.json`:**唯一的翻譯來源**(扁平點分鍵)。改翻譯只改這個檔。
|
|
111
|
+
- `zh-TW-nested.js`:由來源檔產生的 ESM 字典,供 Renderer 載入。**請勿手動編輯。**
|
|
112
|
+
- `zh-TW-nested.cjs.js`:由來源檔產生的 CJS 字典,供 Main process 載入。**請勿手動編輯。**
|
|
113
|
+
- `scripts/build-nested.js`:由 JSON 產生上述兩個字典檔。
|
|
114
|
+
- `scripts/sweep-terms.js`:依術語鎖定表統一用詞,預設 dry-run。
|
|
115
|
+
- `scripts/sweep-spacing.js`:中英之間補半形空格,預設 dry-run。
|
|
116
|
+
- `scripts/verify-install.js`:驗證已安裝的 `app.asar` 是否含全部補丁與字典。
|
|
117
|
+
|
|
118
|
+
### 改翻譯的流程
|
|
119
|
+
|
|
120
|
+
`zh-TW-nested.js` 與 `zh-TW-nested.cjs.js` 都是**產生物**,編輯 JSON 後必須重新建置,
|
|
121
|
+
否則安裝時不會生效:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# 1. 編輯 orca_zh_TW_translation.json
|
|
125
|
+
# 2. 重新產生字典檔(兩種格式)
|
|
126
|
+
npm run build
|
|
127
|
+
# 3. 套用
|
|
128
|
+
npm start
|
|
129
|
+
```
|
|
95
130
|
|
|
96
131
|
---
|
|
97
132
|
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# 翻譯改善計畫
|
|
2
|
+
|
|
3
|
+
> Orca zh-TW 語系包的分批修訂計畫。中斷後接手請從「進度」往下讀。
|
|
4
|
+
|
|
5
|
+
## 為什麼需要這份文件
|
|
6
|
+
|
|
7
|
+
`orca_zh_TW_translation.json` 的 11,020 條字串中,**10,804 條(98%)在 `auto.*` 命名空間**,是機器批次產出的;
|
|
8
|
+
只有 216 條是手工精修。`auto.*` 那批的品質問題不是「翻錯」,而是**同一個詞在不同地方譯法不一致**,
|
|
9
|
+
以及少數簡繁轉換的機械殘留。
|
|
10
|
+
|
|
11
|
+
這類問題無法靠「再翻一次」解決——需要一份強制的術語表,加上按模組逐批對照畫面檢查。
|
|
12
|
+
|
|
13
|
+
## 進度
|
|
14
|
+
|
|
15
|
+
| 階段 | 狀態 | 說明 |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| **Tier 0a** 術語統一 | ✅ 完成 | 26 條規則 / 761 處 |
|
|
18
|
+
| **Tier 0b** 格式(空格/標點)| ✅ 完成 | 654 句 / 949 個空格 |
|
|
19
|
+
| **Tier 0c** 第二輪術語+損壞修復 | ✅ 完成 | 328 處。由批次 #1 審查暴露 |
|
|
20
|
+
| **Tier 1** 高曝光介面 | ✅ 完成 | 批次 #1–#12(3,502 句)|
|
|
21
|
+
| **Tier 2** 長文案 | ⬜ 未開始 | 批次 #13–#18(317 句但 30,898 字)|
|
|
22
|
+
| **Tier 3** 設定頁 | ⬜ 未開始 | 批次 #19–#29(3,873 句)|
|
|
23
|
+
| **Tier 4** 外部整合 | ⬜ 未開始 | 批次 #30–#36(1,960 句)|
|
|
24
|
+
| **Tier 5** 長尾模組 | ⬜ 未開始 | 批次 #37–#39(1,152 句)|
|
|
25
|
+
| **Tier 0** 手工精修區 | ⬜ 抽查即可 | 批次 #40(216 句),品質已達標 |
|
|
26
|
+
|
|
27
|
+
批號以「分批清單」一節為準(由 `scripts/plan-batches.js` 產生)。改動資料後重跑產生器,
|
|
28
|
+
批號可能位移——別把批號寫進 commit message 以外的地方。
|
|
29
|
+
|
|
30
|
+
## 術語鎖定表
|
|
31
|
+
|
|
32
|
+
單一真實來源:`~/.claude/skills/tw-translate/data/domains/lock.csv`(303 條)
|
|
33
|
+
|
|
34
|
+
欄位 `tier` 的意義:
|
|
35
|
+
|
|
36
|
+
- **A**:確定性替換,可機械 sweep
|
|
37
|
+
- **B**:需上下文判斷,**不可**機械替換(例:`應用` 可能是 apply→套用,也可能是 application→應用程式)
|
|
38
|
+
- **C**:已裁決的產品風格決定
|
|
39
|
+
|
|
40
|
+
`forbidden` 欄支援 `re:` 前綴的正則,用於損壞修復與需要前後文條件的規則
|
|
41
|
+
(例如 `re:(?<!來)源分支`)。**注意 CSV 以逗號分隔,正則量詞不能寫 `{2,}`**,
|
|
42
|
+
要改寫成 `別+` 這種等價形式。
|
|
43
|
+
|
|
44
|
+
`glossary.csv` 是**建議**,`lock.csv` 是**強制**。目前的用詞不一致就是因為過去只有建議、沒有強制。
|
|
45
|
+
|
|
46
|
+
### 已裁決的產品風格(勿再更動)
|
|
47
|
+
|
|
48
|
+
| 詞 | 決定 | 理由 |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| permission | **權限** | 台灣開發者慣用,不採 MS 的「許可權」 |
|
|
51
|
+
| pull request | **保留英文 Pull Request** | 與既有的 Agent / Issue / Worktree 保留策略一致 |
|
|
52
|
+
| stash | **保留英文 stash** | vscode-loc 的「隱藏項目」語意差 |
|
|
53
|
+
| worktree | **保留英文 Worktree** | 產品既有策略 |
|
|
54
|
+
| theme | **主題** | 「終端機主題」較自然,不採 VS Code 的「佈景主題」 |
|
|
55
|
+
|
|
56
|
+
### 刻意不鎖的詞(勿當成錯誤去「修正」)
|
|
57
|
+
|
|
58
|
+
| 詞 | 出現數 | 為何不改 |
|
|
59
|
+
|---|---:|---|
|
|
60
|
+
| 選擇 | 251 | 「選擇一個 Agent」是台灣自然用法;只有 selection/selected 才用「選取」 |
|
|
61
|
+
| 帳號 | 95 | 台灣自然用法,且**已經全檔一致**(帳戶 0 處) |
|
|
62
|
+
| 提交 | 118 | vscode-loc 確認 commit→提交 正確 |
|
|
63
|
+
| 暫存 | 25 | vscode-loc 確認 stage→暫存 正確 |
|
|
64
|
+
| 跳過 | 20 | 台灣同樣自然,MS 慣例才用「略過」 |
|
|
65
|
+
| 截圖 | 17 | MS 的「螢幕擷取畫面」過於冗長 |
|
|
66
|
+
|
|
67
|
+
## 分批原則
|
|
68
|
+
|
|
69
|
+
**雙上限:每批 400 句 / 6,000 字,取先到者。**
|
|
70
|
+
|
|
71
|
+
不能只用句數切,因為各模組句長差距達 14 倍:
|
|
72
|
+
|
|
73
|
+
| 模組 | 句數 | 字/句 |
|
|
74
|
+
|---|---:|---:|
|
|
75
|
+
| `components.tab` | 157 | 7 |
|
|
76
|
+
| `components.feature` | 317 | **97** |
|
|
77
|
+
|
|
78
|
+
`feature` 只有 317 句卻佔全檔 20% 的字數。純照句數切,某幾批的實際工作量會是別批的十倍。
|
|
79
|
+
|
|
80
|
+
**批次邊界貼齊模組**,這樣可以在 Orca 裡把那個畫面打開對照著看——那才是真正的品質關卡,比讀 JSON 有效得多。
|
|
81
|
+
|
|
82
|
+
## 每批的作業流程
|
|
83
|
+
|
|
84
|
+
**每批做完要複查兩輪**,兩輪的目的不同,不能合成一輪。批次 #1 的經驗是:
|
|
85
|
+
第一輪找到 9 處、第二輪又找到 41 處,而且第二輪找到的是第一輪的規則抓不到的類型。
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# ── 主要處理 ──
|
|
89
|
+
# 1. 取出這批的實際內容(key + 現有譯文)
|
|
90
|
+
node scripts/plan-batches.js --batch 7
|
|
91
|
+
|
|
92
|
+
# 2. 對照 lock.csv 逐句檢查;在 Orca 裡打開對應畫面比對
|
|
93
|
+
# 3. 直接編輯 orca_zh_TW_translation.json
|
|
94
|
+
|
|
95
|
+
# ── 複查第一輪:機械 ──
|
|
96
|
+
node scripts/audit-batch.js auto.components.right.sidebar # 命名空間前綴
|
|
97
|
+
npm run lint:terms # 術語違規(dry-run)
|
|
98
|
+
npm run lint:spacing # 空格與標點(dry-run)
|
|
99
|
+
|
|
100
|
+
# ── 複查第二輪:語意 ──
|
|
101
|
+
# 重新讀一次這批(見下方「第二輪要找什麼」)
|
|
102
|
+
|
|
103
|
+
# ── 收尾 ──
|
|
104
|
+
npm run build
|
|
105
|
+
npm start && npm run verify
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 第一輪複查:機械(`audit-batch.js`)
|
|
109
|
+
|
|
110
|
+
偵測未翻譯、標點半形化、疑似截斷、同命名空間重複譯文、過長標籤、
|
|
111
|
+
全形英數字、人稱混用。這輪的產出多半是**規則不夠廣**:
|
|
112
|
+
|
|
113
|
+
> 批次 #1 第一輪找到 `函式程式庫` 3 處——那是 `庫→程式庫` 損壞的另一種形式。
|
|
114
|
+
> 上一輪的規則只寫了 `儲存函式程式庫`,漏了 `資料函式程式庫`(應為資料庫)。
|
|
115
|
+
> **同一個壞規則會有多個受害詞,修一個不等於修完。**
|
|
116
|
+
|
|
117
|
+
#### 方法一:列出全部含該詞的字串,再逐一分類
|
|
118
|
+
|
|
119
|
+
找到一個損壞後,**不要只修眼前那個**。用損壞詞的「正確形式」去撈全檔,
|
|
120
|
+
把結果全部列出來人工分類成「損壞」與「正當」,才知道真實範圍。
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# 例:發現「群群組」後,改用正確形式「群組」撈全檔
|
|
124
|
+
node -e "const j=require('./orca_zh_TW_translation.json');
|
|
125
|
+
Object.entries(j).filter(([,v])=>typeof v==='string'&&/群組/.test(v))
|
|
126
|
+
.forEach(([k,v])=>console.log(JSON.stringify(v.slice(0,54))+' '+k))"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
> 批次 #1 只修了 `群群組`(31 處)就以為修完了。批次 #2 用這個方法列出
|
|
130
|
+
> 全部 100 多個含「群組」的字串,才發現同一條壞規則有 **8 個受害詞**:
|
|
131
|
+
> `群組織`(組織)、`分群組`(分組)、`群組合`(組合)、`群組態`(組態)、
|
|
132
|
+
> `一群組`、`模群組`、`每群組`、`群組成`。
|
|
133
|
+
>
|
|
134
|
+
> **只看單一受害詞會少修 32 處。** 分類時同時能確認正當用法沒被誤傷——
|
|
135
|
+
> 那 35 處正當的「群組」都沒接上述字,規則才敢下。
|
|
136
|
+
|
|
137
|
+
危險組合要用負向前瞻保護:`群組成員` 是正當詞,所以規則寫
|
|
138
|
+
`re:群組成(?!員)` 而不是 `群組成`。
|
|
139
|
+
|
|
140
|
+
### 第二輪複查:語意(人讀)
|
|
141
|
+
|
|
142
|
+
#### 方法二:先讀短字串
|
|
143
|
+
|
|
144
|
+
**≤4 字的字串是語意錯誤的高風險區。**缺乏上下文,機器最容易選錯義項。
|
|
145
|
+
先把它們單獨列出來讀,密度遠高於通讀整批。
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# 列出批次範圍內所有 ≤4 字的字串,去重並排序
|
|
149
|
+
node -e "const j=require('./orca_zh_TW_translation.json');
|
|
150
|
+
const E=Object.entries(j).filter(([k,v])=>typeof v==='string'
|
|
151
|
+
&&k.includes('auto.components.right.sidebar'));
|
|
152
|
+
const m=new Map();
|
|
153
|
+
for(const [k,v] of E) if(v.length<=4&&/[一-鿿]/.test(v)){
|
|
154
|
+
if(!m.has(v))m.set(v,[]); m.get(v).push(k.split('.').slice(-2).join('.')); }
|
|
155
|
+
[...m.entries()].sort((a,b)=>a[0].localeCompare(b[0],'zh'))
|
|
156
|
+
.forEach(([v,ks])=>console.log(v.padEnd(6)+(ks.length>1?'×'+ks.length:' ')+' '+ks[0]))"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
> 批次 #2 這批誤譯**全都是短字串**:`樹`、`起源`(origin)、`醫學博士`(MD)、
|
|
160
|
+
> `透過`(Passed)、`邊`(Side)、`更多的`、`待辦的`、`偵測劑`。
|
|
161
|
+
>
|
|
162
|
+
> 讀到可疑的短字串後,去看**同命名空間的鄰居**——選項通常成組出現,
|
|
163
|
+
> 鄰居就是上下文。`邊` 的鄰居是 `活動欄位置` 與 `頂部`,
|
|
164
|
+
> 一看就知道是 Top/Side 的位置選項,應為「側邊」。
|
|
165
|
+
|
|
166
|
+
機械檢查抓不到的,依重要性排序:
|
|
167
|
+
|
|
168
|
+
1. **正確的詞用錯地方** ← 最難抓,也最容易漏
|
|
169
|
+
> 批次 #1:`執行緒` 4 處全部誤譯。它本身是完全正確的台灣用語,
|
|
170
|
+
> 但這 4 處講的是 UI 討論串與 comment thread,不是 concurrency thread。
|
|
171
|
+
> 任何模式比對都抓不到,只能讀。
|
|
172
|
+
|
|
173
|
+
2. **同一概念多種錯譯**:機器翻譯會把同一個原文在不同地方譯成不同的錯法
|
|
174
|
+
> 批次 #1:comment thread 被譯成 `執行緒` 和 `評論主題`;
|
|
175
|
+
> hosted review 被譯成 `託管評審`、`託管評論`、`託管審查` 三種。
|
|
176
|
+
> 修了其中一種,另外兩種還在——規則要涵蓋所有變體。
|
|
177
|
+
|
|
178
|
+
3. **動詞被當形容詞(或反之)**
|
|
179
|
+
> `Clear notes` → `清晰的筆記`(應為「清除筆記」)
|
|
180
|
+
|
|
181
|
+
4. **一詞多義選錯**
|
|
182
|
+
> `refs` → `參考文獻`(學術文獻)、`Publishing` → `出版`(出版書籍)、
|
|
183
|
+
> `Process` → `過程`、`Ahead` → `前面`、`Forward` → `向前`
|
|
184
|
+
> (port forwarding 與瀏覽器上下頁的 forward 是兩回事)、
|
|
185
|
+
> `MD` → `醫學博士`、`origin` → `起源`、`Passed` → `透過`、
|
|
186
|
+
> `Detecting…` → `偵測劑…`
|
|
187
|
+
|
|
188
|
+
5. **識別碼與參數被翻譯**:不該進翻譯流程的東西進來了
|
|
189
|
+
> `create_pr` → `建立_pr`(動作識別碼)
|
|
190
|
+
> `--model sonnet` → `——模範十四行詩`(CLI 參數;模範=model、十四行詩=sonnet)
|
|
191
|
+
>
|
|
192
|
+
> 這類要靠**鄰近欄位**判斷。上例旁邊的欄位標籤是「CLI 引數」,
|
|
193
|
+
> 才確定那是參數範例而不是文案。
|
|
194
|
+
|
|
195
|
+
6. **佔位符**:`{{value0}}`、`{{count}}` 數量必須與原文一致
|
|
196
|
+
7. **長度**:按鈕、分頁標籤等寬度受限的元件,譯文別過長
|
|
197
|
+
|
|
198
|
+
### 兩條硬規則
|
|
199
|
+
|
|
200
|
+
- **改完一定要跑 `npm run lint:terms`。** 批次 #1 時我把 `過程` 改成 `程序`,
|
|
201
|
+
lint 立刻報違規——`程序` 是 program 的中國用語且已被鎖,process 在本表是 `行程`。
|
|
202
|
+
- **加規則後看 dry-run 的疊字檢查。** `許可權→權限` 曾在詞界造出 `隱私權權限`
|
|
203
|
+
(`隱私權`+`許可權` 相接)。只看那條規則的 diff 看不出來。
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
## 分批清單
|
|
207
|
+
|
|
208
|
+
> 本表由 `node scripts/plan-batches.js` 產生,資料變動後請重跑。
|
|
209
|
+
> 上限:每批 400 句 / 6,000 字。
|
|
210
|
+
> 全檔合計 **11020 句 / 152,301 字**,共 **40 批**。
|
|
211
|
+
|
|
212
|
+
### Tier 1 — 高曝光介面
|
|
213
|
+
|
|
214
|
+
共 14 個模組、3502 句、38,342 字
|
|
215
|
+
|
|
216
|
+
| 批次 | 模組 | 句數 | 字數 |
|
|
217
|
+
|---|---|---:|---:|
|
|
218
|
+
| #1 | `components.right` (1/3) | ~336 | ~4,062 |
|
|
219
|
+
| #2 | `components.right` (2/3) | ~336 | ~4,062 |
|
|
220
|
+
| #3 | `components.right` (3/3) | ~336 | ~4,062 |
|
|
221
|
+
| #4 | `components.sidebar` (1/3) | ~283 | ~3,293 |
|
|
222
|
+
| #5 | `components.sidebar` (2/3) | ~283 | ~3,293 |
|
|
223
|
+
| #6 | `components.sidebar` (3/3) | ~283 | ~3,293 |
|
|
224
|
+
| #7 | `components.editor` (1/2) | ~233 | ~1,818 |
|
|
225
|
+
| #8 | `components.editor` (2/2) | ~233 | ~1,818 |
|
|
226
|
+
| #9 | `components.status` | 325 | 3,194 |
|
|
227
|
+
| #10 | `components.onboarding`<br>`components.tab` | 327 | 3,428 |
|
|
228
|
+
| #11 | `components.terminal`<br>`components.workspace`<br>`components.orca` | 361 | 4,224 |
|
|
229
|
+
| #12 | `components.NewWorkspaceComposerCard`<br>`components.new`<br>`components.rightSidebar`<br>`lib.terminal`<br>`lib.workspace` | 171 | 1,800 |
|
|
230
|
+
|
|
231
|
+
### Tier 2 — 長文案(導覽/功能牆)
|
|
232
|
+
|
|
233
|
+
共 1 個模組、317 句、30,898 字
|
|
234
|
+
|
|
235
|
+
| 批次 | 模組 | 句數 | 字數 |
|
|
236
|
+
|---|---|---:|---:|
|
|
237
|
+
| #13 | `components.feature` (1/6) | ~53 | ~5,150 |
|
|
238
|
+
| #14 | `components.feature` (2/6) | ~53 | ~5,150 |
|
|
239
|
+
| #15 | `components.feature` (3/6) | ~53 | ~5,150 |
|
|
240
|
+
| #16 | `components.feature` (4/6) | ~53 | ~5,150 |
|
|
241
|
+
| #17 | `components.feature` (5/6) | ~53 | ~5,150 |
|
|
242
|
+
| #18 | `components.feature` (6/6) | ~53 | ~5,150 |
|
|
243
|
+
|
|
244
|
+
### Tier 3 — 設定頁(量大、曝光低)
|
|
245
|
+
|
|
246
|
+
共 176 個模組、3873 句、48,099 字
|
|
247
|
+
|
|
248
|
+
| 批次 | 模組 | 句數 | 字數 |
|
|
249
|
+
|---|---|---:|---:|
|
|
250
|
+
| #19 | `settings.terminal`<br>`settings.general` | 382 | 3,106 |
|
|
251
|
+
| #20 | `settings.appearance`<br>`settings.AccountsPane`<br>`settings.repository` | 375 | 4,952 |
|
|
252
|
+
| #21 | `settings.TerminalPane`<br>`settings.mobile`<br>`settings.RepositoryHooksSection`<br>`settings.browser` | 358 | 4,336 |
|
|
253
|
+
| #22 | `settings.IntegrationsPane`<br>`settings.Settings`<br>`settings.RuntimeEnvironmentsPane`<br>`settings.TerminalWindowSection`<br>`settings.RepositoryPane` | 354 | 4,753 |
|
|
254
|
+
| #23 | `settings.experimental`<br>`settings.git`<br>`settings.AppearancePane`<br>`settings.agents`<br>`settings.accounts`<br>`settings.GitPane`<br>…等 7 個模組 | 371 | 3,911 |
|
|
255
|
+
| #24 | `settings.TerminalAppearanceSection`<br>`settings.CommitMessageAiPane`<br>`settings.notifications`<br>`settings.developer`<br>`settings.ExperimentalPane`<br>`settings.integrations`<br>…等 10 個模組 | 370 | 4,857 |
|
|
256
|
+
| #25 | `settings.token`<br>`settings.commit`<br>`settings.GeneralEditorSettingsSection`<br>`settings.VoicePane`<br>`settings.NotificationsPane`<br>`settings.SparsePresetSettingsSection`<br>…等 14 個模組 | 387 | 4,875 |
|
|
257
|
+
| #26 | `settings.WarpThemeImportModal`<br>`settings.jira`<br>`settings.AutoRenameBranchFromWorkSetting`<br>`settings.BrowserPane`<br>`settings.voice`<br>`settings.task`<br>…等 19 個模組 | 396 | 5,092 |
|
|
258
|
+
| #27 | `settings.advanced`<br>`settings.orchestration`<br>`settings.quick`<br>`settings.GrokAccountsSection`<br>`settings.SshTargetCard`<br>`settings.EphemeralVmsPane`<br>…等 28 個模組 | 396 | 4,937 |
|
|
259
|
+
| #28 | `settings.ShortcutsPane`<br>`settings.TasksPane`<br>`settings.tasks`<br>`settings.linear`<br>`settings.MobileRelayStatusSection`<br>`settings.CliSkillRuntimeSetup`<br>…等 47 個模組 | 397 | 5,870 |
|
|
260
|
+
| #29 | `settings.TerminalSettingsPreview`<br>`settings.PrivacyDiagnosticsRows`<br>`settings.MobileRelayBetaAvailability`<br>`settings.SkillUsageExampleDialog`<br>`settings.HiddenExperimentalGroup`<br>`settings.RecentTabOrderControl`<br>…等 37 個模組 | 87 | 1,410 |
|
|
261
|
+
|
|
262
|
+
### Tier 4 — 外部整合
|
|
263
|
+
|
|
264
|
+
共 16 個模組、1960 句、18,898 字
|
|
265
|
+
|
|
266
|
+
| 批次 | 模組 | 句數 | 字數 |
|
|
267
|
+
|---|---|---:|---:|
|
|
268
|
+
| #30 | `components.TaskPage` | 317 | 3,242 |
|
|
269
|
+
| #31 | `components.stats` | 259 | 2,095 |
|
|
270
|
+
| #32 | `components.automations` | 248 | 1,960 |
|
|
271
|
+
| #33 | `components.github` | 235 | 1,976 |
|
|
272
|
+
| #34 | `components.GitHubItemDialog`<br>`components.PullRequestPage` | 368 | 3,433 |
|
|
273
|
+
| #35 | `components.mobile`<br>`components.skills`<br>`components.GitLabItemDialog`<br>`components.linear` | 358 | 3,846 |
|
|
274
|
+
| #36 | `components.emulator`<br>`components.JiraIssueWorkspace`<br>`components.LinearItemDrawer`<br>`components.jira`<br>`lib.linear`<br>`components.gitlab` | 175 | 2,346 |
|
|
275
|
+
|
|
276
|
+
### Tier 5 — 長尾模組
|
|
277
|
+
|
|
278
|
+
共 123 個模組、1152 句、13,541 字
|
|
279
|
+
|
|
280
|
+
| 批次 | 模組 | 句數 | 字數 |
|
|
281
|
+
|---|---|---:|---:|
|
|
282
|
+
| #37 | `components.browser`<br>`store.slices`<br>`hooks.useSettingsNavigationMetadata`<br>`lib.agent`<br>`components.UpdateCard` | 374 | 4,624 |
|
|
283
|
+
| #38 | `components.floating`<br>`components.WorktreeJumpPalette`<br>`components.LinearIssueWorkspace`<br>`components.cmd`<br>`components.repo`<br>`components.activity`<br>…等 15 個模組 | 400 | 4,638 |
|
|
284
|
+
| #39 | `components.Terminal`<br>`components.sparse`<br>`components.StarNagCard`<br>`components.link`<br>`components.ui`<br>`components.diff`<br>…等 103 個模組 | 378 | 4,279 |
|
|
285
|
+
|
|
286
|
+
### Tier 0 — 手工精修區(品質已達標,僅抽查)
|
|
287
|
+
|
|
288
|
+
共 47 個模組、216 句、2,523 字
|
|
289
|
+
|
|
290
|
+
| 批次 | 模組 | 句數 | 字數 |
|
|
291
|
+
|---|---|---:|---:|
|
|
292
|
+
| #40 | `components.native-chat`<br>`components.agentSessionContinuation`<br>`settings.appearance`<br>`browser.loadFailure`<br>`worktreeJumpPalette.matchLabel`<br>`dashboardPopout.card`<br>…等 47 個模組 | 216 | 2,523 |
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 已知待辦(不屬於任何單一批次)
|
|
297
|
+
|
|
298
|
+
### 1. Tier B 逐句判斷項(11 條)
|
|
299
|
+
|
|
300
|
+
`lock.csv` 中 `tier=B` 的詞不可機械替換,需在批次中逐句處理:
|
|
301
|
+
|
|
302
|
+
| 詞 | 出現數 | 注意 |
|
|
303
|
+
|---|---:|---|
|
|
304
|
+
| `應用` → `套用` | 17 | 但 `應用程式`、`應用視窗` 不可改 |
|
|
305
|
+
| `請求` / `要求` | 67 / 28 | request 兩者在台灣皆自然;需確認是 request 還是 require |
|
|
306
|
+
| `依賴` → `相依性` | 3 | 「依賴項稽核」機械替換會變成「相依性項稽核」,需改寫整句 |
|
|
307
|
+
| `instance` → `執行個體` | — | 「實例」在台灣亦通用 |
|
|
308
|
+
| `release` → `發行` | — | 「發布」在台灣亦通用,視語境 |
|
|
309
|
+
| `blame` | — | 多數情況建議保留英文 |
|
|
310
|
+
|
|
311
|
+
### 2. 模擬器裝置名稱疑似整批誤譯
|
|
312
|
+
|
|
313
|
+
以下譯文看不出對應的原文,像是 device list 被整批亂翻,需回查原始英文:
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
米4a 振盪器52 作業系統52
|
|
317
|
+
M1 迷你·家 2 名兒童
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 3. 未翻譯項目中混有真漏翻
|
|
321
|
+
|
|
322
|
+
全檔有 884 條不含中文字元。多數是品牌名(Cursor、Hermes、OpenClaw…)**應當保留英文**,
|
|
323
|
+
但其中混了真正的漏翻,已確認的至少有:
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
"No live terminal — this agent's pane has closed."
|
|
327
|
+
"Agent Dashboard"
|
|
328
|
+
"Focus worktree"
|
|
329
|
+
"Close"
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
建議做法:先把 884 條全部列出,人工標記「品牌名」與「漏翻」,再只處理後者。
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
node -e "const j=require('./orca_zh_TW_translation.json');
|
|
336
|
+
Object.entries(j).filter(([,v])=>typeof v==='string'&&v.trim()&&!/[一-鿿]/.test(v))
|
|
337
|
+
.forEach(([k,v])=>console.log(k+'\t'+v))" > untranslated.tsv
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### 4. npm 套件內含不必要的 workflow 檔
|
|
341
|
+
|
|
342
|
+
`orca-zh-tw-installer` 的 tarball 內含 `.github/workflows/npm-publish.yml`。
|
|
343
|
+
無害(使用者不會執行)但沒必要,在 `package.json` 加 `files` 白名單即可,
|
|
344
|
+
不值得為此單獨發版,下次發布時一起處理。
|
|
345
|
+
|
|
346
|
+
## 相關檔案
|
|
347
|
+
|
|
348
|
+
| 檔案 | 用途 |
|
|
349
|
+
|---|---|
|
|
350
|
+
| `orca_zh_TW_translation.json` | **唯一翻譯來源**,只改這個 |
|
|
351
|
+
| `scripts/plan-batches.js` | 產生本文件的分批清單;`--batch N` 取出某批內容 |
|
|
352
|
+
| `scripts/audit-batch.js` | 複查第一輪:對某命名空間做機械檢查 |
|
|
353
|
+
| `scripts/audit-hash-conflicts.js` | 找出同 hash 卻有不同譯文的字串(同原文被譯兩次)|
|
|
354
|
+
| `scripts/sweep-terms.js` | 依 lock.csv 統一術語,預設 dry-run,含事後疊字偵測 |
|
|
355
|
+
| `scripts/sweep-spacing.js` | 空格與標點正規化,預設 dry-run |
|
|
356
|
+
| `scripts/build-nested.js` | 產生 ESM + CJS 兩份字典 |
|
|
357
|
+
| `scripts/verify-install.js` | 驗證已安裝的 app.asar |
|
|
358
|
+
| `~/.claude/skills/tw-translate/data/domains/lock.csv` | 術語鎖定表 |
|
|
359
|
+
|
|
360
|
+
## 重要提醒
|
|
361
|
+
|
|
362
|
+
`zh-TW-nested.js` 與 `zh-TW-nested.cjs.js` 都是**產生物**。
|
|
363
|
+
改完 JSON 一定要 `npm run build`,否則安裝時不會生效——這個坑先前踩過一次。
|