oggui/ogWebconsole/update-translations.js

119 lines
3.7 KiB
JavaScript

const fs = require('fs');
const path = require('path');
// Directorios base: buscará en todo ./src y modificará los JSON de ./src/locale
const srcDir = __dirname+"/src";
const localeDir = path.join(srcDir, 'locale');
// Expresiones regulares para capturar las claves de traducción
const regexes = [
// Captura: 'mi.clave' | translate O "mi.clave" | translate
/['"]([^'"]+)['"]\s*\|\s*translate/g,
// Captura: translate="mi.clave" O translate='mi.clave'
/translate\s*=\s*['"]([^'"]+)['"]/g,
// Captura: translate.instant('mi.clave') O translate.instant("mi.clave")
/translate\.instant\(\s*['"]([^'"]+)['"]/g,
// Captura: [translate]="'mi.clave'"
/\[translate\]\s*=\s*['"]'([^']+)'['"]/g,
// Captura: [translate]='"mi.clave"'
/\[translate\]\s*=\s*['"]"([^"]+)"['"]/g
];
/**
* Función recursiva para obtener todos los archivos con las extensiones deseadas
*/
function getFiles(dir, exts, fileList = []) {
const files = fs.readdirSync(dir);
for (const file of files) {
const filePath = path.join(dir, file);
if (fs.statSync(filePath).isDirectory()) {
getFiles(filePath, exts, fileList);
} else {
if (exts.includes(path.extname(filePath))) {
fileList.push(filePath);
}
}
}
return fileList;
}
/**
* Extrae todas las claves únicas usando las expresiones regulares
*/
function extractKeys() {
const files = getFiles(srcDir, ['.ts', '.html']);
const keys = new Set();
files.forEach(file => {
const content = fs.readFileSync(file, 'utf8');
regexes.forEach(regex => {
let match;
while ((match = regex.exec(content)) !== null) {
const key = match[1];
if (key && key.trim() !== '') {
keys.add(key.trim());
}
}
});
});
return Array.from(keys);
}
/**
* Actualiza y ordena los archivos de idiomas
*/
function updateLocales(extractedKeys) {
if (!fs.existsSync(localeDir)) {
console.error('No se pudo encontrar el directorio de traducciones:', localeDir);
return;
}
const localeFiles = fs.readdirSync(localeDir).filter(f => f.endsWith('.json'));
localeFiles.forEach(file => {
const filePath = path.join(localeDir, file);
let localeData = {};
try {
localeData = JSON.parse(fs.readFileSync(filePath, 'utf8'));
} catch (e) {
console.error(`Error al procesar el JSON en ${file}:`, e.message);
return;
}
let addedCount = 0;
// Añadir claves faltantes
extractedKeys.forEach(key => {
if (!localeData.hasOwnProperty(key)) {
localeData[key] = key; // Usa la propia clave como valor
addedCount++;
}
});
// Ordenar alfabéticamente todas las claves
const sortedData = {};
Object.keys(localeData)
.sort((a, b) => a.localeCompare(b))
.forEach(k => {
sortedData[k] = localeData[k];
});
// Guardar el fichero de nuevo
fs.writeFileSync(filePath, JSON.stringify(sortedData, null, 4) + '\n', 'utf8');
console.log(`[${file}] Actualizado. Agregadas ${addedCount} claves nuevas. Fichero ordenado alfabéticamente.`);
});
}
function run() {
console.log('Buscando claves de traducción en archivos .ts y .html...');
const keys = extractKeys();
console.log(`Se encontraron ${keys.length} claves únicas en el código.`);
console.log('Actualizando diccionarios...');
updateLocales(keys);
console.log('¡Proceso completado exitosamente!');
}
run();