55 lines
3.2 KiB
PHP
55 lines
3.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Prüft, dass das englische Sprachpaket (neueste Version in Plugins/plugins/lang-en-*.zip) alle Texte des Rechte-Katalogs und der Rollen-Vorlagen enthält
|
|
* (Gruppen, Rechte, Hinweise, Rollen-Namen und -Beschreibungen) und dass die Übersetzungen nicht leer oder unverändert sind.
|
|
*/
|
|
|
|
putenv('DESKHUB_TESTING=1');
|
|
putenv('DESKHUB_SQLITE_PATH=:memory:');
|
|
require_once dirname(__DIR__) . '/includes/bootstrap.php';
|
|
|
|
$dir = getenv('DESKHUB_PLUGIN_SRC') ?: dirname(__DIR__, 2) . '/Plugins';
|
|
$zips = glob($dir . '/plugins/lang-en-*.zip') ?: [];
|
|
if (!$zips) { echo "Test übersprungen: kein lang-en-Paket gefunden.\n"; exit(0); }
|
|
usort($zips, fn($a, $b) => version_compare(preg_replace('/^.*lang-en-(.*)\.zip$/', '$1', $a), preg_replace('/^.*lang-en-(.*)\.zip$/', '$1', $b)));
|
|
$zip = new ZipArchive();
|
|
$zip->open(end($zips));
|
|
$strings = null;
|
|
for ($i = 0; $i < $zip->numFiles; $i++) if (str_ends_with($zip->getNameIndex($i), 'strings.json')) $strings = json_decode($zip->getFromIndex($i), true);
|
|
$failures = [];
|
|
$total = 0;
|
|
$check = function (bool $ok, string $what) use (&$failures, &$total): void { $total++; if (!$ok) $failures[] = $what; };
|
|
$check(is_array($strings) && count($strings) > 3000, 'Sprachpaket gelesen (' . basename(end($zips)) . ', ' . count((array) $strings) . ' Einträge)');
|
|
|
|
$texts = [];
|
|
foreach (permission_catalog() as $g) {
|
|
$texts[] = $g['title'];
|
|
foreach ($g['items'] as $i) { $texts[] = $i['label']; $texts[] = $i['hint']; }
|
|
}
|
|
foreach (permission_presets() as $p) { $texts[] = $p[0]; $texts[] = $p[1]; }
|
|
$texts = array_unique($texts);
|
|
$missing = [];
|
|
$same = [];
|
|
foreach ($texts as $t) {
|
|
if (!isset($strings[$t]) || trim((string) $strings[$t]) === '') { $missing[] = $t; continue; }
|
|
// „unverändert“ ist nur für Wörter erlaubt, die in beiden Sprachen gleich sind
|
|
if ($strings[$t] === $t && mb_strlen($t) > 14) $same[] = $t;
|
|
}
|
|
$check($missing === [], 'Alle ' . count($texts) . ' Texte des Rechte-Katalogs und der Rollen-Vorlagen sind übersetzt; es fehlen: ' . implode(' | ', array_slice($missing, 0, 5)));
|
|
$check($same === [], 'Keine unübersetzten Texte (Übersetzung = Original): ' . implode(' | ', array_slice($same, 0, 3)));
|
|
$german = array_filter($texts, fn($t) => isset($strings[$t]) && preg_match('/\b(und|oder|der|die|das|für|nicht|mit)\b/u', $strings[$t]));
|
|
$check($german === [], 'Die englischen Texte enthalten keine deutschen Füllwörter: ' . implode(' | ', array_slice(array_map(fn($t) => $strings[$t], $german), 0, 3)));
|
|
foreach (['Fehlende Rollen anlegen', 'Rechte-Übersicht: Wer darf was?', 'Vorlage laden:', 'Hilfe für Administratoren', 'Passkeys erlauben', 'vordefiniert', 'Wenn etwas nicht funktioniert'] as $k) {
|
|
$check(!empty($strings[$k]), "Oberflächentext „{$k}“ ist übersetzt");
|
|
}
|
|
// Platzhalter stimmen überein
|
|
$bad = [];
|
|
foreach ($strings as $k => $v) if ($k !== '_info' && is_string($k) && is_string($v) && substr_count($k, '{') !== substr_count($v, '{')) $bad[] = $k;
|
|
$check($bad === [], 'Platzhalter in allen Einträgen gleich (' . count($bad) . ' Abweichungen)');
|
|
|
|
echo $failures ? "FEHLGESCHLAGEN:\n - " . implode("\n - ", $failures) . "\n" : '';
|
|
echo "Sprachpaket-Rechte-Test: " . ($total - count($failures)) . " von {$total} Prüfungen in Ordnung.\n";
|
|
exit($failures ? 1 : 0);
|