diff --git a/web/themes/default/app.js b/web/themes/default/app.js
index 02e0de0..2fa47d9 100644
--- a/web/themes/default/app.js
+++ b/web/themes/default/app.js
@@ -108,6 +108,7 @@ function _langToggleLabel(lang){
if(lang==='de')return 'Deutsch';
if(lang==='en')return 'English';
if(lang==='fr')return 'Français';
+ if(lang==='it')return 'Italiano';
if(lang==='zh-cn')return '简体中文';
return 'Espanol';
}
@@ -115,10 +116,10 @@ function _langToggleLabel(lang){
function _mapSupportedLang(lang){
if(!lang)return '';
var l=String(lang).toLowerCase().replace(/_/g,'-').trim();
- if(l==='de'||l==='en'||l==='es'||l==='fr'||l==='zh-cn')return l;
+ if(l==='de'||l==='en'||l==='es'||l==='fr'||l==='it'||l==='zh-cn')return l;
var base=l.split('-')[0];
- if(base==='de'||base==='en'||base==='es'||base==='fr')return base;
+ if(base==='de'||base==='en'||base==='es'||base==='fr'||base==='it')return base;
if(base==='zh'){
if(l.indexOf('cn')>=0||l.indexOf('hans')>=0||l==='zh')return 'zh-cn';
diff --git a/web/themes/default/index.html b/web/themes/default/index.html
index a783654..345db9a 100644
--- a/web/themes/default/index.html
+++ b/web/themes/default/index.html
@@ -39,6 +39,7 @@
+
@@ -521,6 +522,7 @@
+
diff --git a/web/translations/it.json b/web/translations/it.json
new file mode 100644
index 0000000..56ed376
--- /dev/null
+++ b/web/translations/it.json
@@ -0,0 +1,291 @@
+{
+ "header_status_standby": "Pronto",
+ "header_status_printing": "In stampa",
+ "header_status_complete": "Completato",
+ "header_status_error": "Errore",
+ "kobra_free": "Pronto",
+ "kobra_busy": "Occupato",
+ "kobra_printing": "In stampa",
+ "kobra_preheating": "Preriscaldamento",
+ "kobra_auto_leveling": "Livellamento automatico",
+ "kobra_checking": "Verifica",
+ "kobra_updated": "Aggiornamento",
+ "kobra_init": "Inizializzazione",
+ "kobra_pausing": "Pausa in corso...",
+ "kobra_paused": "In pausa",
+ "kobra_resuming": "Ripresa...",
+ "kobra_resumed": "Ripreso",
+ "kobra_stopping": "Arresto...",
+ "kobra_stoped": "Arrestato",
+ "kobra_finished": "Finito",
+ "kobra_failed": "Errore",
+ "kobra_canceled": "Annullato",
+ "kobra_offline": "Offline",
+ "nav_dashboard": "Dashboard",
+ "nav_print": "Stampa",
+ "nav_temps": "Temperature",
+ "nav_motion": "Movimento",
+ "nav_ams": "AMS",
+ "nav_extras": "Luce / Ventola",
+ "nav_console": "Console",
+ "card_progress": "Avanzamento",
+ "card_temps": "Temperature",
+ "card_light_fan": "Ventola",
+ "card_speed": "Velocità di stampa",
+ "card_cam": "Camera",
+ "lbl_elapsed": "Trascorso:",
+ "lbl_remaining": "Rimanente:",
+ "lbl_slicer_time": "Stima slicer:",
+ "lbl_layers": "Layer",
+ "lbl_zpos": "Z (mm)",
+ "speed_silent": "🐢 Silenzioso",
+ "speed_normal": "⚡ Normale",
+ "speed_sport": "🚀 Sport",
+ "lbl_light": "💡 Luce",
+ "lbl_feed": "Carica",
+ "lbl_unload": "Rimuovi",
+ "card_ace_dry": "Essiccazione ACE",
+ "ace_dry_dryer": "Essiccatore",
+ "ace_dry_status_off": "Stato: Spento",
+ "ace_dry_status_on": "Stato: Attivo",
+ "ace_dry_status_remaining": "Rimanente",
+ "ace_dry_humidity": "Umidità",
+ "ace_dry_current_temp": "Temperatura",
+ "ace_dry_chart": "Cronologia (Temp/Umidità)",
+ "ace_dry_temp": "Temperatura (°C)",
+ "ace_dry_duration": "Durata (min)",
+ "ace_dry_start": "▶ Avvia",
+ "ace_dry_stop": "■ Ferma",
+ "ace_dry_auto_refill": "Ricarica automatica",
+ "ace_dry_enable": "Abilita essiccazione",
+ "ace_dry_temp_line": "Temperatura di essiccazione",
+ "ace_dry_time_line": "Tempo di essiccazione",
+ "ace_dry_ui_pending": "(Solo interfaccia, backend a seguire)",
+ "ace_dry_dialog_title": "Impostazioni Temp/Tempo essiccatore",
+ "ace_dry_dialog_temp": "Temperatura (30-80°C)",
+ "ace_dry_dialog_time": "Tempo rim. (h:m:s)",
+ "ace_dry_dialog_confirm": "Conferma",
+ "ace_dry_dialog_cancel": "Annulla",
+ "ace_dry_dialog_save_restart": "Salva e riavvia",
+ "ace_dry_dialog_custom_name": "Nome personalizzato",
+ "ace_dry_dialog_reset_default": "Ripristina predefiniti",
+ "ace_dry_preset_pla": "PLA",
+ "ace_dry_preset_pla_plus": "PLA+",
+ "ace_dry_preset_petg": "PETG",
+ "ace_dry_preset_tpu": "TPU",
+ "ace_dry_preset_abs_asa": "ABS / ASA",
+ "ace_dry_preset_pa_pc": "PA / PC",
+ "ace_dry_preset_custom": "Personalizzato",
+ "cam_placeholder": "📷 Camera non avviata",
+ "cam_stream_unavailable": "Flusso video non disponibile",
+ "btn_cam_start": "▶ Camera",
+ "btn_cam_stop": "◼ Camera",
+ "btn_pause": "⏸ Pausa",
+ "btn_resume": "▶ Riprendi",
+ "btn_cancel": "✕ Stop",
+ "label_nozzle": "Ugello",
+ "label_bed": "Piatto",
+ "label_fan": "🌀 Ventola",
+ "label_light": "💡 Luce",
+ "label_on_off": "On / Off",
+ "label_speed": "Velocità",
+ "panel_print_title": "Controllo stampa",
+ "panel_print_btn_pause": "⏸ Pausa",
+ "panel_print_btn_resume": "▶ Riprendi",
+ "panel_print_btn_cancel": "✕ Annulla",
+ "panel_print_temps_live": "Temperature (In tempo reale)",
+ "label_set": "Imposta",
+ "label_off": "Off",
+ "panel_temps_nozzle": "Ugello",
+ "panel_temps_bed": "Piatto riscaldato",
+ "panel_temps_chart": "Cronologia (ultime 60 letture)",
+ "label_target_c": "Target:",
+ "panel_motion_xy": "Assi XY",
+ "panel_motion_z": "Asse Z",
+ "label_step": "Ampiezza passo:",
+ "btn_home_z": "Home Z",
+ "btn_home_xy": "Home XY",
+ "btn_home_all": "Home generale",
+ "btn_disable_motors": "Spegni motori",
+ "panel_ams_title": "Filamento",
+ "card_ams": "Filamento",
+ "ams_no_data": "Nessun dato ricevuto dall' AMS",
+ "label_slot": "Slot",
+ "ams_empty": "Vuoto",
+ "panel_extras_light": "Luce",
+ "panel_extras_fan": "Ventola",
+ "panel_extras_camera": "Camera",
+ "btn_cam_start2": "▶ Avvia",
+ "btn_cam_stop2": "◼ Ferma",
+ "panel_console_title": "Registro eventi",
+ "log_light_on": "Luce accesa",
+ "log_light_off": "Luce spenta",
+ "log_fan": "Ventola →",
+ "log_nozzle": "Ugello →",
+ "log_bed": "Piatto →",
+ "log_axis": "Asse",
+ "log_home": "Home",
+ "log_home_all": "Home generale",
+ "log_cam_start": "Camera avviata:",
+ "log_cam_stop": "Camera arrestata",
+ "log_poll_error": "Errore di sincronizzazione:",
+ "log_error": "Errore:",
+ "confirm_cancel": "Annullare davvero la stampa?",
+ "settings_title": "Impostazioni",
+ "settings_connection": "Connessione",
+ "settings_print": "Impostazioni di stampa",
+ "settings_poll": "Intervallo di sincronizzazione (secondi)",
+ "nav_settings": "Impostazioni",
+ "settings_cat_display": "Aspetto",
+ "settings_cat_filament": "Filamento",
+ "settings_cat_language": "Lingua",
+ "settings_cat_theme": "Alterna chiaro / scuro",
+ "settings_filament_mapping": "Mappatura profilo filamento (per slot)",
+ "settings_filament_mapping_save": "Salva mappatura",
+ "settings_visible_vendors": "Produttori visibili (menu del profilo)",
+ "settings_visible_vendors_hint": "Solo questi produttori appariranno nel menu del profilo dello slot. Se non selezioni nulla = mostra tutti. I profili \"Generici\" e i tuoi personali sono sempre visibili.",
+ "settings_visible_vendors_save": "Salva selezione",
+ "progress_action_print": "Stampa",
+ "progress_action_slots": "Mappa slot",
+ "progress_action_clear": "Cancella",
+ "settings_version": "Versione",
+ "settings_save": "Salva e riavvia",
+ "settings_printer_name": "Nome stampante",
+ "settings_printer_ip": "IP stampante",
+ "settings_mqtt_port": "Porta MQTT",
+ "settings_username": "Nome utente MQTT",
+ "settings_password": "Password MQTT",
+ "settings_device_id": "ID dispositivo",
+ "settings_mode_id": "ID modalità",
+ "hint_ip_no_port": "Solo indirizzo IP, senza porta (es. 192.168.1.102)",
+ "settings_default_slot": "Slot predefinito (colore singolo)",
+ "settings_slot_auto": "Auto (tutti gli slot caricati)",
+ "settings_auto_leveling": "Livellamento automatico predefinito",
+ "fd_options_title": "Opzioni di stampa",
+ "print_auto_leveling": "Livellamento automatico",
+ "settings_file_ready_mode": "Comportamento all'avvio stampa",
+ "settings_file_ready_banner": "Barra di stampa",
+ "settings_file_ready_dialog": "Finestra di dialogo di stampa",
+ "settings_camera_on_print": "Attiva la camera all'avvio della stampa",
+ "settings_web_upload_warning": "Mostra un avviso quando si stampano caricamenti web",
+ "update_check": "Controlla aggiornamenti",
+ "update_checking": "Verifica in corso...",
+ "update_available": "disponibile",
+ "update_none": "Già aggiornato",
+ "update_apply": "Installa ora",
+ "update_applying": "Download in corso...",
+ "update_restarting": "Riavvio in corso...",
+ "update_error": "Errore",
+ "btn_connect": "⚡ Connetti",
+ "btn_disconnect": "✕ Disconnetti",
+ "lbl_conn_error": "Errore di connessione:",
+ "slot_edit_title": "Modifica slot",
+ "slot_edit_color": "Colore",
+ "slot_edit_material": "Materiale",
+ "slot_edit_load": "⬇ Carica",
+ "slot_edit_unload": "⬆ Rimuovi",
+ "slot_edit_save": "💾 Salva",
+ "slot_edit_custom": "es. PLA, PETG, ABS…",
+ "slot_edit_ok": "Slot AMS",
+ "slot_edit_profile": "Profilo OrcaSlicer",
+ "slot_edit_profile_hint": "Inviato durante la sincronizzazione con OrcaSlicer come marchio specifico invece di un semplice \"Generico\"",
+ "slot_edit_profile_default": "— Generico (predefinito) —",
+ "orca_profile_section": "Profili OrcaSlicer",
+ "orca_profile_hint": "Importa i tuoi profili di filamento OrcaSlicer (apri la cartella utente tramite Aiuto → Mostra cartella di configurazione)",
+ "orca_profile_import_btn": "Importa profili",
+ "orca_profile_import_link": "★ Importa i tuoi profili…",
+ "orca_profile_import_title": "Importa i tuoi profili OrcaSlicer",
+ "orca_profile_help_html": "Carica un file ZIP della tua cartella filamenti di OrcaSlicer o file singoli .json.
In OrcaSlicer: Aiuto → Mostra cartella di configurazione → user/<id>/filament/",
+ "orca_profile_dropmsg": "Trascina qui o fai clic",
+ "orca_profile_list_label": "Attualmente importati",
+ "orca_profile_user_label": "Profili personali",
+ "orca_profile_user_empty": "– nessuno –",
+ "orca_profile_uploading": "Caricamento in corso…",
+ "orca_profile_done": "Importato",
+ "orca_profile_skipped": "saltato",
+ "log_dir_all": "Tutti",
+ "log_dir_rx": "RX",
+ "log_dir_tx": "TX",
+ "log_dir_label": "Dir:",
+ "log_lvl_label": "Livello:",
+ "log_lvl_err": "⛔ Errori",
+ "log_lvl_warn": "⚠ Avvisi",
+ "log_topic_label": "Argomento:",
+ "log_topic_ams": "AMS",
+ "log_topic_print": "Stampa",
+ "log_topic_info": "Info",
+ "log_topic_status": "Stato",
+ "log_download": "⬇ Scarica",
+ "log_auto": "⬇ Auto",
+ "log_clear": "✕ Cancella",
+ "log_filter_placeholder": "Filtra…",
+ "file_ready_btn": "▶ Avvia stampa",
+ "file_slots_btn": "🎨 Seleziona slot",
+ "file_cancel_btn": "✕ Annulla",
+ "nav_printers": "Stampanti",
+ "skip_title": "✂ Salta oggetti",
+ "skip_hint": "Deseleziona gli oggetti che non vuoi più stampare:",
+ "skip_btn_label": "Oggetti",
+ "skip_no_objects": "Nessun oggetto in questa stampa.",
+ "skip_already": "saltato",
+ "skip_cancel": "Annulla",
+ "skip_confirm": "Salta",
+ "skip_select_at_least_one": "Seleziona almeno un oggetto.",
+ "skip_sending": "Invio in corso …",
+ "skip_success": "Gli oggetti verranno saltati.",
+ "fd_objects_hint": "Salta oggetti (opzionale):",
+ "fd_objects_toggle": "Salta oggetti",
+ "fd_slots_hint": "Assegna il canale GCode allo slot AMS:",
+ "fd_cancel": "Annulla",
+ "fd_print": "▶ Stampa",
+ "fd_no_slots_msg": "Nessuno slot AMS caricato.{br}Avviare comunque la stampa?",
+ "fd_slot": "Slot",
+ "fd_no_matching_material": "Nessun materiale corrispondente",
+ "fd_used": "USATO",
+ "add_printer": "Aggiungi stampante",
+ "apd_lbl_ip": "IP stampante",
+ "apd_lbl_name": "Nome (opzionale)",
+ "apd_placeholder_name": "es. Kobra X Soggiorno",
+ "apd_cancel": "Annulla",
+ "apd_confirm": "Aggiungi",
+ "apd_fetching": "Recupero dati dalla stampante…",
+ "apd_success": "Stampante aggiunta, riavvio del bridge in corso…",
+ "apd_err_ip": "Inserisci un indirizzo IP",
+ "printers_remove": "Rimuovi stampante",
+ "printers_remove_confirm": "Rimuovere la stampante \"{name}\"? Il bridge si riavvierà.",
+ "printers_active": "● attiva",
+ "printers_switch": "Cambia →",
+ "printers_current": "Stampante corrente",
+ "printers_loading": "Caricamento in corso…",
+ "printers_none": "Nessuna stampante configurata.",
+ "printers_empty_hint": "Nessuna stampante ancora configurata.",
+ "nav_browser": "Browser",
+ "panel_browser_title": "Browser dei file",
+ "store_search_placeholder": "🔍 Cerca…",
+ "store_empty": "Nessun file caricato.",
+ "store_refresh": "↻ Aggiorna",
+ "store_print": "▶ Stampa",
+ "store_download": "⬇ Scarica",
+ "store_delete_confirm": "Eliminare il file?",
+ "store_print_confirm": "Stampare il file?",
+ "store_web_verify_title": "Verifica file",
+ "store_web_verify_msg": "Verifica che questo file sia stato creato per Anycubic Kobra X.",
+ "store_web_verify_confirm": "Conferma",
+ "store_web_verify_abort": "Interrompi",
+ "store_no_results": "Nessun file trovato.",
+ "store_never": "mai stampato",
+ "store_estimate": "Stima",
+ "store_upload_label_prefix": "Trascina il GCode qui o ",
+ "store_upload_label_browse": "sfoglia",
+ "store_upload_busy": "⏳ Caricamento in corso…",
+ "store_upload_success": "✓ {file}",
+ "store_upload_error": "✗ {error}",
+ "store_upload_only_gcode": "✗ Sono consentiti solo file GCode (.gcode, .3mf, .bgcode)",
+ "sf_all": "Tutti",
+ "sf_ok": "✓ Completato",
+ "sf_err": "✗ Fallito",
+ "sf_new": "Nuovo",
+ "ss_date": "↓ Data",
+ "ss_name": "Nome A–Z",
+ "ss_dur": "⏱ Tempo di stampa"
+}
\ No newline at end of file