Files
foundryvtt-wh4-lang-fr-fr/tools/auto-merge-translations.js

117 lines
4.1 KiB
JavaScript

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.`);