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();