gctGenerator/scripts/compare_translations.js
2020-07-10 00:57:26 +02:00

56 lines
1.8 KiB
JavaScript

const path = require('path');
const locales = require(path.join(__dirname, '../site/.vuepress/i18n/locales.json'));
/**
* Gets all leave nodes from the specified object
* @param {*} node The root node
* @param {*} path The already visited path
*/
const getLeaves = (node, path = null) => {
if (typeof node === 'string') return leavePaths.push(path);
if (typeof node != 'object') throw new Error(typeof node);
const currentPath = path ? `${path}.` : '';
Object.keys(node).forEach((key) => getLeaves(node[key], `${currentPath}${key}`));
};
/**
* Gets a nested property of the specified node
* @param {*} node The root node
* @param {*} path The property path
*/
const getNestedProperty = (node, path) => {
const props = path.split('.');
let currentValue = node;
while (currentValue && props.length > 0) {
currentValue = currentValue[props.shift()];
}
return currentValue;
};
// Load the translation files
const translations = Object.keys(locales).map((locale) => ({
lang: locales[locale].lang,
values: require(path.join(__dirname, `../site/.vuepress/i18n/${locales[locale].lang}.json`)),
}));
// Set the default translation
const defaultTranslation = translations.find((t) => t.lang === locales['/'].lang);
console.log(`Default translation set to ${defaultTranslation.lang}`);
// Holds the paths to all leave nodes of the default translation
const leavePaths = [];
getLeaves(defaultTranslation.values);
console.log('Detected translations: ', leavePaths);
// Compare all translations to the default translation
translations.forEach((t) => {
console.log(`Comparing ${t.lang} to ${defaultTranslation.lang}`);
leavePaths.forEach((p) => {
const value = getNestedProperty(t.values, p);
if (value == null || typeof value !== 'string')
console.warn(`${t.lang} is missing a translation at '${p}'`);
});
});