grunt-google-translate
Version:
A build task to translate JSON files to other languages using Google's Translation API. Pairs very well with angular-translate.
96 lines (76 loc) • 3.28 kB
JavaScript
/*
* grunt-google-translate
* https://github.com/dolanmiu/grunt-google-translate
*
* Copyright (c) 2016 Dolan Miu
* Licensed under the MIT license.
*/
/*jslint node: true, nomen: true, regexp: true*/
;
var _ = require('lodash');
var Q = require('q');
var utility = require('../utility');
var angular = require('../utility/angular');
function translate(origJson, googleTranslate, source, target, destPath, grunt) {
var deferred = Q.defer(),
jsonReferenceArray = [],
sourceJson = _.cloneDeep(origJson);
utility.deepTraverseJson(sourceJson, function (parent, value, key) {
jsonReferenceArray.push({
parent: parent,
value: value,
key: key
});
});
grunt.log.writeln('Translating into: ' + target);
googleTranslate.translate(_.map(jsonReferenceArray, 'value'), source, target, function (err, translations) {
var i;
if (err) {
grunt.log.error('Failed to translate');
return deferred.reject(err);
}
// Result is an object (instead of Array) in case of translating one term only
if (jsonReferenceArray.length == 1 && translations.translatedText) {
jsonReferenceArray[0].parent[jsonReferenceArray[0].key] = translations.translatedText;
}
else {
for (i = 0; i < jsonReferenceArray.length; i += 1) {
jsonReferenceArray[i].parent[jsonReferenceArray[i].key] = translations[i].translatedText;
}
}
deferred.resolve({
dest: destPath,
json: sourceJson
});
});
return deferred.promise;
}
module.exports = function (grunt) {
var promises = [];
grunt.registerMultiTask('google_translate', 'A build task to translate JSON files to other languages using Google\'s Translation API. Pairs very well with angular-translate.', function () {
var done = this.async(),
defer = Q.defer(),
googleTranslate = require('google-translate')(this.options().googleApiKey);
this.files.forEach(function (file) {
file.prefix = file.prefix || '';
file.suffix = file.suffix || /.+(\..+)/.exec(file.src)[1];
var languageJson = JSON.parse(grunt.file.read(file.src)),
variableSafeJson = angular.createVariableSafeJson(languageJson);
file.targetLanguages.forEach(function (targetLanguage) {
var filePath = file.dest + file.prefix + targetLanguage + file.suffix;
promises.push(translate(variableSafeJson, googleTranslate, file.sourceLanguage, targetLanguage, filePath, grunt));
});
});
Q.all(promises).then(function (translatedJsons) {
grunt.log.writeln('Writing translated file');
translatedJsons.forEach(function (translatedJson) {
var revertedJson = angular.revertVariablesInJson(translatedJson.json);
grunt.file.write(translatedJson.dest, JSON.stringify(revertedJson, null, "\t"));
grunt.log.writeln('Wrote translated file: ' + translatedJson.dest);
});
done();
}, function (err) {
grunt.fail.fatal(err);
});
});
};