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 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 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: "—" 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 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 della pagina. Verde = poco, rosso = molto. preview_title: Screenshot pagina preview_unavailable: Anteprima non disponibile per path con placeholder (es. /clubs/:id). snapshot_missing: Nessuno screenshot ancora. Visita la pagina sul sito con consenso analytics (desktop) e 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. 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