scratch-www/bin/tx-import
chrisgarrity 82785435bf New scripts to generate translations from Transifex
Added tx-import, expects TX_TOKEN environment variable to be set to an API token for Transifex. If no API token exists it’ll just use the default English strings for everything.

Removed the localization spot checks because they were checking tha json got built from po files. With Tx-import the files are already json, and may possibly be missing.
2017-02-15 22:51:15 -05:00

119 lines
3.6 KiB
JavaScript
Executable file

#!/usr/bin/env node
/*
Downloads translation json files from Transifex for all the languages defined
in the menus. Expects a Transifex API key to be set in the TX_TOKEN environment
variable. Takes as input a directory in which to store the translations.
Creates subdirectories for each view and 'general'. Creates <lang>.json files
for each language downloaded. Uses the english source l10n file if there is
an error.
*/
var fs = require('fs');
var path = require('path');
var async = require('async');
var Transifex = require('transifex');
var languages = require('../languages.json');
var routes = require('../src/routes.json');
// -----------------------------------------------------------------------------
// Main script
// -----------------------------------------------------------------------------
var args = process.argv.slice(2);
if (!args.length) {
process.stdout.write('A destination directory for localizations must be specified.');
process.exit(1);
}
var outputDir = path.resolve(__dirname, '../', args.shift());
try {
fs.accessSync(outputDir, fs.F_OK);
} catch (err) {
// Doesn't exist - create it.
fs.mkdirSync(outputDir);
}
if (process.env.TX_TOKEN) {
var transifex = new Transifex({
project_slug: 'scratch-website',
credential: 'api:'+process.env.TX_TOKEN
});
} else {
process.stdout.write('WARNING: Missing Transifex API key, skipping download.\n');
process.stdout.write('Set TX_TOKEN in env if you want translations.\n');
process.exit(0);
}
//make sure general translation directory exists
var transDir = path.resolve(outputDir + '/general');
try {
fs.accessSync(transDir, fs.F_OK);
} catch (err) {
// Doesn't exist - create it.
fs.mkdirSync(transDir);
}
var localizations = [];
for ( var isoCode in languages ) {
var transFile = transDir + '/' + isoCode + '.json';
localizations.push({view: 'general', lang: isoCode, file: transFile, src: 'l10n.json'});
}
// initialize views, ignore redirect routes
for (var v in routes) {
if (typeof routes[v].redirect !== 'undefined') {
continue;
}
var subdir = routes[v].view.split('/');
subdir.pop();
var l10n = 'src/views/' + subdir.join('/') + '/l10n.json';
var name = routes[v].name;
try {
// only Initialize if there is an l10n file
fs.accessSync(l10n);
transDir = path.resolve(outputDir + '/' + name);
try {
fs.accessSync(transDir, fs.F_OK);
} catch (err) {
// Doesn't exist - create it.
fs.mkdirSync(transDir);
}
for ( var isoCode in languages ) {
var transFile = transDir + '/' + isoCode + '.json';
localizations.push({view: name, lang: isoCode, file: transFile, src: l10n});
}
} catch (err) {
// skip views without l10n files
// TODO: ES6
// process.stdout.write(`Skipping ${name}, no l10n\n`);
process.stdout.write('Skipping ' + name+ ', no l10n\n');
}
}
async.forEachLimit(localizations, 3, function (item, cb) {
transifex.translationInstanceMethod(
'scratch-website',
item.view+'-l10njson',
item.lang,
{mode: 'reviewed'},
function (err, data) {
if (err) {
process.stdout.write(item.view + ': ' + item.lang + '(' + err + ')' + ' using english\n');
fs.createReadStream(item.src).pipe(fs.createWriteStream(item.file));
} else {
fs.writeFile(item.file, data);
}
return;
});
cb();
}, function (err) {
if (err) {
process.stdout.write('Import completed with errors\n');
}
return;
});