@defensestation/yjs-local-translator 0.3.0-dev.2.d2befbc
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 +21 -0
- package/README.md +519 -0
- package/dist/blocknote.d.ts +62 -0
- package/dist/blocknote.d.ts.map +1 -0
- package/dist/blocknote.js +379 -0
- package/dist/blocknote.js.map +1 -0
- package/dist/browser-translator.d.ts +81 -0
- package/dist/browser-translator.d.ts.map +1 -0
- package/dist/browser-translator.js +452 -0
- package/dist/browser-translator.js.map +1 -0
- package/dist/chunking.d.ts +16 -0
- package/dist/chunking.d.ts.map +1 -0
- package/dist/chunking.js +95 -0
- package/dist/chunking.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +26 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +41 -0
- package/dist/metadata.js.map +1 -0
- package/dist/model-catalog.d.ts +14 -0
- package/dist/model-catalog.d.ts.map +1 -0
- package/dist/model-catalog.js +41 -0
- package/dist/model-catalog.js.map +1 -0
- package/dist/native-translation.d.ts +37 -0
- package/dist/native-translation.d.ts.map +1 -0
- package/dist/native-translation.js +80 -0
- package/dist/native-translation.js.map +1 -0
- package/dist/protocol.d.ts +59 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/translation-memory.d.ts +50 -0
- package/dist/translation-memory.d.ts.map +1 -0
- package/dist/translation-memory.js +117 -0
- package/dist/translation-memory.js.map +1 -0
- package/dist/translator.worker.d.ts +2 -0
- package/dist/translator.worker.d.ts.map +1 -0
- package/dist/translator.worker.js +304 -0
- package/dist/translator.worker.js.map +1 -0
- package/dist/yjs.d.ts +98 -0
- package/dist/yjs.d.ts.map +1 -0
- package/dist/yjs.js +291 -0
- package/dist/yjs.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { Fragment, Slice } from "@tiptap/pm/model";
|
|
2
|
+
import { TranslationConflictError } from "./yjs.js";
|
|
3
|
+
function inlineContentToText(content) {
|
|
4
|
+
if (typeof content === "string") {
|
|
5
|
+
return content;
|
|
6
|
+
}
|
|
7
|
+
if (!Array.isArray(content)) {
|
|
8
|
+
return "";
|
|
9
|
+
}
|
|
10
|
+
return content
|
|
11
|
+
.map((item) => {
|
|
12
|
+
if (typeof item === "string") {
|
|
13
|
+
return item;
|
|
14
|
+
}
|
|
15
|
+
if (!item || typeof item !== "object") {
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
if ("text" in item && typeof item.text === "string") {
|
|
19
|
+
return item.text;
|
|
20
|
+
}
|
|
21
|
+
if ("content" in item) {
|
|
22
|
+
return inlineContentToText(item.content);
|
|
23
|
+
}
|
|
24
|
+
return "";
|
|
25
|
+
})
|
|
26
|
+
.join("");
|
|
27
|
+
}
|
|
28
|
+
function getTextStyleSpans(content) {
|
|
29
|
+
if (typeof content === "string") {
|
|
30
|
+
return [{ text: content }];
|
|
31
|
+
}
|
|
32
|
+
if (Array.isArray(content)) {
|
|
33
|
+
return content.flatMap(getTextStyleSpans);
|
|
34
|
+
}
|
|
35
|
+
if (!content || typeof content !== "object") {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
if ("text" in content && typeof content.text === "string") {
|
|
39
|
+
return [{ text: content.text }];
|
|
40
|
+
}
|
|
41
|
+
return "content" in content ? getTextStyleSpans(content.content) : [];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Rebuilds translated inline content without dropping the original inline
|
|
45
|
+
* structure. Translation changes word boundaries, so translated text is
|
|
46
|
+
* assigned proportionally across the original text leaves.
|
|
47
|
+
*/
|
|
48
|
+
function translateInlineContent(content, translatedText) {
|
|
49
|
+
const spans = getTextStyleSpans(content).filter((span) => span.text.length > 0);
|
|
50
|
+
const sourceLength = spans.reduce((length, span) => length + span.text.length, 0);
|
|
51
|
+
if (sourceLength === 0) {
|
|
52
|
+
return translatedText;
|
|
53
|
+
}
|
|
54
|
+
let sourceOffset = 0;
|
|
55
|
+
let translatedOffset = 0;
|
|
56
|
+
const translatedSpans = spans.map((span, index) => {
|
|
57
|
+
sourceOffset += span.text.length;
|
|
58
|
+
const translatedEnd = index === spans.length - 1
|
|
59
|
+
? translatedText.length
|
|
60
|
+
: Math.round((sourceOffset / sourceLength) * translatedText.length);
|
|
61
|
+
const text = translatedText.slice(translatedOffset, translatedEnd);
|
|
62
|
+
translatedOffset = translatedEnd;
|
|
63
|
+
return text;
|
|
64
|
+
});
|
|
65
|
+
let spanIndex = 0;
|
|
66
|
+
const rebuild = (value) => {
|
|
67
|
+
if (typeof value === "string") {
|
|
68
|
+
return translatedSpans[spanIndex++] ?? "";
|
|
69
|
+
}
|
|
70
|
+
if (Array.isArray(value)) {
|
|
71
|
+
return value.map(rebuild);
|
|
72
|
+
}
|
|
73
|
+
if (!value || typeof value !== "object") {
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
if ("text" in value && typeof value.text === "string") {
|
|
77
|
+
return { ...value, text: translatedSpans[spanIndex++] ?? "" };
|
|
78
|
+
}
|
|
79
|
+
return "content" in value ? { ...value, content: rebuild(value.content) } : value;
|
|
80
|
+
};
|
|
81
|
+
return rebuild(content);
|
|
82
|
+
}
|
|
83
|
+
function getTextLeaves(node) {
|
|
84
|
+
if (node.isText) {
|
|
85
|
+
return node.text ? [node] : [];
|
|
86
|
+
}
|
|
87
|
+
const leaves = [];
|
|
88
|
+
node.forEach((child) => leaves.push(...getTextLeaves(child)));
|
|
89
|
+
return leaves;
|
|
90
|
+
}
|
|
91
|
+
function getSelectionSnapshot(editor) {
|
|
92
|
+
// Tests and lightweight editor adapters may not expose ProseMirror. Real
|
|
93
|
+
// BlockNote editors always do, which lets us retain marks and inline nodes.
|
|
94
|
+
if (!("prosemirrorState" in editor)) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const selection = editor.prosemirrorState.selection;
|
|
98
|
+
const slice = selection.content();
|
|
99
|
+
const sourceText = slice.content.content
|
|
100
|
+
.flatMap((node) => getTextLeaves(node))
|
|
101
|
+
.map((node) => node.text)
|
|
102
|
+
.join("");
|
|
103
|
+
return sourceText
|
|
104
|
+
? { sourceText, slice, from: selection.from, to: selection.to }
|
|
105
|
+
: undefined;
|
|
106
|
+
}
|
|
107
|
+
function translateSelectionSlice(slice, translatedText) {
|
|
108
|
+
const leaves = slice.content.content.flatMap((node) => getTextLeaves(node));
|
|
109
|
+
const sourceLength = leaves.reduce((length, node) => length + (node.text?.length ?? 0), 0);
|
|
110
|
+
let sourceOffset = 0;
|
|
111
|
+
let translatedOffset = 0;
|
|
112
|
+
const translatedLeaves = leaves.map((node, index) => {
|
|
113
|
+
sourceOffset += node.text?.length ?? 0;
|
|
114
|
+
const translatedEnd = index === leaves.length - 1
|
|
115
|
+
? translatedText.length
|
|
116
|
+
: Math.round((sourceOffset / sourceLength) * translatedText.length);
|
|
117
|
+
const text = translatedText.slice(translatedOffset, translatedEnd);
|
|
118
|
+
translatedOffset = translatedEnd;
|
|
119
|
+
return text;
|
|
120
|
+
});
|
|
121
|
+
let leafIndex = 0;
|
|
122
|
+
const rebuildNode = (node) => {
|
|
123
|
+
if (node.isText) {
|
|
124
|
+
const text = translatedLeaves[leafIndex++] ?? "";
|
|
125
|
+
return text ? [node.withText(text)] : [];
|
|
126
|
+
}
|
|
127
|
+
if (node.isLeaf) {
|
|
128
|
+
return [node];
|
|
129
|
+
}
|
|
130
|
+
const content = Fragment.fromArray(node.content.content.flatMap(rebuildNode));
|
|
131
|
+
return [node.copy(content)];
|
|
132
|
+
};
|
|
133
|
+
return new Slice(Fragment.fromArray(slice.content.content.flatMap(rebuildNode)), slice.openStart, slice.openEnd);
|
|
134
|
+
}
|
|
135
|
+
export function blockNoteBlockToPlainText(block) {
|
|
136
|
+
if (Array.isArray(block.content)) {
|
|
137
|
+
return inlineContentToText(block.content);
|
|
138
|
+
}
|
|
139
|
+
if (block.content &&
|
|
140
|
+
typeof block.content === "object" &&
|
|
141
|
+
"type" in block.content &&
|
|
142
|
+
block.content.type === "tableContent" &&
|
|
143
|
+
"rows" in block.content &&
|
|
144
|
+
Array.isArray(block.content.rows)) {
|
|
145
|
+
return block.content.rows
|
|
146
|
+
.map((row) => row.cells.map((cell) => inlineContentToText(cell)).join("\t"))
|
|
147
|
+
.join("\n");
|
|
148
|
+
}
|
|
149
|
+
return "";
|
|
150
|
+
}
|
|
151
|
+
function isTableContent(content) {
|
|
152
|
+
return (!!content &&
|
|
153
|
+
typeof content === "object" &&
|
|
154
|
+
"type" in content &&
|
|
155
|
+
content.type === "tableContent" &&
|
|
156
|
+
"rows" in content &&
|
|
157
|
+
Array.isArray(content.rows));
|
|
158
|
+
}
|
|
159
|
+
function getTableCellContent(cell) {
|
|
160
|
+
return (cell &&
|
|
161
|
+
typeof cell === "object" &&
|
|
162
|
+
"type" in cell &&
|
|
163
|
+
cell.type === "tableCell" &&
|
|
164
|
+
"content" in cell
|
|
165
|
+
? cell.content
|
|
166
|
+
: cell);
|
|
167
|
+
}
|
|
168
|
+
function getBlockTranslationSnapshots(block) {
|
|
169
|
+
if (Array.isArray(block.content)) {
|
|
170
|
+
const sourceText = inlineContentToText(block.content);
|
|
171
|
+
return sourceText.trim() ? [{ block, sourceText }] : [];
|
|
172
|
+
}
|
|
173
|
+
if (!isTableContent(block.content)) {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
return block.content.rows.flatMap((row, rowIndex) => row.cells.flatMap((cell, cellIndex) => {
|
|
177
|
+
const sourceText = inlineContentToText(getTableCellContent(cell));
|
|
178
|
+
return sourceText.trim()
|
|
179
|
+
? [{ block, sourceText, tableCell: { rowIndex, cellIndex } }]
|
|
180
|
+
: [];
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
function translateTableContent(content, translations) {
|
|
184
|
+
if (!isTableContent(content)) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
...content,
|
|
189
|
+
rows: content.rows.map((row, rowIndex) => ({
|
|
190
|
+
...row,
|
|
191
|
+
cells: row.cells.map((cell, cellIndex) => {
|
|
192
|
+
const translation = translations.get(`${rowIndex}:${cellIndex}`);
|
|
193
|
+
if (translation === undefined) {
|
|
194
|
+
return cell;
|
|
195
|
+
}
|
|
196
|
+
const originalContent = getTableCellContent(cell);
|
|
197
|
+
const translatedContent = translateInlineContent(originalContent, translation);
|
|
198
|
+
return (cell &&
|
|
199
|
+
typeof cell === "object" &&
|
|
200
|
+
"type" in cell &&
|
|
201
|
+
cell.type === "tableCell"
|
|
202
|
+
? { ...cell, content: translatedContent }
|
|
203
|
+
: translatedContent);
|
|
204
|
+
})
|
|
205
|
+
}))
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function getDefaultBlocks(editor) {
|
|
209
|
+
const selected = editor.getSelection()?.blocks;
|
|
210
|
+
if (selected?.length) {
|
|
211
|
+
return selected;
|
|
212
|
+
}
|
|
213
|
+
return [editor.getTextCursorPosition().block];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Returns every block in document order, including nested child blocks.
|
|
217
|
+
*
|
|
218
|
+
* BlockNote's `editor.document` contains only root blocks, so children must
|
|
219
|
+
* be traversed explicitly when operating on the whole document.
|
|
220
|
+
*/
|
|
221
|
+
export function getBlockNoteDocumentBlocks(editor) {
|
|
222
|
+
const blocks = [];
|
|
223
|
+
const visit = (block) => {
|
|
224
|
+
blocks.push(block);
|
|
225
|
+
for (const child of block.children) {
|
|
226
|
+
visit(child);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
for (const block of editor.document) {
|
|
230
|
+
visit(block);
|
|
231
|
+
}
|
|
232
|
+
return blocks;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Translates selected or explicit inline-content blocks. Every block is sent
|
|
236
|
+
* to the model as one complete input. Streaming remains local; all finished
|
|
237
|
+
* block updates are grouped in one BlockNote transaction.
|
|
238
|
+
*/
|
|
239
|
+
export async function translateBlockNoteBlocks(editor, translator, options) {
|
|
240
|
+
const blocks = options.blocks ?? getDefaultBlocks(editor);
|
|
241
|
+
const conflictPolicy = options.conflictPolicy ?? "abort";
|
|
242
|
+
const commit = options.commit ?? true;
|
|
243
|
+
const blockSourceTexts = new Map(blocks.map((block) => [block.id, blockNoteBlockToPlainText(block)]));
|
|
244
|
+
const snapshots = blocks.flatMap((block) => {
|
|
245
|
+
const blockSnapshots = getBlockTranslationSnapshots(block);
|
|
246
|
+
if (blockSnapshots.length === 0) {
|
|
247
|
+
options.onUnsupportedBlock?.(block);
|
|
248
|
+
}
|
|
249
|
+
return blockSnapshots;
|
|
250
|
+
});
|
|
251
|
+
const translated = [];
|
|
252
|
+
const completed = [];
|
|
253
|
+
for (let index = 0; index < snapshots.length; index += 1) {
|
|
254
|
+
const snapshot = snapshots[index];
|
|
255
|
+
if (!snapshot) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const result = await translator.translate(snapshot.sourceText, {
|
|
259
|
+
sourceLanguage: options.sourceLanguage,
|
|
260
|
+
targetLanguage: options.targetLanguage,
|
|
261
|
+
...(options.signal === undefined ? {} : { signal: options.signal }),
|
|
262
|
+
...(options.onProgress === undefined
|
|
263
|
+
? {}
|
|
264
|
+
: { onProgress: options.onProgress }),
|
|
265
|
+
...(options.onStatus === undefined
|
|
266
|
+
? {}
|
|
267
|
+
: { onStatus: options.onStatus }),
|
|
268
|
+
onDelta(delta, streamedText) {
|
|
269
|
+
options.onBlockDelta?.({
|
|
270
|
+
blockId: snapshot.block.id,
|
|
271
|
+
blockIndex: index,
|
|
272
|
+
blockCount: snapshots.length,
|
|
273
|
+
delta,
|
|
274
|
+
streamedText
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
translated.push({
|
|
279
|
+
blockId: snapshot.block.id,
|
|
280
|
+
sourceText: snapshot.sourceText,
|
|
281
|
+
translation: result.text,
|
|
282
|
+
result
|
|
283
|
+
});
|
|
284
|
+
completed.push({ snapshot, result });
|
|
285
|
+
}
|
|
286
|
+
if (!commit || translated.length === 0) {
|
|
287
|
+
return translated;
|
|
288
|
+
}
|
|
289
|
+
const changedIds = new Set();
|
|
290
|
+
for (const block of blocks) {
|
|
291
|
+
const current = editor.getBlock(block.id);
|
|
292
|
+
if (!current ||
|
|
293
|
+
blockNoteBlockToPlainText(current) !== blockSourceTexts.get(block.id)) {
|
|
294
|
+
changedIds.add(block.id);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (changedIds.size > 0 && conflictPolicy === "abort") {
|
|
298
|
+
throw new TranslationConflictError(`BlockNote content changed while translating: ${[...changedIds].join(", ")}`);
|
|
299
|
+
}
|
|
300
|
+
editor.transact(() => {
|
|
301
|
+
for (const block of blocks) {
|
|
302
|
+
const blockTranslations = completed.filter(({ snapshot }) => snapshot.block.id === block.id);
|
|
303
|
+
if (blockTranslations.length === 0) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
if (changedIds.has(block.id)) {
|
|
307
|
+
if (conflictPolicy === "skip") {
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
// Even when overwriting, a block that no longer exists cannot be
|
|
311
|
+
// updated; updateBlock would throw mid-transaction.
|
|
312
|
+
if (!editor.getBlock(block.id)) {
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const tableTranslations = new Map();
|
|
317
|
+
for (const { snapshot, result } of blockTranslations) {
|
|
318
|
+
if (snapshot.tableCell) {
|
|
319
|
+
tableTranslations.set(`${snapshot.tableCell.rowIndex}:${snapshot.tableCell.cellIndex}`, result.text);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const update = isTableContent(block.content)
|
|
323
|
+
? { content: translateTableContent(block.content, tableTranslations) }
|
|
324
|
+
: options.createUpdate?.(block, blockTranslations[0].result.text) ?? {
|
|
325
|
+
content: translateInlineContent(block.content, blockTranslations[0].result.text)
|
|
326
|
+
};
|
|
327
|
+
editor.updateBlock(block.id, update);
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
return translated;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Translates every supported text block in the BlockNote document. Root and
|
|
334
|
+
* nested blocks are translated in document order, then committed together in
|
|
335
|
+
* one BlockNote transaction. Use this instead of `translateBlockNoteBlocks`
|
|
336
|
+
* when selection and cursor position should not affect the translation scope.
|
|
337
|
+
*/
|
|
338
|
+
export async function translateBlockNoteDocument(editor, translator, options) {
|
|
339
|
+
return translateBlockNoteBlocks(editor, translator, {
|
|
340
|
+
...options,
|
|
341
|
+
blocks: getBlockNoteDocumentBlocks(editor)
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Translates the current text selection as one complete input and replaces it
|
|
346
|
+
* once when finished. It aborts if the selection or selected text changes.
|
|
347
|
+
*/
|
|
348
|
+
export async function translateBlockNoteSelection(editor, translator, options) {
|
|
349
|
+
const selectionSnapshot = getSelectionSnapshot(editor);
|
|
350
|
+
const sourceText = selectionSnapshot?.sourceText ?? editor.getSelectedText();
|
|
351
|
+
if (!sourceText.trim()) {
|
|
352
|
+
throw new Error("Select text in BlockNote before translating.");
|
|
353
|
+
}
|
|
354
|
+
const conflictPolicy = options.conflictPolicy ?? "abort";
|
|
355
|
+
const commit = options.commit ?? true;
|
|
356
|
+
const result = await translator.translate(sourceText, options);
|
|
357
|
+
if (!commit) {
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
const currentSelection = selectionSnapshot
|
|
361
|
+
? editor.prosemirrorState.selection
|
|
362
|
+
: undefined;
|
|
363
|
+
if (conflictPolicy === "abort" &&
|
|
364
|
+
(selectionSnapshot
|
|
365
|
+
? currentSelection?.from !== selectionSnapshot.from ||
|
|
366
|
+
currentSelection?.to !== selectionSnapshot.to
|
|
367
|
+
: editor.getSelectedText() !== sourceText)) {
|
|
368
|
+
throw new TranslationConflictError("The BlockNote selection changed while it was being translated.");
|
|
369
|
+
}
|
|
370
|
+
editor.transact((tr) => {
|
|
371
|
+
if (selectionSnapshot) {
|
|
372
|
+
tr.replaceSelection(translateSelectionSlice(selectionSnapshot.slice, result.text));
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
editor.insertInlineContent(result.text, { updateSelection: true });
|
|
376
|
+
});
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=blocknote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocknote.js","sourceRoot":"","sources":["../src/blocknote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type ModelCatalog } from "./model-catalog.js";
|
|
2
|
+
import { type TranslationMemory } from "./translation-memory.js";
|
|
3
|
+
import type { WorkerConfiguration, WorkerToMainMessage } from "./protocol.js";
|
|
4
|
+
export interface TranslationProgress {
|
|
5
|
+
modelId: string;
|
|
6
|
+
file?: string;
|
|
7
|
+
progress?: number;
|
|
8
|
+
loaded?: number;
|
|
9
|
+
total?: number;
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
export type TranslationStatusEvent = Exclude<WorkerToMainMessage, {
|
|
13
|
+
status: "partial" | "success" | "error";
|
|
14
|
+
}>;
|
|
15
|
+
export interface TranslateOptions {
|
|
16
|
+
sourceLanguage: string;
|
|
17
|
+
targetLanguage: string;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
onDelta?: (delta: string, streamedText: string) => void;
|
|
20
|
+
onProgress?: (progress: TranslationProgress) => void;
|
|
21
|
+
onStatus?: (event: TranslationStatusEvent) => void;
|
|
22
|
+
}
|
|
23
|
+
export type TranslationEngine = "native" | "transformers" | "memory" | "none";
|
|
24
|
+
export interface TranslationResult {
|
|
25
|
+
text: string;
|
|
26
|
+
sourceLanguage: string;
|
|
27
|
+
targetLanguage: string;
|
|
28
|
+
models: string[];
|
|
29
|
+
engine: TranslationEngine;
|
|
30
|
+
}
|
|
31
|
+
export interface BrowserTranslatorOptions {
|
|
32
|
+
workerFactory?: () => Worker;
|
|
33
|
+
transformersUrl?: string;
|
|
34
|
+
dtype?: string;
|
|
35
|
+
device?: string;
|
|
36
|
+
graphOptimizationLevel?: "disabled" | "basic" | "extended" | "all";
|
|
37
|
+
modelCatalog?: ModelCatalog;
|
|
38
|
+
maxNewTokens?: number;
|
|
39
|
+
maxChunkLength?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Prefer the browser's built-in Translator API (Chrome 138+) when it
|
|
42
|
+
* supports the requested language pair, falling back to the Transformers.js
|
|
43
|
+
* worker otherwise. Enabled by default; set to false to always use the
|
|
44
|
+
* worker.
|
|
45
|
+
*/
|
|
46
|
+
useNativeTranslation?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Chunk-level cache of finished translations. When set, input is split
|
|
49
|
+
* into sentence chunks and only chunks missing from the memory are sent to
|
|
50
|
+
* a model, which makes retranslating an edited document incremental.
|
|
51
|
+
*/
|
|
52
|
+
translationMemory?: TranslationMemory;
|
|
53
|
+
}
|
|
54
|
+
export declare class TranslationAbortedError extends Error {
|
|
55
|
+
constructor();
|
|
56
|
+
}
|
|
57
|
+
export declare class BrowserTranslator {
|
|
58
|
+
readonly configuration: WorkerConfiguration;
|
|
59
|
+
private readonly workerFactory;
|
|
60
|
+
private readonly useNativeTranslation;
|
|
61
|
+
private readonly translationMemory;
|
|
62
|
+
private readonly nativePool;
|
|
63
|
+
private readonly requests;
|
|
64
|
+
private worker;
|
|
65
|
+
private disposed;
|
|
66
|
+
constructor(options?: BrowserTranslatorOptions);
|
|
67
|
+
translate(text: string, options: TranslateOptions): Promise<TranslationResult>;
|
|
68
|
+
private translateWithMemory;
|
|
69
|
+
unloadModels(): void;
|
|
70
|
+
dispose(): void;
|
|
71
|
+
private translateNatively;
|
|
72
|
+
private translateWithWorker;
|
|
73
|
+
private ensureWorker;
|
|
74
|
+
private teardownWorker;
|
|
75
|
+
private failAllRequests;
|
|
76
|
+
private readonly handleMessage;
|
|
77
|
+
private readonly handleWorkerError;
|
|
78
|
+
private readonly handleWorkerMessageError;
|
|
79
|
+
private finishRequest;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=browser-translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-translator.d.ts","sourceRoot":"","sources":["../src/browser-translator.ts"],"names":[],"mappings":"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"}
|