dsh-cait 1.0.4 → 1.1.3

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/client/locales.js CHANGED
@@ -47,6 +47,40 @@
47
47
  'editor.emptyTarget': '请先输入译文',
48
48
  'editor.done': '全部句段已确认',
49
49
  'editor.confirmedAt': '确认于',
50
+ 'editor.suggestion': '机器建议',
51
+ 'editor.adopt': '采纳',
52
+ 'editor.adoptHint': '把建议填入译文,保留它的来源',
53
+ 'editor.remaining': '句待确认',
54
+ 'status.translated': '已翻译',
55
+ 'origin.tm': 'TM',
56
+ 'origin.mt': 'MT',
57
+ 'origin.agent': 'Agent',
58
+ 'origin.manual': '手动',
59
+ 'rail.filter.all': '全部',
60
+ 'rail.filter.pending': '待译',
61
+ 'rail.filter.translated': '待审',
62
+ 'rail.filter.confirmed': '已确认',
63
+ 'rail.confirmAll': '全部确认',
64
+ 'rail.confirmAllHint': '把当前所有「待审」句段一次性确认并写入翻译记忆',
65
+ 'rail.confirmAllMessage': '将确认 {count} 个待审句段并写入翻译记忆,句段译文不会经过逐句复核。确定继续?',
66
+ 'toast.confirmedMany': '已确认 {count} 段',
67
+ 'qa.warn': '检查提醒',
68
+ 'qa.exportBanner': '导出前检查发现 {count} 条提醒(不影响导出):',
69
+ 'qa.counts': '占位符 {placeholder} · 数字 {number} · 术语 {term} · 空译文 {empty}',
70
+ 'qa.code.PLACEHOLDER_MISSING': '占位符缺失',
71
+ 'qa.code.NUMBER_MISMATCH': '数字不一致',
72
+ 'qa.code.TERM_NOT_USED': '术语未使用',
73
+ 'qa.code.EMPTY_TARGET': '空译文',
74
+ 'toast.suggestionAdopted': '已采纳建议',
75
+ 'pretranslate.start': '预翻译',
76
+ 'editor.noSuggestion': '暂无建议,可直接翻译或让 agent 补刀',
77
+ 'editor.baselineHint': '中间栏是机器或 agent 的初次产出,右侧可以对照着改',
78
+ 'pretranslate.title': '用翻译记忆与机器翻译给整篇铺底,之后逐句审校',
79
+ 'pretranslate.running': '预翻译中',
80
+ 'pretranslate.cancel': '停止预翻译',
81
+ 'toast.preDone': '预翻译完成,填充 {count} 段',
82
+ 'toast.preCancelled': '已停止预翻译',
83
+ 'toast.preFailed': '预翻译结束,{count} 段失败',
50
84
  'empty.title': '开始一次 CAT 翻译',
51
85
  'empty.desc': '粘贴文本、拖入文件,或加载演示文档。CAIT 会把源文切成句段,并同时查询翻译记忆与术语库;确认译文后自动入库。',
52
86
  'empty.paste': '粘贴文本',
@@ -57,7 +91,7 @@
57
91
  'empty.demo': '加载演示文档',
58
92
  'empty.demoHint': '没有素材?',
59
93
  'empty.drop': '拖入文件,或点击选择',
60
- 'empty.formats': '支持 TXT · Markdown · DOCX · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
94
+ 'empty.formats': '支持 TXT · Markdown · DOCX · EPUB · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
61
95
  'empty.features.tm': '翻译记忆',
62
96
  'empty.features.tmDesc': '精确 + 模糊匹配',
63
97
  'empty.features.glossary': '术语库',
@@ -71,7 +105,7 @@
71
105
  'modal.new.targetLang': '目标语言',
72
106
  'modal.new.create': '创建文档',
73
107
  'modal.new.importing': '正在导入…',
74
- 'modal.new.dropHint': 'TXT · Markdown · DOCX · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
108
+ 'modal.new.dropHint': 'TXT · Markdown · DOCX · EPUB · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
75
109
  'modal.new.csvSource': 'CSV 源文列',
76
110
  'modal.new.csvTarget': 'CSV 译文列',
77
111
  'modal.new.csvColumnPlaceholder': '列名或列号,例如 Source / 2',
@@ -95,6 +129,13 @@
95
129
  'libraries.create': '新建',
96
130
  'libraries.done': '完成',
97
131
  'libraries.created': '库已创建并自动挂载',
132
+ 'libraries.rename': '重命名',
133
+ 'libraries.save': '保存',
134
+ 'libraries.renamed': '库已重命名',
135
+ 'libraries.delete': '删除库',
136
+ 'libraries.deleted': '库已删除',
137
+ 'libraries.deleteTmWarn': '库里的记忆条目也会一起删除,无法撤销。',
138
+ 'libraries.deleteGlossaryWarn': '库里的术语也会一起删除,无法撤销。',
98
139
  'libraries.mountSaved': '挂载设置已保存',
99
140
  'panel.tm': '记忆库',
100
141
  'panel.glossary': '术语库',
@@ -112,6 +153,9 @@
112
153
  'match.high_fuzzy': '高模糊',
113
154
  'match.medium_fuzzy': '中模糊',
114
155
  'match.low_fuzzy': '低模糊',
156
+ 'match.context': '上下文匹配',
157
+ 'panel.contextPrev': '上文',
158
+ 'panel.contextNext': '下文',
115
159
  'panel.apply': '应用',
116
160
  'panel.importTmx': '导入 TMX',
117
161
  'panel.clearTm': '清空记忆库',
@@ -127,6 +171,8 @@
127
171
  'panel.saveTerm': '保存术语',
128
172
  'panel.cancel': '取消',
129
173
  'panel.delete': '删除',
174
+ 'panel.edit': '编辑',
175
+ 'panel.saveEntry': '保存修改',
130
176
  'panel.noTerms': '术语库为空。添加术语后,命中会自动高亮。',
131
177
  'panel.importCsv': '导入 CSV/TSV',
132
178
  'panel.clearGlossary': '清空术语库',
@@ -156,6 +202,8 @@
156
202
  'modal.export.targetMd': 'Markdown',
157
203
  'modal.export.docx': 'Word DOCX',
158
204
  'modal.export.docxGroup': '保留源格式',
205
+ 'modal.export.epub': 'EPUB 电子书',
206
+ 'modal.export.epubGroup': '保留源排版',
159
207
  'modal.export.json': '文档 JSON',
160
208
  'modal.export.subtitleGroup': '字幕',
161
209
  'modal.export.localizationGroup': '本地化交换',
@@ -178,6 +226,11 @@
178
226
  'modal.settings.uiAuto': '跟随 DSH 语言',
179
227
  'modal.settings.uiHint': '只影响 CAIT 界面,不会改变文档的源语言和目标语言。',
180
228
  'modal.settings.languages': '语言',
229
+ 'modal.settings.preprocess': '预处理',
230
+ 'modal.settings.preprocessHint': '在导入切句之前清理源文,占位符与标点不会被改写。',
231
+ 'modal.settings.pre.normalizeWhitespace': '折叠多余空格与制表符',
232
+ 'modal.settings.pre.stripInvisible': '移除零宽字符与控制字符',
233
+ 'modal.settings.pre.collapseBlankLines': '合并连续空行',
181
234
  'modal.settings.tm': '翻译记忆',
182
235
  'modal.settings.fuzzy': '模糊匹配阈值',
183
236
  'modal.settings.limit': '返回匹配数',
@@ -198,6 +251,7 @@
198
251
  'modal.confirm.clearGlossary':
199
252
  '清空当前挂载的术语?未挂载库不会受影响;如要清空全部库,请在 API 调用中显式传 all: true。此操作无法撤销。',
200
253
  'modal.confirm.deleteTerm': '删除术语',
254
+ 'modal.confirm.deleteTm': '删除记忆库条目',
201
255
  'modal.confirm.ok': '确认',
202
256
  'modal.confirm.cancel': '取消',
203
257
  'toast.confirmed': '句段已确认并写入记忆库',
@@ -210,6 +264,8 @@
210
264
  'toast.draftSaved': '草稿已保存',
211
265
  'toast.termSaved': '术语已保存',
212
266
  'toast.termDeleted': '术语已删除',
267
+ 'toast.tmUpdated': '记忆库条目已更新',
268
+ 'toast.tmDeleted': '记忆库条目已删除',
213
269
  'toast.tmImported': 'TMX 已导入',
214
270
  'toast.tmxMarkupLost': 'TMX 已导入;{count} 个内联占位符/格式标签已按纯文本处理,格式信息丢失。',
215
271
  'toast.glossaryImported': '术语已导入',
@@ -220,6 +276,93 @@
220
276
  'toast.copied': '已复制到剪贴板',
221
277
  'toast.mtReady': '译文建议已生成',
222
278
  'toast.error': '操作失败',
279
+ 'nav.documents': '文档',
280
+ 'nav.libraries': '库',
281
+ 'library.title': '翻译记忆与术语库',
282
+ 'library.tmTab': '翻译记忆',
283
+ 'library.glossaryTab': '术语库',
284
+ 'library.scope': '搜索范围',
285
+ 'library.scopeAll': '全部库',
286
+ 'library.search': '搜索原文或译文…',
287
+ 'library.language': '全部语言',
288
+ 'library.pageSize': '每页',
289
+ 'library.pageInfo': '第 {start}–{end} 条 / 共 {total} 条',
290
+ 'library.prev': '上一页',
291
+ 'library.next': '下一页',
292
+ 'library.empty': '这个库里还没有条目。',
293
+ 'library.noMatch': '没有匹配的条目。',
294
+ 'library.add': '新增',
295
+ 'library.import': '导入',
296
+ 'library.export': '导出',
297
+ 'library.clear': '清空',
298
+ 'library.newLibrary': '新建库',
299
+ 'library.rename': '重命名',
300
+ 'library.deleteLibrary': '删除库',
301
+ 'library.deleteLibraryMessage': '删除「{name}」?库里的条目也会一起删除。',
302
+ 'library.colSource': '原文',
303
+ 'library.colTarget': '译文',
304
+ 'library.colNote': '备注',
305
+ 'library.colContext': '上下文',
306
+ 'library.colLang': '语言',
307
+ 'library.colCase': '区分大小写',
308
+ 'library.colUpdated': '更新时间',
309
+ 'library.detail': '条目详情',
310
+ 'library.detailEmpty': '点一行查看和编辑。',
311
+ 'library.save': '保存',
312
+ 'library.deleteEntry': '删除条目',
313
+ 'library.entryCreated': '已新增条目',
314
+ 'library.entrySaved': '已保存',
315
+ 'library.entryDeleted': '已删除',
316
+ 'library.exported': '已导出',
317
+ 'library.exportFormat': '导出格式',
318
+ 'library.caseSensitiveHint': '区分大小写时只匹配完全一致的写法。',
319
+ 'library.noDocHint': '不用打开文档也能管理库。',
320
+ 'rail.pageInfo': '第 {start}–{end} 条 / 共 {total} 条',
321
+ 'rail.goto': '跳到编号',
322
+ 'rail.gotoInvalid': '编号超出范围。',
323
+ 'rail.nextUnconfirmed': '下一个未确认',
324
+ 'panel.searchInLibrary': '在库中搜索',
325
+ 'panel.viewAll': '在库页面查看全部',
326
+ 'panel.glossaryMatchesOnly': '这里只显示当前句段命中的术语。',
327
+ 'nav.align': '对齐',
328
+ 'align.title': '对齐两个文件',
329
+ 'align.hint': '分别放入源文件和译文文件,CAIT 会按段落逐句配对。两个文件可以是完全不同的语言。',
330
+ 'align.sourceFile': '源文件',
331
+ 'align.targetFile': '译文文件',
332
+ 'align.pick': '未选择文件',
333
+ 'align.choose': '选择',
334
+ 'align.chars': '{count} 字符',
335
+ 'align.run': '开始对齐',
336
+ 'align.running': '对齐中…',
337
+ 'align.needFiles': '请先选择源文件和译文文件。',
338
+ 'align.readError': '读取文件失败。',
339
+ 'align.sourceLang': '源语言(可选)',
340
+ 'align.targetLang': '目标语言(可选)',
341
+ 'align.stats': '高置信 {high} · 待确认 {medium} · 可疑 {low}',
342
+ 'align.unpairedSource': '未配对原文',
343
+ 'align.unpairedTarget': '未配对译文',
344
+ 'align.blocked': '文件较大,已按段落分块对齐,结果可能不如整体对齐稳定。',
345
+ 'align.confidence': '置信度',
346
+ 'align.merge': '与下一行合并',
347
+ 'align.split': '按换行拆开',
348
+ 'align.remove': '删除这一行',
349
+ 'align.write': '写入记忆库',
350
+ 'align.writeCount': '写入选中的 {count} 条',
351
+ 'align.writeMessage': '将写入 {count} 条,完全相同的条目会被跳过。',
352
+ 'align.written': '已写入 {written} 条,跳过 {skipped} 条。',
353
+ 'align.nothing': '没有可写入的行。',
354
+ 'origin.auto': '自动传播',
355
+ 'rail.propagate': '铺满重复句段',
356
+ 'rail.propagateMessage': '把已有译文填到本文档中其它相同原文的句段(已确认的不会动)。',
357
+ 'toast.propagated': '已铺满 {count} 个句段。',
358
+ 'term.title': '术语候选',
359
+ 'term.hint': '按出现次数与长度排序,点选后填入译文即可入库。',
360
+ 'term.extract': '从文档提取术语',
361
+ 'term.empty': '没有找到重复出现的候选术语。',
362
+ 'term.add': '加入术语库',
363
+ 'term.added': '已加入 {added} 条术语。',
364
+ 'term.noDoc': '先打开一个文档再提取术语。',
365
+ 'term.inLibrary': '已有',
223
366
  }
224
367
 
225
368
  const EN = {
@@ -271,6 +414,40 @@
271
414
  'editor.emptyTarget': 'Enter a translation first',
272
415
  'editor.done': 'All segments confirmed',
273
416
  'editor.confirmedAt': 'Confirmed',
417
+ 'editor.suggestion': 'Machine suggestion',
418
+ 'editor.adopt': 'Adopt',
419
+ 'editor.adoptHint': 'Fill the target with this suggestion and keep its origin',
420
+ 'editor.remaining': 'to review',
421
+ 'status.translated': 'Translated',
422
+ 'origin.tm': 'TM',
423
+ 'origin.mt': 'MT',
424
+ 'origin.agent': 'Agent',
425
+ 'origin.manual': 'Manual',
426
+ 'rail.filter.all': 'All',
427
+ 'rail.filter.pending': 'To translate',
428
+ 'rail.filter.translated': 'To review',
429
+ 'rail.filter.confirmed': 'Confirmed',
430
+ 'rail.confirmAll': 'Confirm all',
431
+ 'rail.confirmAllHint': 'Confirm every "To review" segment at once and write them to translation memory',
432
+ 'rail.confirmAllMessage': 'This confirms {count} segment(s) awaiting review and writes them to translation memory, without reviewing them one by one. Continue?',
433
+ 'toast.confirmedMany': 'Confirmed {count} segment(s)',
434
+ 'qa.warn': 'Review note',
435
+ 'qa.exportBanner': 'Pre-export check found {count} note(s) — export is not blocked:',
436
+ 'qa.counts': 'placeholders {placeholder} · numbers {number} · terms {term} · empty {empty}',
437
+ 'qa.code.PLACEHOLDER_MISSING': 'placeholder missing',
438
+ 'qa.code.NUMBER_MISMATCH': 'number mismatch',
439
+ 'qa.code.TERM_NOT_USED': 'term unused',
440
+ 'qa.code.EMPTY_TARGET': 'empty target',
441
+ 'toast.suggestionAdopted': 'Suggestion adopted',
442
+ 'pretranslate.start': 'Pre-translate',
443
+ 'editor.noSuggestion': 'No suggestion yet — translate directly or let an agent draft it',
444
+ 'editor.baselineHint': 'The middle column is what the machine or agent produced; edit against it on the right',
445
+ 'pretranslate.title': 'Fill the whole document from TM and machine translation, then review segment by segment',
446
+ 'pretranslate.running': 'Pre-translating',
447
+ 'pretranslate.cancel': 'Stop pre-translation',
448
+ 'toast.preDone': 'Pre-translation finished, {count} segment(s) filled',
449
+ 'toast.preCancelled': 'Pre-translation stopped',
450
+ 'toast.preFailed': 'Pre-translation finished, {count} segment(s) failed',
274
451
  'empty.title': 'Start a CAT translation',
275
452
  'empty.desc': 'Paste text, drop a file, or load the demo. CAIT splits the source into segments, queries translation memory and glossary hits, and stores each confirmed pair in TM.',
276
453
  'empty.paste': 'Paste text',
@@ -281,7 +458,7 @@
281
458
  'empty.demo': 'Load demo document',
282
459
  'empty.demoHint': 'No material?',
283
460
  'empty.drop': 'Drop a file, or click to choose',
284
- 'empty.formats': 'TXT · Markdown · DOCX · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
461
+ 'empty.formats': 'TXT · Markdown · DOCX · EPUB · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
285
462
  'empty.features.tm': 'Translation memory',
286
463
  'empty.features.tmDesc': 'Exact + fuzzy matching',
287
464
  'empty.features.glossary': 'Glossary',
@@ -295,7 +472,7 @@
295
472
  'modal.new.targetLang': 'Target language',
296
473
  'modal.new.create': 'Create document',
297
474
  'modal.new.importing': 'Importing…',
298
- 'modal.new.dropHint': 'TXT · Markdown · DOCX · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
475
+ 'modal.new.dropHint': 'TXT · Markdown · DOCX · EPUB · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
299
476
  'modal.new.csvSource': 'CSV source column',
300
477
  'modal.new.csvTarget': 'CSV target column',
301
478
  'modal.new.csvColumnPlaceholder': 'Column name or number, e.g. Source / 2',
@@ -319,6 +496,13 @@
319
496
  'libraries.create': 'Create',
320
497
  'libraries.done': 'Done',
321
498
  'libraries.created': 'Library created and mounted',
499
+ 'libraries.rename': 'Rename',
500
+ 'libraries.save': 'Save',
501
+ 'libraries.renamed': 'Library renamed',
502
+ 'libraries.delete': 'Delete library',
503
+ 'libraries.deleted': 'Library deleted',
504
+ 'libraries.deleteTmWarn': 'Its TM entries are deleted with it. This cannot be undone.',
505
+ 'libraries.deleteGlossaryWarn': 'Its terms are deleted with it. This cannot be undone.',
322
506
  'libraries.mountSaved': 'Mount settings saved',
323
507
  'panel.tm': 'TM',
324
508
  'panel.glossary': 'Glossary',
@@ -336,6 +520,9 @@
336
520
  'match.high_fuzzy': 'High fuzzy',
337
521
  'match.medium_fuzzy': 'Medium fuzzy',
338
522
  'match.low_fuzzy': 'Low fuzzy',
523
+ 'match.context': 'Context match',
524
+ 'panel.contextPrev': 'Prev',
525
+ 'panel.contextNext': 'Next',
339
526
  'panel.apply': 'Apply',
340
527
  'panel.importTmx': 'Import TMX',
341
528
  'panel.clearTm': 'Clear TM',
@@ -351,6 +538,8 @@
351
538
  'panel.saveTerm': 'Save term',
352
539
  'panel.cancel': 'Cancel',
353
540
  'panel.delete': 'Delete',
541
+ 'panel.edit': 'Edit',
542
+ 'panel.saveEntry': 'Save changes',
354
543
  'panel.noTerms': 'The glossary is empty. Hits will be highlighted automatically.',
355
544
  'panel.importCsv': 'Import CSV/TSV',
356
545
  'panel.clearGlossary': 'Clear glossary',
@@ -380,6 +569,8 @@
380
569
  'modal.export.targetMd': 'Markdown',
381
570
  'modal.export.docx': 'Word DOCX',
382
571
  'modal.export.docxGroup': 'Preserve source formatting',
572
+ 'modal.export.epub': 'EPUB ebook',
573
+ 'modal.export.epubGroup': 'Preserve source layout',
383
574
  'modal.export.json': 'Document JSON',
384
575
  'modal.export.subtitleGroup': 'Subtitles',
385
576
  'modal.export.localizationGroup': 'Localization exchange',
@@ -402,6 +593,11 @@
402
593
  'modal.settings.uiAuto': 'Follow DSH language',
403
594
  'modal.settings.uiHint': 'Changes only the CAIT interface; document source and target languages are unaffected.',
404
595
  'modal.settings.languages': 'Languages',
596
+ 'modal.settings.preprocess': 'Preprocessing',
597
+ 'modal.settings.preprocessHint': 'Cleans imported source text before segmentation. Placeholders and punctuation are left untouched.',
598
+ 'modal.settings.pre.normalizeWhitespace': 'Collapse extra spaces and tabs',
599
+ 'modal.settings.pre.stripInvisible': 'Remove zero-width and control characters',
600
+ 'modal.settings.pre.collapseBlankLines': 'Merge consecutive blank lines',
405
601
  'modal.settings.tm': 'Translation memory',
406
602
  'modal.settings.fuzzy': 'Fuzzy-match threshold',
407
603
  'modal.settings.limit': 'Matches returned',
@@ -422,6 +618,7 @@
422
618
  'modal.confirm.clearGlossary':
423
619
  'Clear the currently mounted glossary terms? Unmounted libraries are not affected; pass all: true to the API to clear every library. This cannot be undone.',
424
620
  'modal.confirm.deleteTerm': 'Delete term',
621
+ 'modal.confirm.deleteTm': 'Delete TM entry',
425
622
  'modal.confirm.ok': 'Confirm',
426
623
  'modal.confirm.cancel': 'Cancel',
427
624
  'toast.confirmed': 'Segment confirmed and written to TM',
@@ -434,6 +631,8 @@
434
631
  'toast.draftSaved': 'Draft saved',
435
632
  'toast.termSaved': 'Term saved',
436
633
  'toast.termDeleted': 'Term deleted',
634
+ 'toast.tmUpdated': 'TM entry updated',
635
+ 'toast.tmDeleted': 'TM entry deleted',
437
636
  'toast.tmImported': 'TMX imported',
438
637
  'toast.tmxMarkupLost': 'TMX imported; {count} inline placeholder/format tags were flattened to plain text.',
439
638
  'toast.glossaryImported': 'Glossary imported',
@@ -444,6 +643,93 @@
444
643
  'toast.copied': 'Copied to clipboard',
445
644
  'toast.mtReady': 'Suggestion ready',
446
645
  'toast.error': 'Operation failed',
646
+ 'nav.documents': 'Documents',
647
+ 'nav.libraries': 'Libraries',
648
+ 'library.title': 'Translation memory and glossary',
649
+ 'library.tmTab': 'Translation memory',
650
+ 'library.glossaryTab': 'Glossary',
651
+ 'library.scope': 'Search in',
652
+ 'library.scopeAll': 'All libraries',
653
+ 'library.search': 'Search source or target…',
654
+ 'library.language': 'All languages',
655
+ 'library.pageSize': 'Per page',
656
+ 'library.pageInfo': '{start}–{end} of {total}',
657
+ 'library.prev': 'Previous',
658
+ 'library.next': 'Next',
659
+ 'library.empty': 'This library has no entries yet.',
660
+ 'library.noMatch': 'No entries match.',
661
+ 'library.add': 'Add',
662
+ 'library.import': 'Import',
663
+ 'library.export': 'Export',
664
+ 'library.clear': 'Clear',
665
+ 'library.newLibrary': 'New library',
666
+ 'library.rename': 'Rename',
667
+ 'library.deleteLibrary': 'Delete library',
668
+ 'library.deleteLibraryMessage': 'Delete “{name}”? Its entries will be deleted too.',
669
+ 'library.colSource': 'Source',
670
+ 'library.colTarget': 'Target',
671
+ 'library.colNote': 'Note',
672
+ 'library.colContext': 'Context',
673
+ 'library.colLang': 'Language',
674
+ 'library.colCase': 'Case-sensitive',
675
+ 'library.colUpdated': 'Updated',
676
+ 'library.detail': 'Entry',
677
+ 'library.detailEmpty': 'Select a row to view and edit it.',
678
+ 'library.save': 'Save',
679
+ 'library.deleteEntry': 'Delete entry',
680
+ 'library.entryCreated': 'Entry added',
681
+ 'library.entrySaved': 'Saved',
682
+ 'library.entryDeleted': 'Deleted',
683
+ 'library.exported': 'Exported',
684
+ 'library.exportFormat': 'Format',
685
+ 'library.caseSensitiveHint': 'Case-sensitive terms match only the exact spelling.',
686
+ 'library.noDocHint': 'Manage libraries without opening a document.',
687
+ 'rail.pageInfo': '{start}–{end} of {total}',
688
+ 'rail.goto': 'Go to segment',
689
+ 'rail.gotoInvalid': 'Segment number is out of range.',
690
+ 'rail.nextUnconfirmed': 'Next unconfirmed',
691
+ 'panel.searchInLibrary': 'Search the library',
692
+ 'panel.viewAll': 'View all in libraries',
693
+ 'panel.glossaryMatchesOnly': 'Only terms that match this segment are listed here.',
694
+ 'nav.align': 'Align',
695
+ 'align.title': 'Align two files',
696
+ 'align.hint': 'Drop the source file and the translated file. CAIT pairs them paragraph by paragraph — they can be in completely different languages.',
697
+ 'align.sourceFile': 'Source file',
698
+ 'align.targetFile': 'Translated file',
699
+ 'align.pick': 'No file chosen',
700
+ 'align.choose': 'Choose',
701
+ 'align.chars': '{count} chars',
702
+ 'align.run': 'Align',
703
+ 'align.running': 'Aligning…',
704
+ 'align.needFiles': 'Choose both files first.',
705
+ 'align.readError': 'Could not read that file.',
706
+ 'align.sourceLang': 'Source language (optional)',
707
+ 'align.targetLang': 'Target language (optional)',
708
+ 'align.stats': 'high {high} · to review {medium} · doubtful {low}',
709
+ 'align.unpairedSource': 'Unpaired source',
710
+ 'align.unpairedTarget': 'Unpaired target',
711
+ 'align.blocked': 'Large files are aligned in paragraph blocks; results may be less stable than a whole-file pass.',
712
+ 'align.confidence': 'Confidence',
713
+ 'align.merge': 'Merge with the next row',
714
+ 'align.split': 'Split on line breaks',
715
+ 'align.remove': 'Remove this row',
716
+ 'align.write': 'Write to memory',
717
+ 'align.writeCount': 'Write {count} selected',
718
+ 'align.writeMessage': 'This writes {count} pair(s); identical entries are skipped.',
719
+ 'align.written': 'Wrote {written}, skipped {skipped}.',
720
+ 'align.nothing': 'Nothing selected to write.',
721
+ 'origin.auto': 'Propagated',
722
+ 'rail.propagate': 'Fill repeated segments',
723
+ 'rail.propagateMessage': 'Copy the existing translation to other segments with the same source. Confirmed segments are left alone.',
724
+ 'toast.propagated': 'Filled {count} segment(s).',
725
+ 'term.title': 'Terminology candidates',
726
+ 'term.hint': 'Ranked by occurrences and length. Pick the real terms, type a translation, and add them.',
727
+ 'term.extract': 'Mine terms from the document',
728
+ 'term.empty': 'No repeated candidate found.',
729
+ 'term.add': 'Add to glossary',
730
+ 'term.added': 'Added {added} term(s).',
731
+ 'term.noDoc': 'Open a document before mining terms.',
732
+ 'term.inLibrary': 'in library',
447
733
  }
448
734
 
449
735
  const JA = {
@@ -495,6 +781,40 @@
495
781
  'editor.emptyTarget': '先に訳文を入力してください',
496
782
  'editor.done': 'すべてのセグメントを確認済み',
497
783
  'editor.confirmedAt': '確認日時',
784
+ 'editor.suggestion': '機械翻訳の提案',
785
+ 'editor.adopt': '採用',
786
+ 'editor.adoptHint': '提案を訳文に反映し、出所を保ちます',
787
+ 'editor.remaining': '件が未確認',
788
+ 'status.translated': '翻訳済み',
789
+ 'origin.tm': 'TM',
790
+ 'origin.mt': 'MT',
791
+ 'origin.agent': 'Agent',
792
+ 'origin.manual': '手動',
793
+ 'rail.filter.all': 'すべて',
794
+ 'rail.filter.pending': '未翻訳',
795
+ 'rail.filter.translated': '要確認',
796
+ 'rail.filter.confirmed': '確認済み',
797
+ 'rail.confirmAll': 'まとめて確認',
798
+ 'rail.confirmAllHint': '「要確認」の文をまとめて確認し、翻訳メモリに書き込みます',
799
+ 'rail.confirmAllMessage': '要確認の {count} 文をまとめて確認し、翻訳メモリに書き込みます。1 文ずつ見直すことはありません。続けますか?',
800
+ 'toast.confirmedMany': '{count} 文を確認しました',
801
+ 'qa.warn': 'チェック注意',
802
+ 'qa.exportBanner': '書き出し前のチェックで {count} 件の注意が見つかりました(書き出しは可能です):',
803
+ 'qa.counts': 'プレースホルダー {placeholder} · 数字 {number} · 用語 {term} · 空訳 {empty}',
804
+ 'qa.code.PLACEHOLDER_MISSING': 'プレースホルダー欠落',
805
+ 'qa.code.NUMBER_MISMATCH': '数字の不一致',
806
+ 'qa.code.TERM_NOT_USED': '用語が未使用',
807
+ 'qa.code.EMPTY_TARGET': '訳文が空',
808
+ 'toast.suggestionAdopted': '提案を採用しました',
809
+ 'pretranslate.start': '事前翻訳',
810
+ 'editor.noSuggestion': '提案はまだありません。直接翻訳するか、agent に下訳させてください',
811
+ 'editor.baselineHint': '中央の列は機械翻訳/agent の初回出力です。右側で見比べながら直せます',
812
+ 'pretranslate.title': 'TM と機械翻訳で文書全体を下訳し、あとから文ごとに確認します',
813
+ 'pretranslate.running': '事前翻訳中',
814
+ 'pretranslate.cancel': '事前翻訳を停止',
815
+ 'toast.preDone': '事前翻訳が完了しました({count} 文を反映)',
816
+ 'toast.preCancelled': '事前翻訳を停止しました',
817
+ 'toast.preFailed': '事前翻訳が終了しました({count} 文が失敗)',
498
818
  'empty.title': 'CAT 翻訳を始める',
499
819
  'empty.desc': 'テキストを貼り付けるか、ファイルをドロップするか、デモ文書を読み込みます。CAIT は原文をセグメントに分割し、翻訳メモリと用語集を同時に検索します。確認した訳文は自動的に TM に保存されます。',
500
820
  'empty.paste': 'テキストを貼り付け',
@@ -505,7 +825,7 @@
505
825
  'empty.demo': 'デモ文書を読み込む',
506
826
  'empty.demoHint': '素材がありませんか?',
507
827
  'empty.drop': 'ファイルをドロップ、またはクリックして選択',
508
- 'empty.formats': 'TXT · Markdown · DOCX · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX に対応',
828
+ 'empty.formats': 'TXT · Markdown · DOCX · EPUB · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX に対応',
509
829
  'empty.features.tm': '翻訳メモリ',
510
830
  'empty.features.tmDesc': '完全一致+あいまい一致',
511
831
  'empty.features.glossary': '用語集',
@@ -519,7 +839,7 @@
519
839
  'modal.new.targetLang': '訳文言語',
520
840
  'modal.new.create': '文書を作成',
521
841
  'modal.new.importing': 'インポート中…',
522
- 'modal.new.dropHint': 'TXT · Markdown · DOCX · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
842
+ 'modal.new.dropHint': 'TXT · Markdown · DOCX · EPUB · TMX · CSV · SRT · VTT · PO · XLIFF · HTML · JSON · RTF · XLSX · PPTX',
523
843
  'modal.new.csvSource': 'CSV 原文列',
524
844
  'modal.new.csvTarget': 'CSV 訳文列',
525
845
  'modal.new.csvColumnPlaceholder': '列名または列番号(例:Source / 2)',
@@ -543,6 +863,13 @@
543
863
  'libraries.create': '作成',
544
864
  'libraries.done': '完了',
545
865
  'libraries.created': 'ライブラリを作成してマウントしました',
866
+ 'libraries.rename': '名前を変更',
867
+ 'libraries.save': '保存',
868
+ 'libraries.renamed': 'ライブラリ名を変更しました',
869
+ 'libraries.delete': 'ライブラリを削除',
870
+ 'libraries.deleted': 'ライブラリを削除しました',
871
+ 'libraries.deleteTmWarn': '中の TM エントリも一緒に削除され、元に戻せません。',
872
+ 'libraries.deleteGlossaryWarn': '中の用語も一緒に削除され、元に戻せません。',
546
873
  'libraries.mountSaved': 'マウント設定を保存しました',
547
874
  'panel.tm': 'TM',
548
875
  'panel.glossary': '用語集',
@@ -560,6 +887,9 @@
560
887
  'match.high_fuzzy': '高あいまい一致',
561
888
  'match.medium_fuzzy': '中あいまい一致',
562
889
  'match.low_fuzzy': '低あいまい一致',
890
+ 'match.context': 'コンテキスト一致',
891
+ 'panel.contextPrev': '前文',
892
+ 'panel.contextNext': '後文',
563
893
  'panel.apply': '適用',
564
894
  'panel.importTmx': 'TMX をインポート',
565
895
  'panel.clearTm': 'TM をクリア',
@@ -575,6 +905,8 @@
575
905
  'panel.saveTerm': '用語を保存',
576
906
  'panel.cancel': 'キャンセル',
577
907
  'panel.delete': '削除',
908
+ 'panel.edit': '編集',
909
+ 'panel.saveEntry': '変更を保存',
578
910
  'panel.noTerms': '用語集は空です。用語を追加するとヒットが自動で強調表示されます。',
579
911
  'panel.importCsv': 'CSV/TSV をインポート',
580
912
  'panel.clearGlossary': '用語集をクリア',
@@ -604,6 +936,8 @@
604
936
  'modal.export.targetMd': 'Markdown',
605
937
  'modal.export.docx': 'Word DOCX',
606
938
  'modal.export.docxGroup': '元の書式を保持',
939
+ 'modal.export.epub': 'EPUB 電子書',
940
+ 'modal.export.epubGroup': '元のレイアウトを保持',
607
941
  'modal.export.json': '文書 JSON',
608
942
  'modal.export.subtitleGroup': '字幕',
609
943
  'modal.export.localizationGroup': 'ローカライズ交換',
@@ -626,6 +960,11 @@
626
960
  'modal.settings.uiAuto': 'DSH の言語に合わせる',
627
961
  'modal.settings.uiHint': 'CAIT の表示だけを切り替えます。文書の原文言語・訳文言語には影響しません。',
628
962
  'modal.settings.languages': '言語',
963
+ 'modal.settings.preprocess': '前処理',
964
+ 'modal.settings.preprocessHint': '取り込みと分割の前に原文を整えます。プレースホルダーと句読点は変更しません。',
965
+ 'modal.settings.pre.normalizeWhitespace': '余分な空白とタブをまとめる',
966
+ 'modal.settings.pre.stripInvisible': 'ゼロ幅文字と制御文字を除去',
967
+ 'modal.settings.pre.collapseBlankLines': '連続する空行をまとめる',
629
968
  'modal.settings.tm': '翻訳メモリ',
630
969
  'modal.settings.fuzzy': 'あいまい一致のしきい値',
631
970
  'modal.settings.limit': '返す一致件数',
@@ -646,6 +985,7 @@
646
985
  'modal.confirm.clearGlossary':
647
986
  '現在マウント中の用語をクリアしますか?未マウントのライブラリは影響を受けません。すべてのライブラリをクリアするには API に all: true を明示してください。この操作は元に戻せません。',
648
987
  'modal.confirm.deleteTerm': '用語を削除',
988
+ 'modal.confirm.deleteTm': 'TM エントリを削除',
649
989
  'modal.confirm.ok': '確認',
650
990
  'modal.confirm.cancel': 'キャンセル',
651
991
  'toast.confirmed': 'セグメントを確認して TM に保存しました',
@@ -658,6 +998,8 @@
658
998
  'toast.draftSaved': '下書きを保存しました',
659
999
  'toast.termSaved': '用語を保存しました',
660
1000
  'toast.termDeleted': '用語を削除しました',
1001
+ 'toast.tmUpdated': 'TM エントリを更新しました',
1002
+ 'toast.tmDeleted': 'TM エントリを削除しました',
661
1003
  'toast.tmImported': 'TMX をインポートしました',
662
1004
  'toast.tmxMarkupLost': 'TMX をインポートしました。{count} 個のインライン プレースホルダー/書式タグはプレーンテキストとして処理され、書式情報は失われました。',
663
1005
  'toast.glossaryImported': '用語をインポートしました',
@@ -668,6 +1010,93 @@
668
1010
  'toast.copied': 'クリップボードにコピーしました',
669
1011
  'toast.mtReady': '訳文候補を生成しました',
670
1012
  'toast.error': '操作に失敗しました',
1013
+ 'nav.documents': '文書',
1014
+ 'nav.libraries': 'ライブラリ',
1015
+ 'library.title': '翻訳メモリと用語集',
1016
+ 'library.tmTab': '翻訳メモリ',
1017
+ 'library.glossaryTab': '用語集',
1018
+ 'library.scope': '検索範囲',
1019
+ 'library.scopeAll': 'すべてのライブラリ',
1020
+ 'library.search': '原文または訳文を検索…',
1021
+ 'library.language': 'すべての言語',
1022
+ 'library.pageSize': '表示件数',
1023
+ 'library.pageInfo': '{start}–{end} 件 / 全 {total} 件',
1024
+ 'library.prev': '前へ',
1025
+ 'library.next': '次へ',
1026
+ 'library.empty': 'このライブラリにはまだエントリがありません。',
1027
+ 'library.noMatch': '一致するエントリはありません。',
1028
+ 'library.add': '追加',
1029
+ 'library.import': 'インポート',
1030
+ 'library.export': 'エクスポート',
1031
+ 'library.clear': 'クリア',
1032
+ 'library.newLibrary': '新しいライブラリ',
1033
+ 'library.rename': '名前を変更',
1034
+ 'library.deleteLibrary': 'ライブラリを削除',
1035
+ 'library.deleteLibraryMessage': '「{name}」を削除しますか?エントリも一緒に削除されます。',
1036
+ 'library.colSource': '原文',
1037
+ 'library.colTarget': '訳文',
1038
+ 'library.colNote': 'メモ',
1039
+ 'library.colContext': 'コンテキスト',
1040
+ 'library.colLang': '言語',
1041
+ 'library.colCase': '大文字小文字を区別',
1042
+ 'library.colUpdated': '更新日時',
1043
+ 'library.detail': 'エントリ詳細',
1044
+ 'library.detailEmpty': '行を選択すると表示・編集できます。',
1045
+ 'library.save': '保存',
1046
+ 'library.deleteEntry': 'エントリを削除',
1047
+ 'library.entryCreated': 'エントリを追加しました',
1048
+ 'library.entrySaved': '保存しました',
1049
+ 'library.entryDeleted': '削除しました',
1050
+ 'library.exported': 'エクスポートしました',
1051
+ 'library.exportFormat': '形式',
1052
+ 'library.caseSensitiveHint': '大文字小文字を区別すると、完全に同じ表記だけが一致します。',
1053
+ 'library.noDocHint': '文書を開かなくてもライブラリを管理できます。',
1054
+ 'rail.pageInfo': '{start}–{end} 件 / 全 {total} 件',
1055
+ 'rail.goto': '番号へ移動',
1056
+ 'rail.gotoInvalid': '番号が範囲外です。',
1057
+ 'rail.nextUnconfirmed': '次の未確認へ',
1058
+ 'panel.searchInLibrary': 'ライブラリを検索',
1059
+ 'panel.viewAll': 'ライブラリで全件表示',
1060
+ 'panel.glossaryMatchesOnly': 'ここには現在のセグメントに一致する用語だけを表示します。',
1061
+ 'nav.align': '整列',
1062
+ 'align.title': '2つのファイルを整列',
1063
+ 'align.hint': '原文ファイルと訳文ファイルをそれぞれ選んでください。段落ごとに 1 対 1 で対応づけます。言語が違っても構いません。',
1064
+ 'align.sourceFile': '原文ファイル',
1065
+ 'align.targetFile': '訳文ファイル',
1066
+ 'align.pick': 'ファイル未選択',
1067
+ 'align.choose': '選択',
1068
+ 'align.chars': '{count} 文字',
1069
+ 'align.run': '整列する',
1070
+ 'align.running': '整列中…',
1071
+ 'align.needFiles': '先に 2 つのファイルを選んでください。',
1072
+ 'align.readError': 'ファイルを読み込めませんでした。',
1073
+ 'align.sourceLang': '原文言語(任意)',
1074
+ 'align.targetLang': '訳文言語(任意)',
1075
+ 'align.stats': '高 {high} · 要確認 {medium} · 要注意 {low}',
1076
+ 'align.unpairedSource': '未対応の原文',
1077
+ 'align.unpairedTarget': '未対応の訳文',
1078
+ 'align.blocked': '大きいファイルは段落ブロックごとに整列します。全体整列より不安定になることがあります。',
1079
+ 'align.confidence': '信頼度',
1080
+ 'align.merge': '次の行と結合',
1081
+ 'align.split': '改行で分割',
1082
+ 'align.remove': 'この行を削除',
1083
+ 'align.write': 'メモリに保存',
1084
+ 'align.writeCount': '選択した {count} 件を保存',
1085
+ 'align.writeMessage': '{count} 件を保存します。同一の項目はスキップされます。',
1086
+ 'align.written': '{written} 件を保存、{skipped} 件をスキップしました。',
1087
+ 'align.nothing': '保存する行がありません。',
1088
+ 'origin.auto': '自動反映',
1089
+ 'rail.propagate': '重複セグメントを埋める',
1090
+ 'rail.propagateMessage': '同じ原文の他のセグメントに既存の訳文をコピーします。確定済みは変更しません。',
1091
+ 'toast.propagated': '{count} 件のセグメントを埋めました。',
1092
+ 'term.title': '用語候補',
1093
+ 'term.hint': '出現回数と長さで並んでいます。実際の用語だけを選び、訳語を入れて登録してください。',
1094
+ 'term.extract': '文書から用語を抽出',
1095
+ 'term.empty': '繰り返し現れる候補はありませんでした。',
1096
+ 'term.add': '用語集に追加',
1097
+ 'term.added': '{added} 件の用語を追加しました。',
1098
+ 'term.noDoc': '先に文書を開いてください。',
1099
+ 'term.inLibrary': '登録済み',
671
1100
  }
672
1101
 
673
1102
  // UI languages offered by the in-app switch. 'auto' follows the DSH locale