anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
117 lines (115 loc) • 13.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DeepLTranslator = void 0;
var _zod = _interopRequireDefault(require("zod"));
var _BaseTranslator = require("../BaseTranslator");
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 DeepLTranslator extends _BaseTranslator.BaseTranslator {
static getSupportedLanguages() {
// eslint-disable
// prettier-ignore
return ['bg', 'cs', 'da', 'de', 'el', 'en', 'es', 'et', 'fi', 'fr', 'hu', 'id', 'it', 'ja', 'ko', 'lt', 'lv', 'nb', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'zh'];
// eslint-enable
}
constructor(options) {
super(options);
// DeepL API Free authentication keys can be identified easily by the suffix ":fx"
// Docs: https://www.deepl.com/docs-api/api-access/
const isApiKeyFreeVersion = options.apiKey.endsWith(':fx');
const apiHost = isApiKeyFreeVersion ? 'https://api-free.deepl.com' : 'https://api.deepl.com';
this.apiHost = apiHost + '/v2/translate';
}
getLengthLimit() {
return 5000;
}
getRequestsTimeout() {
return 300;
}
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* () {
// eslint-disable-next-line camelcase
const requestBody = {
text,
target_lang: to
};
if (from !== 'auto') {
requestBody['source_lang'] = from;
}
const stringifiedBody = Object.entries(requestBody).map(([key, value]) => {
if (!Array.isArray(value)) return `${key}=${encodeURIComponent(value)}`;
// Handle array parameters
return value.map(t => `${key}=` + encodeURIComponent(t)).join('&');
}).join('&');
return this.fetch(this.apiHost, {
responseType: 'json',
method: 'POST',
headers: Object.assign({
Authorization: `DeepL-Auth-Key ${this.options.apiKey}`,
'Content-Type': 'application/x-www-form-urlencoded'
}, this.options.headers),
body: stringifiedBody
}).then(rsp => {
return _zod.default.object({
translations: _zod.default.object({
text: _zod.default.string()
}).array()
}).transform(({
translations
}) => translations.map(({
text
}) => text)).parse(rsp.data, {
error: () => 'Unexpected data'
});
});
});
}
}
exports.DeepLTranslator = DeepLTranslator;
DeepLTranslator.translatorName = 'DeepLTranslator';
DeepLTranslator.isRequiredKey = () => true;
DeepLTranslator.isSupportedAutoFrom = () => true;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvRGVlcExUcmFuc2xhdG9yL2luZGV4LmpzIiwibmFtZXMiOlsiX3pvZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX0Jhc2VUcmFuc2xhdG9yIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiRGVlcExUcmFuc2xhdG9yIiwiQmFzZVRyYW5zbGF0b3IiLCJnZXRTdXBwb3J0ZWRMYW5ndWFnZXMiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJpc0FwaUtleUZyZWVWZXJzaW9uIiwiYXBpS2V5IiwiZW5kc1dpdGgiLCJhcGlIb3N0IiwiZ2V0TGVuZ3RoTGltaXQiLCJnZXRSZXF1ZXN0c1RpbWVvdXQiLCJjaGVja0xpbWl0RXhjZWVkaW5nIiwidGV4dCIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuIiwicmVkdWNlIiwiYWNjIiwibGVuZ3RoIiwiZXh0cmEiLCJ0cmFuc2xhdGUiLCJmcm9tIiwidG8iLCJ0cmFuc2xhdGVCYXRjaCIsInRoZW4iLCJyZXNwIiwicmVxdWVzdEJvZHkiLCJ0YXJnZXRfbGFuZyIsInN0cmluZ2lmaWVkQm9keSIsIk9iamVjdCIsImVudHJpZXMiLCJtYXAiLCJrZXkiLCJ2YWx1ZSIsImVuY29kZVVSSUNvbXBvbmVudCIsInQiLCJqb2luIiwiZmV0Y2giLCJyZXNwb25zZVR5cGUiLCJtZXRob2QiLCJoZWFkZXJzIiwiYXNzaWduIiwiQXV0aG9yaXphdGlvbiIsImJvZHkiLCJyc3AiLCJ6Iiwib2JqZWN0IiwidHJhbnNsYXRpb25zIiwic3RyaW5nIiwiYXJyYXkiLCJ0cmFuc2Zvcm0iLCJwYXJzZSIsImRhdGEiLCJlcnJvciIsInRyYW5zbGF0b3JOYW1lIiwiaXNSZXF1aXJlZEtleSIsImlzU3VwcG9ydGVkQXV0b0Zyb20iXSwic291cmNlcyI6WyJ0cmFuc2xhdG9ycy9EZWVwTFRyYW5zbGF0b3IvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHogZnJvbSAnem9kJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zbGF0b3IsIFRyYW5zbGF0b3JPcHRpb25zIH0gZnJvbSAnLi4vQmFzZVRyYW5zbGF0b3InO1xuXG5leHBvcnQgdHlwZSBEZWVwTFRyYW5zbGF0b3JPcHRpb25zID0ge1xuXHRhcGlLZXk6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBEZWVwTFRyYW5zbGF0b3IgZXh0ZW5kcyBCYXNlVHJhbnNsYXRvcjxEZWVwTFRyYW5zbGF0b3JPcHRpb25zPiB7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHJhbnNsYXRvck5hbWUgPSAnRGVlcExUcmFuc2xhdG9yJztcblxuXHRwdWJsaWMgc3RhdGljIGlzUmVxdWlyZWRLZXkgPSAoKSA9PiB0cnVlO1xuXG5cdHB1YmxpYyBzdGF0aWMgaXNTdXBwb3J0ZWRBdXRvRnJvbSA9ICgpID0+IHRydWU7XG5cblx0cHVibGljIHN0YXRpYyBnZXRTdXBwb3J0ZWRMYW5ndWFnZXMoKTogc3RyaW5nW10ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlXG5cdFx0Ly8gcHJldHRpZXItaWdub3JlXG5cdFx0cmV0dXJuIFtcblx0XHRcdCdiZycsICdjcycsICdkYScsICdkZScsICdlbCcsICdlbicsICdlcycsICdldCcsICdmaScsICdmcicsXG5cdFx0XHQnaHUnLCAnaWQnLCAnaXQnLCAnamEnLCAna28nLCAnbHQnLCAnbHYnLCAnbmInLCAnbmwnLCAncGwnLFxuXHRcdFx0J3B0JywgJ3JvJywgJ3J1JywgJ3NrJywgJ3NsJywgJ3N2JywgJ3RyJywgJ3VrJywgJ3poJ1xuXHRcdF07XG5cdFx0Ly8gZXNsaW50LWVuYWJsZVxuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSBhcGlIb3N0OiBzdHJpbmc7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRyYW5zbGF0b3JPcHRpb25zPERlZXBMVHJhbnNsYXRvck9wdGlvbnM+KSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cblx0XHQvLyBEZWVwTCBBUEkgRnJlZSBhdXRoZW50aWNhdGlvbiBrZXlzIGNhbiBiZSBpZGVudGlmaWVkIGVhc2lseSBieSB0aGUgc3VmZml4IFwiOmZ4XCJcblx0XHQvLyBEb2NzOiBodHRwczovL3d3dy5kZWVwbC5jb20vZG9jcy1hcGkvYXBpLWFjY2Vzcy9cblxuXHRcdGNvbnN0IGlzQXBpS2V5RnJlZVZlcnNpb24gPSBvcHRpb25zLmFwaUtleS5lbmRzV2l0aCgnOmZ4Jyk7XG5cdFx0Y29uc3QgYXBpSG9zdCA9IGlzQXBpS2V5RnJlZVZlcnNpb25cblx0XHRcdD8gJ2h0dHBzOi8vYXBpLWZyZWUuZGVlcGwuY29tJ1xuXHRcdFx0OiAnaHR0cHM6Ly9hcGkuZGVlcGwuY29tJztcblxuXHRcdHRoaXMuYXBpSG9zdCA9IGFwaUhvc3QgKyAnL3YyL3RyYW5zbGF0ZSc7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGVuZ3RoTGltaXQoKSB7XG5cdFx0cmV0dXJuIDUwMDA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVxdWVzdHNUaW1lb3V0KCkge1xuXHRcdHJldHVybiAzMDA7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tMaW1pdEV4Y2VlZGluZyh0ZXh0OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7XG5cdFx0XHRjb25zdCBhcnJheUxlbiA9IHRleHQucmVkdWNlKChhY2MsIHRleHQpID0+IGFjYyArIHRleHQubGVuZ3RoLCAwKTtcblx0XHRcdGNvbnN0IGV4dHJhID0gYXJyYXlMZW4gLSB0aGlzLmdldExlbmd0aExpbWl0KCk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPiAwID8gZXh0cmEgOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBleHRyYSA9IHRleHQubGVuZ3RoIC0gdGhpcy5nZXRMZW5ndGhMaW1pdCgpO1xuXHRcdFx0cmV0dXJuIGV4dHJhID4gMCA/IGV4dHJhIDogMDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlKHRleHQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlQmF0Y2goW3RleHRdLCBmcm9tLCB0bykudGhlbigocmVzcCkgPT4gcmVzcFswXSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlQmF0Y2godGV4dDogc3RyaW5nW10sIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2Vcblx0XHRjb25zdCByZXF1ZXN0Qm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+ID0geyB0ZXh0LCB0YXJnZXRfbGFuZzogdG8gfTtcblxuXHRcdGlmIChmcm9tICE9PSAnYXV0bycpIHtcblx0XHRcdHJlcXVlc3RCb2R5Wydzb3VyY2VfbGFuZyddID0gZnJvbTtcblx0XHR9XG5cblx0XHRjb25zdCBzdHJpbmdpZmllZEJvZHkgPSBPYmplY3QuZW50cmllcyhyZXF1ZXN0Qm9keSlcblx0XHRcdC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYCR7a2V5fT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcblxuXHRcdFx0XHQvLyBIYW5kbGUgYXJyYXkgcGFyYW1ldGVyc1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUubWFwKCh0KSA9PiBgJHtrZXl9PWAgKyBlbmNvZGVVUklDb21wb25lbnQodCkpLmpvaW4oJyYnKTtcblx0XHRcdH0pXG5cdFx0XHQuam9pbignJicpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2godGhpcy5hcGlIb3N0LCB7XG5cdFx0XHRyZXNwb25zZVR5cGU6ICdqc29uJyxcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRBdXRob3JpemF0aW9uOiBgRGVlcEwtQXV0aC1LZXkgJHt0aGlzLm9wdGlvbnMuYXBpS2V5fWAsXG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcblx0XHRcdFx0Li4udGhpcy5vcHRpb25zLmhlYWRlcnMsXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogc3RyaW5naWZpZWRCb2R5LFxuXHRcdH0pLnRoZW4oKHJzcCkgPT4ge1xuXHRcdFx0cmV0dXJuIHpcblx0XHRcdFx0Lm9iamVjdCh7XG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zOiB6Lm9iamVjdCh7IHRleHQ6IHouc3RyaW5nKCkgfSkuYXJyYXkoKSxcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRyYW5zZm9ybSgoeyB0cmFuc2xhdGlvbnMgfSkgPT4gdHJhbnNsYXRpb25zLm1hcCgoeyB0ZXh0IH0pID0+IHRleHQpKVxuXHRcdFx0XHQucGFyc2UocnNwLmRhdGEsIHsgZXJyb3I6ICgpID0+ICdVbmV4cGVjdGVkIGRhdGEnIH0pO1xuXHRcdH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLGVBQUEsR0FBQUQsT0FBQTtBQUFzRSxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1oRSxNQUFPRyxlQUFnQixTQUFRQyw4QkFBc0M7RUFPbkUsT0FBT0MscUJBQXFCQSxDQUFBO0lBQ2xDO0lBQ0E7SUFDQSxPQUFPLENBQ04sSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUMxRCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQzFELElBQUksRUFBRSxJQUFJLEVBQUUsSUFB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
;