openethereum/js/scripts/build-i18n.js

155 lines
4.5 KiB
JavaScript

// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
const fs = require('fs');
const _ = require('lodash');
const path = require('path');
const toSource = require('to-source');
const FILE_HEADER = `// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.\n\n`;
const SECTION_HEADER = 'export default ';
const SECTION_FOOTER = ';\n';
const INDENT = ' ';
const DESTPATH = path.join(__dirname, '../src/i18n/_default');
const ENPATH = path.join(__dirname, '../src/i18n/en');
const SRCPATH = path.join(__dirname, '../.build/i18n/i18n/en.json');
// main entry point
(function main () {
const { sections, sectionNames } = createSectionMap();
sectionNames.forEach((name) => outputSection(name, sections[name]));
outputIndex(sectionNames);
})();
// sort an object based on its keys
function sortObject (object) {
return Object
.keys(object)
.sort()
.reduce((sorted, key) => {
if (typeof object[key] === 'object') {
sorted[key] = sortObject(object[key]);
} else {
sorted[key] = object[key];
}
return sorted;
}, {});
}
// create an object map of the actual inputs
function createSectionMap () {
console.log(`Reading strings from ${SRCPATH}`);
const i18nstrings = require(SRCPATH);
const sections = sortObject(
Object
.keys(i18nstrings)
.reduce((sections, fullKey) => {
const defaultMessage = i18nstrings[fullKey].defaultMessage;
const keys = fullKey.split('.');
let outputs = sections;
keys.forEach((key, index) => {
if (index === keys.length - 1) {
outputs[key] = defaultMessage;
} else {
if (!outputs[key]) {
outputs[key] = {};
}
outputs = outputs[key];
}
});
return sections;
}, {})
);
const sectionNames = Object.keys(sections);
console.log(`Found ${sectionNames.length} sections`);
return {
sections,
sectionNames
};
}
// load the available deafults (non-exported strings) for a section
function readDefaults (sectionName) {
let defaults = {};
try {
defaults = require(path.join(ENPATH, `${sectionName}.js`)).default;
} catch (error) {
defaults = {};
}
return defaults;
}
// create the index.js file
function outputIndex (sectionNames) {
console.log(`Writing index.js to ${DESTPATH}`);
const defaults = readDefaults('index');
const dest = path.join(DESTPATH, 'index.js');
const exports = _.uniq(Object.keys(defaults).concat(sectionNames))
.sort()
.map((name) => `export ${name} from './${name}';`)
.join('\n');
fs.writeFileSync(dest, `${FILE_HEADER}${exports}\n`, 'utf8');
}
// export a section as a flatenned JS export string
function createJSSection (section) {
const source = toSource(section, {
enclose: true,
quoteChar: '`',
tabChar: INDENT,
tabDepth: 0
});
return `${SECTION_HEADER}${source}${SECTION_FOOTER}`;
}
// create the individual section files
function outputSection (sectionName, section) {
console.log(`Writing ${sectionName}.js to ${DESTPATH}`);
const defaults = readDefaults(sectionName);
const dest = path.join(DESTPATH, `${sectionName}.js`);
const sectionText = createJSSection(_.defaultsDeep(section, defaults));
fs.writeFileSync(dest, `${FILE_HEADER}${sectionText}`, 'utf8');
}