@dhis2/d2-i18n-extract
Version:
Extract i18n.t translation strings from DHIS2 frontend apps
114 lines (95 loc) • 2.8 kB
JavaScript
var ArgumentParser = require('argparse').ArgumentParser;
var argsParser = new ArgumentParser({
version: '1.0.0',
addHelp: true,
description: 'Extract i18n.t translation strings from DHIS2 frontend apps'
});
argsParser.addArgument(['-p', '--path'], {
dest: 'path',
defaultValue: './src/',
help: 'directory path to recurse and extract i18n.t translation strings'
});
argsParser.addArgument(['-o', '--output'], {
dest: 'output',
defaultValue: './i18n/',
help: 'destination path for en.pot file.'
});
var args = argsParser.parseArgs();
var fs = require('fs');
var path = require('path');
var { walk } = require('./helpers');
try {
var dirPath = path.normalize(args.path);
var stat = fs.lstatSync(dirPath);
if (!stat.isDirectory()) {
console.error(dirPath, 'is not a directory.');
process.exit(1);
}
} catch (e) {
console.error(dirPath, 'does not exist.');
process.exit(1);
}
console.log('\n> reading:', dirPath);
var files = walk(dirPath);
if (files.length === 0) {
console.log(dirPath, 'has no strings to translate.');
process.exit(1);
}
var Parser = require('i18next-scanner').Parser;
var parser = new Parser({
keepRemoved: false,
keySeparator: false,
sort: true
});
console.log('> parsing:', files.length, 'files');
for (var filePath of files) {
var contents = fs.readFileSync(filePath, 'utf8');
parser.parseFuncFromString(contents).get();
}
var parsed = parser.get();
var en = {};
Object.keys(parsed.en.translation).forEach(str => (en[str] = ''));
var { i18nextToPot, gettextToI18next } = require('i18next-conv');
var targetPath = path.join(args.output, 'en.pot');
var checkExisting = true;
if (!fs.existsSync(args.output)) {
(checkExisting = false), fs.mkdirSync(args.output);
fs.closeSync(fs.openSync(targetPath, 'w'));
}
if (checkExisting) {
// validate, diff translation keys b/w en.pot vs now
gettextToI18next('en', fs.readFileSync(targetPath, 'utf8')).then(json => {
var msgIds = Object.keys(en);
var newMsgIds = Object.keys(JSON.parse(json));
if (arrayEqual(newMsgIds, msgIds)) {
console.log('> no i18n updates found.');
console.log('> complete\n');
process.exit(0);
} else {
write(en);
}
});
} else {
write(en);
}
function write(en) {
console.log(
'> writing:',
Object.keys(en).length,
'language strings to',
targetPath
);
i18nextToPot('en', JSON.stringify(en)).then(result => {
fs.writeFileSync(targetPath, result + "\n");
console.log('> complete\n');
process.exit(0);
});
}
// src from component/array-equal
function arrayEqual(arr1, arr2) {
var length = arr1.length;
if (length !== arr2.length) return false;
for (var i = 0; i < length; i++) if (arr1[i] !== arr2[i]) return false;
return true;
}