🧑‍💻(i18n) rebuild translations for crowdin

For some unexpected reasons it can happen that the
translations in Crowdin are lost.
If that happens, we can rebuild the Crowdin
translations file from our translated json file.
"translations-skeleton.json" is the downloaded
source file from Crowdin.
It will generate "translations-rebuild.json",
which can be uploaded directly to Crowdin.
This commit is contained in:
Anthony LC
2024-10-07 15:31:30 +02:00
committed by Anthony LC
parent ac18d23fbc
commit d701195ae5
2 changed files with 51 additions and 0 deletions

View File

@@ -7,6 +7,7 @@
"extract-translation:impress": "yarn i18next ../../apps/impress/**/*.{ts,tsx} -c ./i18next-parser.config.mjs -o ./locales/impress/translations-crowdin.json",
"format-deploy": "yarn format-deploy:impress",
"format-deploy:impress": "node ./format-deploy.mjs --app=impress --output=../../apps/impress/src/i18n/translations.json",
"format-rebuild-fr:impress": "node ./rebuild-translations.mjs --language=fr --app=impress --output=../../apps/impress/src/i18n/translations.json",
"lint": "eslint --ext .js,.ts,.mjs .",
"test": "jest"
},

View File

@@ -0,0 +1,50 @@
/**
* For some unexpected reasons it can happen that the translations in Crowdin are lost.
* If that happens, we can rebuild the Crowdin translations file from our translated json file.
*
* This script is used to rebuild the translations file from the empty skeleton file generated by Crowdin.
*/
import fs from 'fs';
import path from 'path';
import { hideBin } from 'yargs/helpers';
import yargs from 'yargs/yargs';
// Get our args
const argv = yargs(hideBin(process.argv)).argv;
const { app, output, language } = argv;
const folderPath = './locales/' + app;
const namefile = 'translations-skeleton.json';
const nameRebuildfile = 'translations-rebuild.json';
const pathRebuildFile = path.join(folderPath, path.sep, nameRebuildfile);
// Get the skeleton generated from crowdin
const pathSkeletonFile = path.join(folderPath, path.sep, namefile);
if (!fs.existsSync(pathSkeletonFile)) {
throw new Error(`File ${pathSkeletonFile} not found!`);
}
// Get the translated file
if (!fs.existsSync(output)) {
throw new Error(`File ${output} not found!`);
}
const jsonSkel = JSON.parse(fs.readFileSync(pathSkeletonFile, 'utf8'));
const jsonTrans = JSON.parse(fs.readFileSync(output, 'utf8'));
// Transform the json file to the format expected by i18next
const jsonRebuild = jsonSkel;
Object.keys(jsonSkel)
.sort()
.forEach((key) => {
jsonRebuild[key]['message'] = jsonTrans[language]['translation'][key] || '';
});
// Write the file to the output
fs.writeFileSync(pathRebuildFile, JSON.stringify(jsonRebuild), 'utf8');
console.log(`${app} translations rebuild!`);