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'; ?>

Sprachen

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.

Installierte Sprachen

$l): $n = $code === 'de' ? null : i18n_dictionary($code)['count']; ?>

Noch kein Sprachpaket aktiv. Installieren Sie zum Beispiel „English“ unter Plugins; dann erscheinen die Flaggen.

$c !== 'de')); $activePlugins = []; try { $activePlugins = $pdo->query("SELECT slug FROM plugins WHERE is_active = 1 ORDER BY slug")->fetchAll(PDO::FETCH_COLUMN); } catch (Throwable $e) { } $activePlugins = array_values(array_filter($activePlugins, fn($sl) => !isset($langs) || !in_array($sl, array_column($langs, 'slug'), true))); ?>

Übersetzungen in den Plugins

Jedes Plugin kann seine Texte selbst übersetzen: Es legt dazu im Plugin-Ordner lang/<Sprachcode>.json ab (zum Beispiel lang/en.json). Wird eine Sprache gewählt, nutzt DeskHub diese Dateien aller aktiven Plugins zusätzlich zum Sprachpaket; steht ein Text in beiden, gilt der aus dem Sprachpaket. Eine neue Sprache braucht deshalb nur ein Sprachpaket und je Plugin eine Datei.

Noch kein Sprachpaket aktiv. Installieren Sie zum Beispiel „English“ unter Plugins.

Es ist kein Plugin aktiv.

Plugin ()
keine Datei (Texte aus dem Sprachpaket oder deutsch)✓ Texte

Einstellungen

Gesammelte Texte:

Das sind deutsche Texte, die der Sammelmodus gesehen hat. Sie bilden die Vorlage für ein neues Sprachpaket.

Eigene Sprache als Plugin erstellen

  1. Sammelmodus einschalten, die Seiten durchklicken, dann bei Deutsch „Leere Vorlage laden“ (alle gesammelten Texte, noch ohne Übersetzung). Für Ergänzungen zu einer vorhandenen Sprache bei dieser „Vorlage laden“: bereits Übersetztes ist eingetragen.
  2. In der Datei strings.json die Werte übersetzen. Der Schlüssel ist der deutsche Text, {} steht für wechselnde Teile („Willkommen, {}“ → „Welcome, {}“).
  3. Ordner mit diesen Dateien packen: plugin.json, plugin.php (kann leer sein), flag.svg (Flagge, höchstens 40 KB), strings.json.
  4. Die 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"}}
  5. ZIP unter Plugins hochladen und aktivieren (das Sprachpaket braucht keine Berechtigungen). Die Flagge erscheint sofort.