de: admin: layout: title: "Match Live TV — Admin" nav: dashboard: Dashboard ops: Ops announcements: Hinweise clubs: Vereine & Teams billing: Abrechnung youtube: YouTube sessions: Sitzungen stream_concurrency: Konto-Missbrauch analytics: Analytics costs: Kosten stream_nodes: Stream-Knoten password: Passwort logout: Abmelden flash: login_required: Bitte melde dich an, um fortzufahren login_success: Erfolgreich angemeldet invalid_credentials: Ungültiger Benutzername oder Passwort logout_success: Abgemeldet password_current_incorrect: Das aktuelle Passwort ist falsch password_too_short: Das neue Passwort muss mindestens 8 Zeichen lang sein password_too_long: Das neue Passwort darf höchstens 72 Zeichen lang sein password_too_weak: Das neue Passwort muss mindestens 3 aus Kleinbuchstaben, Großbuchstaben, Zahlen und Symbolen enthalten password_same_as_current: Das neue Passwort muss sich vom aktuellen unterscheiden password_mismatch: Die Passwörter stimmen nicht überein password_updated: Passwort aktualisiert ops_acknowledged: Vorfall übernommen ops_resolved: Vorfall gelöst ops_muted: Benachrichtigungen für 24 Stunden stummgeschaltet stream_node_created: "Lab-Knoten %{slug} bereitgestellt." stream_node_destroyed: "Knoten %{slug} entfernt." stream_node_draining: "Knoten %{slug} im Drain-Modus." autoscale_kill_on: "Autoscaler-Kill-Switch aktiv. Kein automatisches Scale-out." autoscale_kill_off: "Autoscaler-Kill-Switch aus (STREAM_AUTOSCALE_ENABLED=1 weiterhin nötig)." comped_granted: "Kostenloses Abonnement %{plan} für %{club} aktiviert." comped_revoked: "Kostenloses Abonnement für %{club} widerrufen." session_already_terminated: "Sitzung bereits beendet (%{status})." session_stopped: Sitzung beendet. session_stop_error: "Fehler beim Beenden: %{error}" session_terminated_no_regia: "Sitzung beendet: Regie-Link kann nicht erzeugt werden." session_regia_generated: Regie-Link erzeugt. invoice_upload_hint: Lade das PDF aus der Liste „Zu berechnende Zahlungen“ hoch. invoice_draft_created: Entwurf erstellt. Lade das PDF auf der Abrechnungsseite oder unten hoch. invoice_issued: "Rechnung %{number} ausgestellt und an %{email} gesendet." invoice_updated: "Rechnung %{number} aktualisiert." invoice_uploaded: "Rechnung hochgeladen und an %{email} gesendet." youtube_not_configured: Konfiguriere YOUTUBE_CLIENT_ID und YOUTUBE_CLIENT_SECRET in .env announcement_created: Hinweis gespeichert announcement_updated: Hinweis aktualisiert announcement_destroyed: Hinweis gelöscht cost_entry_created: Kostenposition gespeichert. cost_entry_updated: Kostenposition aktualisiert. cost_entry_destroyed: Kostenposition gelöscht. common: free_plan: Free yes: "Ja" no: "Nein" dash: "—" live_page: Live-Seite auth: new: title: Admin-Anmeldung username_label: Benutzername password_label: Passwort submit: Anmelden initial_credentials_html: "Anfangs-Zugangsdaten: admin / AdminPass123. Ändere das Passwort nach der ersten Anmeldung." passwords: edit: title: Passwort ändern current_password_label: Aktuelles Passwort new_password_label: "Neues Passwort (mind. 8, mindestens 3 Zeichenarten)" confirm_password_label: Neues Passwort bestätigen submit: Passwort speichern cancel: Abbrechen dashboard: kpi: active_sessions: Aktive Sitzungen active_sessions_sub: gerade live today: Heute übertragen today_sub: "%{duration} Streaming" month: Diesen Monat übertragen month_sub: "%{duration} insgesamt" teams: Teams teams_sub: "%{count} Nutzer" cpu: CPU cpu_sub: "Last %{one} / %{five} / %{fifteen}" ram: RAM ram_sub: "%{used} / %{total}" network: Bandbreite (gesamt) network_sub: "↑ %{tx} · ↓ %{rx}" recordings: Replays im Archiv recordings_sub: "%{count} Aufnahmen" charts: cpu: CPU (%) ram: RAM (%) ops_panel: title: Plattformstatus (Ops) critical: "%{count} kritische(r) offene(r) Vorfall/Vorfälle" view_dashboard: Ops-Dashboard ansehen warnings: "%{count} Warnung(en)" dashboard_link: Ops-Dashboard none_html: "Keine offenen Vorfälle. %{link}" concurrency_panel: title: Konto-Missbrauch (zweite Direktübertragung) count: "%{count} Versuch(e) in den letzten 30 Tagen" view_all: Alle ansehen none: Keine Versuche erfasst. none_html: "Keine Versuche einer zweiten Direktübertragung mit demselben Konto. %{link}" disk: system_title: Systemfestplatte free_label: "Frei: %{free} (%{percent}% belegt)" not_available: Festplattenmetriken nicht verfügbar recordings_title: Aufnahmearchiv recordings_content: "Inhalt der Aufnahmen: %{size}" recordings_not_mounted: "Pfad %{path} nicht eingebunden" sessions: title: Aktive Sitzungen table: match: Spiel status: Status client: Client ingest: Ingest start: Start link: Link none: Derzeit keine aktive Sitzung. detail: Details stop: Beenden stop_confirm: Diese Sitzung beenden? regia: Regie teams: title: Teams matches_count: "%{count} Spiele" view_all: "Vereine ansehen (%{count} Teams)" stream_nodes: title: Stream-Knoten providers: "Cloud: %{cloud} · DNS: %{dns}" actions_title: Aktionen table_title: Registrierte Knoten empty: Keine Knoten registriert. free_slots: one: "%{count} frei" other: "%{count} frei" kpi: autoscaler: Autoscaler kill_switch: KILL kind: "Modus %{kind}" free_slots: Freie Slots soft_slots: "Soft-Schwelle ≤ %{soft}" spare: Spare warm_spare: Warm-Spares bereit overflow: Overflow overflow_nodes: Cloud/Lab-Knoten budget: Geschätztes Budget budget_of: "von €%{budget}/Monat (%{ok})" autoscale: "Autoscaler %{enabled} · free_slots=%{free} (soft≤%{soft}) · spare=%{spare}/%{warm} · overflow=%{overflow}/%{max} · kind=%{kind}" autoscale_budget: "Budget €%{eur}/€%{budget} (%{ok})" kill_switch_active: "KILL-SWITCH AKTIV" engage_kill_switch: "Kill-switch ON" clear_kill_switch: "Kill-switch OFF" kill_switch_confirm: "Autoscaler sofort blockieren?" provision_lab: Lab bereitstellen provision_cloud: Hetzner bereitstellen provision_cloud_confirm: "Hetzner Cloud Server + DNS auf mltv-stream.net erstellen?" hetzner_token_missing: "HCLOUD_TOKEN setzen, um Cloud-Provisioning zu aktivieren." drain: Drain destroy: Löschen destroy_confirm: "Knoten %{slug} löschen?" hosts_title: Lab-DNS (/etc/hosts) col: slug: Slug role: Rolle status: Status slots: Slots hostname: Hostname provider: Provider ops: kpi: critical: Kritisch offen warning: Warnungen offen total: Insgesamt offen open: title: Offene Vorfälle table: severity: Schweregrad kind: Typ title: Titel occurrences: Anz. last_seen: Zuletzt none: Keine offenen Vorfälle. Die Plattform ist gesund. actions: acknowledge: Übernommen resolve: Lösen mute: Stumm 24h resolved: title: Gelöst (letzte 30 Tage) table: resolved_at: Gelöst none: Kürzlich keine Vorfälle gelöst. stream_concurrency: index: title: Konto-Missbrauch lead: Versuche, mit demselben Konto eine zweite Direktübertragung zu starten, während bereits eine lief (connecting, live, reconnecting oder pausiert). results: "%{shown} von %{total} angezeigt" none: Keine Versuche erfasst. kpi: lookback: Letzte 30 Tage lookback_sub: blockierte Versuche two_devices: Zwei Geräte two_devices_sub: unterschiedliche Handy-Modelle filters: q: Suche q_placeholder: E-Mail, Verein, Spiel… two_devices: Filter two_devices_hint: Nur Versuche von unterschiedlichen Geräten apply: Filtern reset: Zurücksetzen table: when: Wann account: Konto club: Verein occupying: Bereits laufende Direktübertragung attempted: Blockierter Versuch action: start: Start resume: Fortsetzen badge: two_devices: 2 Telefone same_or_unknown: gleiches Gerät / n. v. clubs: index: title: Vereine & Teams subtitle_html: "Kostenlose Abonnements (Sponsoren / Aktionen) und YouTube-Status pro Team. Stripe-Zahlungen: %{billing_link}." billing_link: Abrechnung table: club: Verein plan: Plan teams: Teams comped: Kostenlos stripe: Stripe manage: Verwalten invoices: Rechnungen show: back: "← Vereine & Teams" sport_label: "Sportart: %{sport}" recordings_archive: Replay-Archiv billing_link: Zahlungen & Rechnungen youtube_platform_link: Plattform-YouTube-Kanal youtube_club_label: "Vereins-YouTube:" youtube_connected: (verbunden) youtube_premium_full_not_connected: Premium Full — Vereinskanal nicht verbunden (nutzt Match Live TV) no_channel_hint_html: "Ohne verbundenen Kanal nutzt die App den Match-Live-TV-Kanal. %{link}." link_channel: Kanal verbinden (Vereinsseite) teams_title: Teams no_teams: Keine Teams registriert. table: team: Team sport: Sportart matches_and_details: Spiele & Details replay: Replays concurrency_title: Versuche einer zweiten Direktübertragung concurrency_lead: Dasselbe Konto hat versucht, eine weitere Direktübertragung zu starten, während bereits eine lief. concurrency_none: Keine Versuche für diesen Verein erfasst. concurrency_all: Alle Konto-Missbräuche ansehen comped: title: Kostenloses Abonnement description: "Sponsor oder Aktion: Vergib Premium Light/Full ohne Stripe-Zahlung. Jederzeit widerrufbar." active_label: "Aktiv:" since_label_html: "Seit %{date}" by_admin: "· Admin %{username}" stripe_note: "Hinweis: Es existiert auch ein verknüpftes Stripe-Abo; das kostenlose Abo hat Vorrang vor dem Plan." revoke_button: Kostenloses Abo widerrufen (zurück zu Free oder Stripe wiederherstellen) revoke_confirm: "Das kostenlose Abonnement für %{club} widerrufen?" current_plan: "Aktueller Plan: %{plan}" stripe_active: "· aktive Stripe-Zahlung" plan_label: Plan reason_label: "Grund (z. B. Sponsor 2026)" reason_placeholder: "Sponsor, Aktion…" grant_button: Kostenloses Abo gewähren teams: show: back: "← %{club}" sport_label: "Sportart: %{sport}" club_label_html: "Verein: %{club} · %{replay_link} · %{billing_link}" replay_link: Team-Replays billing_link: Zahlungen & Rechnungen youtube_label: "YouTube:" youtube_platform_default_no_oauth: ", Standard ohne Vereins-OAuth" youtube_platform_channel: "(Plattformkanal%{suffix})" youtube_club_channel: (Vereinskanal) youtube_not_ready: nicht bereit no_channel_hint_html: "Ohne verbundenen Kanal nutzt die App den Match-Live-TV-Kanal. %{link}." link_channel: Kanal verbinden (Vereinsseite) matches_title: Spiele sessions: index: title: Stream-Sitzungen lead: Suche nach Verein, Team, Gegner oder Ort. Filtere nach Status, Plattform, Knoten und Zeitraum. results: "%{shown} von %{total} angezeigt" none: Keine Sitzungen für diese Filter. filters: q: Suche q_placeholder: Verein, Team, Gegner… status: Status platform: Plattform club: Verein node: Ingest-Knoten from: Von to: Bis any: Alle apply: Filtern reset: Zurücksetzen table: club: Verein match: Spiel status: Status started: Start ended: Ende duration: Dauer ingest: Ingest disconnects: Verbindungsabbrüche client: Client link: Link detail: Details regia: Regie show: title: "Sitzung %{id}" heading: Sitzungsdetails back: "← Zurück zu Sitzungen" club_label: "Verein:" summary_title: Übersicht timing_title: Zeiten ingest_title: Ingest & Medien devices_title: Geräte events_title: Ereignisse events_none: Keine Ereignisse erfasst. concurrency_title: Versuche einer zweiten Direktübertragung concurrency_lead: Dieses Konto hat versucht, eine weitere Direktübertragung zu starten, während diese bereits lief (oder wurde von einer anderen Sitzung desselben Kontos blockiert). status_label: "Status:" stop_button: Sitzung beenden stop_confirm: "Übertragung beenden? Der RTMP-Pfad wird entfernt und der Status wechselt zu beendet." match_label: "Spiel: %{team} gegen %{opponent}" youtube_studio: YouTube Studio broadcast: Übertragung open_replays: Vereins-Replays öffnen audio_muted: Audio stumm audio_on: Audio an ingest_node: "Ingest-Knoten:" rtmp_ingest: "RTMP-Ingest:" fields: id: ID club: Verein team: Team opponent: Gegner operator: Operator platform: Plattform client_os: System app_version: App-Version device: Gerät os_version: OS-Version carrier: Mobilfunkanbieter privacy: Privacy quality: Qualität min_quality: Min. Qualität audio: Audio created: Erstellt started: Start ended: Ende duration: Dauer disconnects: Abbrüche scheduled: Geplantes Spiel location: Ort node: Knoten rtmp: RTMP-Ingest hls: HLS recording: Replay devices: role: Rolle network: Netz battery: Akku bitrate: Bitrate fps: FPS last_seen: Zuletzt gesehen table: type: Typ when: Wann meta: Details links: watch_title: Live-Link none: Kein Video-Link für diese Sitzung verfügbar. regia_title: Regie-Link terminated: Sitzung beendet — Regie-Link nicht verfügbar. regia_label: Regie valid_until: "Gültig bis %{date}" active_exists: Es existiert bereits ein aktiver Regie-Link (die URL kann nicht abgerufen werden). Erzeuge einen neuen, wenn du ihn erneut teilen musst. none_active: Kein aktiver Regie-Link. Erzeuge einen Link zum Teilen mit der Person, die den Spielstand verwaltet. generate_button: Regie-Link erzeugen ingest: none: "—" decommissioned: "(Knoten entfernt)" role: home: Home-lab lab: Lab cloud: Hetzner analytics: missing_path: Seite auswählen. filters: from: Von to: Bis device: Gerät any: Alle apply: Filtern reset: Zurücksetzen chart_path: Seite (Diagramm) chart_path_all: Alle Seiten layer: Ebene layer_move: Mausbewegungen layer_click: Klicks devices: mobile: Mobil tablet: Tablet desktop: Desktop index: title: Website-Analytics lead: Aggregierte First-Party-Heatmaps (Bewegung/Klick) und Scrolltiefe, nur mit Statistik-Einwilligung. Keine personenbezogenen Daten. none: Keine Daten im gewählten Zeitraum. heatmap: Heatmap chart_for_path: Diagramm trend_title: Pageview-Verlauf trend_lead: Gesamte Pageviews aller Seiten, Tag für Tag. Dieselben Filter Von / Bis / Gerät. Seite im Filter wählen oder «Diagramm» in der Tabelle. trend_lead_path: "Tägliche Pageviews nur für %{path} (gleiche Filter Von / Bis / Gerät)." trend_total_label: Pageviews gesamt (alle Seiten) trend_total_label_path: Pageviews der gewählten Seite trend_total_hint: "%{from} → %{to}" hide_chart: Diagramm ausblenden show_chart: Diagramm anzeigen pages_title: Aufschlüsselung nach Seite pages_lead: Pageviews und Engagement im gefilterten Zeitraum, nach Pfad. «Diagramm» zeigt den Verlauf einer Seite. table: path: Seite pageviews: Pageviews moves: Bewegungen clicks: Klicks avg_scroll: Scroll Ø max_scroll: Scroll max show: title: Seiten-Heatmap back: "← Zurück zu Analytics" summary: Übersicht scroll_depth: Scrolltiefe scroll_hint: "Durchschnitt %{avg}% · Maximum %{max}%" heatmap_moves: Mausbewegungs-Karte heatmap_clicks: Klickkarte heatmap_hint: Farbiges Overlay auf dem %{device}-Screenshot. Grün = wenig, Rot = viel. Daten werden nicht zwischen Geräten gemischt. device_tabs_label: Gerät preview_title: Seiten-Screenshot preview_unavailable: Vorschau für Pfade mit Platzhalter nicht verfügbar (z. B. /clubs/:id). snapshot_missing: Noch kein Screenshot für %{device}. Seite auf diesem Gerät mit Analytics-Einwilligung besuchen und erneut versuchen. snapshot_meta: "Screenshot %{device} · %{at}" no_points: Keine aggregierten Punkte für diese Ebene im Zeitraum. heatmap_title: Klickkarte no_clicks: Keine aggregierten Klicks für diese Seite im Zeitraum. preview: title: Vorschau ohne Tracking lead: Öffentliche Website durchsuchen ohne Pageviews, Klicks, Bewegungen oder Heatmap-Screenshots zu speichern. Für Produktionstests. active: Staff-Vorschau in diesem Browser aktiv (7 Tage oder bis Deaktivierung). enable: Staff-Vorschau aktivieren disable: Vorschau deaktivieren open_site: Website öffnen enabled: Staff-Vorschau aktiviert. Dieser Browser speichert keine Analytics. disabled: Staff-Vorschau deaktiviert. billing: index: title: Zu berechnende Zahlungen description: Bezahlte Stripe-Zahlungen ohne Rechnungs-PDF. Erstelle das PDF in deinen Systemen und lade es hier hoch — es wird der Zahlung zugeordnet und dem Kunden per E-Mail gesendet. filter_label: "Vereine filtern:" filter_all: Alle incomplete_profile_warning: Rechnungsdaten unvollständig no_billing_data: Keine Rechnungsdaten — der Kunde muss sein Profil vervollständigen. pdf_label: Rechnungs-PDF upload_button: PDF hochladen und an Kunden senden none_pending: "Keine Zahlungen warten auf eine Rechnung%{club}." none_pending_for_club: " für %{club}" uploaded_title: Bereits hochgeladene Rechnungen table: date: Datum club: Verein description: Beschreibung amount: Betrag invoice: Rechnung status: Status back_dashboard: "← Dashboard" billing_invoices: index: title: "Abrechnung — %{club}" back_dashboard: "← Dashboard" new_invoice: Neue Rechnung (ohne Zahlung) payments_title: Zahlungen table: date: Datum description: Beschreibung amount: Betrag invoice: Rechnung pdf_suffix: " (PDF)" edit_send_pdf: Bearbeiten / PDF senden create_invoice: Rechnung erstellen no_payments: Keine Zahlungen für diesen Verein erfasst. all_invoices_title: Alle Rechnungen table2: number: Nummer date: Datum amount: Betrag status: Status payment: Zahlung edit: Bearbeiten no_invoices: Keine Rechnungen. new: title: "Neue Rechnung — %{club}" linked_payment: "Verknüpft mit der Zahlung vom %{date} (%{amount})." number_label: Rechnungsnummer issued_on_label: Ausstellungsdatum amount_label: "Betrag (€)" notes_label: Interne Notizen (optional) hint: Speichere den Entwurf, lade dann das PDF hoch und sende es dem Kunden vom nächsten Bildschirm aus. submit: Rechnungsentwurf erstellen back: "← Zahlungen & Rechnungen" edit: title: "Rechnung %{number} — %{club}" status_label: "Status:" sent_at: "· Gesendet am %{date}" number_label: Rechnungsnummer issued_on_label: Ausstellungsdatum amount_label: "Betrag (€)" payment_info: "Zahlung: %{description} — %{amount}" pdf_label: Rechnungs-PDF pdf_already: "PDF bereits hochgeladen: %{filename}" notes_label: Interne Notizen save_draft: Entwurf speichern issue_send: Ausstellen und per E-Mail senden issue_confirm: "Die Rechnung an %{email} senden?" back: "← Zahlungen & Rechnungen" youtube: platform_token: title: Token für den Match-Live-TV-Kanal page_title: "YouTube-Token — Match Live TV" channel_label: "Kanal: %{title}" success: "Verbindung erfolgreich. Kopiere diese Zeile sofort:" env_hint_html: "Füge zu /opt/matchlivetv/infra/.env hinzu:" not_shown_again_html: "Wird nicht erneut angezeigt. Danach: docker compose -f docker-compose.prod.yml restart rails sidekiq" no_refresh_token_html: "Google hat keinen Refresh-Token zurückgegeben. Widerrufe in deinem Google-Konto → App-Zugriff „Match Live TV“ und wiederhole den Vorgang ab /admin/youtube/platform." back_dashboard: "← Admin-Dashboard" club_recordings: index: title: "Replays — %{club}" announcements: index: title: Hinweise lead: Meldungen für die Apps, die öffentliche Website und den Login-Bereich — Wartung, Updates oder Mitteilungen. new: Neuer Hinweis table_title: Hinweise none: Noch keine Hinweise. Erstelle einen, um Apps und Website zu informieren. new: title: Neuer Hinweis edit: title: Hinweis bearbeiten table: status: Status kind: Typ title: Nachricht channels: Ziele window: Zeitraum actions: edit: Bearbeiten delete: Löschen delete_confirm: Diesen Hinweis löschen? Er erscheint nicht mehr an den gewählten Stellen. kind: info: Information maintenance: Wartung update: App-Update severity: info: Info warning: Warnung critical: Kritisch status: draft: Entwurf published: Veröffentlicht archived: Archiviert channels: android: Android-App ios: iOS-App web_public: Öffentliche Website web_private: Login-Bereich window: always: Immer (solange veröffentlicht) from: "Ab %{time}" until: "Bis %{time}" form: kind: Typ severity: Schwere status: Status channels: Wo anzeigen channels_hint: "Eine oder mehrere Ziele wählen. Android und iOS sind unabhängig: bei unterschiedlichem Text zwei Hinweise anlegen. Der Login-Bereich ist nach der Anmeldung sichtbar (Verein, Teams, Konto)." title: Titel body: Text starts_at: Sichtbar ab ends_at: Sichtbar bis window_hint: Leer lassen, um sofort und solange veröffentlicht anzuzeigen. action_url: Link (optional) action_url_hint: Bei Updates öffnet eine leere URL den Store der Plattform (Play Store auf Android, App Store auf iOS). action_label: Button-Text locales_legend: Text pro Sprache locales_hint: Alle App-Sprachen ausfüllen (Italienisch, Englisch, Französisch, Deutsch, Spanisch). Italienisch ist Pflicht; fehlende Sprachen fallen auf Englisch, dann Italienisch zurück. locale_required: Pflicht dismissible: Nutzer können den Hinweis schließen dismissible_hint: Haken entfernen für Wartungshinweise, die sichtbar bleiben sollen. submit_create: Hinweis speichern submit_update: Hinweis aktualisieren cancel: Abbrechen