@yxw007/translate 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +83 -21
- package/README_zh-CN.md +84 -22
- package/dist/browser/index.cjs +1337 -1178
- package/dist/browser/index.esm.js +1338 -1175
- package/dist/browser/index.esm.min.js +1 -1
- package/dist/browser/index.min.cjs +1 -1
- package/dist/browser/index.umd.js +1337 -1178
- package/dist/browser/index.umd.min.js +1 -1
- package/dist/index.d.ts +2411 -4700
- package/dist/node/index.cjs +1338 -1179
- package/dist/node/index.js +1339 -1176
- package/dist/node/index.min.cjs +1 -1
- package/dist/node/index.min.js +1 -1
- package/dist/package.json +122 -122
- package/package.json +1 -1
package/dist/browser/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// translate v0.
|
|
1
|
+
// translate v0.5.0 Copyright (c) 2026 Potter<aa4790139@gmail.com> and contributors
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
@@ -14,7 +14,8 @@ class TranslationError extends Error {
|
|
|
14
14
|
constructor(region, message) {
|
|
15
15
|
super(message);
|
|
16
16
|
this.region = region;
|
|
17
|
-
|
|
17
|
+
this.name = "TranslationError";
|
|
18
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
class CheckLanguageError extends Error {
|
|
@@ -22,7 +23,8 @@ class CheckLanguageError extends Error {
|
|
|
22
23
|
constructor(region, message) {
|
|
23
24
|
super(message);
|
|
24
25
|
this.region = region;
|
|
25
|
-
|
|
26
|
+
this.name = "CheckLanguageError";
|
|
27
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
const OPEN_AI_MODELS = [
|
|
@@ -210,12 +212,299 @@ function isOverMaxCharacterNum(text, max_character_num) {
|
|
|
210
212
|
return total > max_character_num;
|
|
211
213
|
}
|
|
212
214
|
|
|
215
|
+
var googleTargetLanguages = {
|
|
216
|
+
Abkhazian: "ab",
|
|
217
|
+
Acehnese: "ace",
|
|
218
|
+
"Acholi language": "ach",
|
|
219
|
+
Afar: "aa",
|
|
220
|
+
Afrikaans: "af",
|
|
221
|
+
Albanian: "sq",
|
|
222
|
+
Alur: "alz",
|
|
223
|
+
Amharic: "am",
|
|
224
|
+
Arabic: "ar",
|
|
225
|
+
Armenian: "hy",
|
|
226
|
+
Assamese: "as",
|
|
227
|
+
Avar: "av",
|
|
228
|
+
Awadhi: "awa",
|
|
229
|
+
Aymara: "ay",
|
|
230
|
+
Azerbaijani: "az",
|
|
231
|
+
Badawi: "bew",
|
|
232
|
+
Balinese: "ban",
|
|
233
|
+
Balochi: "bal",
|
|
234
|
+
Bambara: "bm",
|
|
235
|
+
Bangasinan: "pag",
|
|
236
|
+
Bashkir: "ba",
|
|
237
|
+
Basque: "eu",
|
|
238
|
+
Batakkalo: "btx",
|
|
239
|
+
"Bataksi Marungon": "bts",
|
|
240
|
+
Bataktoba: "bbc",
|
|
241
|
+
Baure: "bci",
|
|
242
|
+
Belarusian: "be",
|
|
243
|
+
Bengali: "bn",
|
|
244
|
+
Bhojpuri: "bho",
|
|
245
|
+
Bikol: "bik",
|
|
246
|
+
Bosnian: "bs",
|
|
247
|
+
Breton: "br",
|
|
248
|
+
Bulgarian: "bg",
|
|
249
|
+
Burmese: "my",
|
|
250
|
+
"Buryat language": "bua",
|
|
251
|
+
Cantonese: "yue",
|
|
252
|
+
Casey: "kha",
|
|
253
|
+
Catalan: "ca",
|
|
254
|
+
Cebuano: "ceb",
|
|
255
|
+
"Chamorro language": "ch",
|
|
256
|
+
Chechen: "ce",
|
|
257
|
+
Chevi: "ak",
|
|
258
|
+
Chicheva: "ny",
|
|
259
|
+
Chiga: "cgg",
|
|
260
|
+
Chinese: "zh-CN",
|
|
261
|
+
"Chinese (Traditional)": "zh-TW",
|
|
262
|
+
Chuk: "chk",
|
|
263
|
+
Chuvash: "cv",
|
|
264
|
+
Conga: "ts",
|
|
265
|
+
Corsican: "co",
|
|
266
|
+
"Crimean Tatar": "crh",
|
|
267
|
+
Croatian: "hr",
|
|
268
|
+
Czech: "cs",
|
|
269
|
+
Danish: "da",
|
|
270
|
+
Dari: "fa-AF",
|
|
271
|
+
Dhivehi: "dv",
|
|
272
|
+
Dinka: "din",
|
|
273
|
+
Dogra: "doi",
|
|
274
|
+
Dutch: "nl",
|
|
275
|
+
Dyula: "dyu",
|
|
276
|
+
Dzongka: "dz",
|
|
277
|
+
Elocano: "ilo",
|
|
278
|
+
English: "en",
|
|
279
|
+
Esperanto: "eo",
|
|
280
|
+
Estonian: "et",
|
|
281
|
+
Ewe: "ee",
|
|
282
|
+
"FYRO Macedonian": "mk",
|
|
283
|
+
Faroese: "fo",
|
|
284
|
+
"Feng language": "fon",
|
|
285
|
+
Fijian: "fj",
|
|
286
|
+
Filipino: "tl",
|
|
287
|
+
Finnish: "fi",
|
|
288
|
+
French: "fr",
|
|
289
|
+
Frisian: "fy",
|
|
290
|
+
Friulian: "fur",
|
|
291
|
+
Fulani: "ff",
|
|
292
|
+
Ga: "gaa",
|
|
293
|
+
Galician: "gl",
|
|
294
|
+
Georgian: "ka",
|
|
295
|
+
German: "de",
|
|
296
|
+
Gongen: "gom",
|
|
297
|
+
Gorkbojok: "trp",
|
|
298
|
+
"Grace and Taoism": "ndc-ZW",
|
|
299
|
+
Greek: "el",
|
|
300
|
+
Greenlandic: "kl",
|
|
301
|
+
Guarani: "gn",
|
|
302
|
+
Gujarati: "gu",
|
|
303
|
+
"Haitian Creole": "ht",
|
|
304
|
+
Hakachin: "cnh",
|
|
305
|
+
Hausa: "ha",
|
|
306
|
+
Hawaiian: "haw",
|
|
307
|
+
Hebrew: "iw",
|
|
308
|
+
Heligaignon: "hil",
|
|
309
|
+
Hindi: "hi",
|
|
310
|
+
Hmong: "hmn",
|
|
311
|
+
Hungarian: "hu",
|
|
312
|
+
Hunsrück: "hrx",
|
|
313
|
+
Iban: "iba",
|
|
314
|
+
Icelandic: "is",
|
|
315
|
+
Igbo: "ig",
|
|
316
|
+
Indonesian: "id",
|
|
317
|
+
Irish: "ga",
|
|
318
|
+
Italian: "it",
|
|
319
|
+
"Jamaica vernacular": "jam",
|
|
320
|
+
Japanese: "ja",
|
|
321
|
+
Javanese: "jw",
|
|
322
|
+
"Jingpo language": "kac",
|
|
323
|
+
Kannada: "kn",
|
|
324
|
+
Kanuri: "kr",
|
|
325
|
+
Kazakh: "kk",
|
|
326
|
+
Kekchi: "kek",
|
|
327
|
+
Khmer: "km",
|
|
328
|
+
Kikwanda: "rw",
|
|
329
|
+
Kithuba: "ktu",
|
|
330
|
+
"Komi language": "kv",
|
|
331
|
+
Kongo: "kg",
|
|
332
|
+
Korean: "ko",
|
|
333
|
+
"Kurdish (Kurmanji)": "ku",
|
|
334
|
+
"Kurdish (Solani)": "ckb",
|
|
335
|
+
Kyrgyz: "ky",
|
|
336
|
+
Lao: "lo",
|
|
337
|
+
Latin: "la",
|
|
338
|
+
Latvian: "lv",
|
|
339
|
+
Ligurian: "lij",
|
|
340
|
+
Limburg: "li",
|
|
341
|
+
Lingala: "ln",
|
|
342
|
+
Lithuanian: "lt",
|
|
343
|
+
Lombard: "lmo",
|
|
344
|
+
Luganda: "lg",
|
|
345
|
+
Luo: "luo",
|
|
346
|
+
Luxembourg: "lb",
|
|
347
|
+
Madura: "mad",
|
|
348
|
+
Maithili: "mai",
|
|
349
|
+
Makassar: "mak",
|
|
350
|
+
Malagasian: "mg",
|
|
351
|
+
Malay: "ms",
|
|
352
|
+
"Malay, Jawi": "ms-Arab",
|
|
353
|
+
Malayalam: "ml",
|
|
354
|
+
Maltese: "mt",
|
|
355
|
+
"Malwadi language": "mwr",
|
|
356
|
+
Mamu: "mam",
|
|
357
|
+
Manx: "gv",
|
|
358
|
+
Marathi: "mr",
|
|
359
|
+
Marshallese: "mh",
|
|
360
|
+
"Mauritius Scrio whispers": "mfe",
|
|
361
|
+
"Meitei (Manipur)": "mni-Mtei",
|
|
362
|
+
Minan: "min",
|
|
363
|
+
Mizo: "lus",
|
|
364
|
+
Mongolian: "mn",
|
|
365
|
+
Māori: "mi",
|
|
366
|
+
"Nahuatl (Eastern Vastka)": "nhe",
|
|
367
|
+
"Ndebele (Southern)": "nr",
|
|
368
|
+
Ndombe: "dov",
|
|
369
|
+
"Nepal Language (Newar)": "new",
|
|
370
|
+
Nepali: "ne",
|
|
371
|
+
"Nko alphabet (West African written script)": "bm-Nkoo",
|
|
372
|
+
"Northern Sotho": "nso",
|
|
373
|
+
Norwegian: "no",
|
|
374
|
+
Nuer: "nus",
|
|
375
|
+
Occitan: "oc",
|
|
376
|
+
Oriya: "or",
|
|
377
|
+
"Oromo language": "om",
|
|
378
|
+
Ossetian: "os",
|
|
379
|
+
Pampangja: "pam",
|
|
380
|
+
Papiamento: "pap",
|
|
381
|
+
Pashto: "ps",
|
|
382
|
+
Pemba: "bem",
|
|
383
|
+
Persian: "fa",
|
|
384
|
+
Polish: "pl",
|
|
385
|
+
"Portugal (Brazil)": "pt",
|
|
386
|
+
"Portugal (Portugal)": "pt-PT",
|
|
387
|
+
"Punjabi (Gurumuchi)": "pa",
|
|
388
|
+
"Punjabi (Shamuki)": "pa-Arab",
|
|
389
|
+
Quechua: "qu",
|
|
390
|
+
Ratgale: "ltg",
|
|
391
|
+
Romani: "rom",
|
|
392
|
+
Romanian: "ro",
|
|
393
|
+
Rondi: "rn",
|
|
394
|
+
Russian: "ru",
|
|
395
|
+
Sabatec: "zap",
|
|
396
|
+
Sakha: "sah",
|
|
397
|
+
Samoan: "sm",
|
|
398
|
+
Sango: "sg",
|
|
399
|
+
Sanskrit: "sa",
|
|
400
|
+
Santali: "sat-Latn",
|
|
401
|
+
"Schuna language": "sn",
|
|
402
|
+
"Scottish Gaelic": "gd",
|
|
403
|
+
Serbian: "sr",
|
|
404
|
+
"Seychellois Creole": "crs",
|
|
405
|
+
Shan: "shn",
|
|
406
|
+
Sicilian: "scn",
|
|
407
|
+
"Sierra Leonean Creole": "kri",
|
|
408
|
+
Silesian: "szl",
|
|
409
|
+
Sindhi: "sd",
|
|
410
|
+
Sinhalese: "si",
|
|
411
|
+
Slovak: "sk",
|
|
412
|
+
Slovenian: "sl",
|
|
413
|
+
Somali: "so",
|
|
414
|
+
"South Sotho": "st",
|
|
415
|
+
Spanish: "es",
|
|
416
|
+
"Steppe Mali": "chm",
|
|
417
|
+
Sundanese: "su",
|
|
418
|
+
"Susu language": "sus",
|
|
419
|
+
Swahili: "sw",
|
|
420
|
+
Swat: "ss",
|
|
421
|
+
Swedish: "sv",
|
|
422
|
+
"Sámi (North)": "se",
|
|
423
|
+
Tahiti: "ty",
|
|
424
|
+
Tajik: "tg",
|
|
425
|
+
Tamaset: "ber-Latn",
|
|
426
|
+
"Tamazight (Tifinaven)": "ber",
|
|
427
|
+
Tamil: "ta",
|
|
428
|
+
Tatar: "tt",
|
|
429
|
+
Telugu: "te",
|
|
430
|
+
Tetum: "tet",
|
|
431
|
+
Thai: "th",
|
|
432
|
+
Tibetan: "bo",
|
|
433
|
+
"Tiff language": "tiv",
|
|
434
|
+
Tigrinya: "ti",
|
|
435
|
+
"Tok Pisin": "tpi",
|
|
436
|
+
Tongan: "to",
|
|
437
|
+
Tswana: "tn",
|
|
438
|
+
Tulu: "tcy",
|
|
439
|
+
"Tumbuka language": "tum",
|
|
440
|
+
Turkish: "tr",
|
|
441
|
+
Turkmen: "tk",
|
|
442
|
+
Tuvan: "tyv",
|
|
443
|
+
Udmurtic: "udm",
|
|
444
|
+
Uighur: "ug",
|
|
445
|
+
Ukrainian: "uk",
|
|
446
|
+
Urdu: "ur",
|
|
447
|
+
Uzbek: "uz",
|
|
448
|
+
Venda: "ve",
|
|
449
|
+
Venetian: "vec",
|
|
450
|
+
Vietnamese: "vi",
|
|
451
|
+
"Wari language": "war",
|
|
452
|
+
Welsh: "cy",
|
|
453
|
+
"Wolof language": "wo",
|
|
454
|
+
Xhosa: "xh",
|
|
455
|
+
Yiddish: "yi",
|
|
456
|
+
Yoruba: "yo",
|
|
457
|
+
"Yucatan Maya": "yua",
|
|
458
|
+
Zulu: "zu",
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
const googleLanguages = {
|
|
462
|
+
from: {
|
|
463
|
+
Auto: "auto",
|
|
464
|
+
...googleTargetLanguages,
|
|
465
|
+
},
|
|
466
|
+
to: googleTargetLanguages,
|
|
467
|
+
};
|
|
468
|
+
|
|
469
|
+
function normalizeEngineLanguage(language, languages, allowAuto = false) {
|
|
470
|
+
if (!language) {
|
|
471
|
+
return allowAuto ? "auto" : "";
|
|
472
|
+
}
|
|
473
|
+
if (allowAuto && language === "auto") {
|
|
474
|
+
return "auto";
|
|
475
|
+
}
|
|
476
|
+
const entries = Object.entries(languages);
|
|
477
|
+
const matchedByKey = entries.find(([name]) => name.toLowerCase() === language.toLowerCase());
|
|
478
|
+
if (matchedByKey) {
|
|
479
|
+
return matchedByKey[1];
|
|
480
|
+
}
|
|
481
|
+
const matchedByValue = entries.find(([, value]) => value.toLowerCase() === language.toLowerCase());
|
|
482
|
+
if (matchedByValue) {
|
|
483
|
+
return matchedByValue[1];
|
|
484
|
+
}
|
|
485
|
+
return "";
|
|
486
|
+
}
|
|
487
|
+
|
|
213
488
|
function google(options) {
|
|
214
489
|
const base = "https://translate.googleapis.com/translate_a/single";
|
|
490
|
+
const fromLanguages = googleLanguages.from;
|
|
491
|
+
const toLanguages = googleLanguages.to;
|
|
215
492
|
return {
|
|
216
493
|
name: "google",
|
|
217
|
-
|
|
218
|
-
|
|
494
|
+
getFromLanguages() {
|
|
495
|
+
return fromLanguages;
|
|
496
|
+
},
|
|
497
|
+
getToLanguages() {
|
|
498
|
+
return toLanguages;
|
|
499
|
+
},
|
|
500
|
+
normalFromLanguage(language) {
|
|
501
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
502
|
+
},
|
|
503
|
+
normalToLanguage(language) {
|
|
504
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
505
|
+
},
|
|
506
|
+
async translate(text, opts) {
|
|
507
|
+
const { from = "auto", to } = opts;
|
|
219
508
|
if (!Array.isArray(text)) {
|
|
220
509
|
text = [text];
|
|
221
510
|
}
|
|
@@ -258,11 +547,157 @@ function google(options) {
|
|
|
258
547
|
};
|
|
259
548
|
}
|
|
260
549
|
|
|
550
|
+
var azureTargetLanguages = {
|
|
551
|
+
Afrikaans: "af",
|
|
552
|
+
Albanian: "sq",
|
|
553
|
+
Amharic: "am",
|
|
554
|
+
Arabic: "ar",
|
|
555
|
+
Armenian: "hy",
|
|
556
|
+
Assamese: "as",
|
|
557
|
+
Azerbaijani: "az",
|
|
558
|
+
Bashkir: "ba",
|
|
559
|
+
Basque: "eu",
|
|
560
|
+
Bengali: "bn",
|
|
561
|
+
Bhojpuri: "bho",
|
|
562
|
+
Bosnian: "bs",
|
|
563
|
+
Bulgarian: "bg",
|
|
564
|
+
Burmese: "my",
|
|
565
|
+
"Cantonese (Traditional)": "yue",
|
|
566
|
+
Catalan: "ca",
|
|
567
|
+
Chhattisgarhi: "hne",
|
|
568
|
+
Chinese: "zh-Hans",
|
|
569
|
+
"Chinese (Literary)": "lzh",
|
|
570
|
+
"Chinese (Traditional)": "zh-Hant",
|
|
571
|
+
Croatian: "hr",
|
|
572
|
+
Czech: "cs",
|
|
573
|
+
Danish: "da",
|
|
574
|
+
Dari: "prs",
|
|
575
|
+
Dhivehi: "dv",
|
|
576
|
+
Dogri: "doi",
|
|
577
|
+
Double: "lug",
|
|
578
|
+
Dutch: "nl",
|
|
579
|
+
English: "en",
|
|
580
|
+
Estonian: "et",
|
|
581
|
+
"FYRO Macedonian": "mk",
|
|
582
|
+
Faroese: "fo",
|
|
583
|
+
Fijian: "fj",
|
|
584
|
+
Filipino: "fil",
|
|
585
|
+
Finnish: "fi",
|
|
586
|
+
French: "fr",
|
|
587
|
+
"French (Canada)": "fr-CA",
|
|
588
|
+
Galician: "gl",
|
|
589
|
+
Georgian: "ka",
|
|
590
|
+
German: "de",
|
|
591
|
+
Greek: "el",
|
|
592
|
+
Gujarati: "gu",
|
|
593
|
+
"Haitian Creole": "ht",
|
|
594
|
+
Hausa: "ha",
|
|
595
|
+
Hebrew: "he",
|
|
596
|
+
Hindi: "hi",
|
|
597
|
+
Hmong: "mww",
|
|
598
|
+
Hungarian: "hu",
|
|
599
|
+
Icelandic: "is",
|
|
600
|
+
Igbo: "ig",
|
|
601
|
+
Indonesian: "id",
|
|
602
|
+
Inuinnaqtun: "ikt",
|
|
603
|
+
Inuktitut: "iu",
|
|
604
|
+
"Inuktitut (Latin)": "iu-Latn",
|
|
605
|
+
Irish: "ga",
|
|
606
|
+
Italian: "it",
|
|
607
|
+
Japanese: "ja",
|
|
608
|
+
Kannada: "kn",
|
|
609
|
+
Kashmiri: "ks",
|
|
610
|
+
Kazakh: "kk",
|
|
611
|
+
Khmer: "km",
|
|
612
|
+
Kikwanda: "rw",
|
|
613
|
+
"Klingon (Latin)": "tlh-Latn",
|
|
614
|
+
"Klingon (pIqaD)": "tlh-Piqd",
|
|
615
|
+
Konkani: "gom",
|
|
616
|
+
Korean: "ko",
|
|
617
|
+
"Kurdish (Medium)": "ku",
|
|
618
|
+
"Kurdish (North)": "kmr",
|
|
619
|
+
Kyrgyz: "ky",
|
|
620
|
+
Lao: "lo",
|
|
621
|
+
Latvian: "lv",
|
|
622
|
+
Lingala: "ln",
|
|
623
|
+
Lithuanian: "lt",
|
|
624
|
+
"Lower Sorbian language": "dsb",
|
|
625
|
+
Maithili: "mai",
|
|
626
|
+
Malagasian: "mg",
|
|
627
|
+
Malay: "ms",
|
|
628
|
+
Malayalam: "ml",
|
|
629
|
+
Maltese: "mt",
|
|
630
|
+
Manipuri: "mni",
|
|
631
|
+
Marathi: "mr",
|
|
632
|
+
"Mongolian (Cyrillic)": "mn-Cyrl",
|
|
633
|
+
"Mongolian (Traditional)": "mn-Mong",
|
|
634
|
+
Māori: "mi",
|
|
635
|
+
Nepali: "ne",
|
|
636
|
+
"Norwegian Bokmål": "nb",
|
|
637
|
+
Nyanja: "nya",
|
|
638
|
+
Oriya: "or",
|
|
639
|
+
Pashto: "ps",
|
|
640
|
+
Persian: "fa",
|
|
641
|
+
Polish: "pl",
|
|
642
|
+
"Portugal (Brazil)": "pt",
|
|
643
|
+
"Portugal (Portugal)": "pt-PT",
|
|
644
|
+
Punjabi: "pa",
|
|
645
|
+
"Querétaro Ottomi": "otq",
|
|
646
|
+
Romanian: "ro",
|
|
647
|
+
Rounds: "run",
|
|
648
|
+
Russian: "ru",
|
|
649
|
+
Samoan: "sm",
|
|
650
|
+
"Serbia (Latin)": "sr-Latn",
|
|
651
|
+
"Serbian (Cyrillic)": "sr-Cyrl",
|
|
652
|
+
Sesotho: "st",
|
|
653
|
+
"Sesotho at Leboa": "nso",
|
|
654
|
+
Setswana: "tn",
|
|
655
|
+
Shona: "sn",
|
|
656
|
+
Sindhi: "sd",
|
|
657
|
+
Sinhalese: "si",
|
|
658
|
+
Slovak: "sk",
|
|
659
|
+
Slovenian: "sl",
|
|
660
|
+
Somali: "so",
|
|
661
|
+
Spanish: "es",
|
|
662
|
+
Swahili: "sw",
|
|
663
|
+
Swedish: "sv",
|
|
664
|
+
Tahiti: "ty",
|
|
665
|
+
Tamil: "ta",
|
|
666
|
+
Tatar: "tt",
|
|
667
|
+
Telugu: "te",
|
|
668
|
+
Thai: "th",
|
|
669
|
+
Tibetan: "bo",
|
|
670
|
+
Tigrinya: "ti",
|
|
671
|
+
Tongan: "to",
|
|
672
|
+
Turkish: "tr",
|
|
673
|
+
Turkmen: "tk",
|
|
674
|
+
Uighur: "ug",
|
|
675
|
+
Ukrainian: "uk",
|
|
676
|
+
"Upper Sorbian": "hsb",
|
|
677
|
+
Urdu: "ur",
|
|
678
|
+
Uzbek: "uz",
|
|
679
|
+
Vietnamese: "vi",
|
|
680
|
+
Welsh: "cy",
|
|
681
|
+
Will: "brx",
|
|
682
|
+
Xhosa: "xh",
|
|
683
|
+
Yoruba: "yo",
|
|
684
|
+
"Yucatec Maya": "yua",
|
|
685
|
+
Zulu: "zu",
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
const azureLanguages = {
|
|
689
|
+
from: {
|
|
690
|
+
Auto: "auto",
|
|
691
|
+
...azureTargetLanguages,
|
|
692
|
+
},
|
|
693
|
+
to: azureTargetLanguages,
|
|
694
|
+
};
|
|
695
|
+
|
|
261
696
|
/**
|
|
262
697
|
* Azure translate documentation: https://learn.microsoft.com/zh-cn/azure/ai-services/translator/reference/v3-0-translate
|
|
263
698
|
*/
|
|
264
|
-
function azure
|
|
265
|
-
const { key, region } = options;
|
|
699
|
+
function azure(options) {
|
|
700
|
+
const { key, region, fromLanguages = azureLanguages.from, toLanguages = azureLanguages.to } = options;
|
|
266
701
|
const name = "azure";
|
|
267
702
|
const checkOptions = () => {
|
|
268
703
|
if (!key || !region) {
|
|
@@ -273,6 +708,18 @@ function azure$1(options) {
|
|
|
273
708
|
const base = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0";
|
|
274
709
|
return {
|
|
275
710
|
name,
|
|
711
|
+
getFromLanguages() {
|
|
712
|
+
return fromLanguages;
|
|
713
|
+
},
|
|
714
|
+
getToLanguages() {
|
|
715
|
+
return toLanguages;
|
|
716
|
+
},
|
|
717
|
+
normalFromLanguage(language) {
|
|
718
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
719
|
+
},
|
|
720
|
+
normalToLanguage(language) {
|
|
721
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
722
|
+
},
|
|
276
723
|
async translate(text, opts) {
|
|
277
724
|
checkOptions();
|
|
278
725
|
const { from, to } = opts;
|
|
@@ -340,8 +787,94 @@ function azure$1(options) {
|
|
|
340
787
|
};
|
|
341
788
|
}
|
|
342
789
|
|
|
343
|
-
|
|
344
|
-
|
|
790
|
+
var amazonTargetLanguages = {
|
|
791
|
+
Afrikaans: "af",
|
|
792
|
+
Albanian: "sq",
|
|
793
|
+
Amharic: "am",
|
|
794
|
+
Arabic: "ar",
|
|
795
|
+
Armenian: "hy",
|
|
796
|
+
Azerbaijani: "az",
|
|
797
|
+
Bengali: "bn",
|
|
798
|
+
Bosnian: "bs",
|
|
799
|
+
Bulgarian: "bg",
|
|
800
|
+
Catalan: "ca",
|
|
801
|
+
"Chinese (Simplified)": "zh",
|
|
802
|
+
"Chinese (Traditional)": "zh-TW",
|
|
803
|
+
Croatian: "hr",
|
|
804
|
+
Czech: "cs",
|
|
805
|
+
Danish: "da",
|
|
806
|
+
Dari: "fa-AF",
|
|
807
|
+
Dutch: "nl",
|
|
808
|
+
English: "en",
|
|
809
|
+
Estonian: "et",
|
|
810
|
+
"Farsi (Persian)": "fa",
|
|
811
|
+
"Filipino, Tagalog": "tl",
|
|
812
|
+
Finnish: "fi",
|
|
813
|
+
French: "fr",
|
|
814
|
+
"French (Canada)": "fr-CA",
|
|
815
|
+
Georgian: "ka",
|
|
816
|
+
German: "de",
|
|
817
|
+
Greek: "el",
|
|
818
|
+
Gujarati: "gu",
|
|
819
|
+
"Haitian Creole": "ht",
|
|
820
|
+
Hausa: "ha",
|
|
821
|
+
Hebrew: "he",
|
|
822
|
+
Hindi: "hi",
|
|
823
|
+
Hungarian: "hu",
|
|
824
|
+
Icelandic: "is",
|
|
825
|
+
Indonesian: "id",
|
|
826
|
+
Irish: "ga",
|
|
827
|
+
Italian: "it",
|
|
828
|
+
Japanese: "ja",
|
|
829
|
+
Kannada: "kn",
|
|
830
|
+
Kazakh: "kk",
|
|
831
|
+
Korean: "ko",
|
|
832
|
+
Latvian: "lv",
|
|
833
|
+
Lithuanian: "lt",
|
|
834
|
+
Macedonian: "mk",
|
|
835
|
+
Malay: "ms",
|
|
836
|
+
Malayalam: "ml",
|
|
837
|
+
Maltese: "mt",
|
|
838
|
+
Marathi: "mr",
|
|
839
|
+
Mongolian: "mn",
|
|
840
|
+
"Norwegian (Bokmål)": "no",
|
|
841
|
+
Pashto: "ps",
|
|
842
|
+
Polish: "pl",
|
|
843
|
+
"Portuguese (Brazil)": "pt",
|
|
844
|
+
"Portuguese (Portugal)": "pt-PT",
|
|
845
|
+
Punjabi: "pa",
|
|
846
|
+
Romanian: "ro",
|
|
847
|
+
Russian: "ru",
|
|
848
|
+
Serbian: "sr",
|
|
849
|
+
Sinhala: "si",
|
|
850
|
+
Slovak: "sk",
|
|
851
|
+
Slovenian: "sl",
|
|
852
|
+
Somali: "so",
|
|
853
|
+
Spanish: "es",
|
|
854
|
+
"Spanish (Mexico)": "es-MX",
|
|
855
|
+
Swahili: "sw",
|
|
856
|
+
Swedish: "sv",
|
|
857
|
+
Tamil: "ta",
|
|
858
|
+
Telugu: "te",
|
|
859
|
+
Thai: "th",
|
|
860
|
+
Turkish: "tr",
|
|
861
|
+
Ukrainian: "uk",
|
|
862
|
+
Urdu: "ur",
|
|
863
|
+
Uzbek: "uz",
|
|
864
|
+
Vietnamese: "vi",
|
|
865
|
+
Welsh: "cy",
|
|
866
|
+
};
|
|
867
|
+
|
|
868
|
+
const amazonLanguages = {
|
|
869
|
+
from: {
|
|
870
|
+
Auto: "auto",
|
|
871
|
+
...amazonTargetLanguages,
|
|
872
|
+
},
|
|
873
|
+
to: amazonTargetLanguages,
|
|
874
|
+
};
|
|
875
|
+
|
|
876
|
+
function amazon(options) {
|
|
877
|
+
const { region, accessKeyId, secretAccessKey, fromLanguages = amazonLanguages.from, toLanguages = amazonLanguages.to } = options;
|
|
345
878
|
const name = "amazon";
|
|
346
879
|
const checkOptions = () => {
|
|
347
880
|
if (!region || !accessKeyId || !secretAccessKey) {
|
|
@@ -351,6 +884,18 @@ function amazon$1(options) {
|
|
|
351
884
|
checkOptions();
|
|
352
885
|
return {
|
|
353
886
|
name,
|
|
887
|
+
getFromLanguages() {
|
|
888
|
+
return fromLanguages;
|
|
889
|
+
},
|
|
890
|
+
getToLanguages() {
|
|
891
|
+
return toLanguages;
|
|
892
|
+
},
|
|
893
|
+
normalFromLanguage(language) {
|
|
894
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
895
|
+
},
|
|
896
|
+
normalToLanguage(language) {
|
|
897
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
898
|
+
},
|
|
354
899
|
async translate(text, opts) {
|
|
355
900
|
checkOptions();
|
|
356
901
|
const { from = "auto", to } = opts;
|
|
@@ -1313,1010 +1858,213 @@ function requireCore () {
|
|
|
1313
1858
|
var M_offset_4 = M[offset + 4];
|
|
1314
1859
|
var M_offset_5 = M[offset + 5];
|
|
1315
1860
|
var M_offset_6 = M[offset + 6];
|
|
1316
|
-
var M_offset_7 = M[offset + 7];
|
|
1317
|
-
var M_offset_8 = M[offset + 8];
|
|
1318
|
-
var M_offset_9 = M[offset + 9];
|
|
1319
|
-
var M_offset_10 = M[offset + 10];
|
|
1320
|
-
var M_offset_11 = M[offset + 11];
|
|
1321
|
-
var M_offset_12 = M[offset + 12];
|
|
1322
|
-
var M_offset_13 = M[offset + 13];
|
|
1323
|
-
var M_offset_14 = M[offset + 14];
|
|
1324
|
-
var M_offset_15 = M[offset + 15];
|
|
1325
|
-
|
|
1326
|
-
// Working variables
|
|
1327
|
-
var a = H[0];
|
|
1328
|
-
var b = H[1];
|
|
1329
|
-
var c = H[2];
|
|
1330
|
-
var d = H[3];
|
|
1331
|
-
|
|
1332
|
-
// Computation
|
|
1333
|
-
a = FF(a, b, c, d, M_offset_0, 7, T[0]);
|
|
1334
|
-
d = FF(d, a, b, c, M_offset_1, 12, T[1]);
|
|
1335
|
-
c = FF(c, d, a, b, M_offset_2, 17, T[2]);
|
|
1336
|
-
b = FF(b, c, d, a, M_offset_3, 22, T[3]);
|
|
1337
|
-
a = FF(a, b, c, d, M_offset_4, 7, T[4]);
|
|
1338
|
-
d = FF(d, a, b, c, M_offset_5, 12, T[5]);
|
|
1339
|
-
c = FF(c, d, a, b, M_offset_6, 17, T[6]);
|
|
1340
|
-
b = FF(b, c, d, a, M_offset_7, 22, T[7]);
|
|
1341
|
-
a = FF(a, b, c, d, M_offset_8, 7, T[8]);
|
|
1342
|
-
d = FF(d, a, b, c, M_offset_9, 12, T[9]);
|
|
1343
|
-
c = FF(c, d, a, b, M_offset_10, 17, T[10]);
|
|
1344
|
-
b = FF(b, c, d, a, M_offset_11, 22, T[11]);
|
|
1345
|
-
a = FF(a, b, c, d, M_offset_12, 7, T[12]);
|
|
1346
|
-
d = FF(d, a, b, c, M_offset_13, 12, T[13]);
|
|
1347
|
-
c = FF(c, d, a, b, M_offset_14, 17, T[14]);
|
|
1348
|
-
b = FF(b, c, d, a, M_offset_15, 22, T[15]);
|
|
1349
|
-
|
|
1350
|
-
a = GG(a, b, c, d, M_offset_1, 5, T[16]);
|
|
1351
|
-
d = GG(d, a, b, c, M_offset_6, 9, T[17]);
|
|
1352
|
-
c = GG(c, d, a, b, M_offset_11, 14, T[18]);
|
|
1353
|
-
b = GG(b, c, d, a, M_offset_0, 20, T[19]);
|
|
1354
|
-
a = GG(a, b, c, d, M_offset_5, 5, T[20]);
|
|
1355
|
-
d = GG(d, a, b, c, M_offset_10, 9, T[21]);
|
|
1356
|
-
c = GG(c, d, a, b, M_offset_15, 14, T[22]);
|
|
1357
|
-
b = GG(b, c, d, a, M_offset_4, 20, T[23]);
|
|
1358
|
-
a = GG(a, b, c, d, M_offset_9, 5, T[24]);
|
|
1359
|
-
d = GG(d, a, b, c, M_offset_14, 9, T[25]);
|
|
1360
|
-
c = GG(c, d, a, b, M_offset_3, 14, T[26]);
|
|
1361
|
-
b = GG(b, c, d, a, M_offset_8, 20, T[27]);
|
|
1362
|
-
a = GG(a, b, c, d, M_offset_13, 5, T[28]);
|
|
1363
|
-
d = GG(d, a, b, c, M_offset_2, 9, T[29]);
|
|
1364
|
-
c = GG(c, d, a, b, M_offset_7, 14, T[30]);
|
|
1365
|
-
b = GG(b, c, d, a, M_offset_12, 20, T[31]);
|
|
1366
|
-
|
|
1367
|
-
a = HH(a, b, c, d, M_offset_5, 4, T[32]);
|
|
1368
|
-
d = HH(d, a, b, c, M_offset_8, 11, T[33]);
|
|
1369
|
-
c = HH(c, d, a, b, M_offset_11, 16, T[34]);
|
|
1370
|
-
b = HH(b, c, d, a, M_offset_14, 23, T[35]);
|
|
1371
|
-
a = HH(a, b, c, d, M_offset_1, 4, T[36]);
|
|
1372
|
-
d = HH(d, a, b, c, M_offset_4, 11, T[37]);
|
|
1373
|
-
c = HH(c, d, a, b, M_offset_7, 16, T[38]);
|
|
1374
|
-
b = HH(b, c, d, a, M_offset_10, 23, T[39]);
|
|
1375
|
-
a = HH(a, b, c, d, M_offset_13, 4, T[40]);
|
|
1376
|
-
d = HH(d, a, b, c, M_offset_0, 11, T[41]);
|
|
1377
|
-
c = HH(c, d, a, b, M_offset_3, 16, T[42]);
|
|
1378
|
-
b = HH(b, c, d, a, M_offset_6, 23, T[43]);
|
|
1379
|
-
a = HH(a, b, c, d, M_offset_9, 4, T[44]);
|
|
1380
|
-
d = HH(d, a, b, c, M_offset_12, 11, T[45]);
|
|
1381
|
-
c = HH(c, d, a, b, M_offset_15, 16, T[46]);
|
|
1382
|
-
b = HH(b, c, d, a, M_offset_2, 23, T[47]);
|
|
1383
|
-
|
|
1384
|
-
a = II(a, b, c, d, M_offset_0, 6, T[48]);
|
|
1385
|
-
d = II(d, a, b, c, M_offset_7, 10, T[49]);
|
|
1386
|
-
c = II(c, d, a, b, M_offset_14, 15, T[50]);
|
|
1387
|
-
b = II(b, c, d, a, M_offset_5, 21, T[51]);
|
|
1388
|
-
a = II(a, b, c, d, M_offset_12, 6, T[52]);
|
|
1389
|
-
d = II(d, a, b, c, M_offset_3, 10, T[53]);
|
|
1390
|
-
c = II(c, d, a, b, M_offset_10, 15, T[54]);
|
|
1391
|
-
b = II(b, c, d, a, M_offset_1, 21, T[55]);
|
|
1392
|
-
a = II(a, b, c, d, M_offset_8, 6, T[56]);
|
|
1393
|
-
d = II(d, a, b, c, M_offset_15, 10, T[57]);
|
|
1394
|
-
c = II(c, d, a, b, M_offset_6, 15, T[58]);
|
|
1395
|
-
b = II(b, c, d, a, M_offset_13, 21, T[59]);
|
|
1396
|
-
a = II(a, b, c, d, M_offset_4, 6, T[60]);
|
|
1397
|
-
d = II(d, a, b, c, M_offset_11, 10, T[61]);
|
|
1398
|
-
c = II(c, d, a, b, M_offset_2, 15, T[62]);
|
|
1399
|
-
b = II(b, c, d, a, M_offset_9, 21, T[63]);
|
|
1400
|
-
|
|
1401
|
-
// Intermediate hash value
|
|
1402
|
-
H[0] = (H[0] + a) | 0;
|
|
1403
|
-
H[1] = (H[1] + b) | 0;
|
|
1404
|
-
H[2] = (H[2] + c) | 0;
|
|
1405
|
-
H[3] = (H[3] + d) | 0;
|
|
1406
|
-
},
|
|
1407
|
-
|
|
1408
|
-
_doFinalize: function () {
|
|
1409
|
-
// Shortcuts
|
|
1410
|
-
var data = this._data;
|
|
1411
|
-
var dataWords = data.words;
|
|
1412
|
-
|
|
1413
|
-
var nBitsTotal = this._nDataBytes * 8;
|
|
1414
|
-
var nBitsLeft = data.sigBytes * 8;
|
|
1415
|
-
|
|
1416
|
-
// Add padding
|
|
1417
|
-
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
|
1418
|
-
|
|
1419
|
-
var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
|
|
1420
|
-
var nBitsTotalL = nBitsTotal;
|
|
1421
|
-
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
|
|
1422
|
-
(((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
|
|
1423
|
-
(((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
|
|
1424
|
-
);
|
|
1425
|
-
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
|
|
1426
|
-
(((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
|
|
1427
|
-
(((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
|
|
1428
|
-
);
|
|
1429
|
-
|
|
1430
|
-
data.sigBytes = (dataWords.length + 1) * 4;
|
|
1431
|
-
|
|
1432
|
-
// Hash final blocks
|
|
1433
|
-
this._process();
|
|
1434
|
-
|
|
1435
|
-
// Shortcuts
|
|
1436
|
-
var hash = this._hash;
|
|
1437
|
-
var H = hash.words;
|
|
1438
|
-
|
|
1439
|
-
// Swap endian
|
|
1440
|
-
for (var i = 0; i < 4; i++) {
|
|
1441
|
-
// Shortcut
|
|
1442
|
-
var H_i = H[i];
|
|
1443
|
-
|
|
1444
|
-
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
|
|
1445
|
-
(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
|
|
1446
|
-
}
|
|
1447
|
-
|
|
1448
|
-
// Return final computed hash
|
|
1449
|
-
return hash;
|
|
1450
|
-
},
|
|
1451
|
-
|
|
1452
|
-
clone: function () {
|
|
1453
|
-
var clone = Hasher.clone.call(this);
|
|
1454
|
-
clone._hash = this._hash.clone();
|
|
1455
|
-
|
|
1456
|
-
return clone;
|
|
1457
|
-
}
|
|
1458
|
-
});
|
|
1459
|
-
|
|
1460
|
-
function FF(a, b, c, d, x, s, t) {
|
|
1461
|
-
var n = a + ((b & c) | (~b & d)) + x + t;
|
|
1462
|
-
return ((n << s) | (n >>> (32 - s))) + b;
|
|
1463
|
-
}
|
|
1464
|
-
|
|
1465
|
-
function GG(a, b, c, d, x, s, t) {
|
|
1466
|
-
var n = a + ((b & d) | (c & ~d)) + x + t;
|
|
1467
|
-
return ((n << s) | (n >>> (32 - s))) + b;
|
|
1468
|
-
}
|
|
1469
|
-
|
|
1470
|
-
function HH(a, b, c, d, x, s, t) {
|
|
1471
|
-
var n = a + (b ^ c ^ d) + x + t;
|
|
1472
|
-
return ((n << s) | (n >>> (32 - s))) + b;
|
|
1473
|
-
}
|
|
1474
|
-
|
|
1475
|
-
function II(a, b, c, d, x, s, t) {
|
|
1476
|
-
var n = a + (c ^ (b | ~d)) + x + t;
|
|
1477
|
-
return ((n << s) | (n >>> (32 - s))) + b;
|
|
1478
|
-
}
|
|
1479
|
-
|
|
1480
|
-
/**
|
|
1481
|
-
* Shortcut function to the hasher's object interface.
|
|
1482
|
-
*
|
|
1483
|
-
* @param {WordArray|string} message The message to hash.
|
|
1484
|
-
*
|
|
1485
|
-
* @return {WordArray} The hash.
|
|
1486
|
-
*
|
|
1487
|
-
* @static
|
|
1488
|
-
*
|
|
1489
|
-
* @example
|
|
1490
|
-
*
|
|
1491
|
-
* var hash = CryptoJS.MD5('message');
|
|
1492
|
-
* var hash = CryptoJS.MD5(wordArray);
|
|
1493
|
-
*/
|
|
1494
|
-
C.MD5 = Hasher._createHelper(MD5);
|
|
1495
|
-
|
|
1496
|
-
/**
|
|
1497
|
-
* Shortcut function to the HMAC's object interface.
|
|
1498
|
-
*
|
|
1499
|
-
* @param {WordArray|string} message The message to hash.
|
|
1500
|
-
* @param {WordArray|string} key The secret key.
|
|
1501
|
-
*
|
|
1502
|
-
* @return {WordArray} The HMAC.
|
|
1503
|
-
*
|
|
1504
|
-
* @static
|
|
1505
|
-
*
|
|
1506
|
-
* @example
|
|
1507
|
-
*
|
|
1508
|
-
* var hmac = CryptoJS.HmacMD5(message, key);
|
|
1509
|
-
*/
|
|
1510
|
-
C.HmacMD5 = Hasher._createHmacHelper(MD5);
|
|
1511
|
-
}(Math));
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
return CryptoJS.MD5;
|
|
1515
|
-
|
|
1516
|
-
}));
|
|
1517
|
-
} (md5$1));
|
|
1518
|
-
|
|
1519
|
-
var md5Exports = md5$1.exports;
|
|
1520
|
-
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
|
1521
|
-
|
|
1522
|
-
function baidu$2(options) {
|
|
1523
|
-
const { appId, secretKey } = options;
|
|
1524
|
-
const url = "https://fanyi-api.baidu.com/api/trans/vip/fieldtranslate";
|
|
1525
|
-
const name = "baidu";
|
|
1526
|
-
const checkOptions = () => {
|
|
1527
|
-
if (!appId || !secretKey) {
|
|
1528
|
-
throw new TranslationError(name, `${name} appId and secretKey is required`);
|
|
1529
|
-
}
|
|
1530
|
-
};
|
|
1531
|
-
checkOptions();
|
|
1532
|
-
return {
|
|
1533
|
-
name,
|
|
1534
|
-
async translate(text, opts) {
|
|
1535
|
-
checkOptions();
|
|
1536
|
-
const { to, from = "auto", domain = "it" } = opts;
|
|
1537
|
-
if (!Array.isArray(text)) {
|
|
1538
|
-
text = [text];
|
|
1539
|
-
}
|
|
1540
|
-
const q = text.join("\n");
|
|
1541
|
-
const salt = Date.now();
|
|
1542
|
-
const sign = md5(`${appId}${q}${salt}${domain}${secretKey}`).toString();
|
|
1543
|
-
const body = new URLSearchParams();
|
|
1544
|
-
body.append("q", q);
|
|
1545
|
-
body.append("from", from);
|
|
1546
|
-
body.append("to", to);
|
|
1547
|
-
body.append("appid", appId);
|
|
1548
|
-
body.append("salt", salt.toString());
|
|
1549
|
-
body.append("domain", domain);
|
|
1550
|
-
body.append("sign", sign);
|
|
1551
|
-
const res = await fetch(url, {
|
|
1552
|
-
method: "POST",
|
|
1553
|
-
headers: {
|
|
1554
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
1555
|
-
},
|
|
1556
|
-
body: body.toString(),
|
|
1557
|
-
});
|
|
1558
|
-
if (!res.ok) {
|
|
1559
|
-
throw await throwResponseError(this.name, res);
|
|
1560
|
-
}
|
|
1561
|
-
const data = await res.json();
|
|
1562
|
-
if (!data || data.error_code || !data.trans_result || data.trans_result.length === 0) {
|
|
1563
|
-
throw new TranslationError(this.name, `Translate fail ! error_code:${data.error_code}, error_msg: ${data.error_msg} \n Go to https://fanyi-api.baidu.com/product/123 view details`);
|
|
1564
|
-
}
|
|
1565
|
-
const translations = [];
|
|
1566
|
-
for (const translation of data.trans_result) {
|
|
1567
|
-
if (translation.dst) {
|
|
1568
|
-
translations.push(translation.dst);
|
|
1569
|
-
}
|
|
1570
|
-
}
|
|
1571
|
-
return translations;
|
|
1572
|
-
},
|
|
1573
|
-
async checkLanguage(text) {
|
|
1574
|
-
checkOptions();
|
|
1575
|
-
const salt = Date.now();
|
|
1576
|
-
const sign = md5(`${appId}${text}${salt}${secretKey}`).toString();
|
|
1577
|
-
const body = new URLSearchParams();
|
|
1578
|
-
body.append("q", text);
|
|
1579
|
-
body.append("appid", appId);
|
|
1580
|
-
body.append("salt", salt.toString());
|
|
1581
|
-
body.append("sign", sign);
|
|
1582
|
-
const res = await fetch("https://fanyi-api.baidu.com/api/trans/vip/language", {
|
|
1583
|
-
method: "POST",
|
|
1584
|
-
headers: {
|
|
1585
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
1586
|
-
},
|
|
1587
|
-
body: body.toString(),
|
|
1588
|
-
});
|
|
1589
|
-
if (!res.ok) {
|
|
1590
|
-
throw await throwResponseError(this.name, res);
|
|
1591
|
-
}
|
|
1592
|
-
const response = await res.json();
|
|
1593
|
-
if (!response || response.error_code != 0) {
|
|
1594
|
-
throw new CheckLanguageError(this.name, `Check language fail ! error_code:${response.error_code}, error_msg: ${response.error_msg} \n Go to https://fanyi-api.baidu.com/product/143 view details`);
|
|
1595
|
-
}
|
|
1596
|
-
return response.data.src;
|
|
1597
|
-
},
|
|
1598
|
-
};
|
|
1599
|
-
}
|
|
1600
|
-
|
|
1601
|
-
function deepl$2(options) {
|
|
1602
|
-
const { key } = options;
|
|
1603
|
-
const name = "deepl";
|
|
1604
|
-
const checkOptions = () => {
|
|
1605
|
-
if (!key) {
|
|
1606
|
-
throw new TranslationError(name, `${name} key is required`);
|
|
1607
|
-
}
|
|
1608
|
-
};
|
|
1609
|
-
checkOptions();
|
|
1610
|
-
const url = "https://api-free.deepl.com/v2/translate";
|
|
1611
|
-
return {
|
|
1612
|
-
name,
|
|
1613
|
-
async translate(text, opts) {
|
|
1614
|
-
checkOptions();
|
|
1615
|
-
const { to, from } = opts;
|
|
1616
|
-
if (!Array.isArray(text)) {
|
|
1617
|
-
text = [text];
|
|
1618
|
-
}
|
|
1619
|
-
const res = await fetch(url, {
|
|
1620
|
-
method: "POST",
|
|
1621
|
-
headers: {
|
|
1622
|
-
"Content-Type": "application/json; charset=UTF-8",
|
|
1623
|
-
Authorization: `DeepL-Auth-Key ${key}`,
|
|
1624
|
-
Accept: "*/*",
|
|
1625
|
-
Host: "api-free.deepl.com",
|
|
1626
|
-
Connection: "keep-alive",
|
|
1627
|
-
},
|
|
1628
|
-
body: JSON.stringify({
|
|
1629
|
-
text: text,
|
|
1630
|
-
source_lang: from === "auto" ? undefined : from,
|
|
1631
|
-
target_lang: to,
|
|
1632
|
-
}),
|
|
1633
|
-
});
|
|
1634
|
-
if (!res.ok) {
|
|
1635
|
-
throw await throwResponseError(this.name, res);
|
|
1636
|
-
}
|
|
1637
|
-
const bodyRes = await res.json();
|
|
1638
|
-
if (bodyRes.error) {
|
|
1639
|
-
throw new TranslationError(this.name, `Translate fail ! code: ${bodyRes.error.code}, message: ${bodyRes.error.message}`);
|
|
1640
|
-
}
|
|
1641
|
-
const body = bodyRes.translations;
|
|
1642
|
-
if (!body || body.length === 0) {
|
|
1643
|
-
throw new TranslationError(this.name, "Translate fail ! translate's result is null or empty");
|
|
1644
|
-
}
|
|
1645
|
-
const translations = body.map((t) => t.text);
|
|
1646
|
-
return translations;
|
|
1647
|
-
},
|
|
1648
|
-
async checkLanguage(text) {
|
|
1649
|
-
checkOptions();
|
|
1650
|
-
const res = await fetch(url, {
|
|
1651
|
-
method: "POST",
|
|
1652
|
-
headers: {
|
|
1653
|
-
"Content-Type": "application/json; charset=UTF-8",
|
|
1654
|
-
Authorization: `DeepL-Auth-Key ${key}`,
|
|
1655
|
-
Accept: "*/*",
|
|
1656
|
-
Host: "api-free.deepl.com",
|
|
1657
|
-
Connection: "keep-alive",
|
|
1658
|
-
},
|
|
1659
|
-
body: JSON.stringify({
|
|
1660
|
-
text: [text],
|
|
1661
|
-
target_lang: "EN",
|
|
1662
|
-
}),
|
|
1663
|
-
});
|
|
1664
|
-
if (!res.ok) {
|
|
1665
|
-
throw await throwResponseError(this.name, res);
|
|
1666
|
-
}
|
|
1667
|
-
const bodyRes = await res.json();
|
|
1668
|
-
if (bodyRes.error) {
|
|
1669
|
-
throw new CheckLanguageError(this.name, `Check language fail ! code: ${bodyRes.error.code}, message: ${bodyRes.error.message}`);
|
|
1670
|
-
}
|
|
1671
|
-
const body = bodyRes.translations;
|
|
1672
|
-
if (!body || body.length === 0) {
|
|
1673
|
-
throw new CheckLanguageError(this.name, "Check language fail! No result returned");
|
|
1674
|
-
}
|
|
1675
|
-
const detectedLanguage = body[0].detected_source_language;
|
|
1676
|
-
if (!detectedLanguage) {
|
|
1677
|
-
throw new CheckLanguageError(this.name, "Check language fail! Language not detected");
|
|
1678
|
-
}
|
|
1679
|
-
return detectedLanguage;
|
|
1680
|
-
},
|
|
1681
|
-
};
|
|
1682
|
-
}
|
|
1683
|
-
|
|
1684
|
-
const logger$1 = useLogger("openai");
|
|
1685
|
-
function openai$1(options) {
|
|
1686
|
-
const { apiKey, model, maxTokens = 2000, outputLog = false } = options;
|
|
1687
|
-
const name = "openai";
|
|
1688
|
-
const checkOptions = () => {
|
|
1689
|
-
if (!apiKey) {
|
|
1690
|
-
throw new TranslationError(name, `${name} apiKey is required`);
|
|
1691
|
-
}
|
|
1692
|
-
if (!OPEN_AI_MODELS.includes(model)) {
|
|
1693
|
-
throw new TranslationError(name, `${name} model=${model} is invalid`);
|
|
1694
|
-
}
|
|
1695
|
-
};
|
|
1696
|
-
checkOptions();
|
|
1697
|
-
const base = "https://api.openai.com/v1/chat/completions";
|
|
1698
|
-
return {
|
|
1699
|
-
name,
|
|
1700
|
-
async translate(text, opts) {
|
|
1701
|
-
checkOptions();
|
|
1702
|
-
const { from, to } = opts;
|
|
1703
|
-
const url = `${base}`;
|
|
1704
|
-
if (!Array.isArray(text)) {
|
|
1705
|
-
text = [text];
|
|
1706
|
-
}
|
|
1707
|
-
const prompt = {
|
|
1708
|
-
role: "user",
|
|
1709
|
-
content: `
|
|
1710
|
-
满足以下4点翻译要求:
|
|
1711
|
-
1.将每段文本从${from}翻译为${to}
|
|
1712
|
-
2.文本内容以换行符\n进行段落分割,并以段落分割顺序进行翻译
|
|
1713
|
-
3.仅翻译分割出的段落,其他任何不相关的内容都移除,比如:段落前后的空格、所有标点符号\n
|
|
1714
|
-
4.仅返回要翻译的文本内容,不要返回任何其他内容
|
|
1715
|
-
|
|
1716
|
-
如何提取翻译文本,满足以下2点要求:
|
|
1717
|
-
1.翻译从-$s$-字符标记开始至-$e$-字符标记结束,提取-$s$-至-$e$-之间的内容
|
|
1718
|
-
2.-$s$-和-$e$-这2个标记不要返回,只是用来标记翻译的起始和结束位置
|
|
1719
|
-
|
|
1720
|
-
-$s$-
|
|
1721
|
-
${text.join("\n")}
|
|
1722
|
-
-$e$-
|
|
1723
|
-
`,
|
|
1724
|
-
};
|
|
1725
|
-
const res = await fetch(url, {
|
|
1726
|
-
method: "POST",
|
|
1727
|
-
headers: {
|
|
1728
|
-
"Content-Type": "application/json",
|
|
1729
|
-
Authorization: `Bearer ${apiKey}`,
|
|
1730
|
-
},
|
|
1731
|
-
body: JSON.stringify({
|
|
1732
|
-
model,
|
|
1733
|
-
messages: [{ role: "system", content: "You are a professional translator" }, prompt],
|
|
1734
|
-
max_tokens: maxTokens,
|
|
1735
|
-
temperature: 0,
|
|
1736
|
-
}),
|
|
1737
|
-
});
|
|
1738
|
-
if (!res.ok) {
|
|
1739
|
-
throw await throwResponseError(this.name, res);
|
|
1740
|
-
}
|
|
1741
|
-
const bodyRes = await res.json();
|
|
1742
|
-
if (bodyRes.error) {
|
|
1743
|
-
throw new TranslationError(this.name, `Translate fail! message: ${bodyRes.error.message}`);
|
|
1744
|
-
}
|
|
1745
|
-
if (!bodyRes || !bodyRes.choices || bodyRes.choices.length === 0 || !bodyRes.choices[0]?.message?.content) {
|
|
1746
|
-
throw new TranslationError(this.name, "Translate fail ! translate's result is null or empty");
|
|
1747
|
-
}
|
|
1748
|
-
const content = bodyRes.choices[0].message.content;
|
|
1749
|
-
const marks = ["-$s$-", "-$e$-"];
|
|
1750
|
-
const translations = content
|
|
1751
|
-
.trim()
|
|
1752
|
-
.split("\n")
|
|
1753
|
-
.map((item) => item.trim())
|
|
1754
|
-
.filter(Boolean)
|
|
1755
|
-
.filter((it) => !marks.includes(it));
|
|
1756
|
-
if (outputLog) {
|
|
1757
|
-
logger$1.info("prompt:", JSON.stringify(prompt, null, 2));
|
|
1758
|
-
logger$1.info("translations:", JSON.stringify(translations, null, 2));
|
|
1759
|
-
}
|
|
1760
|
-
return translations;
|
|
1761
|
-
},
|
|
1762
|
-
};
|
|
1763
|
-
}
|
|
1764
|
-
|
|
1765
|
-
function sha256(message, secret = "", encoding) {
|
|
1766
|
-
if (encoding) {
|
|
1767
|
-
return crypto.createHmac("sha256", secret).update(message).digest(encoding);
|
|
1768
|
-
}
|
|
1769
|
-
return crypto.createHmac("sha256", secret).update(message).digest();
|
|
1770
|
-
}
|
|
1771
|
-
function getHash(message, encoding = "hex") {
|
|
1772
|
-
return crypto.createHash("sha256").update(message).digest(encoding);
|
|
1773
|
-
}
|
|
1774
|
-
function getDate(timestamp) {
|
|
1775
|
-
const date = new Date(timestamp * 1000);
|
|
1776
|
-
return `${date.getUTCFullYear()}-${("0" + (date.getUTCMonth() + 1)).slice(-2)}-${("0" + date.getUTCDate()).slice(-2)}`;
|
|
1777
|
-
}
|
|
1778
|
-
function buildAuthorization({ secretId, secretKey, service, host, payload, httpRequestMethod, action, apiVersion, region }) {
|
|
1779
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
1780
|
-
const date = getDate(timestamp);
|
|
1781
|
-
const canonicalUri = "/";
|
|
1782
|
-
const canonicalQueryString = "";
|
|
1783
|
-
const canonicalHeaders = "content-type:application/json; charset=utf-8\nhost:" + host + "\n";
|
|
1784
|
-
const signedHeaders = "content-type;host";
|
|
1785
|
-
const hashedRequestPayload = getHash(payload);
|
|
1786
|
-
const canonicalRequest = [
|
|
1787
|
-
httpRequestMethod,
|
|
1788
|
-
canonicalUri,
|
|
1789
|
-
canonicalQueryString,
|
|
1790
|
-
canonicalHeaders,
|
|
1791
|
-
signedHeaders,
|
|
1792
|
-
hashedRequestPayload,
|
|
1793
|
-
].join("\n");
|
|
1794
|
-
const algorithm = "TC3-HMAC-SHA256";
|
|
1795
|
-
const credentialScope = `${date}/${service}/tc3_request`;
|
|
1796
|
-
const hashedCanonicalRequest = getHash(canonicalRequest);
|
|
1797
|
-
const stringToSign = [algorithm, timestamp, credentialScope, hashedCanonicalRequest].join("\n");
|
|
1798
|
-
const kDate = sha256(date, "TC3" + secretKey);
|
|
1799
|
-
const kService = sha256(service, kDate);
|
|
1800
|
-
const kSigning = sha256("tc3_request", kService);
|
|
1801
|
-
const signature = sha256(stringToSign, kSigning, "hex");
|
|
1802
|
-
const authorization = `${algorithm} Credential=${secretId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
|
1803
|
-
const headers = {
|
|
1804
|
-
Authorization: authorization,
|
|
1805
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
1806
|
-
Host: host,
|
|
1807
|
-
"X-TC-Action": action,
|
|
1808
|
-
"X-TC-Timestamp": timestamp,
|
|
1809
|
-
"X-TC-Version": apiVersion,
|
|
1810
|
-
};
|
|
1811
|
-
if (region)
|
|
1812
|
-
headers["X-TC-Region"] = region;
|
|
1813
|
-
return headers;
|
|
1814
|
-
}
|
|
1815
|
-
function tencent$2(options) {
|
|
1816
|
-
const { secretId, secretKey, region = "ap-guangzhou" } = options;
|
|
1817
|
-
const name = "tencent";
|
|
1818
|
-
const host = "tmt.tencentcloudapi.com";
|
|
1819
|
-
const endpoint = `https://${host}/`;
|
|
1820
|
-
const service = "tmt";
|
|
1821
|
-
const apiVersion = "2018-03-21";
|
|
1822
|
-
const action = "TextTranslate";
|
|
1823
|
-
function checkOptions() {
|
|
1824
|
-
if (!secretId || !secretKey) {
|
|
1825
|
-
throw new TranslationError(name, `${name} secretId and secretKey are required`);
|
|
1826
|
-
}
|
|
1827
|
-
}
|
|
1828
|
-
return {
|
|
1829
|
-
name,
|
|
1830
|
-
async translate(text, opts) {
|
|
1831
|
-
checkOptions();
|
|
1832
|
-
const { from = "auto", to } = opts;
|
|
1833
|
-
const source = from === "auto" ? "auto" : from;
|
|
1834
|
-
const payloadObj = {
|
|
1835
|
-
SourceText: Array.isArray(text) ? text.join("\n") : text,
|
|
1836
|
-
Source: source,
|
|
1837
|
-
Target: to,
|
|
1838
|
-
ProjectId: 0,
|
|
1839
|
-
};
|
|
1840
|
-
const payload = JSON.stringify(payloadObj);
|
|
1841
|
-
const headers = buildAuthorization({
|
|
1842
|
-
secretId,
|
|
1843
|
-
secretKey,
|
|
1844
|
-
service,
|
|
1845
|
-
host,
|
|
1846
|
-
payload,
|
|
1847
|
-
httpRequestMethod: "POST",
|
|
1848
|
-
action,
|
|
1849
|
-
apiVersion,
|
|
1850
|
-
region,
|
|
1851
|
-
});
|
|
1852
|
-
try {
|
|
1853
|
-
const res = await fetch(endpoint, {
|
|
1854
|
-
method: "POST",
|
|
1855
|
-
headers,
|
|
1856
|
-
body: payload,
|
|
1857
|
-
});
|
|
1858
|
-
if (!res.ok) {
|
|
1859
|
-
throw new TranslationError(name, `HTTP ${res.status}: ${await res.text()}`);
|
|
1860
|
-
}
|
|
1861
|
-
const data = await res.json();
|
|
1862
|
-
if (data.Response?.Error) {
|
|
1863
|
-
throw new TranslationError(name, `Tencent translate fail: ${data.Response.Error.Code}, ${data.Response.Error.Message} \n Go to https://cloud.tencent.com/document/product/551/15619 view details`);
|
|
1864
|
-
}
|
|
1865
|
-
const translatedResults = data.Response?.TargetText.split("\n") ?? [];
|
|
1866
|
-
if (!Array.isArray(translatedResults) || translatedResults.length === 0) {
|
|
1867
|
-
throw new TranslationError(name, "Translate fail! No result returned");
|
|
1868
|
-
}
|
|
1869
|
-
return translatedResults;
|
|
1870
|
-
}
|
|
1871
|
-
catch (error) {
|
|
1872
|
-
if (error instanceof TranslationError)
|
|
1873
|
-
throw error;
|
|
1874
|
-
throw new TranslationError(name, `Translation failed: ${error}`);
|
|
1875
|
-
}
|
|
1876
|
-
},
|
|
1877
|
-
async checkLanguage(text) {
|
|
1878
|
-
checkOptions();
|
|
1879
|
-
const payloadObj = {
|
|
1880
|
-
SourceText: text,
|
|
1881
|
-
Source: "auto",
|
|
1882
|
-
Target: "en",
|
|
1883
|
-
ProjectId: 0,
|
|
1884
|
-
};
|
|
1885
|
-
const payload = JSON.stringify(payloadObj);
|
|
1886
|
-
const headers = buildAuthorization({
|
|
1887
|
-
secretId,
|
|
1888
|
-
secretKey,
|
|
1889
|
-
service,
|
|
1890
|
-
host,
|
|
1891
|
-
payload,
|
|
1892
|
-
httpRequestMethod: "POST",
|
|
1893
|
-
action,
|
|
1894
|
-
apiVersion,
|
|
1895
|
-
region,
|
|
1896
|
-
});
|
|
1897
|
-
try {
|
|
1898
|
-
const res = await fetch(endpoint, {
|
|
1899
|
-
method: "POST",
|
|
1900
|
-
headers,
|
|
1901
|
-
body: payload,
|
|
1902
|
-
});
|
|
1903
|
-
if (!res.ok) {
|
|
1904
|
-
throw new CheckLanguageError(name, `HTTP ${res.status}: ${await res.text()}`);
|
|
1905
|
-
}
|
|
1906
|
-
const data = await res.json();
|
|
1907
|
-
if (data.Response?.Error) {
|
|
1908
|
-
throw new CheckLanguageError(name, `Tencent language detect fail: ${data.Response.Error.Code}, ${data.Response.Error.Message} \n Go to https://cloud.tencent.com/document/product/551/15619 view details`);
|
|
1909
|
-
}
|
|
1910
|
-
const detectedLanguage = data.Response?.Source;
|
|
1911
|
-
if (!detectedLanguage) {
|
|
1912
|
-
throw new CheckLanguageError(name, "Language detect fail! No result returned");
|
|
1913
|
-
}
|
|
1914
|
-
return detectedLanguage;
|
|
1915
|
-
}
|
|
1916
|
-
catch (error) {
|
|
1917
|
-
if (error instanceof CheckLanguageError)
|
|
1918
|
-
throw error;
|
|
1919
|
-
throw new CheckLanguageError(name, `Language detection failed: ${error}`);
|
|
1920
|
-
}
|
|
1921
|
-
},
|
|
1922
|
-
};
|
|
1923
|
-
}
|
|
1924
|
-
|
|
1925
|
-
const engines = {
|
|
1926
|
-
google,
|
|
1927
|
-
azure: azure$1,
|
|
1928
|
-
amazon: amazon$1,
|
|
1929
|
-
baidu: baidu$2,
|
|
1930
|
-
deepl: deepl$2,
|
|
1931
|
-
openai: openai$1,
|
|
1932
|
-
tencent: tencent$2,
|
|
1933
|
-
};
|
|
1934
|
-
|
|
1935
|
-
var azure = {
|
|
1936
|
-
Afrikaans: "af",
|
|
1937
|
-
Albanian: "sq",
|
|
1938
|
-
Amharic: "am",
|
|
1939
|
-
Arabic: "ar",
|
|
1940
|
-
Armenian: "hy",
|
|
1941
|
-
Assamese: "as",
|
|
1942
|
-
Azerbaijani: "az",
|
|
1943
|
-
Bashkir: "ba",
|
|
1944
|
-
Basque: "eu",
|
|
1945
|
-
Bengali: "bn",
|
|
1946
|
-
Bhojpuri: "bho",
|
|
1947
|
-
Bosnian: "bs",
|
|
1948
|
-
Bulgarian: "bg",
|
|
1949
|
-
Burmese: "my",
|
|
1950
|
-
"Cantonese (Traditional)": "yue",
|
|
1951
|
-
Catalan: "ca",
|
|
1952
|
-
Chhattisgarhi: "hne",
|
|
1953
|
-
Chinese: "zh-Hans",
|
|
1954
|
-
"Chinese (Literary)": "lzh",
|
|
1955
|
-
"Chinese (Traditional)": "zh-Hant",
|
|
1956
|
-
Croatian: "hr",
|
|
1957
|
-
Czech: "cs",
|
|
1958
|
-
Danish: "da",
|
|
1959
|
-
Dari: "prs",
|
|
1960
|
-
Dhivehi: "dv",
|
|
1961
|
-
Dogri: "doi",
|
|
1962
|
-
Double: "lug",
|
|
1963
|
-
Dutch: "nl",
|
|
1964
|
-
English: "en",
|
|
1965
|
-
Estonian: "et",
|
|
1966
|
-
"FYRO Macedonian": "mk",
|
|
1967
|
-
Faroese: "fo",
|
|
1968
|
-
Fijian: "fj",
|
|
1969
|
-
Filipino: "fil",
|
|
1970
|
-
Finnish: "fi",
|
|
1971
|
-
French: "fr",
|
|
1972
|
-
"French (Canada)": "fr-CA",
|
|
1973
|
-
Galician: "gl",
|
|
1974
|
-
Georgian: "ka",
|
|
1975
|
-
German: "de",
|
|
1976
|
-
Greek: "el",
|
|
1977
|
-
Gujarati: "gu",
|
|
1978
|
-
"Haitian Creole": "ht",
|
|
1979
|
-
Hausa: "ha",
|
|
1980
|
-
Hebrew: "he",
|
|
1981
|
-
Hindi: "hi",
|
|
1982
|
-
Hmong: "mww",
|
|
1983
|
-
Hungarian: "hu",
|
|
1984
|
-
Icelandic: "is",
|
|
1985
|
-
Igbo: "ig",
|
|
1986
|
-
Indonesian: "id",
|
|
1987
|
-
Inuinnaqtun: "ikt",
|
|
1988
|
-
Inuktitut: "iu",
|
|
1989
|
-
"Inuktitut (Latin)": "iu-Latn",
|
|
1990
|
-
Irish: "ga",
|
|
1991
|
-
Italian: "it",
|
|
1992
|
-
Japanese: "ja",
|
|
1993
|
-
Kannada: "kn",
|
|
1994
|
-
Kashmiri: "ks",
|
|
1995
|
-
Kazakh: "kk",
|
|
1996
|
-
Khmer: "km",
|
|
1997
|
-
Kikwanda: "rw",
|
|
1998
|
-
"Klingon (Latin)": "tlh-Latn",
|
|
1999
|
-
"Klingon (pIqaD)": "tlh-Piqd",
|
|
2000
|
-
Konkani: "gom",
|
|
2001
|
-
Korean: "ko",
|
|
2002
|
-
"Kurdish (Medium)": "ku",
|
|
2003
|
-
"Kurdish (North)": "kmr",
|
|
2004
|
-
Kyrgyz: "ky",
|
|
2005
|
-
Lao: "lo",
|
|
2006
|
-
Latvian: "lv",
|
|
2007
|
-
Lingala: "ln",
|
|
2008
|
-
Lithuanian: "lt",
|
|
2009
|
-
"Lower Sorbian language": "dsb",
|
|
2010
|
-
Maithili: "mai",
|
|
2011
|
-
Malagasian: "mg",
|
|
2012
|
-
Malay: "ms",
|
|
2013
|
-
Malayalam: "ml",
|
|
2014
|
-
Maltese: "mt",
|
|
2015
|
-
Manipuri: "mni",
|
|
2016
|
-
Marathi: "mr",
|
|
2017
|
-
"Mongolian (Cyrillic)": "mn-Cyrl",
|
|
2018
|
-
"Mongolian (Traditional)": "mn-Mong",
|
|
2019
|
-
Māori: "mi",
|
|
2020
|
-
Nepali: "ne",
|
|
2021
|
-
"Norwegian Bokmål": "nb",
|
|
2022
|
-
Nyanja: "nya",
|
|
2023
|
-
Oriya: "or",
|
|
2024
|
-
Pashto: "ps",
|
|
2025
|
-
Persian: "fa",
|
|
2026
|
-
Polish: "pl",
|
|
2027
|
-
"Portugal (Brazil)": "pt",
|
|
2028
|
-
"Portugal (Portugal)": "pt-PT",
|
|
2029
|
-
Punjabi: "pa",
|
|
2030
|
-
"Querétaro Ottomi": "otq",
|
|
2031
|
-
Romanian: "ro",
|
|
2032
|
-
Rounds: "run",
|
|
2033
|
-
Russian: "ru",
|
|
2034
|
-
Samoan: "sm",
|
|
2035
|
-
"Serbia (Latin)": "sr-Latn",
|
|
2036
|
-
"Serbian (Cyrillic)": "sr-Cyrl",
|
|
2037
|
-
Sesotho: "st",
|
|
2038
|
-
"Sesotho at Leboa": "nso",
|
|
2039
|
-
Setswana: "tn",
|
|
2040
|
-
Shona: "sn",
|
|
2041
|
-
Sindhi: "sd",
|
|
2042
|
-
Sinhalese: "si",
|
|
2043
|
-
Slovak: "sk",
|
|
2044
|
-
Slovenian: "sl",
|
|
2045
|
-
Somali: "so",
|
|
2046
|
-
Spanish: "es",
|
|
2047
|
-
Swahili: "sw",
|
|
2048
|
-
Swedish: "sv",
|
|
2049
|
-
Tahiti: "ty",
|
|
2050
|
-
Tamil: "ta",
|
|
2051
|
-
Tatar: "tt",
|
|
2052
|
-
Telugu: "te",
|
|
2053
|
-
Thai: "th",
|
|
2054
|
-
Tibetan: "bo",
|
|
2055
|
-
Tigrinya: "ti",
|
|
2056
|
-
Tongan: "to",
|
|
2057
|
-
Turkish: "tr",
|
|
2058
|
-
Turkmen: "tk",
|
|
2059
|
-
Uighur: "ug",
|
|
2060
|
-
Ukrainian: "uk",
|
|
2061
|
-
"Upper Sorbian": "hsb",
|
|
2062
|
-
Urdu: "ur",
|
|
2063
|
-
Uzbek: "uz",
|
|
2064
|
-
Vietnamese: "vi",
|
|
2065
|
-
Welsh: "cy",
|
|
2066
|
-
Will: "brx",
|
|
2067
|
-
Xhosa: "xh",
|
|
2068
|
-
Yoruba: "yo",
|
|
2069
|
-
"Yucatec Maya": "yua",
|
|
2070
|
-
Zulu: "zu",
|
|
2071
|
-
};
|
|
2072
|
-
|
|
2073
|
-
var openai = {
|
|
2074
|
-
Abkhazian: "ab",
|
|
2075
|
-
Acehnese: "ace",
|
|
2076
|
-
"Acholi language": "ach",
|
|
2077
|
-
Afar: "aa",
|
|
2078
|
-
Afrikaans: "af",
|
|
2079
|
-
Albanian: "sq",
|
|
2080
|
-
Alur: "alz",
|
|
2081
|
-
Amharic: "am",
|
|
2082
|
-
Arabic: "ar",
|
|
2083
|
-
Armenian: "hy",
|
|
2084
|
-
Assamese: "as",
|
|
2085
|
-
Avar: "av",
|
|
2086
|
-
Awadhi: "awa",
|
|
2087
|
-
Aymara: "ay",
|
|
2088
|
-
Azerbaijani: "az",
|
|
2089
|
-
Badawi: "bew",
|
|
2090
|
-
Balinese: "ban",
|
|
2091
|
-
Balochi: "bal",
|
|
2092
|
-
Bambara: "bm",
|
|
2093
|
-
Bangasinan: "pag",
|
|
2094
|
-
Bashkir: "ba",
|
|
2095
|
-
Basque: "eu",
|
|
2096
|
-
Batakkalo: "btx",
|
|
2097
|
-
"Bataksi Marungon": "bts",
|
|
2098
|
-
Bataktoba: "bbc",
|
|
2099
|
-
Baure: "bci",
|
|
2100
|
-
Belarusian: "be",
|
|
2101
|
-
Bengali: "bn",
|
|
2102
|
-
Bhojpuri: "bho",
|
|
2103
|
-
Bikol: "bik",
|
|
2104
|
-
Bosnian: "bs",
|
|
2105
|
-
Breton: "br",
|
|
2106
|
-
Bulgarian: "bg",
|
|
2107
|
-
Burmese: "my",
|
|
2108
|
-
"Buryat language": "bua",
|
|
2109
|
-
Cantonese: "yue",
|
|
2110
|
-
Casey: "kha",
|
|
2111
|
-
Catalan: "ca",
|
|
2112
|
-
Cebuano: "ceb",
|
|
2113
|
-
"Chamorro language": "ch",
|
|
2114
|
-
Chechen: "ce",
|
|
2115
|
-
Chevi: "ak",
|
|
2116
|
-
Chicheva: "ny",
|
|
2117
|
-
Chiga: "cgg",
|
|
2118
|
-
Chinese: "zh-CN",
|
|
2119
|
-
"Chinese (Traditional)": "zh-TW",
|
|
2120
|
-
Chuk: "chk",
|
|
2121
|
-
Chuvash: "cv",
|
|
2122
|
-
Conga: "ts",
|
|
2123
|
-
Corsican: "co",
|
|
2124
|
-
"Crimean Tatar": "crh",
|
|
2125
|
-
Croatian: "hr",
|
|
2126
|
-
Czech: "cs",
|
|
2127
|
-
Danish: "da",
|
|
2128
|
-
Dari: "fa-AF",
|
|
2129
|
-
Dhivehi: "dv",
|
|
2130
|
-
Dinka: "din",
|
|
2131
|
-
Dogra: "doi",
|
|
2132
|
-
Dutch: "nl",
|
|
2133
|
-
Dyula: "dyu",
|
|
2134
|
-
Dzongka: "dz",
|
|
2135
|
-
Elocano: "ilo",
|
|
2136
|
-
English: "en",
|
|
2137
|
-
Esperanto: "eo",
|
|
2138
|
-
Estonian: "et",
|
|
2139
|
-
Ewe: "ee",
|
|
2140
|
-
"FYRO Macedonian": "mk",
|
|
2141
|
-
Faroese: "fo",
|
|
2142
|
-
"Feng language": "fon",
|
|
2143
|
-
Fijian: "fj",
|
|
2144
|
-
Filipino: "tl",
|
|
2145
|
-
Finnish: "fi",
|
|
2146
|
-
French: "fr",
|
|
2147
|
-
Frisian: "fy",
|
|
2148
|
-
Friulian: "fur",
|
|
2149
|
-
Fulani: "ff",
|
|
2150
|
-
Ga: "gaa",
|
|
2151
|
-
Galician: "gl",
|
|
2152
|
-
Georgian: "ka",
|
|
2153
|
-
German: "de",
|
|
2154
|
-
Gongen: "gom",
|
|
2155
|
-
Gorkbojok: "trp",
|
|
2156
|
-
"Grace and Taoism": "ndc-ZW",
|
|
2157
|
-
Greek: "el",
|
|
2158
|
-
Greenlandic: "kl",
|
|
2159
|
-
Guarani: "gn",
|
|
2160
|
-
Gujarati: "gu",
|
|
2161
|
-
"Haitian Creole": "ht",
|
|
2162
|
-
Hakachin: "cnh",
|
|
2163
|
-
Hausa: "ha",
|
|
2164
|
-
Hawaiian: "haw",
|
|
2165
|
-
Hebrew: "iw",
|
|
2166
|
-
Heligaignon: "hil",
|
|
2167
|
-
Hindi: "hi",
|
|
2168
|
-
Hmong: "hmn",
|
|
2169
|
-
Hungarian: "hu",
|
|
2170
|
-
Hunsrück: "hrx",
|
|
2171
|
-
Iban: "iba",
|
|
2172
|
-
Icelandic: "is",
|
|
2173
|
-
Igbo: "ig",
|
|
2174
|
-
Indonesian: "id",
|
|
2175
|
-
Irish: "ga",
|
|
2176
|
-
Italian: "it",
|
|
2177
|
-
"Jamaica vernacular": "jam",
|
|
2178
|
-
Japanese: "ja",
|
|
2179
|
-
Javanese: "jw",
|
|
2180
|
-
"Jingpo language": "kac",
|
|
2181
|
-
Kannada: "kn",
|
|
2182
|
-
Kanuri: "kr",
|
|
2183
|
-
Kazakh: "kk",
|
|
2184
|
-
Kekchi: "kek",
|
|
2185
|
-
Khmer: "km",
|
|
2186
|
-
Kikwanda: "rw",
|
|
2187
|
-
Kithuba: "ktu",
|
|
2188
|
-
"Komi language": "kv",
|
|
2189
|
-
Kongo: "kg",
|
|
2190
|
-
Korean: "ko",
|
|
2191
|
-
"Kurdish (Kurmanji)": "ku",
|
|
2192
|
-
"Kurdish (Solani)": "ckb",
|
|
2193
|
-
Kyrgyz: "ky",
|
|
2194
|
-
Lao: "lo",
|
|
2195
|
-
Latin: "la",
|
|
2196
|
-
Latvian: "lv",
|
|
2197
|
-
Ligurian: "lij",
|
|
2198
|
-
Limburg: "li",
|
|
2199
|
-
Lingala: "ln",
|
|
2200
|
-
Lithuanian: "lt",
|
|
2201
|
-
Lombard: "lmo",
|
|
2202
|
-
Luganda: "lg",
|
|
2203
|
-
Luo: "luo",
|
|
2204
|
-
Luxembourg: "lb",
|
|
2205
|
-
Madura: "mad",
|
|
2206
|
-
Maithili: "mai",
|
|
2207
|
-
Makassar: "mak",
|
|
2208
|
-
Malagasian: "mg",
|
|
2209
|
-
Malay: "ms",
|
|
2210
|
-
"Malay, Jawi": "ms-Arab",
|
|
2211
|
-
Malayalam: "ml",
|
|
2212
|
-
Maltese: "mt",
|
|
2213
|
-
"Malwadi language": "mwr",
|
|
2214
|
-
Mamu: "mam",
|
|
2215
|
-
Manx: "gv",
|
|
2216
|
-
Marathi: "mr",
|
|
2217
|
-
Marshallese: "mh",
|
|
2218
|
-
"Mauritius Scrio whispers": "mfe",
|
|
2219
|
-
"Meitei (Manipur)": "mni-Mtei",
|
|
2220
|
-
Minan: "min",
|
|
2221
|
-
Mizo: "lus",
|
|
2222
|
-
Mongolian: "mn",
|
|
2223
|
-
Māori: "mi",
|
|
2224
|
-
"Nahuatl (Eastern Vastka)": "nhe",
|
|
2225
|
-
"Ndebele (Southern)": "nr",
|
|
2226
|
-
Ndombe: "dov",
|
|
2227
|
-
"Nepal Language (Newar)": "new",
|
|
2228
|
-
Nepali: "ne",
|
|
2229
|
-
"Nko alphabet (West African written script)": "bm-Nkoo",
|
|
2230
|
-
"Northern Sotho": "nso",
|
|
2231
|
-
Norwegian: "no",
|
|
2232
|
-
Nuer: "nus",
|
|
2233
|
-
Occitan: "oc",
|
|
2234
|
-
Oriya: "or",
|
|
2235
|
-
"Oromo language": "om",
|
|
2236
|
-
Ossetian: "os",
|
|
2237
|
-
Pampangja: "pam",
|
|
2238
|
-
Papiamento: "pap",
|
|
2239
|
-
Pashto: "ps",
|
|
2240
|
-
Pemba: "bem",
|
|
2241
|
-
Persian: "fa",
|
|
2242
|
-
Polish: "pl",
|
|
2243
|
-
"Portugal (Brazil)": "pt",
|
|
2244
|
-
"Portugal (Portugal)": "pt-PT",
|
|
2245
|
-
"Punjabi (Gurumuchi)": "pa",
|
|
2246
|
-
"Punjabi (Shamuki)": "pa-Arab",
|
|
2247
|
-
Quechua: "qu",
|
|
2248
|
-
Ratgale: "ltg",
|
|
2249
|
-
Romani: "rom",
|
|
2250
|
-
Romanian: "ro",
|
|
2251
|
-
Rondi: "rn",
|
|
2252
|
-
Russian: "ru",
|
|
2253
|
-
Sabatec: "zap",
|
|
2254
|
-
Sakha: "sah",
|
|
2255
|
-
Samoan: "sm",
|
|
2256
|
-
Sango: "sg",
|
|
2257
|
-
Sanskrit: "sa",
|
|
2258
|
-
Santali: "sat-Latn",
|
|
2259
|
-
"Schuna language": "sn",
|
|
2260
|
-
"Scottish Gaelic": "gd",
|
|
2261
|
-
Serbian: "sr",
|
|
2262
|
-
"Seychellois Creole": "crs",
|
|
2263
|
-
Shan: "shn",
|
|
2264
|
-
Sicilian: "scn",
|
|
2265
|
-
"Sierra Leonean Creole": "kri",
|
|
2266
|
-
Silesian: "szl",
|
|
2267
|
-
Sindhi: "sd",
|
|
2268
|
-
Sinhalese: "si",
|
|
2269
|
-
Slovak: "sk",
|
|
2270
|
-
Slovenian: "sl",
|
|
2271
|
-
Somali: "so",
|
|
2272
|
-
"South Sotho": "st",
|
|
2273
|
-
Spanish: "es",
|
|
2274
|
-
"Steppe Mali": "chm",
|
|
2275
|
-
Sundanese: "su",
|
|
2276
|
-
"Susu language": "sus",
|
|
2277
|
-
Swahili: "sw",
|
|
2278
|
-
Swat: "ss",
|
|
2279
|
-
Swedish: "sv",
|
|
2280
|
-
"Sámi (North)": "se",
|
|
2281
|
-
Tahiti: "ty",
|
|
2282
|
-
Tajik: "tg",
|
|
2283
|
-
Tamaset: "ber-Latn",
|
|
2284
|
-
"Tamazight (Tifinaven)": "ber",
|
|
2285
|
-
Tamil: "ta",
|
|
2286
|
-
Tatar: "tt",
|
|
2287
|
-
Telugu: "te",
|
|
2288
|
-
Tetum: "tet",
|
|
2289
|
-
Thai: "th",
|
|
2290
|
-
Tibetan: "bo",
|
|
2291
|
-
"Tiff language": "tiv",
|
|
2292
|
-
Tigrinya: "ti",
|
|
2293
|
-
"Tok Pisin": "tpi",
|
|
2294
|
-
Tongan: "to",
|
|
2295
|
-
Tswana: "tn",
|
|
2296
|
-
Tulu: "tcy",
|
|
2297
|
-
"Tumbuka language": "tum",
|
|
2298
|
-
Turkish: "tr",
|
|
2299
|
-
Turkmen: "tk",
|
|
2300
|
-
Tuvan: "tyv",
|
|
2301
|
-
Udmurtic: "udm",
|
|
2302
|
-
Uighur: "ug",
|
|
2303
|
-
Ukrainian: "uk",
|
|
2304
|
-
Urdu: "ur",
|
|
2305
|
-
Uzbek: "uz",
|
|
2306
|
-
Venda: "ve",
|
|
2307
|
-
Venetian: "vec",
|
|
2308
|
-
Vietnamese: "vi",
|
|
2309
|
-
"Wari language": "war",
|
|
2310
|
-
Welsh: "cy",
|
|
2311
|
-
"Wolof language": "wo",
|
|
2312
|
-
Xhosa: "xh",
|
|
2313
|
-
Yiddish: "yi",
|
|
2314
|
-
Yoruba: "yo",
|
|
2315
|
-
"Yucatan Maya": "yua",
|
|
2316
|
-
Zulu: "zu",
|
|
2317
|
-
};
|
|
1861
|
+
var M_offset_7 = M[offset + 7];
|
|
1862
|
+
var M_offset_8 = M[offset + 8];
|
|
1863
|
+
var M_offset_9 = M[offset + 9];
|
|
1864
|
+
var M_offset_10 = M[offset + 10];
|
|
1865
|
+
var M_offset_11 = M[offset + 11];
|
|
1866
|
+
var M_offset_12 = M[offset + 12];
|
|
1867
|
+
var M_offset_13 = M[offset + 13];
|
|
1868
|
+
var M_offset_14 = M[offset + 14];
|
|
1869
|
+
var M_offset_15 = M[offset + 15];
|
|
1870
|
+
|
|
1871
|
+
// Working variables
|
|
1872
|
+
var a = H[0];
|
|
1873
|
+
var b = H[1];
|
|
1874
|
+
var c = H[2];
|
|
1875
|
+
var d = H[3];
|
|
1876
|
+
|
|
1877
|
+
// Computation
|
|
1878
|
+
a = FF(a, b, c, d, M_offset_0, 7, T[0]);
|
|
1879
|
+
d = FF(d, a, b, c, M_offset_1, 12, T[1]);
|
|
1880
|
+
c = FF(c, d, a, b, M_offset_2, 17, T[2]);
|
|
1881
|
+
b = FF(b, c, d, a, M_offset_3, 22, T[3]);
|
|
1882
|
+
a = FF(a, b, c, d, M_offset_4, 7, T[4]);
|
|
1883
|
+
d = FF(d, a, b, c, M_offset_5, 12, T[5]);
|
|
1884
|
+
c = FF(c, d, a, b, M_offset_6, 17, T[6]);
|
|
1885
|
+
b = FF(b, c, d, a, M_offset_7, 22, T[7]);
|
|
1886
|
+
a = FF(a, b, c, d, M_offset_8, 7, T[8]);
|
|
1887
|
+
d = FF(d, a, b, c, M_offset_9, 12, T[9]);
|
|
1888
|
+
c = FF(c, d, a, b, M_offset_10, 17, T[10]);
|
|
1889
|
+
b = FF(b, c, d, a, M_offset_11, 22, T[11]);
|
|
1890
|
+
a = FF(a, b, c, d, M_offset_12, 7, T[12]);
|
|
1891
|
+
d = FF(d, a, b, c, M_offset_13, 12, T[13]);
|
|
1892
|
+
c = FF(c, d, a, b, M_offset_14, 17, T[14]);
|
|
1893
|
+
b = FF(b, c, d, a, M_offset_15, 22, T[15]);
|
|
1894
|
+
|
|
1895
|
+
a = GG(a, b, c, d, M_offset_1, 5, T[16]);
|
|
1896
|
+
d = GG(d, a, b, c, M_offset_6, 9, T[17]);
|
|
1897
|
+
c = GG(c, d, a, b, M_offset_11, 14, T[18]);
|
|
1898
|
+
b = GG(b, c, d, a, M_offset_0, 20, T[19]);
|
|
1899
|
+
a = GG(a, b, c, d, M_offset_5, 5, T[20]);
|
|
1900
|
+
d = GG(d, a, b, c, M_offset_10, 9, T[21]);
|
|
1901
|
+
c = GG(c, d, a, b, M_offset_15, 14, T[22]);
|
|
1902
|
+
b = GG(b, c, d, a, M_offset_4, 20, T[23]);
|
|
1903
|
+
a = GG(a, b, c, d, M_offset_9, 5, T[24]);
|
|
1904
|
+
d = GG(d, a, b, c, M_offset_14, 9, T[25]);
|
|
1905
|
+
c = GG(c, d, a, b, M_offset_3, 14, T[26]);
|
|
1906
|
+
b = GG(b, c, d, a, M_offset_8, 20, T[27]);
|
|
1907
|
+
a = GG(a, b, c, d, M_offset_13, 5, T[28]);
|
|
1908
|
+
d = GG(d, a, b, c, M_offset_2, 9, T[29]);
|
|
1909
|
+
c = GG(c, d, a, b, M_offset_7, 14, T[30]);
|
|
1910
|
+
b = GG(b, c, d, a, M_offset_12, 20, T[31]);
|
|
1911
|
+
|
|
1912
|
+
a = HH(a, b, c, d, M_offset_5, 4, T[32]);
|
|
1913
|
+
d = HH(d, a, b, c, M_offset_8, 11, T[33]);
|
|
1914
|
+
c = HH(c, d, a, b, M_offset_11, 16, T[34]);
|
|
1915
|
+
b = HH(b, c, d, a, M_offset_14, 23, T[35]);
|
|
1916
|
+
a = HH(a, b, c, d, M_offset_1, 4, T[36]);
|
|
1917
|
+
d = HH(d, a, b, c, M_offset_4, 11, T[37]);
|
|
1918
|
+
c = HH(c, d, a, b, M_offset_7, 16, T[38]);
|
|
1919
|
+
b = HH(b, c, d, a, M_offset_10, 23, T[39]);
|
|
1920
|
+
a = HH(a, b, c, d, M_offset_13, 4, T[40]);
|
|
1921
|
+
d = HH(d, a, b, c, M_offset_0, 11, T[41]);
|
|
1922
|
+
c = HH(c, d, a, b, M_offset_3, 16, T[42]);
|
|
1923
|
+
b = HH(b, c, d, a, M_offset_6, 23, T[43]);
|
|
1924
|
+
a = HH(a, b, c, d, M_offset_9, 4, T[44]);
|
|
1925
|
+
d = HH(d, a, b, c, M_offset_12, 11, T[45]);
|
|
1926
|
+
c = HH(c, d, a, b, M_offset_15, 16, T[46]);
|
|
1927
|
+
b = HH(b, c, d, a, M_offset_2, 23, T[47]);
|
|
1928
|
+
|
|
1929
|
+
a = II(a, b, c, d, M_offset_0, 6, T[48]);
|
|
1930
|
+
d = II(d, a, b, c, M_offset_7, 10, T[49]);
|
|
1931
|
+
c = II(c, d, a, b, M_offset_14, 15, T[50]);
|
|
1932
|
+
b = II(b, c, d, a, M_offset_5, 21, T[51]);
|
|
1933
|
+
a = II(a, b, c, d, M_offset_12, 6, T[52]);
|
|
1934
|
+
d = II(d, a, b, c, M_offset_3, 10, T[53]);
|
|
1935
|
+
c = II(c, d, a, b, M_offset_10, 15, T[54]);
|
|
1936
|
+
b = II(b, c, d, a, M_offset_1, 21, T[55]);
|
|
1937
|
+
a = II(a, b, c, d, M_offset_8, 6, T[56]);
|
|
1938
|
+
d = II(d, a, b, c, M_offset_15, 10, T[57]);
|
|
1939
|
+
c = II(c, d, a, b, M_offset_6, 15, T[58]);
|
|
1940
|
+
b = II(b, c, d, a, M_offset_13, 21, T[59]);
|
|
1941
|
+
a = II(a, b, c, d, M_offset_4, 6, T[60]);
|
|
1942
|
+
d = II(d, a, b, c, M_offset_11, 10, T[61]);
|
|
1943
|
+
c = II(c, d, a, b, M_offset_2, 15, T[62]);
|
|
1944
|
+
b = II(b, c, d, a, M_offset_9, 21, T[63]);
|
|
1945
|
+
|
|
1946
|
+
// Intermediate hash value
|
|
1947
|
+
H[0] = (H[0] + a) | 0;
|
|
1948
|
+
H[1] = (H[1] + b) | 0;
|
|
1949
|
+
H[2] = (H[2] + c) | 0;
|
|
1950
|
+
H[3] = (H[3] + d) | 0;
|
|
1951
|
+
},
|
|
1952
|
+
|
|
1953
|
+
_doFinalize: function () {
|
|
1954
|
+
// Shortcuts
|
|
1955
|
+
var data = this._data;
|
|
1956
|
+
var dataWords = data.words;
|
|
1957
|
+
|
|
1958
|
+
var nBitsTotal = this._nDataBytes * 8;
|
|
1959
|
+
var nBitsLeft = data.sigBytes * 8;
|
|
1960
|
+
|
|
1961
|
+
// Add padding
|
|
1962
|
+
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
|
1963
|
+
|
|
1964
|
+
var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
|
|
1965
|
+
var nBitsTotalL = nBitsTotal;
|
|
1966
|
+
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
|
|
1967
|
+
(((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
|
|
1968
|
+
(((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
|
|
1969
|
+
);
|
|
1970
|
+
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
|
|
1971
|
+
(((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
|
|
1972
|
+
(((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
|
|
1973
|
+
);
|
|
1974
|
+
|
|
1975
|
+
data.sigBytes = (dataWords.length + 1) * 4;
|
|
1976
|
+
|
|
1977
|
+
// Hash final blocks
|
|
1978
|
+
this._process();
|
|
1979
|
+
|
|
1980
|
+
// Shortcuts
|
|
1981
|
+
var hash = this._hash;
|
|
1982
|
+
var H = hash.words;
|
|
1983
|
+
|
|
1984
|
+
// Swap endian
|
|
1985
|
+
for (var i = 0; i < 4; i++) {
|
|
1986
|
+
// Shortcut
|
|
1987
|
+
var H_i = H[i];
|
|
1988
|
+
|
|
1989
|
+
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
|
|
1990
|
+
(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
// Return final computed hash
|
|
1994
|
+
return hash;
|
|
1995
|
+
},
|
|
1996
|
+
|
|
1997
|
+
clone: function () {
|
|
1998
|
+
var clone = Hasher.clone.call(this);
|
|
1999
|
+
clone._hash = this._hash.clone();
|
|
2000
|
+
|
|
2001
|
+
return clone;
|
|
2002
|
+
}
|
|
2003
|
+
});
|
|
2004
|
+
|
|
2005
|
+
function FF(a, b, c, d, x, s, t) {
|
|
2006
|
+
var n = a + ((b & c) | (~b & d)) + x + t;
|
|
2007
|
+
return ((n << s) | (n >>> (32 - s))) + b;
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
function GG(a, b, c, d, x, s, t) {
|
|
2011
|
+
var n = a + ((b & d) | (c & ~d)) + x + t;
|
|
2012
|
+
return ((n << s) | (n >>> (32 - s))) + b;
|
|
2013
|
+
}
|
|
2014
|
+
|
|
2015
|
+
function HH(a, b, c, d, x, s, t) {
|
|
2016
|
+
var n = a + (b ^ c ^ d) + x + t;
|
|
2017
|
+
return ((n << s) | (n >>> (32 - s))) + b;
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
function II(a, b, c, d, x, s, t) {
|
|
2021
|
+
var n = a + (c ^ (b | ~d)) + x + t;
|
|
2022
|
+
return ((n << s) | (n >>> (32 - s))) + b;
|
|
2023
|
+
}
|
|
2024
|
+
|
|
2025
|
+
/**
|
|
2026
|
+
* Shortcut function to the hasher's object interface.
|
|
2027
|
+
*
|
|
2028
|
+
* @param {WordArray|string} message The message to hash.
|
|
2029
|
+
*
|
|
2030
|
+
* @return {WordArray} The hash.
|
|
2031
|
+
*
|
|
2032
|
+
* @static
|
|
2033
|
+
*
|
|
2034
|
+
* @example
|
|
2035
|
+
*
|
|
2036
|
+
* var hash = CryptoJS.MD5('message');
|
|
2037
|
+
* var hash = CryptoJS.MD5(wordArray);
|
|
2038
|
+
*/
|
|
2039
|
+
C.MD5 = Hasher._createHelper(MD5);
|
|
2040
|
+
|
|
2041
|
+
/**
|
|
2042
|
+
* Shortcut function to the HMAC's object interface.
|
|
2043
|
+
*
|
|
2044
|
+
* @param {WordArray|string} message The message to hash.
|
|
2045
|
+
* @param {WordArray|string} key The secret key.
|
|
2046
|
+
*
|
|
2047
|
+
* @return {WordArray} The HMAC.
|
|
2048
|
+
*
|
|
2049
|
+
* @static
|
|
2050
|
+
*
|
|
2051
|
+
* @example
|
|
2052
|
+
*
|
|
2053
|
+
* var hmac = CryptoJS.HmacMD5(message, key);
|
|
2054
|
+
*/
|
|
2055
|
+
C.HmacMD5 = Hasher._createHmacHelper(MD5);
|
|
2056
|
+
}(Math));
|
|
2057
|
+
|
|
2058
|
+
|
|
2059
|
+
return CryptoJS.MD5;
|
|
2060
|
+
|
|
2061
|
+
}));
|
|
2062
|
+
} (md5$1));
|
|
2063
|
+
|
|
2064
|
+
var md5Exports = md5$1.exports;
|
|
2065
|
+
var md5 = /*@__PURE__*/getDefaultExportFromCjs(md5Exports);
|
|
2318
2066
|
|
|
2319
|
-
var
|
|
2067
|
+
var baiduTargetLanguages = {
|
|
2320
2068
|
Achinese: "ach",
|
|
2321
2069
|
Afrikaans: "afr",
|
|
2322
2070
|
Akan: "aka",
|
|
@@ -2527,7 +2275,106 @@ var baidu$1 = {
|
|
|
2527
2275
|
Zulu: "zul",
|
|
2528
2276
|
};
|
|
2529
2277
|
|
|
2530
|
-
|
|
2278
|
+
const baiduLanguages = {
|
|
2279
|
+
from: {
|
|
2280
|
+
Auto: "auto",
|
|
2281
|
+
...baiduTargetLanguages,
|
|
2282
|
+
},
|
|
2283
|
+
to: baiduTargetLanguages,
|
|
2284
|
+
};
|
|
2285
|
+
|
|
2286
|
+
function baidu$1(options) {
|
|
2287
|
+
const { appId, secretKey, fromLanguages = baiduLanguages.from, toLanguages = baiduLanguages.to } = options;
|
|
2288
|
+
const url = "https://fanyi-api.baidu.com/api/trans/vip/fieldtranslate";
|
|
2289
|
+
const name = "baidu";
|
|
2290
|
+
const checkOptions = () => {
|
|
2291
|
+
if (!appId || !secretKey) {
|
|
2292
|
+
throw new TranslationError(name, `${name} appId and secretKey is required`);
|
|
2293
|
+
}
|
|
2294
|
+
};
|
|
2295
|
+
checkOptions();
|
|
2296
|
+
return {
|
|
2297
|
+
name,
|
|
2298
|
+
getFromLanguages() {
|
|
2299
|
+
return fromLanguages;
|
|
2300
|
+
},
|
|
2301
|
+
getToLanguages() {
|
|
2302
|
+
return toLanguages;
|
|
2303
|
+
},
|
|
2304
|
+
normalFromLanguage(language) {
|
|
2305
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
2306
|
+
},
|
|
2307
|
+
normalToLanguage(language) {
|
|
2308
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
2309
|
+
},
|
|
2310
|
+
async translate(text, opts) {
|
|
2311
|
+
checkOptions();
|
|
2312
|
+
const { to, from = "auto", domain = "it" } = opts;
|
|
2313
|
+
if (!Array.isArray(text)) {
|
|
2314
|
+
text = [text];
|
|
2315
|
+
}
|
|
2316
|
+
const q = text.join("\n");
|
|
2317
|
+
const salt = Date.now();
|
|
2318
|
+
const sign = md5(`${appId}${q}${salt}${domain}${secretKey}`).toString();
|
|
2319
|
+
const body = new URLSearchParams();
|
|
2320
|
+
body.append("q", q);
|
|
2321
|
+
body.append("from", from);
|
|
2322
|
+
body.append("to", to);
|
|
2323
|
+
body.append("appid", appId);
|
|
2324
|
+
body.append("salt", salt.toString());
|
|
2325
|
+
body.append("domain", domain);
|
|
2326
|
+
body.append("sign", sign);
|
|
2327
|
+
const res = await fetch(url, {
|
|
2328
|
+
method: "POST",
|
|
2329
|
+
headers: {
|
|
2330
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
2331
|
+
},
|
|
2332
|
+
body: body.toString(),
|
|
2333
|
+
});
|
|
2334
|
+
if (!res.ok) {
|
|
2335
|
+
throw await throwResponseError(this.name, res);
|
|
2336
|
+
}
|
|
2337
|
+
const data = await res.json();
|
|
2338
|
+
if (!data || data.error_code || !data.trans_result || data.trans_result.length === 0) {
|
|
2339
|
+
throw new TranslationError(this.name, `Translate fail ! error_code:${data.error_code}, error_msg: ${data.error_msg} \n Go to https://fanyi-api.baidu.com/product/123 view details`);
|
|
2340
|
+
}
|
|
2341
|
+
const translations = [];
|
|
2342
|
+
for (const translation of data.trans_result) {
|
|
2343
|
+
if (translation.dst) {
|
|
2344
|
+
translations.push(translation.dst);
|
|
2345
|
+
}
|
|
2346
|
+
}
|
|
2347
|
+
return translations;
|
|
2348
|
+
},
|
|
2349
|
+
async checkLanguage(text) {
|
|
2350
|
+
checkOptions();
|
|
2351
|
+
const salt = Date.now();
|
|
2352
|
+
const sign = md5(`${appId}${text}${salt}${secretKey}`).toString();
|
|
2353
|
+
const body = new URLSearchParams();
|
|
2354
|
+
body.append("q", text);
|
|
2355
|
+
body.append("appid", appId);
|
|
2356
|
+
body.append("salt", salt.toString());
|
|
2357
|
+
body.append("sign", sign);
|
|
2358
|
+
const res = await fetch("https://fanyi-api.baidu.com/api/trans/vip/language", {
|
|
2359
|
+
method: "POST",
|
|
2360
|
+
headers: {
|
|
2361
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
2362
|
+
},
|
|
2363
|
+
body: body.toString(),
|
|
2364
|
+
});
|
|
2365
|
+
if (!res.ok) {
|
|
2366
|
+
throw await throwResponseError(this.name, res);
|
|
2367
|
+
}
|
|
2368
|
+
const response = await res.json();
|
|
2369
|
+
if (!response || response.error_code != 0) {
|
|
2370
|
+
throw new CheckLanguageError(this.name, `Check language fail ! error_code:${response.error_code}, error_msg: ${response.error_msg} \n Go to https://fanyi-api.baidu.com/product/143 view details`);
|
|
2371
|
+
}
|
|
2372
|
+
return response.data.src;
|
|
2373
|
+
},
|
|
2374
|
+
};
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
var deeplOriginLanguages = {
|
|
2531
2378
|
English: "en",
|
|
2532
2379
|
Bulgarian: "bg",
|
|
2533
2380
|
Chinese: "zh",
|
|
@@ -2563,156 +2410,272 @@ var deepl$1 = {
|
|
|
2563
2410
|
Ukrainian: "uk",
|
|
2564
2411
|
};
|
|
2565
2412
|
|
|
2566
|
-
var
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
English: "en",
|
|
2571
|
-
Japanese: "ja",
|
|
2572
|
-
Korean: "ko",
|
|
2573
|
-
French: "fr",
|
|
2574
|
-
Spanish: "es",
|
|
2575
|
-
Italian: "it",
|
|
2576
|
-
German: "de",
|
|
2577
|
-
Turkish: "tr",
|
|
2578
|
-
Russian: "ru",
|
|
2579
|
-
Portuguese: "pt",
|
|
2580
|
-
Vietnamese: "vi",
|
|
2581
|
-
Indonesian: "id",
|
|
2582
|
-
Thai: "th",
|
|
2583
|
-
Malay: "ms",
|
|
2584
|
-
Arabic: "ar",
|
|
2585
|
-
Hindi: "hi",
|
|
2586
|
-
};
|
|
2587
|
-
|
|
2588
|
-
var amazon = {
|
|
2589
|
-
Afrikaans: "af",
|
|
2590
|
-
Albanian: "sq",
|
|
2591
|
-
Amharic: "am",
|
|
2592
|
-
Arabic: "ar",
|
|
2593
|
-
Armenian: "hy",
|
|
2594
|
-
Azerbaijani: "az",
|
|
2595
|
-
Bengali: "bn",
|
|
2596
|
-
Bosnian: "bs",
|
|
2413
|
+
var deeplTargetLanguages = {
|
|
2414
|
+
"American English": "en-US",
|
|
2415
|
+
"Brazilian Portuguese": "pt-BR",
|
|
2416
|
+
"British English": "en-GB",
|
|
2597
2417
|
Bulgarian: "bg",
|
|
2598
|
-
|
|
2599
|
-
"Chinese (Simplified)": "zh",
|
|
2600
|
-
"Chinese (Traditional)": "zh-TW",
|
|
2418
|
+
Chinese: "zh",
|
|
2601
2419
|
Croatian: "hr",
|
|
2602
2420
|
Czech: "cs",
|
|
2603
2421
|
Danish: "da",
|
|
2604
|
-
Dari: "fa-AF",
|
|
2605
2422
|
Dutch: "nl",
|
|
2606
|
-
English: "en",
|
|
2607
2423
|
Estonian: "et",
|
|
2608
|
-
"
|
|
2609
|
-
"Filipino, Tagalog": "tl",
|
|
2424
|
+
"European Portuguese": "pt-PT",
|
|
2610
2425
|
Finnish: "fi",
|
|
2611
2426
|
French: "fr",
|
|
2612
|
-
"French (Canada)": "fr-CA",
|
|
2613
|
-
Georgian: "ka",
|
|
2614
2427
|
German: "de",
|
|
2615
2428
|
Greek: "el",
|
|
2616
|
-
Gujarati: "gu",
|
|
2617
|
-
"Haitian Creole": "ht",
|
|
2618
|
-
Hausa: "ha",
|
|
2619
|
-
Hebrew: "he",
|
|
2620
|
-
Hindi: "hi",
|
|
2621
2429
|
Hungarian: "hu",
|
|
2622
2430
|
Icelandic: "is",
|
|
2623
2431
|
Indonesian: "id",
|
|
2624
2432
|
Irish: "ga",
|
|
2625
2433
|
Italian: "it",
|
|
2626
2434
|
Japanese: "ja",
|
|
2627
|
-
Kannada: "kn",
|
|
2628
|
-
Kazakh: "kk",
|
|
2629
2435
|
Korean: "ko",
|
|
2630
2436
|
Latvian: "lv",
|
|
2631
2437
|
Lithuanian: "lt",
|
|
2632
|
-
Macedonian: "mk",
|
|
2633
|
-
Malay: "ms",
|
|
2634
|
-
Malayalam: "ml",
|
|
2635
2438
|
Maltese: "mt",
|
|
2636
|
-
|
|
2637
|
-
Mongolian: "mn",
|
|
2638
|
-
"Norwegian (Bokmål)": "no",
|
|
2639
|
-
Pashto: "ps",
|
|
2439
|
+
Norwegian: "nb",
|
|
2640
2440
|
Polish: "pl",
|
|
2641
|
-
|
|
2642
|
-
"Portuguese (Portugal)": "pt-PT",
|
|
2643
|
-
Punjabi: "pa",
|
|
2441
|
+
Portuguese: "pt",
|
|
2644
2442
|
Romanian: "ro",
|
|
2645
2443
|
Russian: "ru",
|
|
2646
|
-
Serbian: "sr",
|
|
2647
|
-
Sinhala: "si",
|
|
2648
2444
|
Slovak: "sk",
|
|
2649
2445
|
Slovenian: "sl",
|
|
2650
|
-
Somali: "so",
|
|
2651
2446
|
Spanish: "es",
|
|
2652
|
-
"Spanish (Mexico)": "es-MX",
|
|
2653
|
-
Swahili: "sw",
|
|
2654
2447
|
Swedish: "sv",
|
|
2655
|
-
Tamil: "ta",
|
|
2656
|
-
Telugu: "te",
|
|
2657
|
-
Thai: "th",
|
|
2658
2448
|
Turkish: "tr",
|
|
2659
2449
|
Ukrainian: "uk",
|
|
2660
|
-
Urdu: "ur",
|
|
2661
|
-
Uzbek: "uz",
|
|
2662
|
-
Vietnamese: "vi",
|
|
2663
|
-
Welsh: "cy",
|
|
2664
2450
|
};
|
|
2665
2451
|
|
|
2666
|
-
const
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2671
|
-
|
|
2672
|
-
|
|
2673
|
-
|
|
2452
|
+
const deeplLanguages = {
|
|
2453
|
+
from: {
|
|
2454
|
+
Auto: "auto",
|
|
2455
|
+
...deeplOriginLanguages,
|
|
2456
|
+
},
|
|
2457
|
+
to: deeplTargetLanguages,
|
|
2458
|
+
};
|
|
2459
|
+
|
|
2460
|
+
function deepl(options) {
|
|
2461
|
+
const { key, fromLanguages = deeplLanguages.from, toLanguages = deeplLanguages.to } = options;
|
|
2462
|
+
const name = "deepl";
|
|
2463
|
+
const checkOptions = () => {
|
|
2464
|
+
if (!key) {
|
|
2465
|
+
throw new TranslationError(name, `${name} key is required`);
|
|
2466
|
+
}
|
|
2467
|
+
};
|
|
2468
|
+
checkOptions();
|
|
2469
|
+
const url = "https://api-free.deepl.com/v2/translate";
|
|
2470
|
+
return {
|
|
2471
|
+
name,
|
|
2472
|
+
getFromLanguages() {
|
|
2473
|
+
return fromLanguages;
|
|
2474
|
+
},
|
|
2475
|
+
getToLanguages() {
|
|
2476
|
+
return toLanguages;
|
|
2477
|
+
},
|
|
2478
|
+
normalFromLanguage(language) {
|
|
2479
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
2480
|
+
},
|
|
2481
|
+
normalToLanguage(language) {
|
|
2482
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
2483
|
+
},
|
|
2484
|
+
async translate(text, opts) {
|
|
2485
|
+
checkOptions();
|
|
2486
|
+
const { to, from } = opts;
|
|
2487
|
+
if (!Array.isArray(text)) {
|
|
2488
|
+
text = [text];
|
|
2489
|
+
}
|
|
2490
|
+
const res = await fetch(url, {
|
|
2491
|
+
method: "POST",
|
|
2492
|
+
headers: {
|
|
2493
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
2494
|
+
Authorization: `DeepL-Auth-Key ${key}`,
|
|
2495
|
+
Accept: "*/*",
|
|
2496
|
+
Host: "api-free.deepl.com",
|
|
2497
|
+
Connection: "keep-alive",
|
|
2498
|
+
},
|
|
2499
|
+
body: JSON.stringify({
|
|
2500
|
+
text: text,
|
|
2501
|
+
source_lang: from === "auto" ? undefined : from,
|
|
2502
|
+
target_lang: to,
|
|
2503
|
+
}),
|
|
2504
|
+
});
|
|
2505
|
+
if (!res.ok) {
|
|
2506
|
+
throw await throwResponseError(this.name, res);
|
|
2507
|
+
}
|
|
2508
|
+
const bodyRes = await res.json();
|
|
2509
|
+
if (bodyRes.error) {
|
|
2510
|
+
throw new TranslationError(this.name, `Translate fail ! code: ${bodyRes.error.code}, message: ${bodyRes.error.message}`);
|
|
2511
|
+
}
|
|
2512
|
+
const body = bodyRes.translations;
|
|
2513
|
+
if (!body || body.length === 0) {
|
|
2514
|
+
throw new TranslationError(this.name, "Translate fail ! translate's result is null or empty");
|
|
2515
|
+
}
|
|
2516
|
+
const translations = body.map((t) => t.text);
|
|
2517
|
+
return translations;
|
|
2518
|
+
},
|
|
2519
|
+
async checkLanguage(text) {
|
|
2520
|
+
checkOptions();
|
|
2521
|
+
const res = await fetch(url, {
|
|
2522
|
+
method: "POST",
|
|
2523
|
+
headers: {
|
|
2524
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
2525
|
+
Authorization: `DeepL-Auth-Key ${key}`,
|
|
2526
|
+
Accept: "*/*",
|
|
2527
|
+
Host: "api-free.deepl.com",
|
|
2528
|
+
Connection: "keep-alive",
|
|
2529
|
+
},
|
|
2530
|
+
body: JSON.stringify({
|
|
2531
|
+
text: [text],
|
|
2532
|
+
target_lang: "EN",
|
|
2533
|
+
}),
|
|
2534
|
+
});
|
|
2535
|
+
if (!res.ok) {
|
|
2536
|
+
throw await throwResponseError(this.name, res);
|
|
2537
|
+
}
|
|
2538
|
+
const bodyRes = await res.json();
|
|
2539
|
+
if (bodyRes.error) {
|
|
2540
|
+
throw new CheckLanguageError(this.name, `Check language fail ! code: ${bodyRes.error.code}, message: ${bodyRes.error.message}`);
|
|
2541
|
+
}
|
|
2542
|
+
const body = bodyRes.translations;
|
|
2543
|
+
if (!body || body.length === 0) {
|
|
2544
|
+
throw new CheckLanguageError(this.name, "Check language fail! No result returned");
|
|
2545
|
+
}
|
|
2546
|
+
const detectedLanguage = body[0].detected_source_language;
|
|
2547
|
+
if (!detectedLanguage) {
|
|
2548
|
+
throw new CheckLanguageError(this.name, "Check language fail! Language not detected");
|
|
2549
|
+
}
|
|
2550
|
+
return detectedLanguage;
|
|
2551
|
+
},
|
|
2552
|
+
};
|
|
2553
|
+
}
|
|
2554
|
+
|
|
2555
|
+
const openaiLanguages = {
|
|
2556
|
+
from: {
|
|
2557
|
+
Auto: "auto",
|
|
2558
|
+
...googleTargetLanguages,
|
|
2559
|
+
},
|
|
2560
|
+
to: googleTargetLanguages,
|
|
2674
2561
|
};
|
|
2675
2562
|
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2679
|
-
|
|
2680
|
-
|
|
2563
|
+
const logger$1 = useLogger("openai");
|
|
2564
|
+
function openai(options) {
|
|
2565
|
+
const { apiKey, model, maxTokens = 2000, outputLog = false, fromLanguages = openaiLanguages.from, toLanguages = openaiLanguages.to, } = options;
|
|
2566
|
+
const name = "openai";
|
|
2567
|
+
const checkOptions = () => {
|
|
2568
|
+
if (!apiKey) {
|
|
2569
|
+
throw new TranslationError(name, `${name} apiKey is required`);
|
|
2570
|
+
}
|
|
2571
|
+
if (!OPEN_AI_MODELS.includes(model)) {
|
|
2572
|
+
throw new TranslationError(name, `${name} model=${model} is invalid`);
|
|
2573
|
+
}
|
|
2574
|
+
};
|
|
2575
|
+
checkOptions();
|
|
2576
|
+
const base = "https://api.openai.com/v1/chat/completions";
|
|
2577
|
+
return {
|
|
2578
|
+
name,
|
|
2579
|
+
getFromLanguages() {
|
|
2580
|
+
return fromLanguages;
|
|
2581
|
+
},
|
|
2582
|
+
getToLanguages() {
|
|
2583
|
+
return toLanguages;
|
|
2584
|
+
},
|
|
2585
|
+
normalFromLanguage(language) {
|
|
2586
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
2587
|
+
},
|
|
2588
|
+
normalToLanguage(language) {
|
|
2589
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
2590
|
+
},
|
|
2591
|
+
async translate(text, opts) {
|
|
2592
|
+
checkOptions();
|
|
2593
|
+
const { from, to } = opts;
|
|
2594
|
+
const url = `${base}`;
|
|
2595
|
+
if (!Array.isArray(text)) {
|
|
2596
|
+
text = [text];
|
|
2597
|
+
}
|
|
2598
|
+
const prompt = {
|
|
2599
|
+
role: "user",
|
|
2600
|
+
content: `
|
|
2601
|
+
满足以下4点翻译要求:
|
|
2602
|
+
1.将每段文本从${from}翻译为${to}
|
|
2603
|
+
2.文本内容以换行符\n进行段落分割,并以段落分割顺序进行翻译
|
|
2604
|
+
3.仅翻译分割出的段落,其他任何不相关的内容都移除,比如:段落前后的空格、所有标点符号\n
|
|
2605
|
+
4.仅返回要翻译的文本内容,不要返回任何其他内容
|
|
2606
|
+
|
|
2607
|
+
如何提取翻译文本,满足以下2点要求:
|
|
2608
|
+
1.翻译从-$s$-字符标记开始至-$e$-字符标记结束,提取-$s$-至-$e$-之间的内容
|
|
2609
|
+
2.-$s$-和-$e$-这2个标记不要返回,只是用来标记翻译的起始和结束位置
|
|
2610
|
+
|
|
2611
|
+
-$s$-
|
|
2612
|
+
${text.join("\n")}
|
|
2613
|
+
-$e$-
|
|
2614
|
+
`,
|
|
2615
|
+
};
|
|
2616
|
+
const res = await fetch(url, {
|
|
2617
|
+
method: "POST",
|
|
2618
|
+
headers: {
|
|
2619
|
+
"Content-Type": "application/json",
|
|
2620
|
+
Authorization: `Bearer ${apiKey}`,
|
|
2621
|
+
},
|
|
2622
|
+
body: JSON.stringify({
|
|
2623
|
+
model,
|
|
2624
|
+
messages: [{ role: "system", content: "You are a professional translator" }, prompt],
|
|
2625
|
+
max_tokens: maxTokens,
|
|
2626
|
+
temperature: 0,
|
|
2627
|
+
}),
|
|
2628
|
+
});
|
|
2629
|
+
if (!res.ok) {
|
|
2630
|
+
throw await throwResponseError(this.name, res);
|
|
2631
|
+
}
|
|
2632
|
+
const bodyRes = await res.json();
|
|
2633
|
+
if (bodyRes.error) {
|
|
2634
|
+
throw new TranslationError(this.name, `Translate fail! message: ${bodyRes.error.message}`);
|
|
2635
|
+
}
|
|
2636
|
+
if (!bodyRes || !bodyRes.choices || bodyRes.choices.length === 0 || !bodyRes.choices[0]?.message?.content) {
|
|
2637
|
+
throw new TranslationError(this.name, "Translate fail ! translate's result is null or empty");
|
|
2638
|
+
}
|
|
2639
|
+
const content = bodyRes.choices[0].message.content;
|
|
2640
|
+
const marks = ["-$s$-", "-$e$-"];
|
|
2641
|
+
const translations = content
|
|
2642
|
+
.trim()
|
|
2643
|
+
.split("\n")
|
|
2644
|
+
.map((item) => item.trim())
|
|
2645
|
+
.filter(Boolean)
|
|
2646
|
+
.filter((it) => !marks.includes(it));
|
|
2647
|
+
if (outputLog) {
|
|
2648
|
+
logger$1.info("prompt:", JSON.stringify(prompt, null, 2));
|
|
2649
|
+
logger$1.info("translations:", JSON.stringify(translations, null, 2));
|
|
2650
|
+
}
|
|
2651
|
+
return translations;
|
|
2652
|
+
},
|
|
2653
|
+
};
|
|
2654
|
+
}
|
|
2655
|
+
|
|
2656
|
+
var tencentOriginLanguages = {
|
|
2657
|
+
Auto: "auto",
|
|
2681
2658
|
Chinese: "zh",
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
Danish: "da",
|
|
2685
|
-
Dutch: "nl",
|
|
2686
|
-
Estonian: "et",
|
|
2687
|
-
"European Portuguese": "pt-PT",
|
|
2688
|
-
Finnish: "fi",
|
|
2689
|
-
French: "fr",
|
|
2690
|
-
German: "de",
|
|
2691
|
-
Greek: "el",
|
|
2692
|
-
Hungarian: "hu",
|
|
2693
|
-
Icelandic: "is",
|
|
2694
|
-
Indonesian: "id",
|
|
2695
|
-
Irish: "ga",
|
|
2696
|
-
Italian: "it",
|
|
2659
|
+
TraditionalChinese: "zh-TW",
|
|
2660
|
+
English: "en",
|
|
2697
2661
|
Japanese: "ja",
|
|
2698
2662
|
Korean: "ko",
|
|
2699
|
-
|
|
2700
|
-
Lithuanian: "lt",
|
|
2701
|
-
Maltese: "mt",
|
|
2702
|
-
Norwegian: "nb",
|
|
2703
|
-
Polish: "pl",
|
|
2704
|
-
Portuguese: "pt",
|
|
2705
|
-
Romanian: "ro",
|
|
2706
|
-
Russian: "ru",
|
|
2707
|
-
Slovak: "sk",
|
|
2708
|
-
Slovenian: "sl",
|
|
2663
|
+
French: "fr",
|
|
2709
2664
|
Spanish: "es",
|
|
2710
|
-
|
|
2665
|
+
Italian: "it",
|
|
2666
|
+
German: "de",
|
|
2711
2667
|
Turkish: "tr",
|
|
2712
|
-
|
|
2668
|
+
Russian: "ru",
|
|
2669
|
+
Portuguese: "pt",
|
|
2670
|
+
Vietnamese: "vi",
|
|
2671
|
+
Indonesian: "id",
|
|
2672
|
+
Thai: "th",
|
|
2673
|
+
Malay: "ms",
|
|
2674
|
+
Arabic: "ar",
|
|
2675
|
+
Hindi: "hi",
|
|
2713
2676
|
};
|
|
2714
2677
|
|
|
2715
|
-
var
|
|
2678
|
+
var tencentTargetLanguages = {
|
|
2716
2679
|
"Simplified Chinese": "zh",
|
|
2717
2680
|
"Traditional Chinese": "zh-TW",
|
|
2718
2681
|
English: "en",
|
|
@@ -2733,14 +2696,203 @@ var tencent = {
|
|
|
2733
2696
|
Hindi: "hi",
|
|
2734
2697
|
};
|
|
2735
2698
|
|
|
2736
|
-
const
|
|
2737
|
-
|
|
2738
|
-
|
|
2699
|
+
const tencentLanguages = {
|
|
2700
|
+
from: {
|
|
2701
|
+
...tencentOriginLanguages,
|
|
2702
|
+
},
|
|
2703
|
+
to: tencentTargetLanguages,
|
|
2704
|
+
};
|
|
2705
|
+
|
|
2706
|
+
function sha256(message, secret = "", encoding) {
|
|
2707
|
+
if (encoding) {
|
|
2708
|
+
return crypto.createHmac("sha256", secret).update(message).digest(encoding);
|
|
2709
|
+
}
|
|
2710
|
+
return crypto.createHmac("sha256", secret).update(message).digest();
|
|
2711
|
+
}
|
|
2712
|
+
function getHash(message, encoding = "hex") {
|
|
2713
|
+
return crypto.createHash("sha256").update(message).digest(encoding);
|
|
2714
|
+
}
|
|
2715
|
+
function getDate(timestamp) {
|
|
2716
|
+
const date = new Date(timestamp * 1000);
|
|
2717
|
+
return `${date.getUTCFullYear()}-${("0" + (date.getUTCMonth() + 1)).slice(-2)}-${("0" + date.getUTCDate()).slice(-2)}`;
|
|
2718
|
+
}
|
|
2719
|
+
function buildAuthorization({ secretId, secretKey, service, host, payload, httpRequestMethod, action, apiVersion, region }) {
|
|
2720
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
2721
|
+
const date = getDate(timestamp);
|
|
2722
|
+
const canonicalUri = "/";
|
|
2723
|
+
const canonicalQueryString = "";
|
|
2724
|
+
const canonicalHeaders = "content-type:application/json; charset=utf-8\nhost:" + host + "\n";
|
|
2725
|
+
const signedHeaders = "content-type;host";
|
|
2726
|
+
const hashedRequestPayload = getHash(payload);
|
|
2727
|
+
const canonicalRequest = [
|
|
2728
|
+
httpRequestMethod,
|
|
2729
|
+
canonicalUri,
|
|
2730
|
+
canonicalQueryString,
|
|
2731
|
+
canonicalHeaders,
|
|
2732
|
+
signedHeaders,
|
|
2733
|
+
hashedRequestPayload,
|
|
2734
|
+
].join("\n");
|
|
2735
|
+
const algorithm = "TC3-HMAC-SHA256";
|
|
2736
|
+
const credentialScope = `${date}/${service}/tc3_request`;
|
|
2737
|
+
const hashedCanonicalRequest = getHash(canonicalRequest);
|
|
2738
|
+
const stringToSign = [algorithm, timestamp, credentialScope, hashedCanonicalRequest].join("\n");
|
|
2739
|
+
const kDate = sha256(date, "TC3" + secretKey);
|
|
2740
|
+
const kService = sha256(service, kDate);
|
|
2741
|
+
const kSigning = sha256("tc3_request", kService);
|
|
2742
|
+
const signature = sha256(stringToSign, kSigning, "hex");
|
|
2743
|
+
const authorization = `${algorithm} Credential=${secretId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
|
2744
|
+
const headers = {
|
|
2745
|
+
Authorization: authorization,
|
|
2746
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
2747
|
+
Host: host,
|
|
2748
|
+
"X-TC-Action": action,
|
|
2749
|
+
"X-TC-Timestamp": timestamp,
|
|
2750
|
+
"X-TC-Version": apiVersion,
|
|
2751
|
+
};
|
|
2752
|
+
if (region)
|
|
2753
|
+
headers["X-TC-Region"] = region;
|
|
2754
|
+
return headers;
|
|
2755
|
+
}
|
|
2756
|
+
function tencent(options) {
|
|
2757
|
+
const { secretId, secretKey, region = "ap-guangzhou", fromLanguages = tencentLanguages.from, toLanguages = tencentLanguages.to, } = options;
|
|
2758
|
+
const name = "tencent";
|
|
2759
|
+
const host = "tmt.tencentcloudapi.com";
|
|
2760
|
+
const endpoint = `https://${host}/`;
|
|
2761
|
+
const service = "tmt";
|
|
2762
|
+
const apiVersion = "2018-03-21";
|
|
2763
|
+
const action = "TextTranslate";
|
|
2764
|
+
function checkOptions() {
|
|
2765
|
+
if (!secretId || !secretKey) {
|
|
2766
|
+
throw new TranslationError(name, `${name} secretId and secretKey are required`);
|
|
2767
|
+
}
|
|
2768
|
+
}
|
|
2769
|
+
return {
|
|
2770
|
+
name,
|
|
2771
|
+
getFromLanguages() {
|
|
2772
|
+
return fromLanguages;
|
|
2773
|
+
},
|
|
2774
|
+
getToLanguages() {
|
|
2775
|
+
return toLanguages;
|
|
2776
|
+
},
|
|
2777
|
+
normalFromLanguage(language) {
|
|
2778
|
+
return normalizeEngineLanguage(language, fromLanguages, true);
|
|
2779
|
+
},
|
|
2780
|
+
normalToLanguage(language) {
|
|
2781
|
+
return normalizeEngineLanguage(language, toLanguages);
|
|
2782
|
+
},
|
|
2783
|
+
async translate(text, opts) {
|
|
2784
|
+
checkOptions();
|
|
2785
|
+
const { from = "auto", to } = opts;
|
|
2786
|
+
const source = from === "auto" ? "auto" : from;
|
|
2787
|
+
const payloadObj = {
|
|
2788
|
+
SourceText: Array.isArray(text) ? text.join("\n") : text,
|
|
2789
|
+
Source: source,
|
|
2790
|
+
Target: to,
|
|
2791
|
+
ProjectId: 0,
|
|
2792
|
+
};
|
|
2793
|
+
const payload = JSON.stringify(payloadObj);
|
|
2794
|
+
const headers = buildAuthorization({
|
|
2795
|
+
secretId,
|
|
2796
|
+
secretKey,
|
|
2797
|
+
service,
|
|
2798
|
+
host,
|
|
2799
|
+
payload,
|
|
2800
|
+
httpRequestMethod: "POST",
|
|
2801
|
+
action,
|
|
2802
|
+
apiVersion,
|
|
2803
|
+
region,
|
|
2804
|
+
});
|
|
2805
|
+
try {
|
|
2806
|
+
const res = await fetch(endpoint, {
|
|
2807
|
+
method: "POST",
|
|
2808
|
+
headers,
|
|
2809
|
+
body: payload,
|
|
2810
|
+
});
|
|
2811
|
+
if (!res.ok) {
|
|
2812
|
+
throw new TranslationError(name, `HTTP ${res.status}: ${await res.text()}`);
|
|
2813
|
+
}
|
|
2814
|
+
const data = await res.json();
|
|
2815
|
+
if (data.Response?.Error) {
|
|
2816
|
+
throw new TranslationError(name, `Tencent translate fail: ${data.Response.Error.Code}, ${data.Response.Error.Message} \n Go to https://cloud.tencent.com/document/product/551/15619 view details`);
|
|
2817
|
+
}
|
|
2818
|
+
const translatedResults = data.Response?.TargetText.split("\n") ?? [];
|
|
2819
|
+
if (!Array.isArray(translatedResults) || translatedResults.length === 0) {
|
|
2820
|
+
throw new TranslationError(name, "Translate fail! No result returned");
|
|
2821
|
+
}
|
|
2822
|
+
return translatedResults;
|
|
2823
|
+
}
|
|
2824
|
+
catch (error) {
|
|
2825
|
+
if (error instanceof TranslationError)
|
|
2826
|
+
throw error;
|
|
2827
|
+
throw new TranslationError(name, `Translation failed: ${error}`);
|
|
2828
|
+
}
|
|
2829
|
+
},
|
|
2830
|
+
async checkLanguage(text) {
|
|
2831
|
+
checkOptions();
|
|
2832
|
+
const payloadObj = {
|
|
2833
|
+
SourceText: text,
|
|
2834
|
+
Source: "auto",
|
|
2835
|
+
Target: "en",
|
|
2836
|
+
ProjectId: 0,
|
|
2837
|
+
};
|
|
2838
|
+
const payload = JSON.stringify(payloadObj);
|
|
2839
|
+
const headers = buildAuthorization({
|
|
2840
|
+
secretId,
|
|
2841
|
+
secretKey,
|
|
2842
|
+
service,
|
|
2843
|
+
host,
|
|
2844
|
+
payload,
|
|
2845
|
+
httpRequestMethod: "POST",
|
|
2846
|
+
action,
|
|
2847
|
+
apiVersion,
|
|
2848
|
+
region,
|
|
2849
|
+
});
|
|
2850
|
+
try {
|
|
2851
|
+
const res = await fetch(endpoint, {
|
|
2852
|
+
method: "POST",
|
|
2853
|
+
headers,
|
|
2854
|
+
body: payload,
|
|
2855
|
+
});
|
|
2856
|
+
if (!res.ok) {
|
|
2857
|
+
throw new CheckLanguageError(name, `HTTP ${res.status}: ${await res.text()}`);
|
|
2858
|
+
}
|
|
2859
|
+
const data = await res.json();
|
|
2860
|
+
if (data.Response?.Error) {
|
|
2861
|
+
throw new CheckLanguageError(name, `Tencent language detect fail: ${data.Response.Error.Code}, ${data.Response.Error.Message} \n Go to https://cloud.tencent.com/document/product/551/15619 view details`);
|
|
2862
|
+
}
|
|
2863
|
+
const detectedLanguage = data.Response?.Source;
|
|
2864
|
+
if (!detectedLanguage) {
|
|
2865
|
+
throw new CheckLanguageError(name, "Language detect fail! No result returned");
|
|
2866
|
+
}
|
|
2867
|
+
return detectedLanguage;
|
|
2868
|
+
}
|
|
2869
|
+
catch (error) {
|
|
2870
|
+
if (error instanceof CheckLanguageError)
|
|
2871
|
+
throw error;
|
|
2872
|
+
throw new CheckLanguageError(name, `Language detection failed: ${error}`);
|
|
2873
|
+
}
|
|
2874
|
+
},
|
|
2875
|
+
};
|
|
2876
|
+
}
|
|
2877
|
+
|
|
2878
|
+
const engines = {
|
|
2879
|
+
google: google(),
|
|
2880
|
+
azure,
|
|
2881
|
+
amazon,
|
|
2739
2882
|
baidu: baidu$1,
|
|
2740
|
-
deepl
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2883
|
+
deepl,
|
|
2884
|
+
openai,
|
|
2885
|
+
tencent,
|
|
2886
|
+
};
|
|
2887
|
+
|
|
2888
|
+
const builtinEngineLanguages = {
|
|
2889
|
+
amazon: amazonLanguages,
|
|
2890
|
+
azure: azureLanguages,
|
|
2891
|
+
baidu: baiduLanguages,
|
|
2892
|
+
deepl: deeplLanguages,
|
|
2893
|
+
google: googleLanguages,
|
|
2894
|
+
openai: openaiLanguages,
|
|
2895
|
+
tencent: tencentLanguages,
|
|
2744
2896
|
};
|
|
2745
2897
|
|
|
2746
2898
|
var baidu = {
|
|
@@ -2752,47 +2904,34 @@ var baidu = {
|
|
|
2752
2904
|
Russian: "ru",
|
|
2753
2905
|
};
|
|
2754
2906
|
|
|
2755
|
-
const checkLanguages =
|
|
2756
|
-
|
|
2757
|
-
|
|
2907
|
+
const checkLanguages = {
|
|
2908
|
+
amazon: builtinEngineLanguages.amazon.from,
|
|
2909
|
+
azure: builtinEngineLanguages.azure.from,
|
|
2910
|
+
baidu,
|
|
2911
|
+
deepl: builtinEngineLanguages.deepl.from,
|
|
2912
|
+
google: builtinEngineLanguages.google.from,
|
|
2913
|
+
openai: builtinEngineLanguages.openai.from,
|
|
2914
|
+
tencent: builtinEngineLanguages.tencent.from,
|
|
2915
|
+
};
|
|
2758
2916
|
|
|
2759
|
-
function
|
|
2760
|
-
if (
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2766
|
-
}
|
|
2767
|
-
const keys = Object.keys(originLanguages[engine]);
|
|
2768
|
-
if (keys.includes(from)) {
|
|
2769
|
-
return engineLanguages[from];
|
|
2770
|
-
}
|
|
2771
|
-
const values = Object.values(originLanguages[engine]);
|
|
2772
|
-
if (values.includes(from)) {
|
|
2773
|
-
return from;
|
|
2774
|
-
}
|
|
2775
|
-
throw new Error(`Invalid from language ${engine} ${from}`);
|
|
2776
|
-
}
|
|
2777
|
-
function normalToLanguage(to, engine) {
|
|
2778
|
-
const engineLanguages = targetLanguages[engine];
|
|
2779
|
-
if (!engineLanguages) {
|
|
2780
|
-
throw new Error(`Engine ${engine} not found`);
|
|
2781
|
-
}
|
|
2782
|
-
const keys = Object.keys(targetLanguages[engine]);
|
|
2783
|
-
if (keys.includes(to)) {
|
|
2784
|
-
return engineLanguages[to];
|
|
2785
|
-
}
|
|
2786
|
-
const values = Object.values(targetLanguages[engine]);
|
|
2787
|
-
if (values.includes(to)) {
|
|
2788
|
-
return to;
|
|
2917
|
+
function resolveLanguageSource(engine) {
|
|
2918
|
+
if (typeof engine === "string") {
|
|
2919
|
+
const languages = builtinEngineLanguages[engine];
|
|
2920
|
+
if (!languages) {
|
|
2921
|
+
throw new Error(`Engine ${engine} not found`);
|
|
2922
|
+
}
|
|
2923
|
+
return languages;
|
|
2789
2924
|
}
|
|
2790
|
-
|
|
2925
|
+
return {
|
|
2926
|
+
from: engine.getFromLanguages(),
|
|
2927
|
+
to: engine.getToLanguages(),
|
|
2928
|
+
};
|
|
2791
2929
|
}
|
|
2792
2930
|
function getLanguage(engine) {
|
|
2931
|
+
const languages = resolveLanguageSource(engine);
|
|
2793
2932
|
return {
|
|
2794
|
-
from:
|
|
2795
|
-
to:
|
|
2933
|
+
from: languages.from,
|
|
2934
|
+
to: languages.to,
|
|
2796
2935
|
};
|
|
2797
2936
|
}
|
|
2798
2937
|
|
|
@@ -2833,6 +2972,23 @@ class Translator {
|
|
|
2833
2972
|
return false;
|
|
2834
2973
|
}
|
|
2835
2974
|
this.engines.delete(engineName);
|
|
2975
|
+
return true;
|
|
2976
|
+
}
|
|
2977
|
+
getFromLanguages(engineName) {
|
|
2978
|
+
const engine = this.engines.get(engineName);
|
|
2979
|
+
if (!engine) {
|
|
2980
|
+
logger.warn(`Engine ${engineName} not found`);
|
|
2981
|
+
return {};
|
|
2982
|
+
}
|
|
2983
|
+
return engine.getFromLanguages();
|
|
2984
|
+
}
|
|
2985
|
+
getToLanguages(engineName) {
|
|
2986
|
+
const engine = this.engines.get(engineName);
|
|
2987
|
+
if (!engine) {
|
|
2988
|
+
logger.warn(`Engine ${engineName} not found`);
|
|
2989
|
+
return {};
|
|
2990
|
+
}
|
|
2991
|
+
return engine.getToLanguages();
|
|
2836
2992
|
}
|
|
2837
2993
|
isSupportCheckLanguage(engineName) {
|
|
2838
2994
|
if (!engineName || !this.engines.has(engineName)) {
|
|
@@ -2872,9 +3028,7 @@ class Translator {
|
|
|
2872
3028
|
}
|
|
2873
3029
|
async translate(text, options) {
|
|
2874
3030
|
const { engine = "google", cache_time = 60 * 1000 } = options;
|
|
2875
|
-
|
|
2876
|
-
from = options.from = normalFromLanguage(from, engine);
|
|
2877
|
-
to = options.to = normalToLanguage(to, engine);
|
|
3031
|
+
const { from = "auto", to } = options;
|
|
2878
3032
|
//1. Check if engine exists
|
|
2879
3033
|
if (!this.engines.has(engine)) {
|
|
2880
3034
|
throw new TranslationError(appName, `Engine ${engine} not found`);
|
|
@@ -2883,24 +3037,32 @@ class Translator {
|
|
|
2883
3037
|
if (!engineInstance) {
|
|
2884
3038
|
throw new TranslationError(appName, `Engine ${engine} is null`);
|
|
2885
3039
|
}
|
|
2886
|
-
|
|
3040
|
+
const normalizedFrom = engineInstance.normalFromLanguage(from);
|
|
3041
|
+
const normalizedTo = engineInstance.normalToLanguage(to);
|
|
3042
|
+
const normalizedOptions = {
|
|
3043
|
+
...options,
|
|
3044
|
+
engine,
|
|
3045
|
+
from: normalizedFrom,
|
|
3046
|
+
to: normalizedTo,
|
|
3047
|
+
};
|
|
3048
|
+
if (!normalizedFrom) {
|
|
2887
3049
|
throw new TranslationError(appName, `Invalid origin language ${from}`);
|
|
2888
3050
|
}
|
|
2889
|
-
if (!
|
|
3051
|
+
if (!normalizedTo) {
|
|
2890
3052
|
throw new TranslationError(appName, `Invalid target language ${to}`);
|
|
2891
3053
|
}
|
|
2892
|
-
const key = `${
|
|
3054
|
+
const key = `${normalizedFrom}:${normalizedTo}:${engine}:${text}`;
|
|
2893
3055
|
//3. If the cache is matched, the cache is used directly
|
|
2894
3056
|
if (cache.get(key)) {
|
|
2895
3057
|
return Promise.resolve(cache.get(key)?.value);
|
|
2896
3058
|
}
|
|
2897
|
-
return this.concurrencyHandle(engineInstance, text,
|
|
3059
|
+
return this.concurrencyHandle(engineInstance, text, normalizedOptions)
|
|
2898
3060
|
.then((translated) => {
|
|
2899
3061
|
cache.set(key, translated, cache_time ?? this.cache_time);
|
|
2900
3062
|
return translated;
|
|
2901
3063
|
})
|
|
2902
3064
|
.catch((e) => {
|
|
2903
|
-
logger.error(`${appName} Failed: from=${
|
|
3065
|
+
logger.error(`${appName} Failed: from=${normalizedFrom},to=${normalizedTo},engine=${engine},translate text: \n${getGapLine()}\n${text}\n${getGapLine()}\n error: ${getErrorMessages(e)}`);
|
|
2904
3066
|
if (e instanceof TranslationError) {
|
|
2905
3067
|
throw e;
|
|
2906
3068
|
}
|
|
@@ -2960,6 +3122,7 @@ class Translator {
|
|
|
2960
3122
|
}
|
|
2961
3123
|
}
|
|
2962
3124
|
const translator = new Translator();
|
|
3125
|
+
translator.addEngine(engines.google);
|
|
2963
3126
|
var index = {
|
|
2964
3127
|
engines,
|
|
2965
3128
|
translator,
|
|
@@ -2977,8 +3140,4 @@ exports.checkLanguages = checkLanguages;
|
|
|
2977
3140
|
exports.default = index;
|
|
2978
3141
|
exports.engines = engines;
|
|
2979
3142
|
exports.getLanguage = getLanguage;
|
|
2980
|
-
exports.normalFromLanguage = normalFromLanguage;
|
|
2981
|
-
exports.normalToLanguage = normalToLanguage;
|
|
2982
|
-
exports.originLanguages = originLanguages;
|
|
2983
|
-
exports.targetLanguages = targetLanguages;
|
|
2984
3143
|
exports.translator = translator;
|