mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
report unrecognized keys; be careful to not clobber English translation of single/plural forms
This commit is contained in:
parent
0d8b7e80f6
commit
b8e964564c
@ -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)]);
|
||||||
|
Loading…
Reference in New Issue
Block a user