Completa i18n IT/EN/FR/DE/ES su sito pubblico, area autenticata e admin.
Tutte le view marketing, legali, viewer, dashboard e admin usano t(); mailer utente-facing e flash localizzati; admin con LocaleResolver e selettore lingua. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,311 @@
|
||||
de:
|
||||
admin:
|
||||
layout:
|
||||
title: "Match Live TV — Admin"
|
||||
nav:
|
||||
dashboard: Dashboard
|
||||
ops: Ops
|
||||
clubs: Vereine & Teams
|
||||
billing: Abrechnung
|
||||
youtube: YouTube
|
||||
sessions: Sitzungen
|
||||
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_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
|
||||
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
|
||||
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: <code>admin</code> / <code>admin</code>. Ändere das Passwort nach der ersten Anmeldung."
|
||||
passwords:
|
||||
edit:
|
||||
title: Passwort ändern
|
||||
current_password_label: Aktuelles Passwort
|
||||
new_password_label: "Neues Passwort (mind. 8 Zeichen)"
|
||||
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
|
||||
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)"
|
||||
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
|
||||
table:
|
||||
match: Spiel
|
||||
status: Status
|
||||
disconnects: Verbindungsabbrüche
|
||||
link: Link
|
||||
detail: Details
|
||||
regia: Regie
|
||||
show:
|
||||
title: "Sitzung %{id}"
|
||||
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
|
||||
rtmp_ingest: "RTMP-Ingest:"
|
||||
events_title: Ereignisse
|
||||
table:
|
||||
type: Typ
|
||||
when: Wann
|
||||
meta: Meta
|
||||
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
|
||||
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 <code>/opt/matchlivetv/infra/.env</code> hinzu:"
|
||||
not_shown_again_html: "Wird nicht erneut angezeigt. Danach: <code>docker compose -f docker-compose.prod.yml restart rails sidekiq</code>"
|
||||
no_refresh_token_html: "Google hat keinen Refresh-Token zurückgegeben. Widerrufe in deinem <a href=\"https://myaccount.google.com/permissions\" target=\"_blank\" rel=\"noopener\">Google-Konto → App-Zugriff</a> „Match Live TV“ und wiederhole den Vorgang ab <a href=\"/admin/youtube/platform\">/admin/youtube/platform</a>."
|
||||
back_dashboard: "← Admin-Dashboard"
|
||||
club_recordings:
|
||||
index:
|
||||
title: "Replays — %{club}"
|
||||
Reference in New Issue
Block a user