report unrecognized keys; be careful to not clobber English translation of single/plural forms

This commit is contained in:
Paul Fitzpatrick 2023-01-12 12:54:14 -05:00
parent 0d8b7e80f6
commit b8e964564c

View File

@ -11,6 +11,7 @@ const fs = require("fs");
const path = require("path"); const path = require("path");
const Parser = require("i18next-scanner").Parser; const Parser = require("i18next-scanner").Parser;
const englishKeys = require("../static/locales/en.client.json"); const englishKeys = require("../static/locales/en.client.json");
const _ = require("lodash");
const parser = new Parser({ const parser = new Parser({
keySeparator: "/", keySeparator: "/",
@ -67,31 +68,63 @@ const getKeysFromFile = (filePath, fileName) => {
// It is highly desirable to retain existing order, to not generate // It is highly desirable to retain existing order, to not generate
// unnecessary merges/conflicts, so we do a specialized merge. // unnecessary merges/conflicts, so we do a specialized merge.
function merge(target, scanned) { function merge(target, scanned) {
let merges = 0;
for (const key of Object.keys(scanned)) { for (const key of Object.keys(scanned)) {
if (!(key in target)) { if (!(key in target)) {
console.log("Merging key", {key});
target[key] = scanned[key]; target[key] = scanned[key];
merges++;
} else if (typeof target[key] === 'object') { } else if (typeof target[key] === 'object') {
merge(target[key], scanned[key]); merges += merge(target[key], scanned[key]);
} else if (scanned[key] !== target[key]) {
if (!key.endsWith('_one')) {
console.log("Value difference", {key, value: target[key]});
}
}
}
return merges;
}
// Look for keys that are listed in json file but not found in source
// code. These may be stale and need deleting in weblate.
function reportUnrecognizedKeys(originalKeys, foundKeys) {
let unknowns = 0;
for (const section of Object.keys(originalKeys)) {
if (!(section in foundKeys)) {
console.log("Unknown section found", {section});
unknowns++;
} else { } else {
scanned[key] = target[key]; for (const key of Object.keys(originalKeys[section])) {
if (!(key in foundKeys[section])) {
console.log("Unknown key found", {section, key});
unknowns++;
} }
} }
} }
}
return unknowns;
}
async function walkTranslation(dirs) { async function walkTranslation(dirs) {
const originalKeys = _.cloneDeep(englishKeys);
for await (const p of walk(dirs)) { for await (const p of walk(dirs)) {
const { name } = path.parse(p); const { name } = path.parse(p);
if (p.endsWith('.map')) { continue; } if (p.endsWith('.map')) { continue; }
getKeysFromFile(p, name); getKeysFromFile(p, name);
} }
const keys = parser.get({ sort: true }); const keys = parser.get({ sort: true });
merge(englishKeys, sort(keys.en.translation)); const foundKeys = _.cloneDeep(keys.en.translation);
const mergeCount = merge(englishKeys, sort(keys.en.translation));
await fs.promises.writeFile( await fs.promises.writeFile(
"static/locales/en.client.json", "static/locales/en.client.json",
JSON.stringify(englishKeys, null, 4) + '\n', // match weblate's default JSON.stringify(englishKeys, null, 4) + '\n', // match weblate's default
"utf-8" "utf-8"
); );
return keys; // Now, print a report of unrecognized keys - candidates
// for deletion in weblate.
const unknownCount = reportUnrecognizedKeys(originalKeys, foundKeys);
console.log(`Found ${unknownCount} unknown key(s).`);
console.log(`Make ${mergeCount} merge(s).`);
} }
walkTranslation(["_build/app/client", ...process.argv.slice(2)]); walkTranslation(["_build/app/client", ...process.argv.slice(2)]);