Migliora sessioni admin e rende robusto il logout web.

Aggiunge filtri/colonne (società, orari) e dettaglio leggibile; evita 422 CSRF su logout e non cancella le cover slate custom in sync prod.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-20 20:41:12 +02:00
co-authored by Cursor
parent 79c48b226e
commit cc96c0396a
20 changed files with 1127 additions and 91 deletions
+61 -2
View File
@@ -251,9 +251,28 @@ de:
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
link: Link
@@ -261,19 +280,59 @@ de:
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:"
events_title: Ereignisse
fields:
id: ID
club: Verein
team: Team
opponent: Gegner
operator: Operator
platform: Plattform
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: Meta
meta: Details
links:
watch_title: Live-Link
none: Kein Video-Link für diese Sitzung verfügbar.
+61 -2
View File
@@ -251,9 +251,28 @@ en:
sessions:
index:
title: Stream sessions
lead: Search by club, team, opponent or venue. Filter by status, platform, node and date range.
results: "Showing %{shown} of %{total}"
none: No sessions match these filters.
filters:
q: Search
q_placeholder: Club, team, opponent…
status: Status
platform: Platform
club: Club
node: Ingest node
from: From
to: To
any: All
apply: Filter
reset: Reset
table:
club: Club
match: Match
status: Status
started: Started
ended: Ended
duration: Duration
ingest: Ingest
disconnects: Disconnects
link: Link
@@ -261,19 +280,59 @@ en:
regia: Control
show:
title: "Session %{id}"
heading: Session details
back: "← Back to sessions"
club_label: "Club:"
summary_title: Summary
timing_title: Timing
ingest_title: Ingest & media
devices_title: Devices
events_title: Events
events_none: No events recorded.
status_label: "Status:"
stop_button: End session
stop_confirm: "End the broadcast? The RTMP path will be removed and the status will move to ended."
match_label: "Match: %{team} vs %{opponent}"
youtube_studio: YouTube Studio
broadcast: Broadcast
open_replays: Open club replays
audio_muted: Audio muted
audio_on: Audio on
ingest_node: "Ingest node:"
rtmp_ingest: "RTMP ingest:"
events_title: Events
fields:
id: ID
club: Club
team: Team
opponent: Opponent
operator: Operator
platform: Platform
privacy: Privacy
quality: Quality
min_quality: Min quality
audio: Audio
created: Created
started: Started
ended: Ended
duration: Duration
disconnects: Disconnects
scheduled: Scheduled match
location: Venue
node: Node
rtmp: RTMP ingest
hls: HLS
recording: Replay
devices:
role: Role
network: Network
battery: Battery
bitrate: Bitrate
fps: FPS
last_seen: Last seen
table:
type: Type
when: When
meta: Meta
meta: Details
links:
watch_title: Live link
none: No video link available for this session.
+61 -2
View File
@@ -251,9 +251,28 @@ es:
sessions:
index:
title: Sesiones de emisión
lead: Busca por club, equipo, rival o sede. Filtra por estado, plataforma, nodo y periodo.
results: "Mostrando %{shown} de %{total}"
none: Ninguna sesión coincide con estos filtros.
filters:
q: Buscar
q_placeholder: Club, equipo, rival…
status: Estado
platform: Plataforma
club: Club
node: Nodo ingest
from: Desde
to: Hasta
any: Todos
apply: Filtrar
reset: Restablecer
table:
club: Club
match: Partido
status: Estado
started: Inicio
ended: Fin
duration: Duración
ingest: Ingest
disconnects: Desconexiones
link: Enlace
@@ -261,19 +280,59 @@ es:
regia: Regie
show:
title: "Sesión %{id}"
heading: Detalle de sesión
back: "← Volver a sesiones"
club_label: "Club:"
summary_title: Resumen
timing_title: Tiempos
ingest_title: Ingest y medios
devices_title: Dispositivos
events_title: Eventos
events_none: No hay eventos registrados.
status_label: "Estado:"
stop_button: Finalizar sesión
stop_confirm: "¿Finalizar la emisión? La ruta RTMP se eliminará y el estado pasará a finalizada."
match_label: "Partido: %{team} vs %{opponent}"
youtube_studio: YouTube Studio
broadcast: Emisión
open_replays: Abrir replays del club
audio_muted: Audio silenciado
audio_on: Audio activo
ingest_node: "Nodo ingest:"
rtmp_ingest: "Ingesta RTMP:"
events_title: Eventos
fields:
id: ID
club: Club
team: Equipo
opponent: Rival
operator: Operador
platform: Plataforma
privacy: Privacidad
quality: Calidad
min_quality: Calidad mínima
audio: Audio
created: Creada
started: Inicio
ended: Fin
duration: Duración
disconnects: Desconexiones
scheduled: Partido programado
location: Sede
node: Nodo
rtmp: Ingesta RTMP
hls: HLS
recording: Replay
devices:
role: Rol
network: Red
battery: Batería
bitrate: Bitrate
fps: FPS
last_seen: Último contacto
table:
type: Tipo
when: Cuándo
meta: Meta
meta: Detalles
links:
watch_title: Enlace en directo
none: No hay ningún enlace de vídeo disponible para esta sesión.
+61 -2
View File
@@ -251,9 +251,28 @@ fr:
sessions:
index:
title: Sessions de diffusion
lead: Recherchez par club, équipe, adversaire ou lieu. Filtrez par statut, plateforme, nœud et période.
results: "%{shown} sur %{total} affichées"
none: Aucune session ne correspond à ces filtres.
filters:
q: Recherche
q_placeholder: Club, équipe, adversaire…
status: Statut
platform: Plateforme
club: Club
node: Nœud ingest
from: Du
to: Au
any: Tous
apply: Filtrer
reset: Réinitialiser
table:
club: Club
match: Match
status: Statut
started: Début
ended: Fin
duration: Durée
ingest: Ingest
disconnects: Déconnexions
link: Lien
@@ -261,19 +280,59 @@ fr:
regia: Régie
show:
title: "Session %{id}"
heading: Détail de la session
back: "← Retour aux sessions"
club_label: "Club :"
summary_title: Résumé
timing_title: Horaires
ingest_title: Ingest et médias
devices_title: Appareils
events_title: Événements
events_none: Aucun événement enregistré.
status_label: "Statut :"
stop_button: Terminer la session
stop_confirm: "Terminer la diffusion ? Le chemin RTMP sera supprimé et le statut passera à terminé."
match_label: "Match : %{team} contre %{opponent}"
youtube_studio: YouTube Studio
broadcast: Diffusion
open_replays: Ouvrir les replays du club
audio_muted: Audio coupé
audio_on: Audio actif
ingest_node: "Nœud ingest :"
rtmp_ingest: "Ingestion RTMP :"
events_title: Événements
fields:
id: ID
club: Club
team: Équipe
opponent: Adversaire
operator: Opérateur
platform: Plateforme
privacy: Confidentialité
quality: Qualité
min_quality: Qualité mini
audio: Audio
created: Créée
started: Début
ended: Fin
duration: Durée
disconnects: Déconnexions
scheduled: Match programmé
location: Lieu
node: Nœud
rtmp: Ingestion RTMP
hls: HLS
recording: Replay
devices:
role: Rôle
network: Réseau
battery: Batterie
bitrate: Débit
fps: FPS
last_seen: Dernier contact
table:
type: Type
when: Quand
meta: Méta
meta: Détails
links:
watch_title: Lien en direct
none: Aucun lien vidéo disponible pour cette session.
+61 -2
View File
@@ -272,9 +272,28 @@ it:
sessions:
index:
title: Sessioni di streaming
lead: Cerca per società, squadra, avversario o sede. Filtra per stato, piattaforma, nodo e periodo.
results: "Mostrate %{shown} di %{total}"
none: Nessuna sessione trovata con questi filtri.
filters:
q: Cerca
q_placeholder: Società, squadra, avversario…
status: Stato
platform: Piattaforma
club: Società
node: Nodo ingest
from: Da
to: A
any: Tutti
apply: Filtra
reset: Azzera
table:
club: Società
match: Match
status: Stato
started: Inizio
ended: Fine
duration: Durata
ingest: Ingest
disconnects: Disconnessioni
link: Link
@@ -282,19 +301,59 @@ it:
regia: Regia
show:
title: "Sessione %{id}"
heading: Dettaglio sessione
back: "← Torna alle sessioni"
club_label: "Società:"
summary_title: Riepilogo
timing_title: Tempi
ingest_title: Ingest e media
devices_title: Dispositivi
events_title: Eventi
events_none: Nessun evento registrato.
status_label: "Stato:"
stop_button: Termina sessione
stop_confirm: "Terminare la trasmissione? Il path RTMP verrà rimosso e lo stato passerà a ended."
match_label: "Match: %{team} vs %{opponent}"
youtube_studio: YouTube Studio
broadcast: Broadcast
open_replays: Apri replay società
audio_muted: Audio muto
audio_on: Audio attivo
ingest_node: "Nodo ingest:"
rtmp_ingest: "RTMP ingest:"
events_title: Eventi
fields:
id: ID
club: Società
team: Squadra
opponent: Avversario
operator: Operatore
platform: Piattaforma
privacy: Privacy
quality: Qualità
min_quality: Qualità minima
audio: Audio
created: Creata
started: Inizio
ended: Fine
duration: Durata
disconnects: Disconnessioni
scheduled: Partita programmata
location: Sede
node: Nodo
rtmp: RTMP ingest
hls: HLS
recording: Replay
devices:
role: Ruolo
network: Rete
battery: Batteria
bitrate: Bitrate
fps: FPS
last_seen: Ultimo contatto
table:
type: Tipo
when: Quando
meta: Meta
meta: Dettagli
links:
watch_title: Link diretta
none: Nessun link video disponibile per questa sessione.