it:
admin:
layout:
title: "Match Live TV — Admin"
nav:
dashboard: Dashboard
ops: Ops
announcements: Avvisi
clubs: Società e squadre
billing: Fatturazione
youtube: YouTube
sessions: Sessioni
analytics: Analytics
costs: Costi
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}."
quote_saved: "Prezzo concordato salvato per %{club}: %{plan} a %{amount}."
quote_revoked: "Prezzo concordato revocato per %{club}."
transfer_confirmed: "Bonifico confermato: piano %{plan} attivo per %{club}."
transfer_cancelled: Bonifico in attesa annullato.
youtube_not_configured: Configura YOUTUBE_CLIENT_ID e YOUTUBE_CLIENT_SECRET in .env
announcement_created: Avviso salvato
announcement_updated: Avviso aggiornato
announcement_destroyed: Avviso eliminato
cost_entry_created: Voce di costo registrata.
cost_entry_updated: Voce di costo aggiornata.
cost_entry_destroyed: Voce di costo eliminata.
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: admin / AdminPass123. 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
client: Client
ingest: Ingest
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: %{cloud} · DNS: %{dns}"
actions_title: Azioni
table_title: Nodi registrati
empty: Nessun nodo registrato.
free_slots:
one: "%{count} libero"
other: "%{count} liberi"
kpi:
autoscaler: Autoscaler
kill_switch: KILL
kind: "modalità %{kind}"
free_slots: Slot liberi
soft_slots: "soglia soft ≤ %{soft}"
spare: Spare
warm_spare: warm spare pronti
overflow: Overflow
overflow_nodes: nodi cloud/lab
budget: Budget stimato
budget_of: "su €%{budget}/mese (%{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 ATTIVO"
engage_kill_switch: "Kill-switch ON"
clear_kill_switch: "Kill-switch OFF"
kill_switch_confirm: "Bloccare immediatamente l'autoscaler? I nodi esistenti restano accesi."
provision_lab: Provisiona lab
provision_cloud: Provisiona 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
quote: Concordato
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
quote:
title: Prezzo concordato (bonifico)
description: "Importo commerciale per questa società: piano, cadenza e cifra in euro. In billing la società vede solo questo prezzo e può pagare solo con bonifico. L'omaggio (0 €) resta nella card sopra."
none: Nessun prezzo concordato. La società paga a listino (carta o bonifico).
active_html: "%{plan} · %{interval} · %{amount}"
note_label: "Nota:"
plan_label: Piano
interval_label: Cadenza
interval_yearly: Annuale
interval_monthly: Mensile
amount_label: "Importo (€)"
amount_placeholder: "es. 150 oppure 150,00"
commercial_note_label: Nota commerciale (opzionale)
save_button: Salva prezzo concordato
revoke_button: Revoca prezzo concordato
revoke_confirm: "Revocare il prezzo concordato per %{club}? Tornerà il listino (carta + bonifico)."
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
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
client: Client
link: Link
detail: Dettaglio
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:"
fields:
id: ID
club: Società
team: Squadra
opponent: Avversario
operator: Operatore
platform: Piattaforma
client_os: Sistema
app_version: Versione app
device: Dispositivo
os_version: Versione OS
carrier: Operatore telefonico
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: Dettagli
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
ingest:
none: "—"
decommissioned: "(nodo rimosso)"
role:
home: Home-lab
lab: Lab
cloud: Hetzner
analytics:
missing_path: Seleziona una pagina.
filters:
from: Da
to: A
device: Device
any: Tutti
apply: Filtra
reset: Azzera
layer: Livello
layer_move: Movimenti mouse
layer_click: Click
devices:
mobile: Mobile
tablet: Tablet
desktop: Desktop
index:
title: Analytics sito
lead: Heatmap movimenti/click e scroll aggregati (first-party), solo con consenso statistico. Nessun dato personale.
none: Nessun dato nel periodo selezionato.
heatmap: Heatmap
table:
path: Pagina
pageviews: Pageview
moves: Movimenti
clicks: Click
avg_scroll: Scroll medio
max_scroll: Scroll max
show:
title: Heatmap pagina
back: "← Torna ad Analytics"
summary: Riepilogo
scroll_depth: Profondità di scroll
scroll_hint: "Media %{avg}% · massimo %{max}%"
heatmap_moves: Mappa movimenti mouse
heatmap_clicks: Mappa click
heatmap_hint: Overlay colorato sullo screenshot %{device}. Verde = poco, rosso = molto. I dati non vengono mischiati tra dispositivi.
device_tabs_label: Dispositivo
preview_title: Screenshot pagina
preview_unavailable: Anteprima non disponibile per path con placeholder (es. /clubs/:id).
snapshot_missing: Nessuno screenshot per %{device}. Visita la pagina sul sito con quel dispositivo e consenso analytics, poi riprova tra qualche secondo.
snapshot_meta: "Screenshot %{device} · catturato %{at}"
no_points: Nessun punto aggregato per questo livello nel periodo.
heatmap_title: Mappa click
no_clicks: Nessun click aggregato per questa pagina nel periodo.
preview:
title: Anteprima senza tracciamento
lead: Visita il sito pubblico senza registrare pageview, click, movimenti o screenshot heatmap. Utile per test in produzione.
active: Modalità anteprima attiva su questo browser (7 giorni o fino a disattivazione).
enable: Attiva anteprima staff
disable: Disattiva anteprima
open_site: Apri sito
enabled: Anteprima staff attivata. Il sito non registrerà analytics su questo browser.
disabled: Anteprima staff disattivata.
costs:
index:
title: Analisi costi
lead: Inserisci i costi mensili della piattaforma e confronta costo, utilizzo e revenue. I KPI si ricalcolano automaticamente quando modifichi le voci.
month: Mese
apply: Applica
entries_title: Voci di costo del mese
entries_lead: Puoi aggiungere più voci (es. server, storage, banda). Il totale è la somma delle voci del mese.
add_entry: Aggiungi voce
no_entries: Nessuna voce di costo per questo mese. Aggiungi il costo della piattaforma per vedere i KPI.
clubs_title: Costo allocato per società
clubs_lead: Il costo infrastruttura è ripartito proporzionalmente alle ore trasmesse nel mese.
no_clubs: Nessuna diretta terminata in questo mese.
trends_title: Trend (ultimi 12 mesi)
kpi:
platform_cost: Costo piattaforma
revenue: Revenue incassata
margin: Margine
margin_pct: Margine %
hours: Ore trasmesse
sessions: Dirette
clubs_active: Società attive
storage: Storage replay
cost_per_hour: Costo / ora stream
cost_per_session: Costo / diretta
cost_per_club: Costo / società attiva
revenue_per_hour: Revenue / ora stream
cost_per_gb: Costo / GB storage
storage_note: Storage cumulativo attuale (non mensile).
charts:
cost_revenue: Costo vs revenue
cost_per_hour: Costo per ora trasmessa
hours: Ore trasmesse
table:
label: Voce
amount: Importo
notes: Note
club: Società
plan: Piano
hours: Ore
hours_share: Quota ore
allocated_cost: Costo allocato
revenue: Revenue
margin: Margine
cost_per_hour: €/ora
cost_per_session: €/diretta
storage: Storage
entries:
new_title: Nuova voce di costo
edit_title: Modifica voce di costo
month: Mese
label: Descrizione
label_hint: Es. Hetzner, nodi stream CPX, S3, banda egress.
amount: Importo (€)
notes: Note
save: Salva
cancel: Annulla
delete: Elimina
delete_confirm: Eliminare questa voce di costo?
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."
transfers_title: Bonifici in attesa
transfers_description: "La società ha chiesto di pagare con bonifico: il piano non è ancora attivo. Conferma dopo l'accredito (puoi allegare subito il PDF fattura)."
transfers_none: Nessun bonifico in attesa.
transfers_table:
club: Società
plan: Piano
amount: Importo
holder: Intestatario
iban: IBAN
causal: Causale
requested: Richiesto
confirm_button: Conferma pagamento e attiva
cancel_button: Annulla richiesta
cancel_confirm: Annullare questa richiesta di bonifico?
pdf_optional: PDF fattura (opzionale)
kind_quote: prezzo concordato
kind_list: listino
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 /opt/matchlivetv/infra/.env:"
not_shown_again_html: "Non verrà mostrato di nuovo. Poi: docker compose -f docker-compose.prod.yml restart rails sidekiq"
no_refresh_token_html: "Google non ha restituito un refresh token. In account Google → accesso app revoca «Match Live TV», poi ripeti da /admin/youtube/platform."
back_dashboard: "← Dashboard admin"
club_recordings:
index:
title: "Replay — %{club}"
announcements:
index:
title: Avvisi
lead: Messaggi verso le app, il sito pubblico e l'area riservata — manutenzione, aggiornamenti o comunicazioni.
new: Nuovo avviso
table_title: Avvisi
none: Nessun avviso. Crea il primo per notificare app e sito.
new:
title: Nuovo avviso
edit:
title: Modifica avviso
table:
status: Stato
kind: Tipo
title: Messaggio
channels: Destinazioni
window: Finestra
actions:
edit: Modifica
delete: Elimina
delete_confirm: Eliminare questo avviso? Non sarà più visibile nelle destinazioni scelte.
kind:
info: Informazione
maintenance: Manutenzione
update: Aggiornamento app
severity:
info: Info
warning: Attenzione
critical: Critico
status:
draft: Bozza
published: Pubblicato
archived: Archiviato
channels:
android: App Android
ios: App iOS
web_public: Sito pubblico
web_private: Area riservata
window:
always: Sempre (finché pubblicato)
from: "Da %{time}"
until: "Fino a %{time}"
form:
kind: Tipo
severity: Gravità
status: Stato
channels: Dove mostrarlo
channels_hint: "Puoi selezionare una o più destinazioni. Android e iOS sono indipendenti: se il testo deve essere diverso, crea due avvisi. L'area riservata è visibile dopo il login (società, squadre, account)."
title: Titolo
body: Testo
starts_at: Inizio visibilità
ends_at: Fine visibilità
window_hint: Lascia vuoto per mostrare subito e finché resta pubblicato.
action_url: Link (facoltativo)
action_url_hint: Per gli aggiornamenti, se vuoto l'app apre lo store della piattaforma (Play Store su Android, App Store su iOS).
action_label: Etichetta del pulsante
locales_legend: Testo per lingua
locales_hint: Compila tutte le lingue dell'app (italiano, inglese, francese, tedesco, spagnolo). L'italiano è obbligatorio; se una lingua manca, l'app usa inglese e poi italiano.
locale_required: obbligatorio
dismissible: L'utente può chiudere l'avviso
dismissible_hint: Togli la spunta per avvisi di manutenzione che devono restare visibili.
submit_create: Salva avviso
submit_update: Aggiorna avviso
cancel: Annulla