@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.
@@ -1,4 +1,4 @@
1
- // translate v0.4.1 Copyright (c) 2025 Potter<aa4790139@gmail.com> and contributors
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
- Error.captureStackTrace(this, this.constructor);
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
- Error.captureStackTrace(this, this.constructor);
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
- async translate(text, opts) {
218
- const { from = "auto", to } = opts;
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$1(options) {
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
- function amazon$1(options) {
344
- const { region, accessKeyId, secretAccessKey } = options;
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 baidu$1 = {
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
- var deepl$1 = {
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 tencent$1 = {
2567
- Auto: "auto",
2568
- Chinese: "zh",
2569
- TraditionalChinese: "zh-TW",
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
- Catalan: "ca",
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
- "Farsi (Persian)": "fa",
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
- Marathi: "mr",
2637
- Mongolian: "mn",
2638
- "Norwegian (Bokmål)": "no",
2639
- Pashto: "ps",
2439
+ Norwegian: "nb",
2640
2440
  Polish: "pl",
2641
- "Portuguese (Brazil)": "pt",
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 originLanguages = {
2667
- azure: azure,
2668
- google: openai,
2669
- baidu: baidu$1,
2670
- deepl: deepl$1,
2671
- amazon: amazon,
2672
- openai: openai,
2673
- tencent: tencent$1,
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
- var deepl = {
2677
- "American English": "en-US",
2678
- "Brazilian Portuguese": "pt-BR",
2679
- "British English": "en-GB",
2680
- Bulgarian: "bg",
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
- Croatian: "hr",
2683
- Czech: "cs",
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
- Latvian: "lv",
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
- Swedish: "sv",
2665
+ Italian: "it",
2666
+ German: "de",
2711
2667
  Turkish: "tr",
2712
- Ukrainian: "uk",
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 tencent = {
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 targetLanguages = {
2737
- azure: azure,
2738
- google: openai,
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: deepl,
2741
- amazon: amazon,
2742
- openai: openai,
2743
- tencent: tencent,
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 = Object.assign(Object.assign({}, originLanguages), {
2756
- baidu: baidu,
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 normalFromLanguage(from, engine) {
2760
- if (from === "auto") {
2761
- return "auto";
2762
- }
2763
- const engineLanguages = originLanguages[engine];
2764
- if (!engineLanguages) {
2765
- throw new Error(`Engine ${engine} not found`);
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
- throw new Error(`Invalid to language ${engine} ${to}`);
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: originLanguages[engine],
2795
- to: targetLanguages[engine],
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
- let { from = "auto", to } = options;
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
- if (!from) {
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 (!to) {
3051
+ if (!normalizedTo) {
2890
3052
  throw new TranslationError(appName, `Invalid target language ${to}`);
2891
3053
  }
2892
- const key = `${from}:${to}:${engine}:${text}`;
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, options)
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=${from},to=${to},engine=${engine},translate text: \n${getGapLine()}\n${text}\n${getGapLine()}\n error: ${getErrorMessages(e)}`);
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;