attranslate
Version:
Text Translator for Websites and Apps
56 lines (55 loc) • 2.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GoogleTranslate = void 0;
const translate_1 = require("@google-cloud/translate");
const util_1 = require("../util/util");
const lodash_1 = require("lodash");
const managed_json_1 = require("../file-formats/common/managed-json");
class GoogleTranslate {
async translateStrings(args) {
if (!args.serviceConfig) {
(0, util_1.logFatal)("Set '--serviceConfig' to a path that points to a GCloud service account JSON file");
}
(0, util_1.checkNotDir)(args.serviceConfig, { errorHint: "serviceConfig" });
const keyFile = (0, managed_json_1.readRawJson)(args.serviceConfig).object;
if (!keyFile.project_id) {
(0, util_1.logFatal)(`serviceConfig ${(0, util_1.getDebugPath)(args.serviceConfig)} does not contain a project_id`);
}
const projectId = keyFile.project_id;
const clientOptions = {
keyFile: args.serviceConfig,
};
const client = new translate_1.TranslationServiceClient(clientOptions);
const batches = (0, lodash_1.chunk)(args.strings, 10);
const results = await Promise.all(batches.map((batch) => this.translateBatch(batch, client, args, projectId)));
return (0, lodash_1.flatten)(results);
}
async translateBatch(batch, client, args, projectId) {
const location = "global";
const stringsToTranslate = batch.map((tString) => tString.value);
const request = {
parent: `projects/${projectId}/locations/${location}`,
contents: stringsToTranslate,
mimeType: "text/plain",
sourceLanguageCode: args.srcLng,
targetLanguageCode: args.targetLng,
};
const [response] = await client.translateText(request);
if (!response.translations) {
(0, util_1.logFatal)(`Google-translate did not return translations`);
}
return response.translations.map((value, index) => {
return this.transformGCloudResult(value, batch[index]);
});
}
transformGCloudResult(result, input) {
if (!result.translatedText) {
(0, util_1.logFatal)(`Google-translate did not return a result for input '${input.value}' with key '${input.key}'`);
}
return {
key: input.key,
translated: result.translatedText,
};
}
}
exports.GoogleTranslate = GoogleTranslate;