<?php

return [
    'title' => 'Integrationen',
    'subtitle' => 'Angebundene Dienste, gruppiert nach Zweck — Zugangsdaten und Einstellungen nebeneinander, nicht auf getrennten Seiten nach Speicherort.',

    // Der Umschalter — über allen Zugangsdaten, weil er regiert, welcher
    // Platz je Eintrag gilt.
    'mode_title' => 'Betriebsmodus',
    'mode_body' => 'Entscheidet, welcher Platz je Zugangsdatum unten gilt. Ist der Testplatz leer, gilt im Testbetrieb der Live-Platz — außer beim Stripe-Schlüssel, der in keine Richtung zurückfällt.',
    'mode_switch_to_test' => 'Zu Testbetrieb wechseln',
    'mode_switch_to_live' => 'Zu Livebetrieb wechseln',
    'mode_switched' => 'Betriebsmodus umgelegt: :mode.',
    'mode_switch_title_test' => 'Wirklich zu Testbetrieb wechseln?',
    'mode_switch_body_test' => 'Ab sofort gilt für jedes Zugangsdatum der Testplatz — oder, wo dieser leer ist, der Live-Platz. Zahlungen laufen weiter über den aktiven Stripe-Schlüssel des jeweiligen Modus.',
    'mode_switch_confirm_test' => 'Umlegen',
    'mode_switch_title_live' => 'Wirklich zu Livebetrieb wechseln?',
    'mode_switch_body_live' => 'Ab sofort fließt echtes Geld: jede Bestellung wird über den Live-Stripe-Schlüssel abgerechnet, nicht mehr über den Testschlüssel. Das ist keine Umschaltfläche zum Danebenklicken.',
    'mode_switch_confirm_live' => 'Umlegen',

    'catalogue_title' => 'Preiskatalog in Stripe',
    'catalogue_body' => 'Legt für jede veröffentlichte Paketversion Produkt und Preise in Stripe an. Der Trockenlauf zeigt zuerst, was entstünde.',
    'catalogue_dry_run' => 'Trockenlauf',
    'catalogue_sync' => 'Abgleichen',
    'catalogue_dry_run_queued' => 'Trockenlauf eingereiht — das Ergebnis erscheint hier, sobald er durch ist.',
    'catalogue_sync_queued' => 'Abgleich eingereiht — das Ergebnis erscheint hier, sobald er durch ist.',
    'catalogue_never_run' => 'Noch nie gelaufen.',
    'catalogue_ok' => 'Durchgelaufen',
    'catalogue_failed' => 'Fehlgeschlagen',
    'catalogue_was_dry_run' => 'Trockenlauf',
    'catalogue_was_live_run' => 'Echter Lauf',
    'catalogue_sync_title' => 'Katalog wirklich nach Stripe schreiben?',
    'catalogue_sync_body' => 'Es entstehen Produkte und Preise in dem Stripe-Konto, das zum aktuellen Betriebsmodus gehört. Ein Stripe-Preis lässt sich nicht mehr ändern, nur archivieren. Der Trockenlauf zeigt vorher, was angelegt würde.',
    'catalogue_sync_confirm' => 'Abgleichen',

    'payments_title' => 'Zahlungen (Stripe)',
    'payments_body' => 'Der Secret Key, mit dem Zahlungen entgegengenommen und Webhooks geprüft werden.',

    'dns_title' => 'DNS (Hetzner)',
    'dns_body' => 'API-Token, Zone und wo Traefik seine dynamische Konfiguration erwartet.',
    'dns_zone' => 'DNS-Zone',
    'dns_zone_hint' => 'Zum Beispiel clupilot.com — Kundeninstanzen erhalten <subdomain>.<Zone>.',
    'traefik_path' => 'Traefik: Pfad für dynamische Konfiguration',
    'traefik_path_hint' => 'Verzeichnis auf dem Traffic-Host, in das Routen geschrieben werden.',

    'monitoring_title' => 'Monitoring',
    'monitoring_body' => 'Damit merkt CluPilot, dass die Cloud eines Kunden steht — bevor der Kunde anruft. Bei jeder neuen Instanz entsteht automatisch eine Überwachung auf deren Statusseite; fällt sie aus, steht die Meldung auf der Übersicht. Ohne Kunden-Instanzen gibt es hier folglich nichts zu sehen. Leer lassen schaltet die Überwachung ab, sonst ändert sich nichts.',
    'monitoring_url' => 'Monitoring-Bridge-URL',
    'monitoring_url_hint' => 'Zum Beispiel http://kuma-bridge:8080. Leer lässt Monitoring aus.',

    'vpn_title' => 'VPN/WireGuard',
    'vpn_body' => 'Wie ein neuer Host CluPilot als VPN-Hub erreicht. Der private Hub-Schlüssel bleibt in der Serverdatei — hier stehen nur der öffentliche Teil und die Adresse.',
    'wg_endpoint' => 'Hub-Endpunkt',
    'wg_endpoint_hint' => 'Öffentlich erreichbare Adresse und Port, z. B. vpn.clupilot.com:51820.',
    'wg_hub_pubkey' => 'Hub-Public-Key',
    'wg_hub_pubkey_hint' => 'Ausgabe von wg pubkey < /etc/wireguard/privatekey auf diesem Server.',

    'ssh_title' => 'SSH-Identität',
    'ssh_body' => 'Der Schlüssel, der auf jedem neuen Host hinterlegt wird — öffentlicher und privater Teil zusammen an einer Stelle.',
    'ssh_public_key' => 'SSH-Schlüssel (öffentlich)',
    'ssh_public_key_hint' => 'Wird bei der Host-Aufnahme in authorized_keys eingetragen.',

    'save_settings' => 'Einstellungen speichern',
    'settings_saved' => 'Gespeichert. Der neue Wert gilt ab sofort.',

    // .env-Editor (Teil B).
    'env_title' => 'Erweitert: Serverdatei (.env)',
    'env_subtitle' => 'Alles, was oben kein eigenes Feld hat — roh, wie auf dem Server. Ohne diesen Editor bräuchte es dafür eine Shell.',
    'env_locked' => 'Gesperrt. Oben entsperren, um die Serverdatei zu sehen.',

    'env_danger_title' => 'Diese Zeilen können die Konsole selbst aussperren',
    'env_danger_body' => 'Ein falscher Wert in einer dieser Zeilen macht die Konsole für Sie selbst unerreichbar: APP_KEY, DB_* (Datenbankverbindung), REDIS_* (Sitzungen, Cache, Warteschlange), SESSION_*. Nicht gesperrt — volle Kontrolle war die Entscheidung —, aber diese Zeilen verdienen einen zweiten Blick.',

    'env_vault_title' => 'Von der Zugangsdaten-Verwaltung verwaltet',
    'env_vault_body' => 'SecretVault::get() bevorzugt einen hier hinterlegten Wert und weicht nur auf die Serverdatei aus, wenn keiner hinterlegt ist. Solange oben ein Wert hinterlegt ist, ändert die passende Zeile unten nichts — sonst widerspräche sich die Konsole selbst.',
    'env_vault_active' => 'hinterlegt — diese Zeile wirkt nicht',
    'env_vault_inactive' => 'nicht hinterlegt — diese Zeile gilt',

    'env_label' => 'Inhalt von .env',
    'env_save' => 'Speichern',

    'env_backup_title' => 'Sicherung',
    'env_backup_body' => 'Vor jedem Speichern wird eine Kopie neben .env abgelegt (Dateiname .env.bak-Zeitstempel). Sie werden nicht automatisch gelöscht.',

    // queue, queue-provisioning, scheduler und reverb lesen .env nur beim
    // eigenen Start. Bis hierher war das Homework — „starten Sie das jetzt
    // selbst neu" — dieselbe Klage wie beim Update-Knopf davor: über die
    // Kommandozeile nacharbeiten, was die Konsole schon wusste. Speichern
    // löst das jetzt selbst aus (App\Livewire\Admin\Integrations::saveEnv()):
    // den Konfigurations-Cache leeren (sofort, ohne den Host-Agenten — dafür
    // braucht es keine besonderen Rechte) und den Neustart beim Agenten
    // anfordern (App\Services\Deployment\UpdateChannel::requestRestart()).
    'env_restart_title' => 'Was beim Speichern automatisch passiert',
    'env_restart_body' => 'queue, queue-provisioning, scheduler und reverb lesen .env nur beim eigenen Start. Speichern hier löst deshalb automatisch aus: der Konfigurations-Cache wird geleert, und diese vier Dienste werden neu gestartet. Diese Konsole selbst (app) wird dabei nie angefasst — sie bedient gerade die Anfrage, die das ausgelöst hat, und ihr PHP liest .env bei jeder neuen Anfrage ohnehin frisch.',
    'env_restarting' => 'Dienste werden neu gestartet …',
    'env_restart_done' => 'Dienste neu gestartet.',

    'env_save_title' => '.env wirklich überschreiben?',
    'env_save_body' => 'Sie enthält jedes Zugangsdatum im System. Eine Sicherung wird zuvor angelegt, und die betroffenen Dienste werden nach dem Speichern automatisch neu gestartet.',
    'env_save_confirm' => 'Überschreiben',
    // Drei Ausgänge nach dem Schreiben, nie eine geschönte Erfolgsmeldung: der
    // Neustart wurde angefordert, oder er konnte es nicht — weil der
    // Host-Agent nicht läuft oder weil schon etwas anderes läuft — und dann
    // steht hier der manuelle Befehl statt eines Versprechens.
    'env_saved_restarting' => 'Gespeichert. Sicherung: :backup. Konfigurations-Cache geleert — queue, queue-provisioning, scheduler und reverb werden jetzt neu gestartet.',
    'env_saved_restart_busy' => 'Gespeichert. Sicherung: :backup. Es läuft gerade schon eine andere Anfrage an den Update-Dienst — der Neustart entfällt diesmal automatisch. Bitte manuell ausführen: docker compose restart queue scheduler reverb.',
    'env_saved_no_agent' => 'Gespeichert. Sicherung: :backup. Der Update-Dienst auf dem Server läuft nicht — queue, scheduler und reverb halten noch die alten Werte. Bitte manuell ausführen: docker compose restart queue scheduler reverb.',
    // Nur wenn keine .env vorher existierte — dann gibt es nichts zu sichern.
    'env_no_previous_file' => 'keine, da zuvor keine Datei existierte',

    'env_invalid' => 'Zeile :line ist weder leer, noch ein Kommentar, noch SCHLÜSSEL=Wert. Nichts wurde gespeichert.',
    'env_empty' => 'Eine leere Datei würde jede Einstellung löschen. Nichts wurde gespeichert.',
    'inbound_title' => 'Support-Postfach (Posteingang)',
    'inbound_body' => 'Von hier holt CluPilot Kundenmails ab und zeigt sie unter Betrieb → Posteingang. IMAP, nicht die mailcow-API: die API verwaltet Domains und Postfächer, gelesen wird ein Postfach über IMAP. Das Passwort liegt verschlüsselt im Tresor.',
    'inbound_host' => 'IMAP-Server',
    'inbound_port' => 'Port',
    'inbound_port_hint' => '993 ist IMAP über TLS. Alles andere läuft unverschlüsselt — dieser Zugang trägt ein Passwort und die Worte Ihrer Kunden.',
    'inbound_username' => 'Postfach',
    'inbound_folder' => 'Ordner',
    'inbound_test' => 'Verbindung prüfen',
    'inbound_never' => 'Noch nie geprüft.',
    'inbound_last_ok' => 'Zuletzt erreichbar: :when (:ago)',
    'inbound_last_failed' => 'Zuletzt fehlgeschlagen: :when (:ago)',
    'inbound_ok' => 'Postfach erreichbar.',
    'inbound_ok_waiting' => '{0} Postfach erreichbar, nichts Ungelesenes.|{1} Postfach erreichbar, :count ungelesene Nachricht.|[2,*] Postfach erreichbar, :count ungelesene Nachrichten.',
    'inbound_failed_incomplete' => 'Es fehlen noch Angaben: Server, Postfach oder Passwort.',
    'inbound_failed_unreachable' => 'Der Server ist nicht erreichbar. Stimmen Adresse und Port?',
    'inbound_failed_credentials' => 'Der Server hat die Anmeldung abgelehnt. Stimmen Postfach und Passwort?',
    'inbound_failed_folder' => 'Anmeldung hat funktioniert, den Ordner gibt es aber nicht.',
    'inbound_failed_failed' => 'Die Verbindung ist fehlgeschlagen. Näheres steht im Log.',

    // Die Reiter. Getrennt nach dem, wofür ein Abschnitt da ist — nicht danach,
    // welcher Speichermechanismus einen Wert zufällig hält.
    'tab' => [
        'services' => 'Dienste',
        'platform' => 'Plattform',
        'env' => 'Umgebung (.env)',
    ],
];
