UNPKG

anylang

Version:

A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs

107 lines (105 loc) 13.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.YandexTranslator = void 0; var _lodash = require("lodash"); var _queryString = _interopRequireDefault(require("query-string")); var _zod = _interopRequireDefault(require("zod")); var _BaseTranslator = require("../BaseTranslator"); var _getYandexSID = require("./getYandexSID"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class YandexTranslator extends _BaseTranslator.BaseTranslator { static isSupportedAutoFrom() { return true; } static getSupportedLanguages() { // Supported, but not valid languages ['mhr', 'pap', 'ceb', 'mrj', 'udm'] // eslint-disable // prettier-ignore return ['af', 'am', 'ar', 'az', 'ba', 'be', 'bg', 'bn', 'bs', 'ca', 'ceb', 'cs', 'cv', 'cy', 'da', 'de', 'el', 'emj', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'ga', 'gd', 'gl', 'gu', 'he', 'hi', 'hr', 'ht', 'hu', 'hy', 'id', 'is', 'it', 'ja', 'jv', 'ka', 'kazlat', 'kk', 'km', 'kn', 'ko', 'ky', 'la', 'lb', 'lo', 'lt', 'lv', 'mg', 'mhr', 'mi', 'mk', 'ml', 'mn', 'mr', 'mrj', 'ms', 'mt', 'my', 'ne', 'nl', 'no', 'pa', 'pap', 'pl', 'pt', 'ro', 'ru', 'sah', 'si', 'sjn', 'sk', 'sl', 'sq', 'sr', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'tl', 'tr', 'tt', 'udm', 'uk', 'ur', 'uz', 'uzbcyr', 'vi', 'xh', 'yi', 'zh', 'zu']; // eslint-enable } getLengthLimit() { return 4000; } getRequestsTimeout() { return 500; } checkLimitExceeding(text) { if (Array.isArray(text)) { const arrayLen = text.reduce((acc, text) => acc + text.length, 0); const extra = arrayLen - this.getLengthLimit(); return extra > 0 ? extra : 0; } else { const extra = text.length - this.getLengthLimit(); return extra > 0 ? extra : 0; } } translate(text, from, to) { return __awaiter(this, void 0, void 0, function* () { return this.translateBatch([text], from, to).then(resp => resp[0]); }); } translateBatch(text, from, to) { return __awaiter(this, void 0, void 0, function* () { const sid = yield (0, _getYandexSID.getYandexSID)(this.fetch); if (sid === null) { throw new Error('Invalid SID'); } const options = { format: 'html', lang: from === 'auto' ? to : `${from}-${to}` }; let body = _queryString.default.stringify(options); for (const textChunk of text) { body += '&text=' + encodeURIComponent(textChunk); } // NOTE: if service will resist and will not work, it may check order of headers, parameters and requests // in this case just make requests less specific to it looks like requests from typical page (with overhead requests if require) const urlWithSid = 'https://translate.yandex.net/api/v1/tr.json/translate?srv=tr-url-widget&id=' + sid + '-0-0&'; return this.fetch(urlWithSid + body, { responseType: 'json', method: 'GET', headers: Object.assign({ 'Content-Type': 'application/x-www-form-urlencoded' }, this.options.headers) }).then(response => { const data = _zod.default.object({ text: _zod.default.string().array() }).parse(response.data); return data.text.map(text => (0, _lodash.unescape)(text)); }); }); } } exports.YandexTranslator = YandexTranslator; YandexTranslator.translatorName = 'YandexTranslator'; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvWWFuZGV4VHJhbnNsYXRvci9pbmRleC5qcyIsIm5hbWVzIjpbIl9sb2Rhc2giLCJyZXF1aXJlIiwiX3F1ZXJ5U3RyaW5nIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl96b2QiLCJfQmFzZVRyYW5zbGF0b3IiLCJfZ2V0WWFuZGV4U0lEIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiWWFuZGV4VHJhbnNsYXRvciIsIkJhc2VUcmFuc2xhdG9yIiwiaXNTdXBwb3J0ZWRBdXRvRnJvbSIsImdldFN1cHBvcnRlZExhbmd1YWdlcyIsImdldExlbmd0aExpbWl0IiwiZ2V0UmVxdWVzdHNUaW1lb3V0IiwiY2hlY2tMaW1pdEV4Y2VlZGluZyIsInRleHQiLCJBcnJheSIsImlzQXJyYXkiLCJhcnJheUxlbiIsInJlZHVjZSIsImFjYyIsImxlbmd0aCIsImV4dHJhIiwidHJhbnNsYXRlIiwiZnJvbSIsInRvIiwidHJhbnNsYXRlQmF0Y2giLCJ0aGVuIiwicmVzcCIsInNpZCIsImdldFlhbmRleFNJRCIsImZldGNoIiwiRXJyb3IiLCJvcHRpb25zIiwiZm9ybWF0IiwibGFuZyIsImJvZHkiLCJxdWVyeVN0cmluZyIsInN0cmluZ2lmeSIsInRleHRDaHVuayIsImVuY29kZVVSSUNvbXBvbmVudCIsInVybFdpdGhTaWQiLCJyZXNwb25zZVR5cGUiLCJtZXRob2QiLCJoZWFkZXJzIiwiT2JqZWN0IiwiYXNzaWduIiwicmVzcG9uc2UiLCJkYXRhIiwieiIsIm9iamVjdCIsInN0cmluZyIsImFycmF5IiwicGFyc2UiLCJtYXAiLCJ1bmVzY2FwZSIsInRyYW5zbGF0b3JOYW1lIl0sInNvdXJjZXMiOlsidHJhbnNsYXRvcnMvWWFuZGV4VHJhbnNsYXRvci9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bmVzY2FwZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcXVlcnlTdHJpbmcgZnJvbSAncXVlcnktc3RyaW5nJztcbmltcG9ydCB6IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IEJhc2VUcmFuc2xhdG9yIH0gZnJvbSAnLi4vQmFzZVRyYW5zbGF0b3InO1xuaW1wb3J0IHsgZ2V0WWFuZGV4U0lEIH0gZnJvbSAnLi9nZXRZYW5kZXhTSUQnO1xuXG5leHBvcnQgY2xhc3MgWWFuZGV4VHJhbnNsYXRvciBleHRlbmRzIEJhc2VUcmFuc2xhdG9yIHtcblx0cHVibGljIHN0YXRpYyByZWFkb25seSB0cmFuc2xhdG9yTmFtZSA9ICdZYW5kZXhUcmFuc2xhdG9yJztcblxuXHRwdWJsaWMgc3RhdGljIGlzU3VwcG9ydGVkQXV0b0Zyb20oKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldFN1cHBvcnRlZExhbmd1YWdlcygpOiBzdHJpbmdbXSB7XG5cdFx0Ly8gU3VwcG9ydGVkLCBidXQgbm90IHZhbGlkIGxhbmd1YWdlcyBbJ21ocicsICdwYXAnLCAnY2ViJywgJ21yaicsICd1ZG0nXVxuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGVcblx0XHQvLyBwcmV0dGllci1pZ25vcmVcblx0XHRyZXR1cm4gW1xuXHRcdFx0J2FmJywgJ2FtJywgJ2FyJywgJ2F6JywgJ2JhJywgJ2JlJywgJ2JnJywgJ2JuJywgJ2JzJywgJ2NhJyxcblx0XHRcdCdjZWInLCAnY3MnLCAnY3YnLCAnY3knLCAnZGEnLCAnZGUnLCAnZWwnLCAnZW1qJywgJ2VuJywgJ2VvJyxcblx0XHRcdCdlcycsICdldCcsICdldScsICdmYScsICdmaScsICdmcicsICdnYScsICdnZCcsICdnbCcsICdndScsXG5cdFx0XHQnaGUnLCAnaGknLCAnaHInLCAnaHQnLCAnaHUnLCAnaHknLCAnaWQnLCAnaXMnLCAnaXQnLCAnamEnLFxuXHRcdFx0J2p2JywgJ2thJywgJ2themxhdCcsICdraycsICdrbScsICdrbicsICdrbycsICdreScsICdsYScsICdsYicsXG5cdFx0XHQnbG8nLCAnbHQnLCAnbHYnLCAnbWcnLCAnbWhyJywgJ21pJywgJ21rJywgJ21sJywgJ21uJywgJ21yJyxcblx0XHRcdCdtcmonLCAnbXMnLCAnbXQnLCAnbXknLCAnbmUnLCAnbmwnLCAnbm8nLCAncGEnLCAncGFwJywgJ3BsJyxcblx0XHRcdCdwdCcsICdybycsICdydScsICdzYWgnLCAnc2knLCAnc2puJywgJ3NrJywgJ3NsJywgJ3NxJywgJ3NyJyxcblx0XHRcdCdzdScsICdzdicsICdzdycsICd0YScsICd0ZScsICd0ZycsICd0aCcsICd0bCcsICd0cicsICd0dCcsXG5cdFx0XHQndWRtJywgJ3VrJywgJ3VyJywgJ3V6JywgJ3V6YmN5cicsICd2aScsICd4aCcsICd5aScsICd6aCcsICd6dSdcblx0XHRdO1xuXHRcdC8vIGVzbGludC1lbmFibGVcblx0fVxuXG5cdHB1YmxpYyBnZXRMZW5ndGhMaW1pdCgpIHtcblx0XHRyZXR1cm4gNDAwMDtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZXF1ZXN0c1RpbWVvdXQoKSB7XG5cdFx0cmV0dXJuIDUwMDtcblx0fVxuXG5cdHB1YmxpYyBjaGVja0xpbWl0RXhjZWVkaW5nKHRleHQ6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodGV4dCkpIHtcblx0XHRcdGNvbnN0IGFycmF5TGVuID0gdGV4dC5yZWR1Y2UoKGFjYywgdGV4dCkgPT4gYWNjICsgdGV4dC5sZW5ndGgsIDApO1xuXHRcdFx0Y29uc3QgZXh0cmEgPSBhcnJheUxlbiAtIHRoaXMuZ2V0TGVuZ3RoTGltaXQoKTtcblx0XHRcdHJldHVybiBleHRyYSA+IDAgPyBleHRyYSA6IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGV4dHJhID0gdGV4dC5sZW5ndGggLSB0aGlzLmdldExlbmd0aExpbWl0KCk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPiAwID8gZXh0cmEgOiAwO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhc3luYyB0cmFuc2xhdGUodGV4dDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVCYXRjaChbdGV4dF0sIGZyb20sIHRvKS50aGVuKChyZXNwKSA9PiByZXNwWzBdKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB0cmFuc2xhdGVCYXRjaCh0ZXh0OiBzdHJpbmdbXSwgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc2lkID0gYXdhaXQgZ2V0WWFuZGV4U0lEKHRoaXMuZmV0Y2gpO1xuXHRcdGlmIChzaWQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBTSUQnKTtcblx0XHR9XG5cblx0XHRjb25zdCBvcHRpb25zID0ge1xuXHRcdFx0Zm9ybWF0OiAnaHRtbCcsXG5cdFx0XHRsYW5nOiBmcm9tID09PSAnYXV0bycgPyB0byA6IGAke2Zyb219LSR7dG99YCxcblx0XHR9O1xuXG5cdFx0bGV0IGJvZHkgPSBxdWVyeVN0cmluZy5zdHJpbmdpZnkob3B0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCB0ZXh0Q2h1bmsgb2YgdGV4dCkge1xuXHRcdFx0Ym9keSArPSAnJnRleHQ9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0Q2h1bmspO1xuXHRcdH1cblxuXHRcdC8vIE5PVEU6IGlmIHNlcnZpY2Ugd2lsbCByZXNpc3QgYW5kIHdpbGwgbm90IHdvcmssIGl0IG1heSBjaGVjayBvcmRlciBvZiBoZWFkZXJzLCBwYXJhbWV0ZXJzIGFuZCByZXF1ZXN0c1xuXHRcdC8vIGluIHRoaXMgY2FzZSBqdXN0IG1ha2UgcmVxdWVzdHMgbGVzcyBzcGVjaWZpYyB0byBpdCBsb29rcyBsaWtlIHJlcXVlc3RzIGZyb20gdHlwaWNhbCBwYWdlICh3aXRoIG92ZXJoZWFkIHJlcXVlc3RzIGlmIHJlcXVpcmUpXG5cdFx0Y29uc3QgdXJsV2l0aFNpZCA9XG5cdFx0XHQnaHR0cHM6Ly90cmFuc2xhdGUueWFuZGV4Lm5ldC9hcGkvdjEvdHIuanNvbi90cmFuc2xhdGU/c3J2PXRyLXVybC13aWRnZXQmaWQ9JyArXG5cdFx0XHRzaWQgK1xuXHRcdFx0Jy0wLTAmJztcblx0XHRyZXR1cm4gdGhpcy5mZXRjaCh1cmxXaXRoU2lkICsgYm9keSwge1xuXHRcdFx0cmVzcG9uc2VUeXBlOiAnanNvbicsXG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHQnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG5cdFx0XHRcdC4uLnRoaXMub3B0aW9ucy5oZWFkZXJzLFxuXHRcdFx0fSxcblx0XHR9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHpcblx0XHRcdFx0Lm9iamVjdCh7XG5cdFx0XHRcdFx0dGV4dDogei5zdHJpbmcoKS5hcnJheSgpLFxuXHRcdFx0XHR9KVxuXHRcdFx0XHQucGFyc2UocmVzcG9uc2UuZGF0YSk7XG5cblx0XHRcdHJldHVybiBkYXRhLnRleHQubWFwKCh0ZXh0KSA9PiB1bmVzY2FwZSh0ZXh0KSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsSUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBRUEsSUFBQUksZUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQThDLFNBQUFFLHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXhDLE1BQU9HLGdCQUFpQixTQUFRQyw4QkFBYztFQUc1QyxPQUFPQyxtQkFBbUJBLENBQUE7SUFDaEMsT0FBTyxJQUFJO0VBQ1o7RUFFTyxPQUFPQyxxQkFBcUJBLENBQUE7SUFDbEM7SUFFQTtJQUNBO0lBQ0EsT0FBTyxDQUNOLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDMUQsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUM1RCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQzFELElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDMUQsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUM5RCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQzNELEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFDNUQsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUM1RCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQzFELEtBQUssRUFBRSxJ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