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