query('SELECT text FROM i18n_missing ORDER BY hits DESC, text')->fetchAll(PDO::FETCH_COLUMN) as $t) $out[$t] = ''; foreach ($existing as $k => $v) if (is_string($v) && ($k === '' || $k[0] !== '_')) $out[$k] = $v; $out = ['_info' => 'Schlüssel = deutscher Text, Wert = Übersetzung. {} steht für wechselnde Teile. Leere Werte werden ignoriert.'] + $out; header('Content-Type: application/json; charset=utf-8'); header('Content-Disposition: attachment; filename="strings-' . preg_replace('/[^a-z\-]/', '', $code) . '.json"'); echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { verify_csrf(); $action = $_POST['action'] ?? ''; if ($action === 'save') { $def = strtolower((string) ($_POST['default_language'] ?? 'de')); set_setting('default_language', isset($langs[$def]) ? $def : 'de'); set_setting('i18n_collect', !empty($_POST['i18n_collect']) ? '1' : '0'); audit_log($admin['id'], 'Sprach-Einstellungen geändert'); flash('success', 'Gespeichert.'); } elseif ($action === 'clear') { $pdo->exec('DELETE FROM i18n_missing'); flash('success', 'Gesammelte Texte gelöscht.'); } redirect('/staff/languages.php'); } $collected = (int) $pdo->query('SELECT COUNT(*) FROM i18n_missing')->fetchColumn(); $collect = get_setting('i18n_collect', '0') === '1'; $pageTitle = 'Sprachen'; $activePage = 'languages'; require __DIR__ . '/_header.php'; ?>
Jede Sprache ist ein Plugin („Sprachpaket“): Deutsch ist eingebaut, weitere Sprachen installieren Sie unter Plugins. Besucher und Mitarbeiter wechseln die Sprache über die Flaggen. Texte ohne Übersetzung bleiben deutsch.
Noch kein Sprachpaket aktiv. Installieren Sie zum Beispiel „English“ unter Plugins; dann erscheinen die Flaggen.
Das sind deutsche Texte, die der Sammelmodus gesehen hat. Sie bilden die Vorlage für ein neues Sprachpaket.
strings.json die Werte übersetzen. Der Schlüssel ist der deutsche Text, {} steht für wechselnde Teile („Willkommen, {}“ → „Welcome, {}“).plugin.json, plugin.php (kann leer sein), flag.svg (Flagge, höchstens 40 KB), strings.json.plugin.json sieht so aus: {"name":"Français","version":"1.0.0","entry":"plugin.php","language":{"code":"fr","name":"Français","flag":"flag.svg","strings":"strings.json"}}