json-google-translator
Version:
Translate you json file with the google translator API
80 lines (62 loc) • 2.29 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { Translate } = require('@google-cloud/translate');
const _ = require('lodash');
const API_KEY = process.env.key;
const inputFileName = process.env.input_file;
const targetLanguages = process.env.target_languages && process.env.target_languages.split(',');
const sourceLanguage = process.env.source_language;
if (!API_KEY || !inputFileName || !targetLanguages || !sourceLanguage) {
console.error('You must provide all the arguments.');
console.log('key(api key), input_file, source_language, target_languages');
return;
}
if (!fs.existsSync(inputFileName)) {
console.error(`There is no ${inputFileName} file`);
return;
}
const inputFile = JSON.parse(fs.readFileSync(path.resolve(inputFileName), 'utf-8'));
const translate = new Translate({
key: API_KEY
});
function iterLeaves(value, keyChain, accumulator, translateOptions) {
accumulator = accumulator || {};
keyChain = keyChain || [];
if (_.isObject(value)) {
return _.chain(value).reduce((handlers, v, k) => {
return handlers.concat(iterLeaves(v, keyChain.concat(k), accumulator, translateOptions));
}, []).flattenDeep().value();
} else {
return function () {
// Keeping url as is
if (value.startsWith('/')) {
_.set(accumulator, keyChain, value);
return Promise.resolve(accumulator);
}
return translate
.translate(value, translateOptions)
.then((result) => {
const translatedText = result[0];
console.log(`Translated ${value} ===> ${translatedText} (${translateOptions.to})`);
_.set(accumulator, keyChain, translatedText);
return accumulator;
})
.catch(error => {
console.warn(error);
});
}
}
}
targetLanguages.forEach(language => {
const options = {
from: sourceLanguage,
to: language
};
const outputFile = `${language}.json`;
_.reduce(iterLeaves(inputFile, undefined, undefined, options), (promiseChain, fn) => {
return promiseChain.then(fn);
}, Promise.resolve()).then((payload) => {
fs.writeFileSync(outputFile, JSON.stringify(payload, null, 2));
}).then(() => console.log(`Successfully translated, file output at ${outputFile}`));
});