UNPKG

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
/* * 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*/ 'use strict'; 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); }); }); };