screentinker/frontend/js/i18n/it.js
ScreenTinker a36880b147 fix: per-item mute round-trip + multi-zone orphan-zone fallback & warnings
Two independent multi-zone bugs, plus operator-facing warnings, i18n, and
regression tests guarding the data contracts.

Bug 1 — per-item mute was a no-op end to end:
- GET /api/devices/:id dropped the `muted` column from its assignments SELECT,
  so the dashboard toggle never reflected state (the muted=false case in
  particular). Column restored to the device payload.
- Android player now honours the per-item mute flag for YouTube (initial state
  + live via the IFrame JS API).

Bug 2 — items whose zone_id belongs to a different layout were silently dropped:
- Player fallback (web + Android): an orphaned zone_id is recovered into the
  largest zone instead of vanishing, with telemetry.
- server/lib/zone-validate.js is the single source of truth for the orphan rule
  (zone not in the device's active layout); used by the device payload
  (per-item `orphan` flag + `active_layout_zones`) and the device list
  (`orphan_count`).
- Assign-time hardening: a stale zone_id (not in the device's active layout) is
  cleared to null on POST/PUT rather than persisted as a new orphan.
- scripts/find-orphan-zone-items.js: read-only sweep for existing orphans.

Dashboard warnings (operator-facing, never on the live player):
- Per-item badge + reassign affordance, device-list glance, preview banner.
- Graceful degradation: the zone selector falls back to /api/layouts/:id so it
  can't vanish on a stale payload.

i18n: orphan-zone strings added to en/es/fr/de/pt/it (hi falls back by design;
count strings interpolate through tn()).

Tests: server/test/device-zone-contract.test.js adds 5 regression tests for the
data contracts above (muted true/false round-trip, active_layout_zones, orphan
flag + count, orphan-clears-on-reassign, assign-time clearing). 172/172 pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 23:16:29 -05:00

1123 lines
58 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Italian translations. This file is the source of truth for keys —
// every other locale should mirror its keys (or fall back to en).
export default {
// #zone-orphan dashboard warnings
'device.pl_item.orphan_zone': 'Zona di un altro layout — riassegna',
'device.pl_item.orphan_zone_tip': 'La zona di questo elemento non fa parte del layout attuale del dispositivo. Continua a essere riprodotto (recuperato nella zona più grande), ma riassegnalo a una zona di questo layout.',
'dashboard.device_orphan_tip_one': '{n} elemento assegnato a una zona non presente nel layout di questo dispositivo — apri il dispositivo per riassegnarlo',
'dashboard.device_orphan_tip_other': '{n} elementi assegnati a una zona non presente nel layout di questo dispositivo — apri il dispositivo per riassegnarli',
// Nav (sidebar)
'nav.displays': 'Schermi',
'nav.content': 'Contenuti',
'nav.playlists': 'Playlist',
'nav.layouts': 'Layout',
'nav.widgets': 'Widget',
'nav.schedule': 'Programmazione',
'nav.walls': 'Video Wall',
'nav.reports': 'Report',
'nav.kiosk': 'Chiosco',
'nav.designer': 'Designer',
'nav.activity': 'Attività',
'nav.teams': 'Team',
'nav.help': 'Aiuto',
'nav.settings': 'Impostazioni',
'nav.subscription': 'Abbonamento',
'nav.admin': 'Admin',
// Common (shared across views)
'common.save': 'Salva',
'common.cancel': 'Annulla',
'common.delete': 'Elimina',
'common.edit': 'Modifica',
'common.done': 'Fatto',
'common.loading': 'Caricamento...',
'common.connected': 'Connesso',
'common.disconnected': 'Disconnesso',
'common.never': 'Mai',
'common.just_now': 'Proprio ora',
'common.minutes_ago': '{n}m fa',
'common.hours_ago': '{n}h fa',
'common.days_ago': '{n}g fa',
'common.unknown': 'Sconosciuto',
// Auth (login view)
'auth.sign_in': 'Accedi',
'auth.sign_out': 'Esci',
'auth.create_account': 'Crea Account',
'auth.create_admin_account': 'Crea Account Admin',
'auth.email': 'Email',
'auth.password': 'Password',
'auth.name': 'Nome',
'auth.placeholder_email': 'tu@esempio.it',
'auth.placeholder_password': '••••••••',
'auth.placeholder_name': 'Il tuo nome',
'auth.placeholder_register_password': 'Almeno 6 caratteri',
'auth.subtitle_setup': 'Crea il tuo account admin per iniziare',
'auth.subtitle_signin': 'Accedi per gestire i tuoi schermi',
'auth.trial_notice': 'I nuovi account ricevono una prova gratuita Pro di 14 giorni',
'auth.divider_or': 'OPPURE',
'auth.signin_google': 'Accedi con Google',
'auth.signin_microsoft': 'Accedi con Microsoft',
'auth.back_to_signin': 'Torna all\'accesso',
'auth.support_access': 'Accesso Supporto',
'auth.support_token_placeholder': 'Incolla il token di supporto',
'auth.support_authenticate': 'Autenticati con Token di Supporto',
'auth.terms': 'Termini di Servizio',
'auth.privacy': 'Informativa sulla Privacy',
'auth.error_email_password_required': 'Email e password richieste',
'auth.error_password_min_6': 'La password deve contenere almeno 6 caratteri',
'auth.error_login_failed': 'Accesso fallito',
'auth.error_registration_failed': 'Registrazione fallita',
'auth.error_paste_support_token': 'Incolla un token di supporto',
'auth.error_support_failed': 'Accesso supporto fallito',
'auth.error_google_failed': 'Accesso con Google fallito',
'auth.error_microsoft_failed': 'Accesso con Microsoft fallito',
// Dashboard
'dashboard.title': 'Schermi',
'dashboard.subtitle': 'Gestisci i tuoi schermi remoti',
'dashboard.help_tip': 'I tuoi dispositivi associati. Verde = online, rosso = offline. Clicca su un dispositivo per gestire la sua playlist, visualizzare la telemetria o usare il controllo remoto.',
'dashboard.add': 'Aggiungi Schermo',
'dashboard.create_group': '+ Gruppo',
'dashboard.search': 'Cerca schermi...',
'dashboard.all_status': 'Tutti gli stati',
'dashboard.online': 'Online',
'dashboard.offline': 'Offline',
'dashboard.awaiting_pairing': 'In attesa di associazione',
'dashboard.no_preview': 'Nessuna anteprima disponibile',
'dashboard.total_displays': 'Schermi Totali',
'dashboard.ungrouped': 'Non raggruppati',
'dashboard.no_displays': 'Nessun schermo presente',
'dashboard.no_displays_desc': 'Installa l\'app ScreenTinker sulla tua TV e associala usando il pulsante sopra.',
'dashboard.failed_to_load': 'Caricamento schermi fallito',
'dashboard.unknown_playlist': 'Playlist sconosciuta',
'dashboard.mixed_playlists': 'Playlist miste',
'dashboard.playlist_label': 'Playlist: {name}',
'dashboard.devices_count_one': '{n} dispositivo',
'dashboard.devices_count_other': '{n} dispositivi',
'dashboard.online_count': '{n} online',
'dashboard.set_playlist_placeholder': 'Imposta Playlist...',
'dashboard.send_command_placeholder': 'Invia Comando...',
'dashboard.manage': 'Gestisci',
'dashboard.manage_tooltip': 'Aggiungi/rimuovi dispositivi',
'dashboard.delete_group_tooltip': 'Elimina gruppo',
'dashboard.no_devices_in_group': 'Nessun dispositivo in questo gruppo. Clicca Gestisci per aggiungerne.',
'dashboard.manage_group_subtitle': 'Seleziona i dispositivi per aggiungerli a questo gruppo',
'dashboard.draft_suffix': '(bozza)',
// Group commands
'dashboard.cmd.screen_on': 'Accendi Schermo',
'dashboard.cmd.screen_off': 'Spegni Schermo',
'dashboard.cmd.restart_app': 'Riavvia App',
'dashboard.cmd.check_update': 'Controlla Aggiornamenti',
'dashboard.cmd.reboot': 'Riavvia Sistema',
'dashboard.cmd.shutdown': 'Spegni',
// Dashboard prompts/confirms
'dashboard.prompt_group_name': 'Nome gruppo:',
'dashboard.error_pairing_code': 'Inserisci un codice di associazione valido di 6 cifre',
'dashboard.confirm_add_to_group': '{name} è già presente in: {groups}\n\nAggiungerlo anche a "{target}"?',
'dashboard.confirm_assign_playlist': 'Assegnare la playlist "{playlist}" a tutti i dispositivi in "{group}"?',
'dashboard.confirm_destructive_command': 'Eseguire {cmd} su tutti i {n} dispositivi in "{group}"?\n\nL\'azione è irreversibile.',
'dashboard.confirm_delete_group': 'Eliminare questo gruppo? I dispositivi non verranno rimossi dal sistema.',
// Dashboard toasts
'dashboard.toast.display_paired': 'Schermo associato con successo!',
'dashboard.toast.group_created': 'Gruppo creato',
'dashboard.toast.group_deleted': 'Gruppo eliminato',
'dashboard.toast.already_in_group': '{name} è già in {group}',
'dashboard.toast.moved_device': 'Spostato {name} in {group}',
'dashboard.toast.removed_device_one': 'Rimosso {name} da 1 gruppo',
'dashboard.toast.removed_device_other': 'Rimosso {name} da {n} gruppi',
'dashboard.toast.playlist_assigned_one': 'Playlist assegnata a 1 dispositivo',
'dashboard.toast.playlist_assigned_other': 'Playlist assegnata a {n} dispositivi',
'dashboard.toast.command_sent': 'Comando {cmd} inviato a {sent}/{total} dispositivi',
'dashboard.toast.command_sent_with_offline': 'Comando {cmd} inviato a {sent}/{total} dispositivi ({offline} offline)',
// Content library
'content.title': 'Libreria Contenuti',
'content.subtitle': 'Carica e gestisci i tuoi file multimediali',
'content.help_tip': 'Carica video e immagini qui. Seleziona più file per il caricamento di massa. Usa "URL Remoto" per lo streaming da fonti esterne. Clicca su un\'anteprima per visualizzarla.',
'content.drop': 'Trascina i file qui o clicca per caricare',
'content.upload_hint': 'Supporta MP4, WebM, AVI, MKV, JPEG, PNG, GIF, WebP',
'content.upload_progress': 'Caricamento...',
'content.upload_progress_named': 'Caricamento di {name}...',
'content.upload_progress_named_pct': 'Caricamento di {name}... {pct}%',
// Remote URL panel
'content.remote_url': 'URL Remoto',
'content.remote_desc': 'Riproduci direttamente da un URL. Risparmia larghezza di banda locale.',
'content.remote_url_placeholder': 'https://esempio.it',
'content.remote_name_placeholder': 'Nome visualizzato (opzionale)',
'content.remote_add_btn': 'Aggiungi URL Remoto',
// YouTube panel
'content.youtube': 'YouTube',
'content.youtube_desc': 'Incorpora un video di YouTube sui tuoi schermi.',
'content.youtube_url_placeholder': 'https://youtube.com/watch?v=...',
'content.youtube_name_placeholder': 'Nome visualizzato (opzionale)',
'content.youtube_add_btn': 'Aggiungi Video YouTube',
// Search / folders
'content.search_placeholder': 'Cerca contenuti...',
'content.new_folder_btn': '+ Nuova Cartella',
'content.breadcrumb_root': 'Tutti i Contenuti',
'content.rename_btn': 'Rinomina',
'content.delete_folder_btn': 'Elimina cartella',
'content.prompt_folder_name': 'Nome cartella:',
'content.prompt_rename_folder': 'Rinomina cartella:',
'content.confirm_delete_folder': 'Eliminare questa cartella? I contenuti all\'interno torneranno al livello principale. Anche le sottocartelle verranno eliminate.',
// Empty states
'content.empty_folder_title': 'Questa cartella è vuota',
'content.empty_folder_desc': 'Trascina i contenuti qui o usa l\'azione Sposta.',
'content.no_content': 'Ancora nessun contenuto',
'content.no_content_desc': 'Carica video e immagini per iniziare.',
'content.failed_to_load': 'Caricamento contenuti fallito',
// Item type labels
'content.type_youtube': 'YouTube',
'content.type_remote': 'URL Remoto',
'content.type_remote_short': 'Remoto',
'content.type_video': 'Video',
'content.type_image': 'Immagine',
// Item action buttons
'content.btn_edit': 'Modifica',
'content.btn_delete': 'Elimina',
'content.btn_confirm_delete': 'Confermi l\'eliminazione?',
'content.btn_deleting': 'Eliminazione...',
// Edit modal
'content.edit_modal_title': 'Modifica Contenuto',
'content.label_filename': 'Nome file / Nome visualizzato',
'content.label_remote_url_field': 'URL Remoto',
'content.label_mime_type': 'Tipo MIME',
'content.label_folder': 'Cartella',
'content.label_replace_file': 'Sostituisci File',
'content.replace_file_hint': 'Lascia vuoto per mantenere il file attuale',
'content.folder_root_option': '— Root (Principale) —',
'content.save_changes': 'Salva Modifiche',
// MIME options
'content.mime.video_mp4': 'Video (MP4)',
'content.mime.video_webm': 'Video (WebM)',
'content.mime.image_jpeg': 'Immagine (JPEG)',
'content.mime.image_png': 'Immagine (PNG)',
'content.mime.image_gif': 'Immagine (GIF)',
'content.mime.image_webp': 'Immagine (WebP)',
// Content errors / toasts
'content.error_enter_url': 'Inserisci un URL',
'content.error_enter_youtube_url': 'Inserisci un URL di YouTube',
'content.error_update_failed': 'Aggiornamento fallito',
'content.toast.remote_added': 'Contenuto remoto aggiunto',
'content.toast.youtube_added': 'Video YouTube aggiunto',
'content.toast.deleted': 'Contenuto eliminato',
'content.toast.updated': 'Contenuto aggiornato',
'content.toast.uploaded_named': '{name} caricato con successo',
'content.toast.upload_failed_named': 'Caricamento di {name} fallito: {error}',
'content.toast.folder_created_named': 'Cartella "{name}" creata',
'content.toast.folder_renamed': 'Cartella rinominata',
'content.toast.folder_deleted': 'Cartella eliminata',
'content.toast.moved': 'Spostato',
'content.toast.moved_to_root': 'Spostato nella cartella principale',
// Device detail
'device.back': 'Torna a Schermi',
'device.owner_label': 'Proprietario: {owner}',
'device.rename': 'Rinomina',
'device.preview_btn': 'Anteprima',
'device.screenshot_btn': 'Screenshot',
'device.remove': 'Rimuovi',
'device.click_to_confirm': 'Clicca di nuovo per confermare',
'device.prompt_new_name': 'Inserisci il nuovo nome:',
'device.confirm_discard_draft': 'Scartare tutte le modifiche non pubblicate e tornare all\'ultima versione pubblicata?',
'device.failed_load': 'Caricamento dispositivo fallito',
'device.no_screenshot': 'Nessuno screenshot disponibile. Clicca "Screenshot" per catturarne uno.',
'device.no_content_assigned': 'Nessun contenuto assegnato',
'device.now_playing_id': 'In riproduzione: {id}',
'device.playlist_count_one': '1 elemento in playlist',
'device.playlist_count_other': '{n} elementi in playlist',
// Tabs
'device.tab.now_playing': 'In riproduzione',
'device.tab.now_playing_tip': "Screenshot dal vivo di ciò che è attualmente visualizzato su questo dispositivo.",
'device.tab.playlist': 'Playlist',
'device.tab.playlist_tip': 'Contenuti assegnati a questo dispositivo. Trascina gli elementi per riordinarli. Aggiungi media, widget o pagine chiosco.',
'device.tab.info': 'Info Dispositivo',
'device.tab.info_tip': 'Telemetria hardware, impostazioni orientamento, note e controlli del dispositivo.',
'device.tab.remote': 'Telecomando',
'device.tab.remote_tip': 'Visualizza lo schermo del dispositivo in tempo reale e invia comandi. Funziona su APK Android e web player.',
// Draft banner
'device.draft.banner_title': 'Modifiche non pubblicate',
'device.draft.devices_showing_published': 'I dispositivi mostrano ancora l\'ultima versione pubblicata.',
'device.draft.never_published': 'Questa playlist non è mai stata pubblicata. I dispositivi non mostreranno nulla fino alla pubblicazione.',
'device.draft.discard': 'Scarta',
'device.draft.publish': 'Pubblica',
'device.draft.publishing': 'Pubblicazione...',
// Layout selector
'device.layout.label': 'Layout Schermo',
'device.layout.fullscreen_default': 'Schermo intero (predefinito)',
'device.layout.zones_count': '{name} ({n} zone)',
'device.layout.template_zones_count': '[Modello] {name} ({n} zone)',
'device.layout.apply': 'Applica',
// Playlist tab
'device.playlist.label': 'Playlist',
'device.playlist.no_playlist': 'Nessuna playlist',
'device.playlist.copy_to_btn': 'Copia in...',
'device.playlist.add_content_btn': 'Aggiungi Contenuto',
'device.playlist.empty_title': 'Nessun contenuto assegnato',
'device.playlist.empty_desc': "Aggiungi contenuti dalla tua libreria alla playlist di questo schermo.",
'device.playlist_picker.with_count': '{name} — {n} elementi',
'device.playlist_picker.with_auto': '{name} (auto) — {n} elementi',
// Info cards
'device.info.status': 'Stato',
'device.info.ip_address': 'Indirizzo IP',
'device.info.battery': 'Batteria',
'device.info.storage': 'Archiviazione',
'device.info.size_free': '{size} liberi',
'device.info.player_type': 'Tipo Player',
'device.info.web_player': 'Web Player',
'device.info.wifi': 'WiFi',
'device.info.uptime': 'Tempo di attività',
'device.info.android_version': 'Versione Android',
'device.info.app_version': 'Versione App',
'device.info.screen_resolution': 'Risoluzione Schermo',
'device.info.ram': 'RAM',
'device.info.cpu_usage': 'Utilizzo CPU',
// Uptime timeline
'device.timeline.title': 'Cronologia Attività (Ultime 24 Ore)',
'device.timeline.h24_ago': '24 ore fa',
'device.timeline.now': 'Ora',
'device.timeline.online': 'Online',
'device.timeline.offline': 'Offline',
'device.timeline.no_data': 'Nessun dato',
'device.timeline.uptime_pct_tracked': '{pct}% attività ({n} min tracciati)',
'device.timeline.uptime_pct_no_data': '{pct}% attività (nessun dato)',
// Form
'device.form.orientation_label': 'Orientamento / Rotazione',
'device.form.orientation.landscape': 'Orizzontale (0°)',
'device.form.orientation.portrait': 'Verticale (90° orario)',
'device.form.orientation.landscape_flipped': 'Orizzontale capovolto (180°)',
'device.form.orientation.portrait_flipped': 'Verticale capovolto (270° orario)',
'device.form.default_content_label': 'Contenuto Predefinito',
'device.form.default_content_none': 'Nessuno (mostra "In attesa...")',
'device.form.notes_label': 'Note',
'device.form.notes_placeholder': 'Posizione, dettagli installazione, ecc.',
'device.form.save_settings': 'Salva Impostazioni',
// Control buttons
'device.ctl.reboot_device': 'Riavvia Dispositivo',
'device.ctl.screen_off': 'Spegni Schermo',
'device.ctl.screen_on': 'Accendi Schermo',
'device.ctl.launch_player': 'Avvia Player',
'device.ctl.force_update': 'Forza Aggiornamento',
'device.ctl.shutdown': 'Spegni',
// Remote tab
'device.remote.start_prompt': 'Clicca "Avvia Controllo" per iniziare',
'device.remote.start': 'Avvia Controllo',
'device.remote.stop': 'Ferma Controllo',
'device.remote.vol_up': 'Vol +',
'device.remote.vol_down': 'Vol -',
'device.remote.home': 'Home',
'device.remote.back': 'Indietro',
'device.remote.recents': 'Recenti',
'device.remote.power': 'Accensione',
'device.remote.ok': 'OK',
'device.remote.settings': 'Impostazioni',
'device.remote.scrn_off': 'Schermo Off',
'device.remote.scrn_on': 'Schermo On',
'device.remote.enable_system_view': 'Attiva Vista di Sistema',
'device.remote.system_view_tooltip': 'Chiede all\'utente del dispositivo di consentire l\'acquisizione completa dello schermo - permette la visualizzazione remota della home, impostazioni e altre app',
'device.remote.system_view_hint': 'Richiede l\'approvazione una tantum sul dispositivo',
'device.remote.waiting_for_approval': 'In attesa di approvazione dal dispositivo...',
'device.remote.system_view_enabled': 'Vista di Sistema Attivata',
'device.remote.unlocked_hint': 'Controlli di sistema e navigazione sbloccati',
// Playlist item
'device.pl_item.widget_with_type': 'Widget ({type})',
'device.pl_item.youtube': 'YouTube',
'device.pl_item.video': 'Video',
'device.pl_item.image': 'Immagine',
'device.pl_item.zone_label': 'Zona: {id}',
'device.pl_item.no_zone': 'Nessuna zona',
'device.pl_item.mute': 'Disattiva Audio',
'device.pl_item.unmute': 'Attiva Audio',
'device.pl_item.remove': 'Rimuovi',
// Copy playlist
'device.copy.no_other_devices': 'Nessun altro dispositivo su cui copiare',
'device.copy.prompt': 'Su quale dispositivo vuoi copiare la playlist?\n\n{list}\n\nInserisci il numero:',
'device.copy.invalid_selection': 'Selezione non valida',
'device.copy.toast': 'Copiati {n} elementi su {device}',
// Add-content modal
'device.assign.empty_all': 'Ancora nessun contenuto, widget o pagina chiosco. Crea qualcosa prima!',
'device.assign.modal_title': 'Aggiungi alla Playlist',
'device.assign.zone_label': 'Zona',
'device.assign.zone_default': 'Predefinita (schermo intero)',
'device.assign.duration_label': 'Durata visualizzazione (secondi, per immagini/widget)',
'device.assign.tab.media': 'Media ({n})',
'device.assign.tab.widgets': 'Widget ({n})',
'device.assign.tab.kiosk': 'Chiosco ({n})',
'device.assign.no_media': 'Nessun media ancora caricato',
'device.assign.no_widgets': 'Nessun widget ancora creato.',
'device.assign.no_kiosk': 'Nessuna pagina chiosco ancora presente.',
'device.assign.create_one': 'Creane uno',
'device.assign.add_selected': 'Aggiungi Selezionati',
'device.assign.select_first': 'Seleziona prima qualcosa',
'device.assign.kiosk_widget_name': 'Chiosco: {name}',
// Toasts
'device.toast.screenshot_requested': 'Richiesta screenshot inviata',
'device.toast.renamed': 'Schermo rinominato',
'device.toast.removing': 'Rimozione in corso...',
'device.toast.removed': 'Schermo rimosso',
'device.toast.settings_saved': 'Impostazioni salvate',
'device.toast.published': 'Playlist pubblicata — dispositivi aggiornati',
'device.toast.draft_discarded': 'Bozza scartata',
'device.toast.playlist_changed': 'Playlist modificata',
'device.toast.layout_applied': 'Layout applicato',
'device.toast.switched_to_fullscreen': 'Passato a schermo intero',
'device.toast.added_to_playlist': 'Aggiunto alla playlist',
'device.toast.unmuted': 'Audio attivato',
'device.toast.muted': 'Audio disattivato',
'device.toast.zone_updated': 'Zona aggiornata',
'device.toast.removed_from_playlist': 'Contenuto rimosso dalla playlist',
'device.toast.playlist_reordered': 'Playlist riordinata',
'device.toast.reboot_sent': 'Comando di riavvio inviato',
'device.toast.shutdown_sent': 'Comando di spegnimento inviato',
'device.toast.screen_off_sent': 'Comando spegnimento schermo inviato',
'device.toast.screen_on_sent': 'Comando accensione schermo inviato',
'device.toast.launch_sent': 'Comando di avvio inviato',
'device.toast.update_triggered': 'Controllo aggiornamenti avviato',
'device.toast.remote_started': 'Sessione remota avviata',
// Settings
'settings.title': 'Impostazioni',
'settings.subtitle': 'Configurazione del server e informazioni di installazione',
'settings.account': 'Account',
'settings.save_profile': 'Salva Profilo',
'settings.change_password': 'Cambia Password',
'settings.password_min_8': 'Deve contenere almeno 8 caratteri.',
'settings.current_password': 'Password Attuale',
'settings.new_password': 'Nuova Password',
'settings.confirm_new_password': 'Conferma Nuova Password',
'settings.sso_note': 'Hai effettuato l\'accesso tramite {provider}. Gestisci la tua password da lì.',
'settings.license': 'Licenza',
'settings.license_mit': 'Licenza MIT - tutte le funzionalità incluse.',
'settings.platform_admin_link': 'Gli strumenti di amministrazione della piattaforma si trovano nella pagina',
'settings.platform_admin_page_suffix': '.',
'settings.user_management': 'Gestione Utenti',
'settings.loading_users': 'Caricamento utenti...',
'settings.white_label': 'White Label / Branding',
'settings.white_label_desc': 'Personalizza l\'aspetto della dashboard e del player per i tuoi clienti.',
'settings.brand_name': 'Nome del Brand',
'settings.logo_url': 'URL del Logo',
'settings.primary_color': 'Colore Primario',
'settings.bg_color': 'Colore di Sfondo',
'settings.custom_domain': 'Dominio Personalizzato',
'settings.favicon_url': 'URL Favicon',
'settings.custom_css': 'CSS Personalizzato (opzionale)',
'settings.hide_branding': 'Nascondi branding "ScreenTinker"',
'settings.save_branding': 'Salva Branding',
'settings.preview': 'Anteprima',
'settings.white_label_enterprise_only': 'Il branding personalizzato è disponibile solo nel piano Enterprise',
'settings.view_plans': 'Visualizza i Piani',
'settings.server_info': 'Informazioni sul Server',
'settings.server_url': 'URL del Server',
'settings.api_endpoint': 'Endpoint API',
'settings.server_url_hint': 'Usa questo URL durante la configurazione dell\'app Android',
'settings.setup_guide': 'Guida all\'installazione',
'settings.setup_step_1': 'Installa l\'APK di ScreenTinker sulla tua TV tramite sideloading',
'settings.setup_step_2_prefix': 'Apri l\'app e inserisci questo URL del server:',
'settings.setup_step_3': 'L\'app mostrerà un codice di associazione di 6 cifre',
'settings.setup_step_4': 'Clicca su "Aggiungi Schermo" nella dashboard e inserisci il codice',
'settings.setup_step_5': 'Carica i contenuti nella Libreria Contenuti',
'settings.setup_step_6': 'Assegna i contenuti alla Playlist dello schermo',
'settings.your_data': 'I Tuoi Dati',
'settings.your_data_desc': 'Esporta o importa i tuoi dispositivi, contenuti, layout, programmazioni e tutte le impostazioni. Usa questa funzione per migrare tra istanze cloud e self-hosted.',
'settings.export_my_data': 'Esporta i Miei Dati',
'settings.include_media_zip': 'Includi file multimediali (ZIP)',
'settings.import_data': 'Importa Dati',
'settings.language': 'Lingua',
'settings.about': 'Informazioni',
'settings.about_tagline': 'Sistema di gestione digital signage.',
'settings.third_party_licenses': 'Licenze di Terze Parti',
// Import flow
'settings.import.reading_file': 'Lettura del file...',
'settings.import.zip_detected': 'Rilevata esportazione ZIP: <strong>{name}</strong> ({size} MB)<br>Contiene dati + file multimediali.',
'settings.import.confirm': 'Conferma Importazione',
'settings.import.invalid_file': 'File non valido. Deve essere un file JSON o ZIP esportato da ScreenTinker.',
'settings.import.summary_devices': '{n} dispositivi',
'settings.import.summary_content': '{n} contenuti',
'settings.import.summary_widgets': '{n} widget',
'settings.import.summary_layouts': '{n} layout',
'settings.import.summary_schedules': '{n} programmazioni',
'settings.import.summary_walls': '{n} video wall',
'settings.import.summary_kiosk': '{n} pagine chiosco',
'settings.import.found_summary': 'Trovati: {summary}.<br>Da: {email} (esportati il {date})',
'settings.import.empty_export': 'esportazione vuota',
'settings.import.uploading_zip': 'Caricamento e importazione in corso... Potrebbe richiedere del tempo per file di grandi dimensioni.',
'settings.import.importing': 'Importazione...',
'settings.import.complete': 'Importazione completata: {imported}.',
'settings.import.pairing_codes_title': 'Codici di Associazione Dispositivi:',
'settings.import.pairing_codes_hint': 'Inserisci questi codici su ciascun dispositivo per ricollegarli. Tutte le assegnazioni e le programmazioni verranno mantenute.',
'settings.import.failed': 'Importazione fallita',
'settings.import.failed_with_error': 'Importazione fallita: {error}',
'settings.import.read_failed': 'Lettura del file fallita: {error}',
// Settings toasts
'settings.toast.support_token_generated': 'Token di supporto generato (valido per {hours} ore)',
'settings.toast.import_success': 'Dati importati con successo',
'settings.toast.name_required': 'Il nome non può essere vuoto',
'settings.toast.profile_saved': 'Profilo salvato',
'settings.toast.current_password_required': 'Inserisci la tua password attuale',
'settings.toast.new_password_min_8': 'La nuova password deve contenere almeno 8 caratteri',
'settings.toast.passwords_dont_match': 'Le nuove password non corrispondono',
'settings.toast.password_changed': 'Password cambiata',
'settings.toast.branding_saved': 'Branding salvato',
'settings.toast.preview_applied': 'Anteprima applicata (ricarica per annullare)',
'settings.toast.plan_updated': 'Piano aggiornato',
'settings.toast.user_removed': 'Utente rimosso',
// User management table
'settings.user.col_user': 'Utente',
'settings.user.col_auth': 'Autenticazione',
'settings.user.col_role': 'Ruolo',
'settings.user.col_plan': 'Piano',
'settings.user.col_actions': 'Azioni',
'settings.user.remove': 'Rimuovi',
'settings.user.you': 'Tu',
'settings.user.confirm': 'Confermi?',
'settings.user.count_one': '1 utente registrato',
'settings.user.count_other': '{n} utenti registrati',
'settings.user.reset_password': 'Reimposta Password',
'settings.user.prompt_reset_password': 'Inserisci una nuova password per {email} (minimo 8 caratteri):',
'settings.toast.password_reset_for_user': 'Password reimpostata',
// Widgets
'widget.title': 'Widget',
'widget.subtitle': 'Aggiungi contenuti dinamici ai tuoi layout',
'widget.help_tip': 'Elementi di contenuto dinamico: orologi live, meteo, ticker RSS, testo, pagine web e feed social. Crea un widget e assegnalo alla playlist di un dispositivo.',
'widget.new_widget': 'Nuovo Widget',
'widget.configure': 'Configura Widget',
'widget.preview': 'Anteprima',
'widget.preview_title': 'Anteprima',
'widget.webpage_blocked_note': 'Se questarea è vuota, il sito blocca lincorporamento in un browser; verrà comunque mostrato sullo schermo del dispositivo.',
'widget.close': 'Chiudi',
'widget.edit_x': 'Modifica {type}',
'widget.new_x': 'Nuovo {type}',
'widget.empty_title': 'Ancora nessun widget',
'widget.empty_desc': 'Crea un widget per aggiungere contenuti dinamici ai tuoi layout.',
'widget.this_widget': 'questo widget',
'widget.confirm_delete': 'Eliminare "{name}"? L\'azione è irreversibile.',
'widget.toast.saved': 'Widget salvato',
'widget.toast.deleted': 'Widget eliminato',
'widget.toast.preview_failed': 'Anteprima fallita',
// Widget types
'widget.type.clock.name': 'Orologio',
'widget.type.clock.desc': 'Orologio digitale con data',
'widget.type.weather.name': 'Meteo',
'widget.type.weather.desc': 'Condizioni meteo attuali',
'widget.type.rss.name': 'News Ticker',
'widget.type.rss.desc': 'Feed RSS a scorrimento',
'widget.type.text.name': 'Testo/HTML',
'widget.type.text.desc': 'Testo personalizzato o contenuto HTML',
'widget.type.webpage.name': 'Pagina Web',
'widget.type.webpage.desc': 'Incorpora una pagina web',
'widget.type.social.name': 'Feed Social',
'widget.type.social.desc': 'Feed dei social media',
'widget.type.directory_board.name': 'Albo Fornitori/Directory',
'widget.type.directory_board.desc': 'Elenco scorrevole di inquilini/uffici per hall',
// Widget config form fields
'widget.field.name': 'Nome Widget',
'widget.field.format': 'Formato',
'widget.field.format_12h': '12 Ore',
'widget.field.format_24h': '24 Ore',
'widget.field.timezone': 'Fuso Orario',
'widget.field.font_size': 'Dimensione Font',
'widget.field.font_size_px': 'Dimensione Font (px)',
'widget.field.color': 'Colore',
'widget.field.background': 'Sfondo',
'widget.field.location': 'Località',
'widget.field.location_placeholder': 'Città, Provincia',
'widget.field.units': 'Unità',
'widget.field.units_imperial': 'Imperiale (°F)',
'widget.field.units_metric': 'Metrico (°C)',
'widget.field.feed_url': 'URL del Feed',
'widget.field.scroll_speed_seconds': 'Velocità Scorrimento (secondi)',
'widget.field.max_items': 'Numero Massimo Elementi',
'widget.field.html_content': 'Contenuto HTML',
'widget.field.css_optional': 'CSS (opzionale)',
'widget.field.url': 'URL',
'widget.field.zoom_pct': 'Zoom (%)',
'widget.field.refresh_interval': 'Intervallo di Aggiornamento (secondi, 0 = mai)',
'widget.field.platform': 'Piattaforma',
'widget.field.platform_twitter': 'Twitter/X',
'widget.field.platform_instagram': 'Instagram',
'widget.field.query': 'Ricerca/Query',
'widget.field.query_placeholder': '@utente o #hashtag',
// Content picker
'widget.picker.default_title': 'Seleziona Immagine',
'widget.picker.select_logo': 'Seleziona Logo',
'widget.picker.select_bg_images': 'Seleziona Immagini di Sfondo',
'widget.picker.search': 'Cerca immagini...',
'widget.picker.no_matches': 'Nessuna corrispondenza.',
'widget.picker.no_images': 'Nessuna immagine nella libreria. Carica prima delle immagini dalla Libreria Contenuti.',
'widget.picker.selected_count': '{n} selezionati',
// Directory Board
'widget.dir.title_label': 'Titolo',
'widget.dir.title_placeholder': 'Esempio: Centro Direzionale',
'widget.dir.logo_label': 'Logo (opzionale)',
'widget.dir.footer_text_label': 'Testo a Piè di Pagina',
'widget.dir.footer_placeholder': 'Per informazioni: Contattare...',
'widget.dir.bg_images_label': 'Immagini di Sfondo (opzionale)',
'widget.dir.bg_images_hint': 'Le immagini sfumano ogni 15 secondi al 30% di opacità. Aggiungine più di una per la rotazione.',
'widget.dir.add_bg_image': '+ Aggiungi Immagine di Sfondo',
'widget.dir.theme': 'Tema',
'widget.dir.theme_dark': 'Scuro',
'widget.dir.theme_light': 'Chiaro',
'widget.dir.scroll_speed': 'Velocità Scorrimento',
'widget.dir.speed_slow': 'Lenta',
'widget.dir.speed_medium': 'Media',
'widget.dir.speed_fast': 'Veloce',
'widget.dir.columns': 'Colonne',
'widget.dir.columns_auto': 'Auto',
'widget.dir.categories': 'Categorie',
'widget.dir.add_category': '+ Aggiungi Categoria',
'widget.dir.add_entry': '+ Aggiungi Voce',
'widget.dir.empty_categories': 'Aggiungi il primo piano o dipartimento per iniziare',
'widget.dir.no_entries': 'Ancora nessuna voce',
'widget.dir.entry': 'voce',
'widget.dir.entries': 'voci',
'widget.dir.collapse': 'Comprimi',
'widget.dir.expand': 'Espandi',
'widget.dir.move_up': 'Sposta su',
'widget.dir.move_down': 'Sposta giù',
'widget.dir.delete_category': 'Elimina categoria',
'widget.dir.delete_entry': 'Elimina voce',
'widget.dir.unnamed': '(senza nome)',
'widget.dir.confirm_delete_category': 'Eliminare la categoria "{name}" e tutte le sue voci?',
'widget.dir.category_name_placeholder': 'es. Primo Piano',
'widget.dir.entry_id_placeholder': '101',
'widget.dir.entry_name_placeholder': 'Nome inquilino/ufficio',
'widget.dir.entry_subtitle_placeholder': 'Dettagli (opzionale)',
'widget.dir.available': 'Disponibile',
'widget.dir.change': 'Cambia',
'widget.dir.choose_logo': 'Scegli Logo',
'widget.dir.remove_logo': 'Rimuovi',
'widget.dir.no_bg_images': 'Nessuna immagine di sfondo selezionata',
'widget.dir.remove_bg': 'Rimuovi',
// Designer
'designer.title': 'Content Designer',
'designer.subtitle': 'Crea contenuti dinamici per la segnaletica',
'designer.help_tip': 'Crea contenuti personalizzati con elementi live: orologi, meteo, ticker RSS, countdown e codici QR. Pubblica come widget o esporta come PNG.',
'designer.load_design': 'Carica Progetto',
'designer.export_png': 'Esporta PNG',
'designer.publish': 'Pubblica nella Libreria',
'designer.preview_hint': 'Clicca sugli elementi per selezionarli. Trascina per riposizionarli. L\'anteprima si aggiorna in tempo reale.',
'designer.add_element': 'Aggiungi Elemento',
'designer.background': 'Sfondo',
'designer.bg_image': 'Immagine',
'designer.properties': 'Proprietà',
'designer.layers': 'Livelli',
'designer.no_elements': 'Ancora nessun elemento',
'designer.save_design_file': 'Salva File Progetto',
'designer.qr_label': 'CODICE QR',
'designer.loading_news': 'Caricamento notizie...',
'designer.no_items': 'Nessun elemento',
'designer.feed_unavailable': 'Feed non disponibile',
'designer.countdown_now': 'ORA!',
'designer.widget_name': 'Progetto {date}',
// Element buttons
'designer.el.text': 'Testo',
'designer.el.heading': 'Titolo',
'designer.el.image': 'Immagine',
'designer.el.video': 'Video',
'designer.el.clock': 'Orologio',
'designer.el.date': 'Data',
'designer.el.weather': 'Meteo',
'designer.el.ticker': 'Ticker',
'designer.el.shape': 'Forma',
'designer.el.qr': 'Codice QR',
'designer.el.countdown': 'Countdown',
'designer.el.webpage': 'Pagina Web',
// Backgrounds
'designer.bg.black': 'Nero',
'designer.bg.dark_blue': 'Blu Scuro',
'designer.bg.dark_gradient': 'Gradiente Scuro',
'designer.bg.blue_gradient': 'Gradiente Blu',
'designer.bg.sunset': 'Tramonto',
'designer.bg.ocean': 'Oceano',
'designer.bg.forest': 'Foresta',
'designer.bg.dark_red': 'Rosso Scuro',
'designer.bg.white': 'Bianco',
// Defaults / prompts
'designer.default.text': 'Il tuo testo qui',
'designer.default.heading': 'TITOLO',
'designer.default.coming_soon': 'In Arrivo',
'designer.prompt.video_url': 'URL Video (MP4):',
'designer.prompt.weather_location': 'Città, Provincia:',
'designer.prompt.rss_url': 'URL Feed RSS:',
'designer.prompt.qr_url': 'URL Codice QR:',
'designer.prompt.countdown_date': 'Data obiettivo (AAAA-MM-GG):',
'designer.prompt.webpage_url': 'URL Pagina Web:',
// Properties
'designer.prop.text': 'Testo',
'designer.prop.size': 'Dimensione',
'designer.prop.font': 'Font',
'designer.prop.color': 'Colore',
'designer.prop.bold': 'Grassetto',
'designer.prop.shadow': 'Ombra',
'designer.prop.format': 'Formato',
'designer.prop.show_seconds': 'Mostra secondi',
'designer.prop.muted': 'Muto',
'designer.prop.loop': 'Ripetizione',
'designer.prop.opacity': 'Opacità',
'designer.prop.shape': 'Forma',
'designer.prop.location': 'Località',
'designer.prop.feed_url': 'URL Feed',
'designer.prop.speed': 'Velocità (secondi)',
'designer.prop.text_color': 'Colore Testo',
'designer.prop.bg_color': 'Colore Sfondo',
'designer.prop.target_date': 'Data Obiettivo',
'designer.prop.label': 'Etichetta',
// Toasts
'designer.toast.published': 'Pubblicato come widget! Assegnalo a una zona del layout.',
'designer.toast.publish_failed': 'Pubblicazione fallita',
'designer.toast.export_failed': 'Esportazione fallita: {error}',
'designer.toast.loaded': 'Progetto caricato',
'designer.toast.invalid_file': 'File progetto non valido',
// Playlists
'playlist.title': 'Playlist',
'playlist.subtitle': 'Crea e gestisci le playlist dei contenuti',
'playlist.show_auto_generated': 'Mostra generate automaticamente',
'playlist.new_playlist_btn': '+ Nuova Playlist',
'playlist.new_playlist': 'Nuova Playlist',
'playlist.empty_title': 'Ancora nessuna playlist',
'playlist.empty_desc': 'Crea la tua prima playlist per organizzare i contenuti dei tuoi schermi.',
'playlist.all_auto_generated': 'Tutte le playlist sono generate automaticamente. Attiva "Mostra generate automaticamente" per vederle.',
'playlist.tag_auto': 'auto',
'playlist.tag_draft': 'bozza',
'playlist.item_count_one': '1 elemento',
'playlist.item_count_other': '{n} elementi',
'playlist.created_at': 'Creata il {date}',
'playlist.display_count_one': '1 schermo',
'playlist.display_count_other': '{n} schermi',
'playlist.assigned_to_one': 'Assegnata a 1 schermo',
'playlist.assigned_to_other': 'Assegnata a {n} schermi',
'playlist.load_failed': 'Caricamento playlist fallito: {error}',
'playlist.back_to_playlists': 'Torna alle Playlist',
'playlist.name_placeholder': 'Nome playlist',
'playlist.desc_placeholder': 'Descrizione (opzionale)',
'playlist.create_btn': 'Crea',
'playlist.add_desc_placeholder': 'Aggiungi una descrizione...',
'playlist.click_to_rename': 'Clicca per rinominare',
'playlist.click_to_edit_desc': 'Clicca per modificare la descrizione',
'playlist.add_content': '+ Aggiungi Contenuto',
'playlist.delete_playlist': 'Elimina Playlist',
'playlist.back': 'Indietro',
'playlist.items_empty': 'Questa playlist è vuota',
'playlist.items_empty_hint': 'Clicca su "Aggiungi Contenuto" per inserire elementi.',
'playlist.duration': 'Durata',
'playlist.sec': 'sec',
'playlist.move_up': 'Sposta su',
'playlist.move_down': 'Sposta giù',
'playlist.remove_item': 'Rimuovi elemento',
'playlist.item_widget': 'Widget',
'playlist.unknown_type': 'Tipo sconosciuto',
'playlist.confirm_delete': 'Eliminare "{name}"? L\'azione è irreversibile.',
'playlist.confirm_discard_draft': 'Scartare tutte le modifiche non pubblicate e tornare all\'ultima versione pubblicata?',
'playlist.draft.banner_title': 'Modifiche non pubblicate',
'playlist.draft.devices_showing_published': 'I dispositivi mostrano ancora l\'ultima versione pubblicata.',
'playlist.draft.never_published': 'Questa playlist non è mai stata pubblicata. I dispositivi non mostreranno nulla fino alla pubblicazione.',
'playlist.draft.discard_changes': 'Scarta Modifiche',
'playlist.draft.publish': 'Pubblica',
'playlist.draft.publishing': 'Pubblicazione...',
'playlist.toast.created': 'Playlist creata',
'playlist.toast.deleted': 'Playlist eliminata',
'playlist.toast.published': 'Playlist pubblicata — dispositivi aggiornati',
'playlist.toast.draft_discarded': 'Modifiche alla bozza scartate',
'playlist.toast.item_removed': 'Elemento rimosso',
'playlist.add_modal_title': 'Aggiungi Contenuto alla Playlist',
'playlist.tab_content': 'Contenuti',
'playlist.tab_widgets': 'Widget',
'playlist.search_placeholder': 'Cerca...',
'playlist.close': 'Chiudi',
'playlist.no_content_found': 'Nessun contenuto trovato',
'playlist.no_widgets_found': 'Nessun widget trovato',
'playlist.add_btn': 'Aggiungi',
'playlist.replace_item': 'Sostituisci contenuto',
'playlist.duplicate_item': 'Duplica elemento',
'playlist.replace_modal_title': 'Sostituisci contenuto',
'playlist.replace_btn': 'Sostituisci',
'playlist.replacing': 'Sostituzione…',
'playlist.toast.item_duplicated': 'Elemento duplicato',
'playlist.toast.item_replaced': 'Contenuto sostituito',
'playlist.adding': 'Aggiunta in corso...',
'playlist.added': 'Aggiunto',
// Onboarding
'onboarding.back': 'Indietro',
'onboarding.next': 'Avanti',
'onboarding.skip': 'Salta Configurazione',
'onboarding.go_to_dashboard': 'Vai alla Dashboard',
'onboarding.pair_display': 'Associa Schermo',
'onboarding.step.welcome.title': 'Benvenuto su ScreenTinker!',
'onboarding.step.welcome.intro': "Configuriamo il tutto in meno di 5 minuti.",
'onboarding.step.welcome.guide_through': 'Questa procedura guidata ti aiuterà a:',
'onboarding.step.welcome.bullet_download': 'Scaricare l\'app del player',
'onboarding.step.welcome.bullet_pair': 'Associare il tuo primo schermo',
'onboarding.step.welcome.bullet_upload': 'Caricare e assegnare i contenuti',
'onboarding.step.player.title': 'Passaggio 1: Scarica l\'App Player',
'onboarding.step.player.intro': 'Installa il player sul tuo dispositivo di visualizzazione.',
'onboarding.step.player.android_label': 'APK Android',
'onboarding.step.player.android_desc': 'TV box, tablet, Fire TV',
'onboarding.step.player.web_label': 'Web Player',
'onboarding.step.player.web_desc': 'Qualsiasi browser, Pi, ChromeOS',
'onboarding.step.player.url_hint': 'Apri l\'app sullo schermo e inserisci questo URL del server:',
'onboarding.step.pair.title': 'Passaggio 2: Associa lo Schermo',
'onboarding.step.pair.intro': 'Inserisci il codice di 6 cifre mostrato sullo schermo.',
'onboarding.step.pair.name_placeholder': 'Nome schermo (es. TV Atrio)',
'onboarding.step.upload.title': 'Passaggio 3: Carica Contenuti',
'onboarding.step.upload.intro': 'Carica un video o un\'immagine da visualizzare.',
'onboarding.step.upload.click_to_select': 'Clicca per selezionare un file',
'onboarding.step.upload.formats': 'MP4, WebM, JPEG, PNG, GIF',
'onboarding.step.upload.uploading': 'Caricamento...',
'onboarding.step.done.title': 'Tutto pronto!',
'onboarding.step.done.intro': 'Il tuo schermo è associato e il contenuto è in riproduzione!',
'onboarding.step.done.whats_next': 'E adesso?',
'onboarding.step.done.next_content': 'Aggiungi altri contenuti nella <strong>Libreria Contenuti</strong>',
'onboarding.step.done.next_layouts': 'Crea layout multi-zona in <strong>Layout</strong>',
'onboarding.step.done.next_schedule': 'Imposta una programmazione nel calendario <strong>Programmazione</strong>',
'onboarding.step.done.next_widgets': 'Aggiungi widget live (orologio, meteo, ticker) in <strong>Widget</strong>',
'onboarding.step.done.next_kiosk': 'Crea schermi interattivi in <strong>Chiosco</strong>',
'onboarding.step.done.next_designer': 'Progetta contenuti personalizzati nel <strong>Designer</strong>',
'onboarding.toast.invalid_code': 'Inserisci un codice valido di 6 cifre',
'onboarding.toast.pairing': 'Associazione...',
'onboarding.toast.pair_failed': 'Associazione fallita',
'onboarding.toast.pair_failed_with_error': 'Associazione fallita: {error}',
'onboarding.toast.paired': 'Schermo associato!',
'onboarding.toast.uploaded_assigning': 'Caricato! Assegnazione allo schermo...',
'onboarding.toast.content_assigned': 'Contenuto caricato e assegnato!',
'onboarding.toast.upload_failed': 'Caricamento fallito',
'onboarding.toast.error_with_error': 'Errore: {error}',
// Admin (platform admin panel)
'admin.title': 'Amministratore di Piattaforma',
'admin.subtitle': 'Controlli Superadmin - visibili solo a te',
'admin.access_denied': 'Accesso Negato',
'admin.access_denied_desc': 'È richiesto l\'accesso come amministratore di piattaforma.',
'admin.all_users': 'Tutti gli Utenti',
'admin.plans': 'Piani di Abbonamento',
'admin.system': 'Sistema',
'admin.col.user': 'Utente',
'admin.col.auth': 'Autenticazione',
'admin.col.last_login': 'Ultimo Accesso',
'admin.col.role': 'Ruolo',
'admin.col.plan': 'Piano',
'admin.col.actions': 'Azioni',
'admin.col.devices': 'Dispositivi',
'admin.col.storage': 'Archiviazione',
'admin.col.monthly': 'Mensile',
'admin.col.yearly': 'Annuale',
'admin.role.user': 'Utente',
'admin.role.admin': 'Admin',
'admin.role.superadmin': 'Superadmin',
'admin.remove': 'Rimuovi',
'admin.owner': 'Proprietario',
'admin.confirm': 'Confermi?',
'admin.total_users': '{n} utenti totali',
'admin.unlimited': 'Illimitato',
'admin.free': 'Gratis',
'admin.version': 'Versione',
'admin.frontend_hash': 'Hash Frontend',
'admin.download_db_backup': 'Scarica Backup DB',
'admin.server_status': 'Stato del Server',
'admin.toast.role_updated': 'Ruolo aggiornato',
'admin.toast.plan_updated': 'Piano aggiornato',
'admin.toast.user_removed': 'Utente rimosso',
'admin.reset_password': 'Reimposta Password',
'admin.prompt_reset_password': 'Inserisci una nuova password per {email} (minimo 8 caratteri):',
'admin.toast.password_min_8': 'La password deve contenere almeno 8 caratteri',
'admin.toast.password_reset': 'Password reimpostata',
// Schedule
'schedule.title': 'Programmazione',
'schedule.subtitle': 'Calendario di programmazione contenuti',
'schedule.help_tip': 'Calendario settimanale visivo per la programmazione dei contenuti. Clicca su "Aggiungi Programmazione" per creare fasce orarie. Imposta la ricorrenza per i contenuti ripetitivi. La priorità più alta prevale su quella più bassa. Le programmazioni a livello di dispositivo prevalgono su quelle di gruppo.',
'schedule.prev_week': '< Prec',
'schedule.next_week': 'Succ >',
'schedule.add_schedule': 'Aggiungi Programmazione',
'schedule.edit_schedule': 'Modifica Programmazione',
'schedule.apply_to': 'Applica a',
'schedule.target_device': 'Dispositivo',
'schedule.target_group': 'Gruppo',
'schedule.group_devices_count': '{n} dispositivi',
'schedule.no_groups_msg': 'Ancora nessun gruppo creato. Crea i gruppi nella pagina Schermi.',
'schedule.zone_note': 'Nota: Le programmazioni basate sulle zone sono specifiche per ogni layout. Assicurati che tutti i dispositivi nel gruppo utilizzino lo stesso layout.',
'schedule.playlist_override': 'Sovrascrittura Playlist',
'schedule.no_playlist_override': '— Nessuna sovrascrittura playlist —',
'schedule.draft_suffix': '(bozza)',
'schedule.layout_override': 'Sovrascrittura Layout',
'schedule.no_layout_override': '— Nessuna sovrascrittura layout —',
'schedule.content_label': 'Contenuto',
'schedule.content_hint': '(elemento singolo, opzionale)',
'schedule.content_none': '— Nessuno —',
'schedule.title_label': 'Titolo (opzionale)',
'schedule.title_placeholder': 'es. Playlist Mattutina',
'schedule.start_time': 'Ora Inizio',
'schedule.end_time': 'Ora Fine',
'schedule.repeat': 'Ripeti',
'schedule.repeat_none': 'Nessuna ripetizione',
'schedule.repeat_daily': 'Giornaliero',
'schedule.repeat_weekdays': 'Giorni feriali',
'schedule.repeat_weekends': 'Fine settimana',
'schedule.repeat_weekly': 'Settimanale',
'schedule.priority': 'Priorità',
'schedule.color': 'Colore',
'schedule.scheduled_label': 'Programmato',
'schedule.tooltip_group_prefix': 'Gruppo: ',
'schedule.tooltip_priority': 'Priorità: {n}',
'schedule.day.sun': 'Dom',
'schedule.day.mon': 'Lun',
'schedule.day.tue': 'Mar',
'schedule.day.wed': 'Mer',
'schedule.day.thu': 'Gio',
'schedule.day.fri': 'Ven',
'schedule.day.sat': 'Sab',
'schedule.hour_12am': '00:00',
'schedule.hour_am': 'am',
'schedule.hour_12pm': '12:00',
'schedule.hour_pm': 'pm',
'schedule.toast.no_groups': 'Nessun gruppo disponibile. Crea prima un gruppo.',
'schedule.toast.saved': 'Programmazione salvata',
// Reports
'report.title': 'Report',
'report.subtitle': 'Analisi proof-of-play e attività dei dispositivi',
'report.help_tip': 'Analisi proof-of-play. Visualizza cosa è stato riprodotto, quando e su quale dispositivo. Filtra per intervallo di date e dispositivo. Esporta in CSV per la verifica pubblicitaria.',
'report.export_csv': 'Esporta CSV',
'report.device': 'Dispositivo',
'report.all_devices': 'Tutti i dispositivi',
'report.start_date': 'Data Inizio',
'report.end_date': 'Data Fine',
'report.load_report': 'Carica Report',
'report.select_range': 'Seleziona un intervallo di date e clicca su Carica Report',
'report.error': 'Errore',
'report.total_plays': 'Riproduzioni Totali',
'report.total_hours': 'Ore Totali',
'report.unique_content': 'Contenuti Unici',
'report.active_devices': 'Dispositivi Attivi',
'report.avg_duration': 'Durata Media',
'report.plays_per_day': 'Riproduzioni al Giorno',
'report.plays_by_hour': 'Riproduzioni per Ora',
'report.top_content': 'Contenuti più riprodotti',
'report.by_device': 'Per Dispositivo',
'report.no_data': 'Nessun dato',
'report.col.content': 'Contenuto',
'report.col.device': 'Dispositivo',
'report.col.plays': 'Riproduzioni',
'report.col.total_hours': 'Ore Totali',
'report.col.completion': 'Completamento',
// Kiosk
'kiosk.title': 'Pagine Chiosco',
'kiosk.subtitle': 'Crea interfacce touchscreen interattive',
'kiosk.help_tip': 'Crea interfacce touchscreen interattive. Aggiungi pulsanti con icone e azioni. Include una schermata di attesa (idle) che appare dopo un periodo di inattività. Assegna le pagine ai dispositivi come widget.',
'kiosk.new_page': 'Nuova Pagina Chiosco',
'kiosk.prompt_name': 'Nome pagina chiosco:',
'kiosk.empty_title': 'Ancora nessuna pagina chiosco',
'kiosk.empty_desc': 'Crea un\'interfaccia touchscreen interattiva per i tuoi schermi.',
'kiosk.label': 'Pagina Chiosco',
'kiosk.preview': 'Anteprima',
'kiosk.confirm_delete': 'Eliminare la pagina chiosco "{name}"? L\'azione è irreversibile.',
'kiosk.toast.deleted': 'Pagina chiosco eliminata',
'kiosk.toast.delete_failed': 'Eliminazione fallita',
'kiosk.toast.saved': 'Pagina chiosco salvata',
'kiosk.not_found': 'Pagina non trovata',
'kiosk.back': 'Torna a Pagine Chiosco',
'kiosk.page_settings': 'Impostazioni Pagina',
'kiosk.title_label': 'Titolo',
'kiosk.subtitle_label': 'Sottotitolo',
'kiosk.logo_url': 'URL Logo',
'kiosk.footer_text': 'Testo a Piè di Pagina',
'kiosk.idle_title': 'Titolo Schermata di Attesa',
'kiosk.idle_default': 'Tocca per Iniziare',
'kiosk.idle_timeout': 'Timeout Inattività (secondi)',
'kiosk.style': 'Stile',
'kiosk.background': 'Sfondo',
'kiosk.text_color': 'Colore Testo',
'kiosk.columns': 'Colonne',
'kiosk.button_color': 'Colore Pulsante',
'kiosk.button_hover': 'Colore Pulsante al Passaggio',
'kiosk.buttons': 'Pulsanti',
'kiosk.add_btn': '+ Aggiungi',
'kiosk.icon_placeholder': 'Emoji',
'kiosk.label_placeholder': 'Etichetta',
'kiosk.sublabel_placeholder': 'Sotto-etichetta',
'kiosk.action_none': 'Nessuna azione',
'kiosk.action_url': 'Apri URL',
'kiosk.action_page': 'Vai alla pagina',
'kiosk.url_placeholder': 'URL o pagina',
'kiosk.no_buttons': 'Ancora nessun pulsante',
'kiosk.new_button': 'Nuovo Pulsante',
// Layout editor
'layout.title': 'Layout',
'layout.subtitle': 'Layout dello schermo e modelli',
'layout.help_tip': 'Crea layout dello schermo multi-zona. Usa i modelli o creane di personalizzati. Trascina le zone per posizionarle e ridimensionale con la maniglia d\'angolo. Assegna i layout ai dispositivi nella scheda Playlist.',
'layout.new_layout': 'Nuovo Layout',
'layout.templates': 'Modelli',
'layout.my_layouts': 'I miei Layout',
'layout.empty_custom': 'Ancora nessun layout personalizzato',
'layout.prompt_name': 'Nome layout:',
'layout.default_zone_name': 'Principale',
'layout.template_label': 'Modello',
'layout.use_template': 'Usa Modello',
'layout.zone_count_one': '1 zona',
'layout.zone_count_other': '{n} zone',
'layout.confirm_delete': 'Eliminare il layout "{name}"? L\'azione è irreversibile.',
'layout.toast.deleted': 'Layout eliminato',
'layout.toast.delete_failed': 'Eliminazione layout fallita',
'layout.toast.saved': 'Layout salvato',
'layout.not_found': 'Layout non trovato',
'layout.back': 'Torna ai Layout',
'layout.add_zone': 'Aggiungi Zona',
'layout.zones': 'Zone',
'layout.properties': 'Proprietà',
'layout.delete_zone': 'Elimina Zona',
'layout.zone_n': 'Zona {n}',
'layout.prop.name': 'Nome',
'layout.prop.x': 'X (%)',
'layout.prop.y': 'Y (%)',
'layout.prop.width': 'Larghezza (%)',
'layout.prop.height': 'Altezza (%)',
'layout.prop.type': 'Tipo',
'layout.type_content': 'Contenuto',
'layout.type_widget': 'Widget',
// Video walls
'wall.title': 'Video Wall',
'wall.subtitle': 'Combina più schermi in un unico grande monitor',
'wall.help_tip': 'Combina più schermi in un unico grande monitor. Imposta la dimensione della griglia, trascina i dispositivi nelle posizioni e regola la compensazione della cornice (bezel). Assegna i contenuti per la riproduzione su tutti i dispositivi.',
'wall.new_wall': 'Nuovo Video Wall',
'wall.prompt_name': 'Nome video wall:',
'wall.empty_title': 'Ancora nessun video wall',
'wall.empty_desc': 'Crea un video wall per combinare più schermi.',
'wall.grid_summary': 'Griglia {cols}x{rows} • {n} dispositivi',
'wall.not_found': 'Video wall non trovato',
'wall.back': 'Torna ai Video Wall',
'wall.delete_wall': 'Elimina Video Wall',
'wall.grid_config': 'Configurazione Griglia',
'wall.columns': 'Colonne',
'wall.rows': 'Righe',
'wall.h_bezel': 'Cornice Orizz. (px)',
'wall.v_bezel': 'Cornice Vert. (px)',
'wall.update': 'Aggiorna',
'wall.content': 'Contenuto',
'wall.no_content': 'Nessun contenuto',
'wall.set_content': 'Imposta Contenuto',
'wall.available_displays': 'Schermi Disponibili',
'wall.all_assigned': 'Tutti i dispositivi assegnati',
'wall.drop_here': 'Trascina qui',
'wall.toast.placed': '{name} posizionato in [{col},{row}]',
'wall.toast.grid_updated': 'Griglia aggiornata',
'wall.toast.content_updated': 'Contenuto aggiornato',
'wall.toast.deleted': 'Video wall eliminato',
// Billing
'billing.title': 'Abbonamento',
'billing.subtitle': 'Gestisci il tuo piano e la fatturazione',
'billing.current_plan': 'Piano Attuale',
'billing.self_hosted': 'Self-Hosted',
'billing.trial_days_left': 'Prova - {n} giorni rimasti',
'billing.trial_ends': 'La tua prova del piano {plan} termina tra {n} giorni',
'billing.trial_after': "Al termine della prova, passerai al piano Gratis (1 dispositivo). Effettua l'upgrade ora per mantenere tutti i tuoi dispositivi e funzionalità.",
'billing.devices': 'Dispositivi',
'billing.devices_lc': 'dispositivi',
'billing.storage': 'Archiviazione',
'billing.storage_lc': 'archiviazione',
'billing.features': 'Funzionalità',
'billing.feat.remote_control': 'Controllo Remoto',
'billing.feat.remote_urls': 'URL Remoti',
'billing.feat.priority_support': 'Supporto Prioritario',
'billing.available_plans': 'Piani Disponibili',
'billing.current': 'Attuale',
'billing.unlimited': 'Illimitato',
'billing.free': 'Gratis',
'billing.per_month': '/mese',
'billing.yearly_save': 'o ${price}/anno (risparmia il {pct}%)',
'billing.monthly': 'Mensile',
'billing.yearly': 'Annuale',
'billing.manage_subscription': 'Gestisci Abbonamento',
'billing.self_hosted_note': 'Modalità self-hosted: i piani possono essere assegnati dagli amministratori senza fatturazione.',
'billing.failed_to_load': 'Caricamento fallito',
'billing.toast.checkout_failed': 'Impossibile avviare il pagamento: {error}',
'billing.toast.portal_failed': 'Impossibile aprire il portale di fatturazione: {error}',
'billing.toast.payment_success': 'Pagamento riuscito! Il tuo piano è stato aggiornato.',
// Teams
'team.title': 'Team',
'team.subtitle': 'Gestisci i team e l\'accesso condiviso',
'team.help_tip': 'Crea dei team per condividere i dispositivi con altri utenti. I proprietari gestiscono il team, gli editor possono modificare contenuti/playlist, i visualizzatori possono solo monitorare.',
'team.new_team': 'Nuovo Team',
'team.prompt_name': 'Nome del team:',
'team.empty_title': 'Ancora nessun team',
'team.empty_desc': 'Crea un team per condividere i dispositivi con altri utenti.',
'team.your_role': 'Il tuo ruolo: {role}',
'team.member_count_one': '1 membro',
'team.member_count_other': '{n} membri',
'team.not_found': 'Team non trovato',
'team.back': 'Torna ai Team',
'team.delete_team': 'Elimina Team',
'team.members_count': 'Membri ({n})',
'team.invite': '+ Invita',
'team.role_viewer': 'Visualizzatore',
'team.role_editor': 'Editor',
'team.role_owner': 'Proprietario',
'team.remove': 'Rimuovi',
'team.remove_from_team': 'Rimuovi dal team',
'team.no_members': 'Ancora nessun membro',
'team.shared_devices': 'Dispositivi Condivisi ({n})',
'team.add_device': '+ Aggiungi dispositivo...',
'team.no_devices': 'Nessun dispositivo condiviso con questo team',
'team.prompt_email': 'Indirizzo email da invitare:',
'team.prompt_role': 'Ruolo (visualizzatore, editor o proprietario):',
'team.toast.invalid_role': 'Ruolo non valido',
'team.toast.invitation_sent': 'Invito inviato',
'team.toast.role_updated': 'Ruolo aggiornato',
'team.toast.member_removed': 'Membro rimosso',
'team.toast.device_added': 'Dispositivo aggiunto al team',
'team.toast.device_removed': 'Dispositivo rimosso dal team',
'team.toast.deleted': 'Team eliminato',
// Activity log
'activity.title': 'Registro Attività',
'activity.subtitle': 'Tracciamento di tutte le azioni effettuate',
'activity.load_more': 'Carica Altro',
'activity.empty_title': 'Ancora nessuna attività',
'activity.empty_desc': 'Le azioni appariranno qui man mano che utilizzerai il sistema.',
'activity.system': 'Sistema',
'activity.verb_created': 'ha creato',
'activity.verb_updated': 'ha aggiornato',
'activity.verb_deleted': 'ha eliminato',
'activity.action_paired_device': 'ha associato un dispositivo',
'activity.action_added_remote_content': 'ha aggiunto un contenuto remoto',
'activity.noun_content': 'contenuto',
'activity.noun_device': 'dispositivo',
'activity.noun_playlist_assignment': 'assegnazione playlist',
'activity.noun_assignment': 'assegnazione',
'activity.noun_layout': 'layout',
'activity.noun_widget': 'widget',
'activity.noun_schedule': 'programmazione',
'activity.noun_video_wall': 'video wall',
'activity.alert_device_offline': 'avviso: il dispositivo è andato offline',
// Help
'help.title': 'Centro Assistenza',
'help.subtitle': 'Guide rapide e FAQ',
'help.faq': 'Domande Frequenti (FAQ)',
'help.shortcuts': 'Scorciatoie da Tastiera',
'help.shortcut_esc': 'Ripristina web player (sulla pagina del player)',
'help.shortcut_f': 'Attiva/Disattiva schermo intero (web player)',
// Add Display modal (in index.html)
'add_display.title': 'Aggiungi Schermo',
'add_display.intro': 'Inserisci il codice di associazione di 6 cifre mostrato sullo schermo.',
'add_display.pairing_code': 'Codice di Associazione',
'add_display.display_name': 'Nome Schermo (opzionale)',
'add_display.name_placeholder': 'es. TV Atrio',
'add_display.need_player': 'Ti serve l\'app player? Installane una per ottenere il codice:',
'add_display.android_apk': 'APK Android',
'add_display.web_player': 'Web Player',
'add_display.raspberry_pi': 'Raspberry Pi',
'add_display.windows': 'Windows',
'add_display.smart_tv_note': 'Smart TV (LG/Samsung): apri il browser integrato e vai su <code style="background:var(--bg-input,#0f172a);padding:1px 4px;border-radius:3px">/player</code>',
'add_display.pair_btn': 'Associa Schermo',
};