de:
admin:
layout:
title: "Match Live TV — Admin"
nav:
dashboard: Dashboard
ops: Ops
announcements: Hinweise
clubs: Vereine & Teams
billing: Abrechnung
youtube: YouTube
sessions: Sitzungen
analytics: Analytics
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
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}"
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.
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
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.
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: "—"
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
layer: Ebene
layer_move: Mausbewegungen
layer_click: Klicks
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
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 Seiten-Screenshot. Grün = wenig, Rot = viel.
preview_title: Seiten-Screenshot
preview_unavailable: Vorschau für Pfade mit Platzhalter nicht verfügbar (z. B. /clubs/:id).
snapshot_missing: Noch kein Screenshot. Seite mit Analytics-Einwilligung (Desktop) 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.
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