import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; const REVIEW_FILE = path.join(__dirname, 'scripts-to-review.json'); const scriptsToReview = JSON.parse(fs.readFileSync(REVIEW_FILE, 'utf-8')); // Dictionnaire de traductions courantes const translations = { 'Loading Spells': 'Chargement des sorts', 'Loading': 'Chargement', 'Could not find': 'Impossible de trouver', 'Try Again': 'Essayez à nouveau', 'Error': 'Erreur', 'Success': 'Succès', 'Warning': 'Avertissement', 'Created': 'Créé', 'Modified': 'Modifié', 'Deleted': 'Supprimé', 'Are you sure': 'Êtes-vous sûr', 'Do you want': 'Voulez-vous', 'Cancel': 'Annuler', 'Confirm': 'Confirmer', 'Yes': 'Oui', 'No': 'Non' }; function translateText(text) { // Remplacer les traductions connues let translated = text; for (const [en, fr] of Object.entries(translations)) { translated = translated.replace(new RegExp(en, 'g'), fr); } return translated; } function mergeScript(wfrp4eContent, frContent) { // Commence avec la version WFRP4E (à jour) let merged = wfrp4eContent; // Extraire les textes traduits du script FR const frTexts = new Map(); const textPattern = /["'`]([^"'`]+)["'`]/g; let match; while ((match = textPattern.exec(frContent)) !== null) { const text = match[1]; // Si le texte contient des mots français caractéristiques if (/Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur/i.test(text)) { // Chercher le texte anglais correspondant dans WFRP4E const enMatch = wfrp4eContent.match(new RegExp(`["'\`]([^"'\`]*${text.split(' ')[0]}[^"'\`]*)["'\`]`)); if (enMatch) { frTexts.set(enMatch[1], text); } } } // Appliquer les traductions connues for (const [en, fr] of frTexts.entries()) { merged = merged.replace(new RegExp(`["'\`]${en.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["'\`]`, 'g'), `"${fr}"`); } // Appliquer le dictionnaire de traductions for (const [en, fr] of Object.entries(translations)) { merged = merged.replace(new RegExp(`["'\`]${en}["'\`]`, 'g'), `"${fr}"`); } // Cas spéciaux pour les template literals merged = merged.replace(/`Could not find \$\{([^}]+)\} spell\. Try Again`/g, '`Impossible de trouver le sort ${$1}. Essayez à nouveau`'); return merged; } console.log('Révision semi-automatique des scripts...\n'); let updated = 0; let skipped = 0; scriptsToReview.forEach(({file}) => { const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file); const frPath = path.join(FR_SCRIPTS, file); const backupPath = frPath + '.backup'; const wfrp4eContent = fs.readFileSync(wfrp4ePath, 'utf-8'); const frContent = fs.readFileSync(frPath, 'utf-8'); // Sauvegarder l'original fs.copyFileSync(frPath, backupPath); // Tenter la fusion const merged = mergeScript(wfrp4eContent, frContent); // Vérifier si des traductions ont été préservées const hasTranslations = /Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur/i.test(merged); if (hasTranslations) { fs.writeFileSync(frPath, merged, 'utf-8'); updated++; console.log(`✓ Mis à jour avec traductions: ${file}`); } else { // Restaurer l'original si aucune traduction n'a été préservée fs.copyFileSync(backupPath, frPath); skipped++; console.log(`⚠ Révision manuelle requise: ${file}`); } }); console.log(`\n=== Résumé ===`); console.log(`Scripts mis à jour automatiquement: ${updated}`); console.log(`Scripts nécessitant révision manuelle: ${skipped}`); console.log(`\nNOTE: Les fichiers .backup contiennent les versions originales.`); console.log(`Vérifiez les fichiers mis à jour avant de supprimer les backups.`);