dsh-cait 1.0.3 → 1.0.5
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/CHANGELOG.md +410 -352
- package/LICENSE +201 -201
- package/README.ja.md +55 -14
- package/README.md +466 -423
- package/README.zh-CN.md +429 -390
- package/client/components.js +2408 -2377
- package/client/helpers.js +103 -103
- package/client/locales.js +751 -730
- package/client/rpc.js +93 -93
- package/client/styles.js +258 -258
- package/client.js +3608 -3556
- package/icon.svg +8 -8
- package/index.js +45 -45
- package/lib/api.js +223 -223
- package/lib/docx.js +392 -389
- package/lib/epub.js +355 -0
- package/lib/errors.js +8 -8
- package/lib/formats.js +972 -917
- package/lib/glossary.js +178 -178
- package/lib/html.js +271 -0
- package/lib/import-export.js +650 -605
- package/lib/libraries.js +183 -183
- package/lib/markdown.js +28 -28
- package/lib/mt.js +152 -152
- package/lib/persistence.js +341 -321
- package/lib/pptx.js +89 -89
- package/lib/preprocess.js +65 -0
- package/lib/segmenter.js +84 -84
- package/lib/similarity.js +113 -113
- package/lib/store-utils.js +342 -339
- package/lib/store.js +746 -734
- package/lib/tm.js +160 -160
- package/lib/tmx.js +85 -85
- package/lib/tools.js +472 -472
- package/lib/xlsx.js +218 -218
- package/lib/xml.js +31 -31
- package/locale/en.json +11 -11
- package/locale/zh.json +11 -11
- package/package.json +83 -83
- package/scripts/build-client.mjs +13 -13
package/README.zh-CN.md
CHANGED
|
@@ -1,390 +1,429 @@
|
|
|
1
|
-
<p align="center">
|
|
2
|
-
<img src="icon.svg" width="76" alt="CAIT 图标" />
|
|
3
|
-
</p>
|
|
4
|
-
|
|
5
|
-
<h1 align="center">CAIT</h1>
|
|
6
|
-
|
|
7
|
-
<p align="center">
|
|
8
|
-
<strong>在 DeepSeek Harness 中完成计算机辅助翻译。</strong><br/>
|
|
9
|
-
翻译记忆 · 术语库 · 句段编辑器 · 机器翻译辅助 · 文档标签页 · Office / 字幕 / 本地化格式
|
|
10
|
-
</p>
|
|
11
|
-
|
|
12
|
-
<p align="center">
|
|
13
|
-
<a href="README.md">English</a> · <a href="README.zh-CN.md">简体中文</a> · <a href="README.ja.md">日本語</a>
|
|
14
|
-
</p>
|
|
15
|
-
|
|
16
|
-
<p align="center">
|
|
17
|
-
<img alt="版本
|
|
18
|
-
<img alt="DSH 0.2.x" src="https://img.shields.io/badge/DSH-0.2.x-4d6bfe.svg" />
|
|
19
|
-
<img alt="
|
|
20
|
-
<img alt="无需 API Key" src="https://img.shields.io/badge/API%20key-not%20required-6b7280.svg" />
|
|
21
|
-
</p>
|
|
22
|
-
|
|
23
|
-
CAIT 为 DSH Web UI 和 DSH 桌面端增加一个 CAT 翻译工作台。它从左侧栏入口打开,
|
|
24
|
-
工作台与七个 Agent 工具共用一个数据存储,覆盖从导入源文件到导出译文的完整流程。
|
|
25
|
-
|
|
26
|
-
> **已在 DSH `0.2.2-rc.1` 中验证。** CAIT 使用 DSH 自己的模型路由和凭据,
|
|
27
|
-
> 不会要求用户填写 API Key。内部回退提供方仍叫 `mock`,界面显示为
|
|
28
|
-
> **术语替换(离线)**。
|
|
29
|
-
|
|
30
|
-
## 为什么选择 CAIT
|
|
31
|
-
|
|
32
|
-
| | |
|
|
33
|
-
|---|---|
|
|
34
|
-
| **原生集成 DSH** | 真正的侧栏入口、主工作台、DSH 主题令牌,以及人和 Agent 共用的同一份数据。不是 iframe,也不是另一个独立应用。 |
|
|
35
|
-
| **可解释的翻译记忆** | 支持多个 TM 库、仅检索已挂载库、精确/近似精确/高/中/低模糊等级,确认句段时自动写回。 |
|
|
36
|
-
| **术语感知编辑** | 支持多个术语库、按源语言过滤、行内高亮、点击插入术语,以及按术语设置是否区分大小写。 |
|
|
37
|
-
| **完整文档流程** | 文档标签页、关闭/重新打开、最近文档清理、重复导入复用、逐文档进度。 |
|
|
38
|
-
| **真实格式覆盖** | TXT、Markdown、DOCX、TMX、CSV、SRT/VTT、PO、XLIFF 1.2/2.0/SDLXLIFF、HTML、JSON、XLSX、PPTX、RTF。 |
|
|
39
|
-
| **面向 Agent** | 七个工具共享当前文档和存储,Agent 可以与用户同时翻译。 |
|
|
40
|
-
|
|
41
|
-
## 快速开始
|
|
42
|
-
|
|
43
|
-
1. 安装 CAIT,然后从左侧栏的 **CAIT** 入口打开。
|
|
44
|
-
2. 选择 **新开页面**,拖入源文件或粘贴文本。
|
|
45
|
-
3. 设置源语言和目标语言。
|
|
46
|
-
4. 翻译当前句段;右侧面板会显示 TM 匹配、术语命中和 MT 建议。
|
|
47
|
-
5. 点击 **确认并下一句**,句对会写入默认挂载的 TM。
|
|
48
|
-
6. 导出纯译文、双语对照,或保留源格式的文档。
|
|
49
|
-
|
|
50
|
-
编辑器中的输入只是草稿,保存在内存里。确认句段(或执行明确的结构性修改)时
|
|
51
|
-
才会写入快照。打开的工作台每两秒轮询一次 Host revision,因此 Agent 触发的修改
|
|
52
|
-
无需手动刷新即可出现。
|
|
53
|
-
|
|
54
|
-
## 功能
|
|
55
|
-
|
|
56
|
-
### 翻译记忆
|
|
57
|
-
|
|
58
|
-
- 支持多个 TM 库,每个库有 id、名称、挂载状态和默认写入库。
|
|
59
|
-
- 支持精确、近似精确和三个模糊等级:
|
|
60
|
-
- `near_exact` 使用忽略数字、标点和空白后的 key 比较,不依赖分数阈值。
|
|
61
|
-
- `high_fuzzy` 为 `>= 0.85`,`medium_fuzzy` 为 `0.75–0.85`,
|
|
62
|
-
`low_fuzzy` 低于 `0.75`(高于可配置下限,默认 `0.55`)。
|
|
63
|
-
- 模糊评分是词法级的:72% 字符二元组 Dice + 28% token Jaccard。
|
|
64
|
-
拉丁文本按单词切分,CJK 文本按单字切分;不做词干、同义词或语义匹配。
|
|
65
|
-
- 检索只查已挂载的库。`cat_submit_translation` 支持可选 `targetTmId`;
|
|
66
|
-
未挂载的目标库会以 `TM_NOT_MOUNTED` 拒绝写入。
|
|
67
|
-
- `bootstrap().tm.entries` 是已挂载条目的 40 条预览;
|
|
68
|
-
`bootstrap().tm.count` 是已挂载数量,`bootstrap().tm.total` 是所有库的总数。
|
|
69
|
-
完整数据请使用 `cat_lookup_tm` 或库面板。
|
|
70
|
-
- 支持 TMX 1.4 `<tu>/<tuv>/<seg>` 导入/导出。TMX 内联占位符会扁平化为
|
|
71
|
-
纯文本,并给出明确警告。
|
|
72
|
-
|
|
73
|
-
### 术语库
|
|
74
|
-
|
|
75
|
-
- 支持多个术语库,每个库有挂载状态和默认写入库。
|
|
76
|
-
- 源文行内高亮,点击术语 chip 即可插入。
|
|
77
|
-
- 支持 CSV/TSV 导入、术语备注、源语言过滤,以及工作台和
|
|
78
|
-
`cat_lookup_glossary` 都遵循的 `caseSensitive` 标记。
|
|
79
|
-
- 语言代码会规范化(`EN` → `en`,`ZH_cn` → `zh-CN`)。
|
|
80
|
-
|
|
81
|
-
### 工作台
|
|
82
|
-
|
|
83
|
-
- 按段落/句子切分,并逐句编辑译文。
|
|
84
|
-
- 支持保存草稿、确认并下一句、上一句/下一句导航和进度。
|
|
85
|
-
- 文档标签页;关闭标签页不会删除文档。
|
|
86
|
-
- **打开已有文档** 可重新打开已关闭的文档。
|
|
87
|
-
- **设置 → 界面** 提供界面语言切换:跟随 DSH 语言(默认)、简体中文、English、
|
|
88
|
-
日本語。工作台与侧栏名称立即生效,且只改 CAIT 界面,不会改动文档的源语言或
|
|
89
|
-
目标语言。
|
|
90
|
-
- 下拉框旁的垃圾桶按钮可删除一个或全部已关闭文档;删除是永久性的,
|
|
91
|
-
不会影响 TM、术语库或其他文档。
|
|
92
|
-
- 同格式、同内容的再次导入会复用已有文档,而不是新建重复文档。
|
|
93
|
-
指纹覆盖语言、源文、格式和交换元数据。
|
|
94
|
-
- 响应式密度:工作台测量自身 DSH 面板,并应用 1×–1.8× 的 `--cait-u`
|
|
95
|
-
缩放系数。1600×900 面板约为 1.32×,2560×1440 面板为 1.8×;
|
|
96
|
-
窗口较矮时保持 1×,不会继续缩小。
|
|
97
|
-
|
|
98
|
-
###
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
|
235
|
-
|
|
|
236
|
-
| `
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
npm
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="icon.svg" width="76" alt="CAIT 图标" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">CAIT</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>在 DeepSeek Harness 中完成计算机辅助翻译。</strong><br/>
|
|
9
|
+
翻译记忆 · 术语库 · 句段编辑器 · 机器翻译辅助 · 文档标签页 · Office / 字幕 / 本地化格式
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="README.md">English</a> · <a href="README.zh-CN.md">简体中文</a> · <a href="README.ja.md">日本語</a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<a href="https://www.npmjs.com/package/dsh-cait"><img alt="npm 版本" src="https://img.shields.io/npm/v/dsh-cait.svg" /></a>
|
|
18
|
+
<img alt="DSH 0.2.x" src="https://img.shields.io/badge/DSH-0.2.x-4d6bfe.svg" />
|
|
19
|
+
<img alt="15 套测试" src="https://img.shields.io/badge/tests-15%20suites-brightgreen.svg" />
|
|
20
|
+
<img alt="无需 API Key" src="https://img.shields.io/badge/API%20key-not%20required-6b7280.svg" />
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
CAIT 为 DSH Web UI 和 DSH 桌面端增加一个 CAT 翻译工作台。它从左侧栏入口打开,
|
|
24
|
+
工作台与七个 Agent 工具共用一个数据存储,覆盖从导入源文件到导出译文的完整流程。
|
|
25
|
+
|
|
26
|
+
> **已在 DSH `0.2.2-rc.1` 中验证。** CAIT 使用 DSH 自己的模型路由和凭据,
|
|
27
|
+
> 不会要求用户填写 API Key。内部回退提供方仍叫 `mock`,界面显示为
|
|
28
|
+
> **术语替换(离线)**。
|
|
29
|
+
|
|
30
|
+
## 为什么选择 CAIT
|
|
31
|
+
|
|
32
|
+
| | |
|
|
33
|
+
|---|---|
|
|
34
|
+
| **原生集成 DSH** | 真正的侧栏入口、主工作台、DSH 主题令牌,以及人和 Agent 共用的同一份数据。不是 iframe,也不是另一个独立应用。 |
|
|
35
|
+
| **可解释的翻译记忆** | 支持多个 TM 库、仅检索已挂载库、精确/近似精确/高/中/低模糊等级,确认句段时自动写回。 |
|
|
36
|
+
| **术语感知编辑** | 支持多个术语库、按源语言过滤、行内高亮、点击插入术语,以及按术语设置是否区分大小写。 |
|
|
37
|
+
| **完整文档流程** | 文档标签页、关闭/重新打开、最近文档清理、重复导入复用、逐文档进度。 |
|
|
38
|
+
| **真实格式覆盖** | TXT、Markdown、DOCX、EPUB、TMX、CSV、SRT/VTT、PO、XLIFF 1.2/2.0/SDLXLIFF、HTML、JSON、XLSX、PPTX、RTF。 |
|
|
39
|
+
| **面向 Agent** | 七个工具共享当前文档和存储,Agent 可以与用户同时翻译。 |
|
|
40
|
+
|
|
41
|
+
## 快速开始
|
|
42
|
+
|
|
43
|
+
1. 安装 CAIT,然后从左侧栏的 **CAIT** 入口打开。
|
|
44
|
+
2. 选择 **新开页面**,拖入源文件或粘贴文本。
|
|
45
|
+
3. 设置源语言和目标语言。
|
|
46
|
+
4. 翻译当前句段;右侧面板会显示 TM 匹配、术语命中和 MT 建议。
|
|
47
|
+
5. 点击 **确认并下一句**,句对会写入默认挂载的 TM。
|
|
48
|
+
6. 导出纯译文、双语对照,或保留源格式的文档。
|
|
49
|
+
|
|
50
|
+
编辑器中的输入只是草稿,保存在内存里。确认句段(或执行明确的结构性修改)时
|
|
51
|
+
才会写入快照。打开的工作台每两秒轮询一次 Host revision,因此 Agent 触发的修改
|
|
52
|
+
无需手动刷新即可出现。
|
|
53
|
+
|
|
54
|
+
## 功能
|
|
55
|
+
|
|
56
|
+
### 翻译记忆
|
|
57
|
+
|
|
58
|
+
- 支持多个 TM 库,每个库有 id、名称、挂载状态和默认写入库。
|
|
59
|
+
- 支持精确、近似精确和三个模糊等级:
|
|
60
|
+
- `near_exact` 使用忽略数字、标点和空白后的 key 比较,不依赖分数阈值。
|
|
61
|
+
- `high_fuzzy` 为 `>= 0.85`,`medium_fuzzy` 为 `0.75–0.85`,
|
|
62
|
+
`low_fuzzy` 低于 `0.75`(高于可配置下限,默认 `0.55`)。
|
|
63
|
+
- 模糊评分是词法级的:72% 字符二元组 Dice + 28% token Jaccard。
|
|
64
|
+
拉丁文本按单词切分,CJK 文本按单字切分;不做词干、同义词或语义匹配。
|
|
65
|
+
- 检索只查已挂载的库。`cat_submit_translation` 支持可选 `targetTmId`;
|
|
66
|
+
未挂载的目标库会以 `TM_NOT_MOUNTED` 拒绝写入。
|
|
67
|
+
- `bootstrap().tm.entries` 是已挂载条目的 40 条预览;
|
|
68
|
+
`bootstrap().tm.count` 是已挂载数量,`bootstrap().tm.total` 是所有库的总数。
|
|
69
|
+
完整数据请使用 `cat_lookup_tm` 或库面板。
|
|
70
|
+
- 支持 TMX 1.4 `<tu>/<tuv>/<seg>` 导入/导出。TMX 内联占位符会扁平化为
|
|
71
|
+
纯文本,并给出明确警告。
|
|
72
|
+
|
|
73
|
+
### 术语库
|
|
74
|
+
|
|
75
|
+
- 支持多个术语库,每个库有挂载状态和默认写入库。
|
|
76
|
+
- 源文行内高亮,点击术语 chip 即可插入。
|
|
77
|
+
- 支持 CSV/TSV 导入、术语备注、源语言过滤,以及工作台和
|
|
78
|
+
`cat_lookup_glossary` 都遵循的 `caseSensitive` 标记。
|
|
79
|
+
- 语言代码会规范化(`EN` → `en`,`ZH_cn` → `zh-CN`)。
|
|
80
|
+
|
|
81
|
+
### 工作台
|
|
82
|
+
|
|
83
|
+
- 按段落/句子切分,并逐句编辑译文。
|
|
84
|
+
- 支持保存草稿、确认并下一句、上一句/下一句导航和进度。
|
|
85
|
+
- 文档标签页;关闭标签页不会删除文档。
|
|
86
|
+
- **打开已有文档** 可重新打开已关闭的文档。
|
|
87
|
+
- **设置 → 界面** 提供界面语言切换:跟随 DSH 语言(默认)、简体中文、English、
|
|
88
|
+
日本語。工作台与侧栏名称立即生效,且只改 CAIT 界面,不会改动文档的源语言或
|
|
89
|
+
目标语言。
|
|
90
|
+
- 下拉框旁的垃圾桶按钮可删除一个或全部已关闭文档;删除是永久性的,
|
|
91
|
+
不会影响 TM、术语库或其他文档。
|
|
92
|
+
- 同格式、同内容的再次导入会复用已有文档,而不是新建重复文档。
|
|
93
|
+
指纹覆盖语言、源文、格式和交换元数据。
|
|
94
|
+
- 响应式密度:工作台测量自身 DSH 面板,并应用 1×–1.8× 的 `--cait-u`
|
|
95
|
+
缩放系数。1600×900 面板约为 1.32×,2560×1440 面板为 1.8×;
|
|
96
|
+
窗口较矮时保持 1×,不会继续缩小。
|
|
97
|
+
|
|
98
|
+
### 预处理
|
|
99
|
+
|
|
100
|
+
导入的源文在切句之前会经过预处理阶段:
|
|
101
|
+
|
|
102
|
+
- 折叠重复空格与制表符、去掉行首缩进、合并连续空行。
|
|
103
|
+
- 移除零宽字符和多余的控制字符。
|
|
104
|
+
- 占位符 token(`{1}`、`{2}`…)、标点、大小写和段落顺序保持不变,
|
|
105
|
+
因此 XLIFF/HTML/EPUB 的内联标记仍可正确往返。
|
|
106
|
+
- 三个步骤可在 **设置 → 预处理** 中分别开关,并随其他设置一起持久化。
|
|
107
|
+
它们作用于新导入和 `createDocument` 调用,不会改写已有文档。
|
|
108
|
+
|
|
109
|
+
### MT 辅助
|
|
110
|
+
|
|
111
|
+
CAIT 不持有 endpoint 或 key,选择器完全来自 DSH:
|
|
112
|
+
|
|
113
|
+
- `ctx.llm.listProviders()` 提供已注册的提供方路由。
|
|
114
|
+
- 可用时通过 `ctx.loader.entries()` 查询 `config.providers`。
|
|
115
|
+
- `ctx.llm.listModels(provider)` 提供模型 id;CAIT 默认选择第一个模型。
|
|
116
|
+
- `ctx.llm.stream({ provider, model, messages, temperature, purpose: 'cait-mt' })`
|
|
117
|
+
执行调用;CAIT 只拼接 `text-delta` chunk。
|
|
118
|
+
|
|
119
|
+
如果没有可用路由、所选路由消失或没有模型,CAIT 会回退到离线术语替换,
|
|
120
|
+
并在 UI 和 `cat_suggest_mt` 结果中明确说明。流式调用失败时,Host 日志记录
|
|
121
|
+
provider/model/code/status,客户端只会收到 `MT_PROVIDER_FAILED`。
|
|
122
|
+
|
|
123
|
+
## 支持的格式
|
|
124
|
+
|
|
125
|
+
| 格式 | 导入 | 导出 | 说明 |
|
|
126
|
+
| --- | :---: | :---: | --- |
|
|
127
|
+
| TXT / Markdown | ✅ | ✅ | 按段落和句子切分 |
|
|
128
|
+
| CSV | ✅ | ✅ | 自动识别逗号、分号、制表符或竖线分隔;可通过表头名称或从 1 开始的列号指定源/目标列;现有双语导出 |
|
|
129
|
+
| DOCX | ✅ | ✅ | 正文段落;导入时排除表格块。导出会修改原包,保留样式、编号、图片、页眉、表格和版式。 |
|
|
130
|
+
| EPUB | ✅ | ✅ | 按 EPUB 3 spine 顺序读取 XHTML 文本块,内联标记保留为 token 并回写到保留的源包。不支持 DRM、固定版式和脚本化 EPUB。 |
|
|
131
|
+
| TMX 1.4 | ✅ | ✅ | 常见 `<tu>/<tuv>/<seg>` 子集;内联标记扁平化并警告 |
|
|
132
|
+
| SRT / WebVTT | ✅ | ✅ | 一个字幕 cue 对应一个句段;保留时间轴/设置/标识;保留语义标签;非法时间范围会拒绝 |
|
|
133
|
+
| PO | ✅ | ✅ | 支持上下文、复数形式、译者注释和废弃 `#~` 条目 |
|
|
134
|
+
| XLIFF 1.2 | ✅ | ✅ | 内联标签转换为 `{n}` token;缺少 token 时阻止确认 |
|
|
135
|
+
| XLIFF 2.0 | ✅ | ✅ | 基础 `<unit><segment><source>/<target>` 子集 |
|
|
136
|
+
| SDLXLIFF | ✅ | ✅ | 走基础 XLIFF 1.2 路径;SDL 专有扩展不会完整往返 |
|
|
137
|
+
| HTML | ✅ | ✅ | 保留文本块与内联标签;不重建文档级 CSS/版式 |
|
|
138
|
+
| JSON | ✅ | ✅ | 字符串路径子集;通过模板保留对象/数组结构;key 和数字不翻译 |
|
|
139
|
+
| XLSX | ✅ | ✅ | 第一个工作表;识别 `Source`/`Target` 表头或 A/B 列;导出为新的两列表格 |
|
|
140
|
+
| PPTX | ✅ | ✅* | 保留源格式导出;需要导入时保留的 `.pptx` 包。仅正文;备注/图表/SmartArt 不导入。 |
|
|
141
|
+
| RTF | ✅ | ✅ | 基础段落、`\uN`、`\'hh`、控制字;不往返原始样式 |
|
|
142
|
+
|
|
143
|
+
\* 如果保留的源包不存在,PPTX 导出会以 `PPTX_SOURCE_REQUIRED` 失败,
|
|
144
|
+
而不是静默生成一个没有格式的演示文稿。
|
|
145
|
+
|
|
146
|
+
交换元数据(字幕时间轴、PO 上下文/复数/注释、XLIFF id 和内联 token 映射、
|
|
147
|
+
JSON 路径/模板、XLSX 行号、PPTX 幻灯片/段落位置、EPUB spine href 和块序号)
|
|
148
|
+
会保存在文档/句段上,并随快照持久化。
|
|
149
|
+
|
|
150
|
+
### 不支持 PDF
|
|
151
|
+
|
|
152
|
+
CAIT 不导入 PDF,后续版本也不会加入 PDF 支持。PDF 是固定版式的打印格式,
|
|
153
|
+
没有逻辑段落、阅读顺序或内联标记;从中提取的文本会散落在绘图指令之间,
|
|
154
|
+
丢失标题、表格和内联强调,切出的句段对翻译记忆和 MT 都是很差的输入——
|
|
155
|
+
也就是说,PDF 极其不适合 AI 相关工作。
|
|
156
|
+
|
|
157
|
+
如果需要翻译 PDF 内容,请先转换成支持的格式,例如:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
pandoc input.pdf -t docx -o output.docx # 或 -t html、-t markdown
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
也可以使用 Adobe Acrobat 的 **导出为 Word/HTML**、LibreOffice,或其他能生成
|
|
164
|
+
DOCX、HTML、EPUB 或纯文本的工具。扫描版 PDF 在转换前还需要 OCR;
|
|
165
|
+
CAIT 没有图片 OCR 阶段。
|
|
166
|
+
|
|
167
|
+
## 安装
|
|
168
|
+
|
|
169
|
+
CAIT 以 DSH bundle 的形式安装;发布的 npm 包名为 `dsh-cait`,插件本身在左侧栏显示为
|
|
170
|
+
**CAIT**。`desktop` 配置档由应用的 plugin manager 管理,请通过它安装,不要手写配置档的
|
|
171
|
+
`package.json`。
|
|
172
|
+
|
|
173
|
+
### 从 npm 安装
|
|
174
|
+
|
|
175
|
+
在 DSH 桌面端(或任何带有 `plugin_manager` 工具的配置档)中:
|
|
176
|
+
|
|
177
|
+
```text
|
|
178
|
+
plugin_manager install_bundle target: dsh-cait
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
需要固定版本时写 `dsh-cait@1.0.5`,需要最新版时写 `dsh-cait@latest`。管理器会解析 registry
|
|
182
|
+
上的包、应用 bundle patch 并激活插件,不需要手工在配置档里加行。
|
|
183
|
+
|
|
184
|
+
使用 CLI 管理的配置档:
|
|
185
|
+
|
|
186
|
+
```sh
|
|
187
|
+
dsh plugin --profile web add dsh-cait
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
将 `web` 替换为你的配置档名称。如果 Host 需要重启,请重启 `dsh web`。
|
|
191
|
+
|
|
192
|
+
### 从本仓库安装
|
|
193
|
+
|
|
194
|
+
GitHub:
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
plugin_manager install_bundle target: github:JoviLecca/dsh-CAIT
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
本地目录:
|
|
201
|
+
|
|
202
|
+
```text
|
|
203
|
+
plugin_manager install_bundle target: /absolute/path/to/dsh-CAIT
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
然后重新加载 DSH。左侧栏会出现 **CAIT** 入口。
|
|
207
|
+
|
|
208
|
+
### 从源码安装
|
|
209
|
+
|
|
210
|
+
```sh
|
|
211
|
+
git clone <this-repository> dsh-CAIT
|
|
212
|
+
cd dsh-CAIT
|
|
213
|
+
npm run build:client
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
本地 `--patch` 覆盖层可以添加一行指向当前目录:
|
|
217
|
+
|
|
218
|
+
```yaml
|
|
219
|
+
# _dev/cait.patch.yml
|
|
220
|
+
- insert:
|
|
221
|
+
- id: cait-dev
|
|
222
|
+
name: 'C:\absolute\path\to\dsh-CAIT'
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
```powershell
|
|
226
|
+
dsh web --patch C:\absolute\path\to\dsh-CAIT\_dev\cait.patch.yml
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
`--patch` 是启动器选项;放在应用名(`web`)之后、应用自身参数之前。
|
|
230
|
+
覆盖层和配置档中已安装的 bundle 二选一,不要同时使用。
|
|
231
|
+
|
|
232
|
+
## 配置
|
|
233
|
+
|
|
234
|
+
| 选项 | 默认值 | 含义 |
|
|
235
|
+
| --- | --- | --- |
|
|
236
|
+
| `dataDir` | `""` | `store.json` 和 `sources/` 的目录。为空时使用 `$DSH_HOME/cait`。支持绝对路径、相对路径和 `~/...`。 |
|
|
237
|
+
|
|
238
|
+
```yaml
|
|
239
|
+
- id: dsh-cait
|
|
240
|
+
name: dsh-cait
|
|
241
|
+
config:
|
|
242
|
+
dataDir: 'D:\CAT\cait-data'
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
快照保存文档、打开的标签页、TM、术语库、库、挂载关系和非敏感设置。
|
|
246
|
+
导入的 DOCX/PPTX/EPUB 源包放在 `sources/` 下。
|
|
247
|
+
|
|
248
|
+
界面内的**设置**保存在快照里,而不是上面的 YAML:源语言/目标语言、模糊阈值、
|
|
249
|
+
TM 返回条数、MT 路由/模型/温度,以及界面语言(`uiLang`:`auto` | `zh` | `en` |
|
|
250
|
+
`ja`,默认 `auto` 即跟随 DSH 语言)。
|
|
251
|
+
|
|
252
|
+
句段确认使用严格写入:如果快照无法写入,确认会以 `PERSISTENCE_FAILED`(503)
|
|
253
|
+
失败,并回滚内存中的确认。其他结构性修改采用尽力写入,并通过工作台横幅显示
|
|
254
|
+
`bootstrap().storage.error`。
|
|
255
|
+
|
|
256
|
+
如果快照损坏或版本未知,CAIT 会记录警告,将其移动到
|
|
257
|
+
`store.json.corrupt-<timestamp>`,然后以空状态启动,而不是让插件激活失败。
|
|
258
|
+
版本 1 快照会迁移到版本 2,并创建默认 TM 和术语库。
|
|
259
|
+
|
|
260
|
+
## Agent 工具
|
|
261
|
+
|
|
262
|
+
| 工具 | 用途 |
|
|
263
|
+
| --- | --- |
|
|
264
|
+
| `cat_get_segment` | 获取当前句段及 TM 匹配、术语命中 |
|
|
265
|
+
| `cat_submit_translation` | 确认译文,写入已挂载 TM(可选 `targetTmId`),前进到下一句 |
|
|
266
|
+
| `cat_lookup_tm` | 在已挂载库中按等级检索 TM |
|
|
267
|
+
| `cat_lookup_glossary` | 查询已挂载术语库;遵循 `caseSensitive` |
|
|
268
|
+
| `cat_list_documents` | 列出文档和进度 |
|
|
269
|
+
| `cat_switch_document` | 选择活动文档 |
|
|
270
|
+
| `cat_suggest_mt` | 通过所选 DSH 路由调用 MT,或使用明确的离线回退 |
|
|
271
|
+
|
|
272
|
+
工作台和工具共用一个 `CatStore`,因此 Agent 可以翻译用户当前打开的同一份文档。
|
|
273
|
+
|
|
274
|
+
## 架构
|
|
275
|
+
|
|
276
|
+
```mermaid
|
|
277
|
+
flowchart LR
|
|
278
|
+
UI["DSH Web UI<br/>(侧栏 + 工作台)"] --> Client["client.js<br/>生成的 Web bundle"]
|
|
279
|
+
Client --> API["/cait/api/rpc<br/>同源 JSON"]
|
|
280
|
+
Tools["7 个 Agent 工具"] --> Store["CatStore"]
|
|
281
|
+
API --> Store
|
|
282
|
+
Store --> Snapshot[("store.json<br/>+ sources/")]
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
- **Host**(`index.js`、`lib/`)负责存储、持久化、导入/导出、工具和私有 API。
|
|
286
|
+
- **Client**(`client/`)是通过 DSH 模块加载器加载的普通 React,渲染到
|
|
287
|
+
`sidebar.panellist` 和 `main`。样式只使用 `--dsw-alias-*` 令牌。
|
|
288
|
+
- `client.js` 是生成文件;请修改 `client/*.js`,然后运行 `npm run build:client`。
|
|
289
|
+
|
|
290
|
+
<details>
|
|
291
|
+
<summary><strong>项目结构</strong></summary>
|
|
292
|
+
|
|
293
|
+
```text
|
|
294
|
+
cait/
|
|
295
|
+
├─ package.json
|
|
296
|
+
├─ cordis.patch.yml
|
|
297
|
+
├─ index.js # Host 端
|
|
298
|
+
├─ client.js # 生成的 Web bundle
|
|
299
|
+
├─ client/ # helpers、styles、RPC、components、locales、entry
|
|
300
|
+
├─ scripts/build-client.mjs
|
|
301
|
+
├─ icon.svg
|
|
302
|
+
├─ locale/{en,zh,ja}.json
|
|
303
|
+
├─ NOTICE
|
|
304
|
+
├─ README.md
|
|
305
|
+
├─ README.zh-CN.md
|
|
306
|
+
├─ README.ja.md
|
|
307
|
+
├─ CHANGELOG.md
|
|
308
|
+
├─ lib/
|
|
309
|
+
│ ├─ store.js # CatStore 门面 + 文档/句段核心
|
|
310
|
+
│ ├─ errors.js
|
|
311
|
+
│ ├─ store-utils.js
|
|
312
|
+
│ ├─ libraries.js # TM/术语库注册表 + 挂载
|
|
313
|
+
│ ├─ tm.js
|
|
314
|
+
│ ├─ glossary.js
|
|
315
|
+
│ ├─ persistence.js
|
|
316
|
+
│ ├─ import-export.js
|
|
317
|
+
│ ├─ formats.js # CSV/SRT/VTT/PO/XLIFF/HTML/JSON/RTF
|
|
318
|
+
│ ├─ html.js # 共享 HTML/XHTML 文本块扫描与回写
|
|
319
|
+
│ ├─ epub.js # EPUB 包读取 / spine 导入 / 回写导出
|
|
320
|
+
│ ├─ preprocess.js # 导入期源文预处理阶段
|
|
321
|
+
│ ├─ xlsx.js
|
|
322
|
+
│ ├─ pptx.js
|
|
323
|
+
│ ├─ segmenter.js
|
|
324
|
+
│ ├─ similarity.js
|
|
325
|
+
│ ├─ tmx.js
|
|
326
|
+
│ ├─ docx.js
|
|
327
|
+
│ ├─ markdown.js
|
|
328
|
+
│ ├─ xml.js
|
|
329
|
+
│ ├─ mt.js
|
|
330
|
+
│ ├─ tools.js
|
|
331
|
+
│ └─ api.js
|
|
332
|
+
└─ _dev/ # 测试、fixture、本地 patch 覆盖层
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
</details>
|
|
336
|
+
|
|
337
|
+
## 开发
|
|
338
|
+
|
|
339
|
+
需要 Node.js 22+ 和 DSH `0.2.x`。已在 DSH `0.2.2-rc.1`、Node `26.7.0`
|
|
340
|
+
中测试。
|
|
341
|
+
|
|
342
|
+
```sh
|
|
343
|
+
npm run build:client
|
|
344
|
+
node --check client.js
|
|
345
|
+
|
|
346
|
+
node _dev/test-core.mjs
|
|
347
|
+
node _dev/test-imports.mjs
|
|
348
|
+
node _dev/test-formats.mjs
|
|
349
|
+
node _dev/test-epub.mjs
|
|
350
|
+
node _dev/test-preprocess.mjs
|
|
351
|
+
node _dev/test-second-tier.mjs
|
|
352
|
+
node _dev/test-docx-export.mjs
|
|
353
|
+
node _dev/test-api.mjs
|
|
354
|
+
node _dev/test-plugin.mjs
|
|
355
|
+
node _dev/test-persistence.mjs
|
|
356
|
+
node _dev/test-documents.mjs
|
|
357
|
+
node _dev/test-libraries.mjs
|
|
358
|
+
node _dev/test-mounts.mjs
|
|
359
|
+
node _dev/test-ui-scale.mjs
|
|
360
|
+
node _dev/test-mt.mjs
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
导入/导出 fixture 为 `_dev/sample.docx`、`_dev/sample-table.docx` 和
|
|
364
|
+
`_dev/sample-format.docx`;可用对应的 `python _dev/make-*.py` 脚本重新生成。
|
|
365
|
+
15 套测试应全部通过。
|
|
366
|
+
|
|
367
|
+
### 发布
|
|
368
|
+
|
|
369
|
+
`npm publish` 会触发 `prepublishOnly`:从 `client/` 的片段重建 `client.js`
|
|
370
|
+
并做语法检查,因此发布出去的不会是一个过期的 bundle。在仓库根目录执行:
|
|
371
|
+
|
|
372
|
+
```sh
|
|
373
|
+
npm publish
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
`.github/workflows/publish.yml` 会在 GitHub 发布 release 时做同样的事,使用
|
|
377
|
+
npm Trusted Publishing(OIDC)而不是保存的 token,并且当 release tag 与
|
|
378
|
+
`package.json` 的版本不一致时拒绝发布。
|
|
379
|
+
|
|
380
|
+
首次发布必须在本地完成,因为 Trusted Publishing 只能为已经存在的包配置:
|
|
381
|
+
|
|
382
|
+
```sh
|
|
383
|
+
npm login
|
|
384
|
+
npm publish
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
之后在 npmjs.com 打开该包,进入 **Settings → Trusted publishing**,添加仓库
|
|
388
|
+
`JoviLecca/dsh-CAIT` 和 workflow 文件 `publish.yml`。以后的版本就可以通过
|
|
389
|
+
GitHub release 发布。
|
|
390
|
+
|
|
391
|
+
## 安全模型
|
|
392
|
+
|
|
393
|
+
- Host API 挂载在 `/cait/api`,通过 `ctx.connection.requestRejection`
|
|
394
|
+
限制为同源/受信任请求。
|
|
395
|
+
- RPC 请求体为 JSON,上限 32 MB;超过时返回 `413 BODY_TOO_LARGE`。
|
|
396
|
+
- `clearTM` / `clearGlossary` 除了浏览器信任检查外,还要求
|
|
397
|
+
`params.confirm === true`;UI 会在发送前询问。
|
|
398
|
+
- CAIT 从不接收、存储或返回 API Key。DSH 凭据保留在所选提供方适配器内部。
|
|
399
|
+
- 持久化使用单个快照,语义为最后写入者获胜;它不是多用户日志。
|
|
400
|
+
|
|
401
|
+
## 已知限制与路线图
|
|
402
|
+
|
|
403
|
+
- 不支持 PDF 导入;PDF 已被明确排除在范围外(见
|
|
404
|
+
[不支持 PDF](#不支持-pdf))。暂不支持图片 OCR。
|
|
405
|
+
- EPUB 导入只覆盖 spine 中的正文 XHTML 文本块;不支持 DRM、固定版式、
|
|
406
|
+
脚本化以及大量使用 MathML 的电子书。
|
|
407
|
+
- DOCX 导入会跳过表格、页眉、脚注、域、替代文本和修订删除内容。
|
|
408
|
+
DOCX 导出时这些区域保持源语言。
|
|
409
|
+
- DOCX/PPTX 中混合 run 的段落会继承第一个 run 的格式。
|
|
410
|
+
- PPTX 导入只覆盖正文,不包含备注、图表或 SmartArt。
|
|
411
|
+
- XLSX 导入/导出是两列表格;不保留单元格样式、公式、合并单元格、图片和额外工作表。
|
|
412
|
+
- HTML/RTF 导出不往返原始样式;JSON 只翻译字符串值。
|
|
413
|
+
- TM 匹配是词法级的,不是语义级;没有词干、同义词或向量。
|
|
414
|
+
- 库重命名/删除和逐标签页挂载状态尚未实现。
|
|
415
|
+
- 工作台界面提供中文、English、日本語三种语言,可在设置中切换;README 提供英文、简体中文和日文三个版本,以英文版为准。
|
|
416
|
+
|
|
417
|
+
后续计划:通过多模态 DSH 路由支持图片/视觉输入、更完整的库管理、
|
|
418
|
+
保留样式的 XLSX 输出,以及 XLIFF `<alt-trans>` / 注释支持。
|
|
419
|
+
|
|
420
|
+
## 变更日志与版本
|
|
421
|
+
|
|
422
|
+
见 [CHANGELOG.md](CHANGELOG.md)。`v1.0.0` 是首个公开发布版本,`v1.0.1` 增加了
|
|
423
|
+
日语界面和界面内语言切换,`v1.0.2` 让「跟随 DSH 语言」真正跟随 DSH 的语言设置,
|
|
424
|
+
`v1.0.3` 把包发布到 npm,`v1.0.4` 起后续版本改由带 provenance 的发布流水线产出,
|
|
425
|
+
`v1.0.5` 增加 EPUB、导入预处理和 PDF 政策;项目在开发阶段使用 `0.1.0`,
|
|
426
|
+
发布到 GitHub 前统一改为 `1.0.0`。
|
|
427
|
+
|
|
428
|
+
> **License:** Apache License 2.0,见 [LICENSE](LICENSE)。再分发时需保留
|
|
429
|
+
> [NOTICE](NOTICE) 中的署名信息。
|