#!/usr/bin/env node /** * @fileoverview * Script to upload a source en.json file to a particular transifex project resource. * Expects that the project and resource have already been defined in Transifex, and that * the person running the script has the the TX_TOKEN environment variable set to an api * token that has developer access. */ const fs = require('fs'); const path = require('path'); const transifex = require('transifex'); const args = process.argv.slice(2); const usage = ` Push English source strings to Transifex. Usage: node tx-push-src.js tx-project tx-resource english-json-file tx-project: the project slug on transifex tx-resource: the resource slug on transifex english-json-file: path to the en.json source NOTE: TX_TOKEN environment variable needs to be set with a Transifex API token. See the Localization page on the GUI wiki for information about setting up Transifex. `; // Exit if missing arguments or TX_TOKEN if (args.length < 3 || !process.env.TX_TOKEN) { process.stdout.write(usage); process.exit(1); } // Globals const PROJECT = args[0]; const RESOURCE = args[1]; const TX = new transifex({ project_slug: PROJECT, credential: 'api:' + process.env.TX_TOKEN }); let en = fs.readFileSync(path.resolve(args[2])); en = JSON.parse(en); // get the correct resource file type based on transifex project/repo and resource const getResourceType = (project, resource) => { if (project === 'scratch-website') { // all the resources are KEYVALUEJSON return 'KEYVALUEJSON'; } if (project === 'scratch-legacy') { // all the resources are po files return 'PO'; } if (project === 'scratch-editor') { if (resource === 'blocks') { return 'KEYVALUEJSON'; } // everything else is CHROME I18N JSON return 'CHROME'; } if (project === 'scratch-videos') { // all the resources are srt files return 'SRT'; } if (project === 'scratch-android') { // all the resources are android xml files return 'ANDROID'; } if (project === 'scratch-resources') { // all the resources are Chrome format json files return 'CHROME'; } process.stdout.write(`Error - Unknown resource type for:\n`); process.stdout.write(` Project: ${project}, resource: ${resource}\n`); process.exit(1); }; // update Transifex with English source TX.uploadSourceLanguageMethod(PROJECT, RESOURCE, {content: JSON.stringify(en)}, (err) => { if (err && err.response.statusCode !== 404) { process.stdout.write(`Transifex Error: ${err.message}\n`); process.stdout.write( `Transifex Error ${err.response.statusCode.toString()}: ${err.response.body}\n`); process.exitCode = 1; return; } // file not found - create it, but also give message if (err && err.response.statusCode === 404) { process.stdout.write(`Transifex Resource not found, creating: ${RESOURCE}\n`); const resourceData = { slug: RESOURCE, name: RESOURCE, priority: 0, // default to normal priority i18n_type: getResourceType(PROJECT, RESOURCE), content: JSON.stringify(en) }; TX.resourceCreateMethod(PROJECT, resourceData, (err1) => { if (err1) { process.stdout.write(`Transifex Error: ${err1.message}\n`); process.stdout.write( `Transifex Error ${err1.response.statusCode.toString()}: ${err1.response.body}\n`); process.exitCode = 1; return; } }); } process.exitCode = 0; });