Drain sicuro in scale-in, alert Ops su overflow e controlli admin senza abilitare il deploy in produzione. Co-authored-by: Cursor <cursoragent@cursor.com>
345 lines
14 KiB
YAML
345 lines
14 KiB
YAML
it:
|
||
admin:
|
||
layout:
|
||
title: "Match Live TV — Admin"
|
||
nav:
|
||
dashboard: Dashboard
|
||
ops: Ops
|
||
clubs: Società e squadre
|
||
billing: Fatturazione
|
||
youtube: YouTube
|
||
sessions: Sessioni
|
||
stream_nodes: Nodi stream
|
||
password: Password
|
||
logout: Esci
|
||
flash:
|
||
login_required: Accedi per continuare
|
||
login_success: Accesso effettuato
|
||
invalid_credentials: Username o password non validi
|
||
logout_success: Disconnesso
|
||
password_current_incorrect: Password attuale non corretta
|
||
password_too_short: La nuova password deve avere almeno 8 caratteri
|
||
password_too_long: La nuova password non può superare i 72 caratteri
|
||
password_too_weak: "La nuova password deve includere almeno 3 tra: minuscole, maiuscole, numeri e simboli"
|
||
password_same_as_current: La nuova password deve essere diversa da quella attuale
|
||
password_mismatch: Le password non coincidono
|
||
password_updated: Password aggiornata
|
||
ops_acknowledged: Incidente preso in carico
|
||
ops_resolved: Incidente risolto
|
||
ops_muted: Notifiche sospese per 24 ore
|
||
stream_node_created: "Nodo lab %{slug} provisionato."
|
||
stream_node_destroyed: "Nodo %{slug} rimosso."
|
||
stream_node_draining: "Nodo %{slug} in drain (niente nuove sessioni)."
|
||
autoscale_kill_on: "Kill-switch autoscaler attivato. Nessun scale-out automatico."
|
||
autoscale_kill_off: "Kill-switch autoscaler disattivato (serve comunque STREAM_AUTOSCALE_ENABLED=1)."
|
||
comped_granted: "Abbonamento omaggio %{plan} attivato per %{club}."
|
||
comped_revoked: "Abbonamento omaggio revocato per %{club}."
|
||
session_already_terminated: "Sessione già terminata (%{status})."
|
||
session_stopped: Sessione terminata.
|
||
session_stop_error: "Errore durante la chiusura: %{error}"
|
||
session_terminated_no_regia: "Sessione terminata: impossibile generare il link regia."
|
||
session_regia_generated: Link regia generato.
|
||
invoice_upload_hint: Carica il PDF dalla lista «Pagamenti da fatturare».
|
||
invoice_draft_created: Bozza creata. Carica il PDF dalla pagina Fatturazione o qui sotto.
|
||
invoice_issued: "Fattura %{number} emessa e inviata a %{email}."
|
||
invoice_updated: "Fattura %{number} aggiornata."
|
||
invoice_uploaded: "Fattura caricata e inviata a %{email}."
|
||
youtube_not_configured: Configura YOUTUBE_CLIENT_ID e YOUTUBE_CLIENT_SECRET in .env
|
||
common:
|
||
free_plan: Free
|
||
yes: "Sì"
|
||
no: "No"
|
||
dash: "—"
|
||
live_page: Pagina live
|
||
auth:
|
||
new:
|
||
title: Accesso admin
|
||
username_label: Username
|
||
password_label: Password
|
||
submit: Accedi
|
||
initial_credentials_html: "Credenziali iniziali: <code>admin</code> / <code>admin</code>. Cambia la password dopo il primo accesso."
|
||
passwords:
|
||
edit:
|
||
title: Cambia password
|
||
current_password_label: Password attuale
|
||
new_password_label: "Nuova password (min. 8, almeno 3 tipi di caratteri)"
|
||
confirm_password_label: Conferma nuova password
|
||
submit: Salva password
|
||
cancel: Annulla
|
||
dashboard:
|
||
kpi:
|
||
active_sessions: Sessioni attive
|
||
active_sessions_sub: in diretta ora
|
||
today: Trasmesse oggi
|
||
today_sub: "%{duration} di streaming"
|
||
month: Trasmesse questo mese
|
||
month_sub: "%{duration} totali"
|
||
teams: Squadre
|
||
teams_sub: "%{count} utenti"
|
||
cpu: CPU
|
||
cpu_sub: "load %{one} / %{five} / %{fifteen}"
|
||
ram: RAM
|
||
ram_sub: "%{used} / %{total}"
|
||
network: Banda (totale)
|
||
network_sub: "↑ %{tx} · ↓ %{rx}"
|
||
recordings: Replay in archivio
|
||
recordings_sub: "%{count} registrazioni"
|
||
charts:
|
||
cpu: CPU (%)
|
||
ram: RAM (%)
|
||
ops_panel:
|
||
title: Stato piattaforma (Ops)
|
||
critical: "%{count} incidente/i critico/i aperto/i"
|
||
view_dashboard: Vedi dashboard Ops
|
||
warnings: "%{count} warning"
|
||
dashboard_link: Dashboard Ops
|
||
none_html: "Nessun incidente aperto. %{link}"
|
||
disk:
|
||
system_title: Disco sistema
|
||
free_label: "Libero: %{free} (%{percent}% usato)"
|
||
not_available: Metriche disco non disponibili
|
||
recordings_title: Archivio registrazioni
|
||
recordings_content: "Contenuto registrazioni: %{size}"
|
||
recordings_not_mounted: "Percorso %{path} non montato"
|
||
sessions:
|
||
title: Sessioni attive
|
||
table:
|
||
match: Partita
|
||
status: Stato
|
||
start: Inizio
|
||
link: Link
|
||
none: Nessuna sessione attiva in questo momento.
|
||
detail: Dettaglio
|
||
stop: Termina
|
||
stop_confirm: Terminare questa sessione?
|
||
regia: Regia
|
||
teams:
|
||
title: Squadre
|
||
matches_count: "%{count} partite"
|
||
view_all: "Vedi società (%{count} squadre)"
|
||
stream_nodes:
|
||
title: Nodi streaming
|
||
providers: "Cloud provider: %{cloud} · DNS provider: %{dns}"
|
||
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 ATTIVO"
|
||
engage_kill_switch: "Kill-switch ON (blocca autoscaler)"
|
||
clear_kill_switch: "Kill-switch OFF"
|
||
kill_switch_confirm: "Bloccare immediatamente l'autoscaler? I nodi esistenti restano accesi."
|
||
provision_lab: Provisiona nodo lab
|
||
provision_cloud: Provisiona nodo Hetzner
|
||
provision_cloud_confirm: "Creare un server Hetzner Cloud + record DNS su mltv-stream.net? Verrà addebitato fino allo spegnimento."
|
||
hetzner_token_missing: "Imposta HCLOUD_TOKEN per abilitare il provisioning Cloud."
|
||
drain: Drain
|
||
destroy: Elimina
|
||
destroy_confirm: "Eliminare il nodo %{slug}?"
|
||
hosts_title: Record DNS lab (snippet /etc/hosts)
|
||
col:
|
||
slug: Slug
|
||
role: Ruolo
|
||
status: Stato
|
||
slots: Slot
|
||
hostname: Hostname
|
||
provider: Provider
|
||
ops:
|
||
kpi:
|
||
critical: Critici aperti
|
||
warning: Warning aperti
|
||
total: Totale aperti
|
||
open:
|
||
title: Incidenti aperti
|
||
table:
|
||
severity: Severità
|
||
kind: Tipo
|
||
title: Titolo
|
||
occurrences: Occ.
|
||
last_seen: Ultimo
|
||
none: Nessun incidente aperto. La piattaforma risulta sana.
|
||
actions:
|
||
acknowledge: Preso in carico
|
||
resolve: Risolvi
|
||
mute: Mute 24h
|
||
resolved:
|
||
title: Risolti (ultimi 30 giorni)
|
||
table:
|
||
resolved_at: Risolto
|
||
none: Nessun incidente risolto di recente.
|
||
clubs:
|
||
index:
|
||
title: Società e squadre
|
||
subtitle_html: "Abbonamenti omaggio (sponsor / promozioni) e stato YouTube per squadra. Pagamenti Stripe: %{billing_link}."
|
||
billing_link: Fatturazione
|
||
table:
|
||
club: Società
|
||
plan: Piano
|
||
teams: Squadre
|
||
comped: Omaggio
|
||
stripe: Stripe
|
||
manage: Gestisci
|
||
invoices: Fatture
|
||
show:
|
||
back: "← Società e squadre"
|
||
sport_label: "Sport: %{sport}"
|
||
recordings_archive: Archivio replay
|
||
billing_link: Pagamenti e fatture
|
||
youtube_platform_link: Canale YouTube piattaforma
|
||
youtube_club_label: "YouTube società:"
|
||
youtube_connected: (collegato)
|
||
youtube_premium_full_not_connected: Premium Full — canale società non collegato (usa Match Live TV)
|
||
no_channel_hint_html: "Senza canale collegato, l’app usa il canale Match Live TV. %{link}."
|
||
link_channel: Collega canale (pagina società)
|
||
teams_title: Squadre
|
||
no_teams: Nessuna squadra registrata.
|
||
table:
|
||
team: Squadra
|
||
sport: Sport
|
||
matches_and_details: Partite e dettagli
|
||
replay: Replay
|
||
comped:
|
||
title: Abbonamento omaggio
|
||
description: "Sponsor o promozione: assegna Premium Light/Full senza pagamento Stripe. Revocabile in qualsiasi momento."
|
||
active_label: "Attivo:"
|
||
since_label_html: "Dal %{date}"
|
||
by_admin: "· admin %{username}"
|
||
stripe_note: "Nota: esiste anche un abbonamento Stripe collegato; l’omaggio ha priorità sul piano."
|
||
revoke_button: Revoca omaggio (torna Free o ripristina Stripe)
|
||
revoke_confirm: "Revocare l’abbonamento omaggio per %{club}?"
|
||
current_plan: "Piano attuale: %{plan}"
|
||
stripe_active: "· pagamento Stripe attivo"
|
||
plan_label: Piano
|
||
reason_label: "Motivo (es. sponsor 2026)"
|
||
reason_placeholder: "Sponsor, promozione…"
|
||
grant_button: Concedi omaggio
|
||
teams:
|
||
show:
|
||
back: "← %{club}"
|
||
sport_label: "Sport: %{sport}"
|
||
club_label_html: "Società: %{club} · %{replay_link} · %{billing_link}"
|
||
replay_link: Replay squadra
|
||
billing_link: Pagamenti e fatture
|
||
youtube_label: "YouTube:"
|
||
youtube_platform_default_no_oauth: ", default senza OAuth società"
|
||
youtube_platform_channel: "(canale piattaforma%{suffix})"
|
||
youtube_club_channel: (canale società)
|
||
youtube_not_ready: non pronto
|
||
no_channel_hint_html: "Senza canale collegato, l’app usa il canale Match Live TV. %{link}."
|
||
link_channel: Collega canale (pagina società)
|
||
matches_title: Partite
|
||
sessions:
|
||
index:
|
||
title: Sessioni di streaming
|
||
table:
|
||
match: Match
|
||
status: Stato
|
||
disconnects: Disconnessioni
|
||
link: Link
|
||
detail: Dettaglio
|
||
regia: Regia
|
||
show:
|
||
title: "Sessione %{id}"
|
||
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
|
||
rtmp_ingest: "RTMP ingest:"
|
||
events_title: Eventi
|
||
table:
|
||
type: Tipo
|
||
when: Quando
|
||
meta: Meta
|
||
links:
|
||
watch_title: Link diretta
|
||
none: Nessun link video disponibile per questa sessione.
|
||
regia_title: Link regia
|
||
terminated: Sessione terminata — link regia non disponibile.
|
||
regia_label: Regia
|
||
valid_until: "Valido fino a %{date}"
|
||
active_exists: Esiste già un link regia attivo (l’URL non è recuperabile). Generane uno nuovo se serve condividerlo di nuovo.
|
||
none_active: Nessun link regia attivo. Genera un link da condividere con chi gestisce il punteggio.
|
||
generate_button: Genera link regia
|
||
billing:
|
||
index:
|
||
title: Pagamenti da fatturare
|
||
description: "Pagamenti Stripe pagati senza PDF fattura. Genera il PDF nei tuoi sistemi, poi caricalo qui: viene associato al pagamento e inviato via email al cliente."
|
||
filter_label: "Filtra società:"
|
||
filter_all: Tutte
|
||
incomplete_profile_warning: Dati fatturazione incompleti
|
||
no_billing_data: Nessun dato di fatturazione — il cliente deve completare il profilo.
|
||
pdf_label: PDF fattura
|
||
upload_button: Carica PDF e invia al cliente
|
||
none_pending: "Nessun pagamento in attesa di fattura%{club}."
|
||
none_pending_for_club: " per %{club}"
|
||
uploaded_title: Fatture già caricate
|
||
table:
|
||
date: Data
|
||
club: Società
|
||
description: Descrizione
|
||
amount: Importo
|
||
invoice: Fattura
|
||
status: Stato
|
||
back_dashboard: "← Dashboard"
|
||
billing_invoices:
|
||
index:
|
||
title: "Fatturazione — %{club}"
|
||
back_dashboard: "← Dashboard"
|
||
new_invoice: Nuova fattura (senza pagamento)
|
||
payments_title: Pagamenti
|
||
table:
|
||
date: Data
|
||
description: Descrizione
|
||
amount: Importo
|
||
invoice: Fattura
|
||
pdf_suffix: " (PDF)"
|
||
edit_send_pdf: Modifica / invia PDF
|
||
create_invoice: Crea fattura
|
||
no_payments: Nessun pagamento registrato per questa società.
|
||
all_invoices_title: Tutte le fatture
|
||
table2:
|
||
number: Numero
|
||
date: Data
|
||
amount: Importo
|
||
status: Stato
|
||
payment: Pagamento
|
||
edit: Modifica
|
||
no_invoices: Nessuna fattura.
|
||
new:
|
||
title: "Nuova fattura — %{club}"
|
||
linked_payment: "Collegata al pagamento del %{date} (%{amount})."
|
||
number_label: Numero fattura
|
||
issued_on_label: Data emissione
|
||
amount_label: "Importo (€)"
|
||
notes_label: Note interne (opzionale)
|
||
hint: Salva la bozza, poi carica il PDF e inviala al cliente dalla schermata successiva.
|
||
submit: Crea bozza fattura
|
||
back: "← Pagamenti e fatture"
|
||
edit:
|
||
title: "Fattura %{number} — %{club}"
|
||
status_label: "Stato:"
|
||
sent_at: "· Inviata il %{date}"
|
||
number_label: Numero fattura
|
||
issued_on_label: Data emissione
|
||
amount_label: "Importo (€)"
|
||
payment_info: "Pagamento: %{description} — %{amount}"
|
||
pdf_label: PDF fattura
|
||
pdf_already: "PDF già caricato: %{filename}"
|
||
notes_label: Note interne
|
||
save_draft: Salva bozza
|
||
issue_send: Emetti e invia via email
|
||
issue_confirm: "Inviare la fattura a %{email}?"
|
||
back: "← Pagamenti e fatture"
|
||
youtube:
|
||
platform_token:
|
||
title: Token canale Match Live TV
|
||
page_title: "Token YouTube — Match Live TV"
|
||
channel_label: "Canale: %{title}"
|
||
success: "Collegamento riuscito. Copia subito questa riga:"
|
||
env_hint_html: "Aggiungi in <code>/opt/matchlivetv/infra/.env</code>:"
|
||
not_shown_again_html: "Non verrà mostrato di nuovo. Poi: <code>docker compose -f docker-compose.prod.yml restart rails sidekiq</code>"
|
||
no_refresh_token_html: "Google non ha restituito un refresh token. In <a href=\"https://myaccount.google.com/permissions\" target=\"_blank\" rel=\"noopener\">account Google → accesso app</a> revoca «Match Live TV», poi ripeti da <a href=\"/admin/youtube/platform\">/admin/youtube/platform</a>."
|
||
back_dashboard: "← Dashboard admin"
|
||
club_recordings:
|
||
index:
|
||
title: "Replay — %{club}"
|