gristlabs_grist-core/buildtools/generate_translation_keys.js

85 lines
2.2 KiB
JavaScript
Raw Normal View History

2022-12-15 09:58:12 +00:00
/**
* Generating translations keys:
*
* This code walk through all the files in client directory and its children
* Get the all keys called by our makeT utils function
* And add only the new one on our en.client.json file
*
2022-12-15 09:58:12 +00:00
*/
const fs = require("fs");
const path = require("path");
const Parser = require("i18next-scanner").Parser;
const englishKeys = require("../static/locales/en.client.json");
const _ = require("lodash");
2022-12-15 09:58:12 +00:00
const parser = new Parser({
keySeparator: "/",
2022-12-15 09:58:12 +00:00
nsSeparator: null,
});
async function* walk(dirs) {
for (const dir of dirs) {
for await (const d of await fs.promises.opendir(dir)) {
const entry = path.join(dir, d.name);
if (d.isDirectory()) yield* walk([entry]);
else if (d.isFile()) yield entry;
}
2022-12-15 09:58:12 +00:00
}
}
const customHandler = (fileName) => (key, options) => {
const keyWithFile = `${fileName}/${key}`;
if (Object.keys(options).includes("count") === true) {
2022-12-15 09:58:12 +00:00
const keyOne = `${keyWithFile}_one`;
const keyOther = `${keyWithFile}_other`;
parser.set(keyOne, key);
parser.set(keyOther, key);
} else {
parser.set(keyWithFile, key);
}
};
function sort(obj) {
if (typeof obj !== "object" || Array.isArray(obj))
return obj;
const sortedObject = {};
const keys = Object.keys(obj).sort();
keys.forEach(key => sortedObject[key] = sort(obj[key]));
return sortedObject;
}
2022-12-15 09:58:12 +00:00
const getKeysFromFile = (filePath, fileName) => {
const content = fs.readFileSync(filePath, "utf-8");
parser.parseFuncFromString(
content,
{
list: [
"i18next.t",
"t", // To match the file-level t function created with makeT
],
},
customHandler(fileName)
);
2022-12-15 09:58:12 +00:00
const keys = parser.get({ sort: true });
return keys;
};
2022-12-15 09:58:12 +00:00
async function walkTranslation(dirs) {
for await (const p of walk(dirs)) {
2022-12-15 09:58:12 +00:00
const { name } = path.parse(p);
if (p.endsWith('.map')) { continue; }
2022-12-15 09:58:12 +00:00
getKeysFromFile(p, name);
}
const keys = parser.get({ sort: true });
2022-12-15 09:58:12 +00:00
const newTranslations = _.merge(keys.en.translation, englishKeys);
await fs.promises.writeFile(
"static/locales/en.client.json",
JSON.stringify(sort(newTranslations), null, 2),
"utf-8"
);
2022-12-15 09:58:12 +00:00
return keys;
}
walkTranslation(["_build/app/client", ...process.argv.slice(2)]);