119 lines
3.7 KiB
JavaScript
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();
|