2022-11-11 06:00:32 +00:00
|
|
|
import fs from 'fs';
|
2023-02-03 20:43:10 +00:00
|
|
|
import glob from 'glob';
|
2022-11-11 06:00:32 +00:00
|
|
|
import { AVAILABLE_LANGUAGE_KEYS } from '../src/js/translations/Translation.mjs';
|
2022-08-24 09:41:17 +00:00
|
|
|
|
2022-09-01 07:37:12 +00:00
|
|
|
async function translationsToCsv() {
|
2022-11-11 06:00:32 +00:00
|
|
|
let csv = '';
|
|
|
|
let languages = [];
|
2023-02-03 20:43:10 +00:00
|
|
|
let translationKeys = new Set();
|
2022-11-11 06:00:32 +00:00
|
|
|
let translations = {};
|
2022-08-24 09:49:07 +00:00
|
|
|
|
2022-11-11 06:00:32 +00:00
|
|
|
for (let lang of AVAILABLE_LANGUAGE_KEYS) {
|
|
|
|
const translation = (await import(`../src/js/translations/${lang}.mjs`)).default;
|
|
|
|
translations[lang] = translation;
|
|
|
|
languages.push(lang);
|
|
|
|
}
|
2022-08-24 09:41:17 +00:00
|
|
|
|
2023-02-03 20:43:10 +00:00
|
|
|
// Collect used translation keys from code
|
|
|
|
const files = glob.sync('../src/js/**/*.{js,jsx,ts,tsx}', { ignore: '../src/js/lib/**/*' });
|
|
|
|
files.forEach((file) => {
|
|
|
|
const content = fs.readFileSync(file, 'utf8');
|
|
|
|
const matches = content.match(/(^|[^a-zA-Z])t\(['"`]([^'"`]+)['"`]\)/g);
|
|
|
|
if (matches) {
|
|
|
|
matches.forEach((match) => {
|
|
|
|
const key = match.match(/(^|[^a-zA-Z])t\(['"`]([^'"`]+)['"`]\)/)[2];
|
|
|
|
translationKeys.add(key);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
console.log('found', translationKeys.size, 'translation keys from', files.length, 'files');
|
|
|
|
|
2022-11-11 06:00:32 +00:00
|
|
|
languages.sort();
|
2023-02-03 20:43:10 +00:00
|
|
|
translationKeys = Array.from(translationKeys);
|
2022-11-11 06:00:32 +00:00
|
|
|
translationKeys.sort();
|
2022-08-24 09:49:07 +00:00
|
|
|
|
2022-11-11 06:00:32 +00:00
|
|
|
// add language names to csv
|
|
|
|
csv += '"","';
|
|
|
|
for (let i = 0; i < languages.length; i++) {
|
|
|
|
csv += languages[i];
|
|
|
|
if (i < languages.length - 1) {
|
|
|
|
csv += '","';
|
|
|
|
} else {
|
|
|
|
csv += '"\n';
|
2022-08-24 09:41:17 +00:00
|
|
|
}
|
2022-11-11 06:00:32 +00:00
|
|
|
}
|
2022-08-24 09:49:07 +00:00
|
|
|
|
2022-11-11 06:00:32 +00:00
|
|
|
csv += '"';
|
|
|
|
for (let key of translationKeys) {
|
|
|
|
let row = key;
|
|
|
|
for (let lang of languages) {
|
|
|
|
row += '","' + (translations[lang][key] || '').replace(/"/g, '""');
|
|
|
|
}
|
|
|
|
csv += row + '"\n';
|
|
|
|
if (key !== translationKeys[translationKeys.length - 1]) {
|
|
|
|
csv += '"';
|
2022-08-24 09:49:07 +00:00
|
|
|
}
|
2022-11-11 06:00:32 +00:00
|
|
|
}
|
2022-08-24 09:49:07 +00:00
|
|
|
|
2022-11-11 06:00:32 +00:00
|
|
|
// output csv to file
|
|
|
|
fs.writeFileSync('translations.csv', csv);
|
|
|
|
console.log('wrote translations.csv');
|
2022-08-24 09:41:17 +00:00
|
|
|
}
|
|
|
|
|
2022-11-11 06:00:32 +00:00
|
|
|
translationsToCsv();
|