Import initial du site ship2net.fr : pages PHP, config, traductions t(), composer.json

This commit is contained in:
2026-09-28 08:04:25 +00:00
commit 82f431b3ae
175 changed files with 25531 additions and 0 deletions
+89
View File
@@ -0,0 +1,89 @@
<?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";