90 lines
3.8 KiB
PHP
90 lines
3.8 KiB
PHP
<?php
|
|
// Parcourt tous les fichiers .php sous /var/www/html et /var/www/config,
|
|
// repère chaque appel t("...") et régénère lang/en.php en conséquence -
|
|
// équivalent de 'lupdate' pour ce mécanisme de traduction "à la Qt".
|
|
//
|
|
// - Les traductions déjà faites, pour des chaînes encore utilisées dans le
|
|
// code, sont conservées telles quelles.
|
|
// - Les nouvelles chaînes (trouvées dans le code, absentes de en.php)
|
|
// sont ajoutées avec une valeur vide, à traduire manuellement.
|
|
// - Les entrées obsolètes (présentes dans en.php, plus utilisées dans le
|
|
// code) sont déplacées en fin de fichier, en commentaire - à supprimer à
|
|
// la main une fois vérifié qu'elles ne servent vraiment plus à rien.
|
|
//
|
|
// Limite connue et acceptée (même limite que qsTr()/gettext) : ne détecte
|
|
// que les chaînes littérales simples (pas de concaténation dynamique).
|
|
// Pour du texte avec contenu variable, utiliser un espace réservé :
|
|
// sprintf(t("Bonjour %s"), $nom)
|
|
// plutôt que t("Bonjour " . $nom) - la seconde forme ne sera pas détectée.
|
|
|
|
$racine = "/var/www";
|
|
$fichier_en = "$racine/config/lang/en.php";
|
|
|
|
$chaines_trouvees = [];
|
|
$iterateur = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($racine));
|
|
foreach ($iterateur as $fichier) {
|
|
if (!str_ends_with($fichier->getFilename(), ".php")) continue;
|
|
if (str_contains($fichier->getPathname(), "/lang/")) continue; // ne pas s'auto-analyser
|
|
if ($fichier->getFilename() === basename(__FILE__)) continue; // idem, pour le script lui-même
|
|
$contenu = file_get_contents($fichier->getPathname());
|
|
if (preg_match_all('/\bt\(\s*"((?:[^"\\\\]|\\\\.)*)"\s*\)/', $contenu, $matches)) {
|
|
foreach ($matches[1] as $chaine) {
|
|
$chaine = stripcslashes($chaine);
|
|
$chaines_trouvees[$chaine][] = $fichier->getPathname();
|
|
}
|
|
}
|
|
}
|
|
|
|
$traductions_en = file_exists($fichier_en) ? include $fichier_en : [];
|
|
|
|
// --- Rapport console, comme avant ---
|
|
echo "=== Chaînes utilisées dans le code : " . count($chaines_trouvees) . " ===\n\n";
|
|
|
|
$manquantes = [];
|
|
foreach ($chaines_trouvees as $chaine => $fichiers) {
|
|
if (!array_key_exists($chaine, $traductions_en)) {
|
|
$manquantes[$chaine] = $fichiers[0];
|
|
}
|
|
}
|
|
echo count($manquantes) . " nouvelle(s) chaîne(s) à traduire.\n";
|
|
|
|
$obsoletes = array_diff(array_keys($traductions_en), array_keys($chaines_trouvees));
|
|
echo count($obsoletes) . " entrée(s) obsolète(s), déplacée(s) en commentaire.\n\n";
|
|
|
|
// --- Régénération de lang/en.php ---
|
|
|
|
// Sauvegarde de précaution avant d'écraser :
|
|
if (file_exists($fichier_en)) {
|
|
copy($fichier_en, "$fichier_en.bak");
|
|
}
|
|
|
|
// Fusion : traductions existantes conservées pour les chaînes encore utilisées,
|
|
// nouvelles chaînes ajoutées avec une valeur vide :
|
|
$nouveau_tableau = [];
|
|
foreach ($chaines_trouvees as $chaine => $fichiers) {
|
|
$nouveau_tableau[$chaine] = $traductions_en[$chaine] ?? "";
|
|
}
|
|
|
|
$contenu = "<?php\n";
|
|
$contenu .= "// Fichier régénéré automatiquement par extraire_traductions.php\n";
|
|
$contenu .= "// le " . date("d/m/Y à H:i:s") . " - les valeurs vides sont à traduire manuellement.\n";
|
|
$contenu .= "return [\n";
|
|
foreach ($nouveau_tableau as $cle => $valeur) {
|
|
$contenu .= " " . var_export($cle, true) . " => " . var_export($valeur, true) . ",\n";
|
|
}
|
|
$contenu .= "];\n";
|
|
|
|
if (!empty($obsoletes)) {
|
|
$contenu .= "\n/*\n";
|
|
$contenu .= "// OBSOLÈTES au " . date("d/m/Y à H:i:s") . " - plus utilisées dans le code.\n";
|
|
$contenu .= "// À supprimer manuellement une fois confirmé qu'elles ne servent vraiment plus.\n";
|
|
foreach ($obsoletes as $chaine) {
|
|
$contenu .= var_export($chaine, true) . " => " . var_export($traductions_en[$chaine], true) . ",\n";
|
|
}
|
|
$contenu .= "*/\n";
|
|
}
|
|
|
|
file_put_contents($fichier_en, $contenu);
|
|
echo "Fichier régénéré : $fichier_en\n";
|
|
echo "(sauvegarde de l'ancienne version : $fichier_en.bak)\n";
|