🌐(i18n) create package i18n

The package i18n will handle the
internationalization of the applications.
It will parse the frontend code and extract
the translations to be send to the crowdin
platform.
This commit is contained in:
Anthony LC
2024-04-02 16:19:35 +02:00
committed by Anthony LC
parent 3098b9f4fc
commit dfafd335f4
11 changed files with 297 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
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 } = argv;
const folderPath = './locales/' + app;
const namefile = 'translations.json';
const jsonI18n = {};
// Fetch the files in the locales folder
fs.readdirSync(folderPath).map((language) => {
const languagePath = path.join(folderPath, path.sep, language);
// Crowdin output file in folder, we want to treat only these ones
if (!fs.lstatSync(languagePath).isDirectory()) {
return;
}
jsonI18n[language] = {
translation: {},
};
// Get the json file generated by crowdin
const pathTranslateFile = path.join(languagePath, path.sep, namefile);
if (!fs.existsSync(pathTranslateFile)) {
throw new Error(`File ${pathTranslateFile} not found!`);
}
const json = JSON.parse(fs.readFileSync(pathTranslateFile, 'utf8'));
// Transform the json file to the format expected by i18next
const jsonKeyMessage = {};
Object.keys(json)
.sort()
.forEach((key) => {
jsonKeyMessage[key] = json[key].message;
});
jsonI18n[language] = {
translation: jsonKeyMessage,
};
});
if (!Object.keys(jsonI18n).length) {
throw new Error(`No translation to deploy`);
}
// Write the file to the output
fs.writeFileSync(output, JSON.stringify(jsonI18n), 'utf8');
console.log(`${app} translations deployed!`);