diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts
index a48ad8d43..76a74fec6 100644
--- a/frontend/src/i18n/index.ts
+++ b/frontend/src/i18n/index.ts
@@ -6,11 +6,13 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import en from './locales/en';
import de from './locales/de';
import ja from './locales/ja';
+import it from './locales/it';
const resources = {
en: { translation: en },
de: { translation: de },
ja: { translation: ja },
+ it: { translation: it },
};
i18n
@@ -19,7 +21,7 @@ i18n
.init({
resources,
fallbackLng: 'en',
- supportedLngs: ['en', 'de', 'ja'],
+ supportedLngs: ['en', 'de', 'ja', 'it'],
detection: {
// Order of detection methods
@@ -46,4 +48,5 @@ export const availableLanguages = [
{ code: 'en', name: 'English', nativeName: 'English' },
{ code: 'de', name: 'German', nativeName: 'Deutsch' },
{ code: 'ja', name: 'Japanese', nativeName: '日本語' },
+ { code: 'it', name: 'Italian', nativeName: 'Italiano' },
];
diff --git a/frontend/src/i18n/locales/it.ts b/frontend/src/i18n/locales/it.ts
new file mode 100644
index 000000000..e175db5e0
--- /dev/null
+++ b/frontend/src/i18n/locales/it.ts
@@ -0,0 +1,2597 @@
+export default {
+ // Navigation
+ nav: {
+ printers: 'Stampanti',
+ archives: 'Archivi',
+ queue: 'Coda',
+ stats: 'Statistiche',
+ profiles: 'Profili',
+ maintenance: 'Manutenzione',
+ projects: 'Progetti',
+ files: 'File',
+ settings: 'Impostazioni',
+ system: 'Sistema',
+ collapseSidebar: 'Comprimi barra laterale',
+ expandSidebar: 'Espandi barra laterale',
+ update: 'Aggiorna',
+ updateAvailable: 'Aggiornamento disponibile: v{{version}}',
+ updateAvailableBanner: 'Versione {{version}} disponibile!',
+ viewUpdate: 'Vedi aggiornamento',
+ viewOnGithub: 'Vedi su GitHub',
+ keyboardShortcuts: 'Scorciatoie da tastiera (?)',
+ switchToLight: 'Passa a tema chiaro',
+ switchToDark: 'Passa a tema scuro',
+ smartSwitches: 'Interruttori Smart',
+ logout: 'Esci',
+ },
+
+ // Common
+ common: {
+ save: 'Salva',
+ saving: 'Salvataggio...',
+ cancel: 'Annulla',
+ delete: 'Elimina',
+ edit: 'Modifica',
+ add: 'Aggiungi',
+ close: 'Chiudi',
+ confirm: 'Conferma',
+ loading: 'Caricamento...',
+ error: 'Errore',
+ success: 'Successo',
+ warning: 'Avviso',
+ enabled: 'Abilitato',
+ disabled: 'Disabilitato',
+ yes: 'Si',
+ no: 'No',
+ on: 'On',
+ off: 'Off',
+ all: 'Tutti',
+ none: 'Nessuno',
+ search: 'Cerca',
+ filter: 'Filtro',
+ sort: 'Ordina',
+ refresh: 'Aggiorna',
+ download: 'Scarica',
+ upload: 'Carica',
+ actions: 'Azioni',
+ status: 'Stato',
+ name: 'Nome',
+ description: 'Descrizione',
+ date: 'Data',
+ time: 'Ora',
+ hours: 'ore',
+ minutes: 'minuti',
+ seconds: 'secondi',
+ days: 'giorni',
+ enable: 'Abilita',
+ disable: 'Disabilita',
+ permissions: 'Permessi',
+ noPrinters: 'Nessuna stampante configurata',
+ noData: 'Nessun dato disponibile',
+ linkNotFound: 'Link non trovato',
+ required: 'Obbligatorio',
+ optional: 'Opzionale',
+ dismiss: 'Chiudi',
+ apply: 'Applica',
+ reset: 'Reimposta',
+ clear: 'Pulisci',
+ selectAll: 'Seleziona tutto',
+ deselectAll: 'Deseleziona tutto',
+ noChange: '— Nessun cambio —',
+ unchanged: 'Invariato',
+ unassigned: 'Non assegnato',
+ unknown: 'Sconosciuto',
+ unknownError: 'Errore sconosciuto',
+ today: 'Oggi',
+ asap: 'ASAP',
+ overdue: 'Scaduto',
+ now: 'Ora',
+ collapse: 'Comprimi',
+ expand: 'Espandi',
+ viewArchive: 'Vedi archivio',
+ viewInFileManager: 'Vedi nel Gestore file',
+ addedBy: 'Aggiunto da {{username}}',
+ prints: 'stampe',
+ more: '+{{count}} altre',
+ ascending: 'Crescente',
+ descending: 'Decrescente',
+ printer: 'Stampante',
+ remove: 'Rimuovi',
+ type: 'Tipo',
+ print: 'Stampa',
+ rename: 'Rinomina',
+ move: 'Sposta',
+ create: 'Crea',
+ duplicate: 'Duplica',
+ left: 'Sinistra',
+ right: 'Destra',
+ },
+
+ // Printers page
+ printers: {
+ title: 'Stampanti',
+ addPrinter: 'Aggiungi Stampante',
+ editPrinter: 'Modifica Stampante',
+ deletePrinter: 'Elimina Stampante',
+ printerName: 'Nome Stampante',
+ serialNumber: 'Numero Seriale',
+ ipAddress: 'Indirizzo IP',
+ accessCode: 'Codice di Accesso',
+ model: 'Modello',
+ nozzleCount: 'Numero Ugelli',
+ autoArchive: 'Auto Archiviazione',
+ status: {
+ idle: 'Inattiva',
+ printing: 'In stampa',
+ paused: 'In pausa',
+ offline: 'Offline',
+ error: 'Errore',
+ finished: 'Finita',
+ unknown: 'Sconosciuto',
+ },
+ temperatures: {
+ nozzle: 'Ugello',
+ bed: 'Piatto',
+ chamber: 'Camera',
+ },
+ progress: '{{percent}}% completato',
+ timeRemaining: '{{time}} rimanente',
+ deleteConfirm: 'Sei sicuro di eliminare "{{name}}"?',
+ maintenanceOk: 'Manutenzione OK',
+ maintenanceWarning: '{{count}} avviso',
+ maintenanceWarning_plural: '{{count}} avvisi',
+ maintenanceDue: '{{count}} in scadenza',
+ maintenanceDue_plural: '{{count}} in scadenza',
+ // Sort options
+ sort: {
+ name: 'Nome',
+ status: 'Stato',
+ model: 'Modello',
+ location: 'Posizione',
+ ascending: 'Ordina crescente',
+ descending: 'Ordina decrescente',
+ },
+ // Card size
+ cardSize: {
+ small: 'Schede piccole',
+ medium: 'Schede medie',
+ large: 'Schede grandi',
+ extraLarge: 'Schede extra grandi',
+ },
+ // Controls
+ hideOffline: 'Nascondi offline',
+ powerOn: 'Accendi',
+ offlinePrintersWithPlugs: 'Stampanti offline con smart plug',
+ noPrintersConfigured: 'Nessuna stampante configurata',
+ // Printer card
+ readyToPrint: 'Pronta a stampare',
+ external: 'Esterna',
+ deleteArchives: 'Elimina archivi stampa',
+ noLabel: 'Nessuna etichetta',
+ printPreview: 'Anteprima stampa',
+ width: 'Larghezza',
+ height: 'Altezza',
+ noObjectsFound: 'Nessun oggetto trovato',
+ objectsLoadedOnPrintStart: 'Gli oggetti sono caricati quando inizia una stampa',
+ willBeSkipped: 'Verra saltato',
+ name: 'Nome',
+ serialCannotBeChanged: 'Il numero seriale non puo essere cambiato',
+ locationHelp: 'Usato per raggruppare stampanti e filtrare i lavori in coda',
+ // WiFi signal strength
+ wifiSignal: {
+ veryWeak: 'Molto debole',
+ weak: 'Debole',
+ fair: 'Discreto',
+ good: 'Buono',
+ excellent: 'Eccellente',
+ },
+ // Maintenance
+ maintenanceUpToDate: 'Tutta la manutenzione aggiornata - Clicca per vedere',
+ // Chamber light
+ chamberLightOn: 'Accendi luce camera',
+ chamberLightOff: 'Spegni luce camera',
+ // Files
+ browseFiles: 'Sfoglia file stampante',
+ // Smart plug
+ autoOffAfterPrint: 'Spegnimento automatico dopo stampa',
+ autoOffExecuted: 'Spegnimento automatico eseguito - accendi la stampante per reimpostare',
+ // HMS errors
+ hmsErrors: 'Errori HMS',
+ viewHmsErrors: 'Vedi {{count}} errore(i) HMS',
+ // Actions
+ resume: 'Riprendi',
+ pause: 'Pausa',
+ stop: 'Ferma',
+ camera: 'Camera',
+ skipObject: 'Salta Oggetto',
+ reconnect: 'Riconnetti',
+ mqttDebug: 'Debug MQTT',
+ activeNozzle: 'Attivo: ugello {{nozzle}}',
+ // Firmware
+ firmwareUpdate: 'Aggiornamento Firmware',
+ firmwareInstructions: 'Sul touchscreen della stampante, vai a',
+ firmwareNav: 'Vai a',
+ settings: 'Impostazioni',
+ firmware: 'Firmware',
+ // Discovery
+ discoverPrinters: 'Trova Stampanti',
+ searching: 'Ricerca...',
+ manualEntry: 'Inserimento manuale',
+ addFromCloud: 'Aggiungi da Cloud',
+ // Toast messages
+ toast: {
+ printerDeleted: 'Stampante eliminata',
+ printerAdded: 'Stampante aggiunta',
+ printerUpdated: 'Stampante aggiornata',
+ failedToDelete: 'Impossibile eliminare stampante',
+ failedToAdd: 'Impossibile aggiungere stampante',
+ failedToUpdate: 'Impossibile aggiornare stampante',
+ commandSent: 'Comando inviato',
+ failedToSendCommand: 'Impossibile inviare comando',
+ turnedOn: '{{name}} accesa',
+ failedToPowerOn: 'Impossibile accendere {{name}}',
+ scriptTriggered: 'Script avviato',
+ printStopped: 'Stampa fermata',
+ printPaused: 'Stampa in pausa',
+ printResumed: 'Stampa ripresa',
+ referenceDeleted: 'Riferimento eliminato',
+ detectionAreaSaved: 'Area rilevamento salvata',
+ failedToRunScript: 'Impossibile eseguire script',
+ failedToStopPrint: 'Impossibile fermare stampa',
+ failedToPausePrint: 'Impossibile mettere in pausa stampa',
+ failedToResumePrint: 'Impossibile riprendere stampa',
+ failedToControlChamberLight: 'Impossibile controllare luce camera',
+ failedToUpdateSetting: 'Impossibile aggiornare impostazione',
+ failedToSkipObjects: 'Impossibile saltare oggetti',
+ failedToRereadRfid: 'Impossibile rileggere RFID',
+ failedToCheckPlate: 'Impossibile controllare piatto',
+ failedToUpdateLabel: 'Impossibile aggiornare etichetta',
+ failedToDeleteReference: 'Impossibile eliminare riferimento',
+ failedToSaveDetectionArea: 'Impossibile salvare area rilevamento',
+ plateCheckEnabled: 'Controllo piatto abilitato',
+ plateCheckDisabled: 'Controllo piatto disabilitato',
+ calibrationSaved: 'Calibrazione salvata!',
+ calibrationFailed: 'Calibrazione non riuscita',
+ rfidRereadInitiated: 'Rilettura RFID avviata',
+ },
+ // Connection status
+ connection: {
+ connected: 'Connesso',
+ offline: 'Offline',
+ },
+ // Queue info
+ queue: {
+ inQueue: '{{count}} stampa in coda',
+ inQueue_plural: '{{count}} stampe in coda',
+ },
+ // Controls section
+ controls: 'Controlli',
+ // RFID
+ rfid: {
+ reread: 'Rileggi RFID',
+ },
+ // Permissions
+ permission: {
+ noAdd: 'Non hai il permesso di aggiungere stampanti',
+ noEdit: 'Non hai il permesso di modificare stampanti',
+ noDelete: 'Non hai il permesso di eliminare stampanti',
+ noControl: 'Non hai il permesso di controllare stampanti',
+ noFiles: 'Non hai il permesso di accedere ai file stampante',
+ noAmsRfid: 'Non hai il permesso di rileggere AMS RFID',
+ noSmartPlugControl: 'Non hai il permesso di controllare smart plug',
+ },
+ // Add/Edit modal
+ modal: {
+ addTitle: 'Aggiungi Stampante',
+ editTitle: 'Modifica Stampante',
+ myPrinter: 'La mia Stampante',
+ selectModel: 'Seleziona modello...',
+ locationGroup: 'Posizione / Gruppo (opzionale)',
+ locationPlaceholder: 'es. Officina, Ufficio, Cantina',
+ autoArchiveLabel: 'Archivia automaticamente stampe completate',
+ fromPrinterSettings: 'Dalle impostazioni della stampante',
+ modelOptional: 'Modello (opzionale)',
+ saveChanges: 'Salva modifiche',
+ },
+ // Skip objects
+ skipObjects: {
+ tooltip: 'Salta oggetti',
+ onlyWhilePrinting: 'Salta oggetti (solo durante la stampa)',
+ requiresMultiple: 'Salta oggetti (richiede 2+ oggetti)',
+ title: 'Salta Oggetti',
+ matchIdsInfo: 'Abbina gli ID con il display della stampante',
+ printerShowsIds: 'Lo schermo mostra gli ID oggetto sul piatto',
+ skipSelected: 'Salta selezionati',
+ skipping: 'Saltando...',
+ noObjectsSelected: 'Nessun oggetto selezionato',
+ selectObjectsToSkip: 'Seleziona gli oggetti da saltare nella stampa corrente',
+ skipped: 'saltato',
+ objectsSkipped: 'Oggetti saltati',
+ activeCount: '{{count}} attivi',
+ waitForLayer: 'Attendi il layer 2+ per saltare oggetti (attualmente layer {{layer}})',
+ skip: 'Salta',
+ },
+ // Confirm modals
+ confirm: {
+ deleteTitle: 'Elimina Stampante',
+ deleteMessage: 'Sei sicuro di eliminare "{{name}}"? Questo rimuovera tutte le impostazioni di connessione.',
+ deleteArchivesNote: 'Tutta la cronologia di stampa sara eliminata definitivamente.',
+ keepArchivesNote: 'La cronologia sara mantenuta ma non piu associata a questa stampante.',
+ stopTitle: 'Ferma Stampa',
+ stopMessage: 'Sei sicuro di fermare la stampa corrente su "{{name}}"? Questo annullera il lavoro di stampa.',
+ stopButton: 'Ferma Stampa',
+ pauseTitle: 'Pausa Stampa',
+ pauseMessage: 'Sei sicuro di mettere in pausa la stampa corrente su "{{name}}"?',
+ pauseButton: 'Pausa Stampa',
+ resumeTitle: 'Riprendi Stampa',
+ resumeMessage: 'Sei sicuro di riprendere la stampa su "{{name}}"?',
+ resumeButton: 'Riprendi Stampa',
+ powerOnTitle: 'Accendi Stampante',
+ powerOnMessage: 'Sei sicuro di accendere "{{name}}"?',
+ powerOnButton: 'Accendi',
+ powerOffTitle: 'Spegni Stampante',
+ powerOffMessage: 'Sei sicuro di spegnere "{{name}}"?',
+ powerOffWarning: 'AVVISO: "{{name}}" sta stampando! Sei sicuro di spegnere? Questo interrompera la stampa e potrebbe danneggiare la stampante.',
+ powerOffButton: 'Spegni',
+ },
+ // Discovery
+ discovery: {
+ title: 'Trova Stampanti',
+ searching: 'Ricerca...',
+ scanning: 'Scansione...',
+ scanProgress: 'Scansione... {{scanned}}/{{total}}',
+ foundPrinters: 'Trovate {{count}} stampante(i)',
+ noPrintersFound: 'Nessuna stampante trovata',
+ noPrintersFoundSubnet: 'Nessuna stampante trovata nella sottorete specificata.',
+ noPrintersFoundNetwork: 'Nessuna stampante trovata sulla rete.',
+ allConfigured: 'Tutte le stampanti trovate sono gia configurate.',
+ alreadyAdded: 'Gia aggiunta',
+ select: 'Seleziona',
+ manualEntry: 'Inserimento manuale',
+ addFromCloud: 'Aggiungi da Cloud',
+ subnetToScan: 'Sottorete da scansionare',
+ dockerNote: 'Docker rilevato. Inserisci la sottorete della stampante in notazione CIDR. Richiede network_mode: host in docker-compose.yml.',
+ scanSubnet: 'Scansiona sottorete per stampanti',
+ discoverNetwork: 'Trova stampanti in rete',
+ scanningSubnet: 'Scansione sottorete per stampanti Bambu...',
+ scanningNetwork: 'Scansione rete...',
+ serialRequired: 'Seriale richiesto',
+ unknown: 'Sconosciuto',
+ failedToStart: 'Avvio ricerca non riuscito',
+ },
+ // Filaments section
+ filaments: 'Filamenti',
+ // Camera
+ openCameraOverlay: 'Apri overlay camera',
+ openCameraWindow: 'Apri camera in nuova finestra',
+ // Firmware
+ firmwareUpdateAvailable: 'Aggiornamento firmware disponibile: {{current}} → {{latest}}',
+ firmwareUpdateButton: 'Aggiorna',
+ // Plate detection
+ plateDetection: {
+ noPermission: 'Non hai il permesso di aggiornare stampanti',
+ enabledClick: 'Controllo piatto abilitato - Clicca per disabilitare',
+ disabledClick: 'Controllo piatto disabilitato - Clicca per abilitare',
+ manageCalibration: 'Gestisci calibrazione rilevamento piatto',
+ calibrationRequired: 'Calibrazione richiesta',
+ calibrationInstructions: 'Assicurati che il piatto sia completamente vuoto, poi clicca Calibra.',
+ calibrationDescription: 'La calibrazione salva un\'immagine di riferimento del piatto vuoto. I controlli futuri confronteranno con questo riferimento per rilevare oggetti.',
+ calibrationTip: 'Suggerimento: Puoi salvare fino a 5 calibrazioni per piatti diversi. Il sistema usa automaticamente la migliore corrispondenza durante il controllo.',
+ plateEmpty: 'Il piatto sembra vuoto',
+ objectsDetected: 'Oggetti rilevati sul piatto',
+ confidence: 'Confidenza',
+ difference: 'Differenza',
+ analysisPreview: 'Anteprima analisi:',
+ analysisLegend: 'Riquadro verde = area rilevamento, overlay rosso = differenze dalla calibrazione',
+ savedReferences: 'Riferimenti salvati ({{count}}/{{max}})',
+ deleteReference: 'Elimina riferimento',
+ labelPlaceholder: 'Etichetta...',
+ clickToEdit: '{{label}} - Clicca per modificare',
+ clickToAddLabel: 'Clicca per aggiungere etichetta',
+ },
+ // Fans
+ fans: {
+ partCooling: 'Ventola raffreddamento parte',
+ auxiliary: 'Ventola ausiliaria',
+ chamber: 'Ventola camera',
+ },
+ // HMS errors
+ clickToViewHmsErrors: 'Clicca per vedere errori HMS',
+ estimatedCompletion: 'Tempo completamento stimato',
+ slotOptions: 'Opzioni slot',
+ // Firmware modal
+ firmwareModal: {
+ title: 'Aggiornamento Firmware',
+ currentVersion: 'Corrente:',
+ latestVersion: 'Ultima:',
+ releaseNotes: 'Note di rilascio',
+ checkingPrereqs: 'Controllo prerequisiti...',
+ sdCardReady: 'SD pronta. Clicca sotto per caricare firmware.',
+ uploadedSuccess: 'Firmware caricato su SD!',
+ applyInstructions: 'Per applicare l\'aggiornamento sulla stampante:',
+ step1: 'Sul touchscreen della stampante, vai a Impostazioni',
+ step2: 'Vai a Firmware',
+ step3: 'Seleziona Aggiorna da SD',
+ step4: 'L\'aggiornamento richiede 10-20 minuti',
+ done: 'Fatto',
+ starting: 'Avvio...',
+ uploadFirmware: 'Carica Firmware',
+ uploadedToast: 'Firmware caricato! Avvia aggiornamento dal display.',
+ },
+ accessCodePlaceholder: 'Lascia vuoto per mantenere quello attuale',
+ // ROI editor
+ roi: {
+ title: 'Area di rilevamento (ROI)',
+ xStart: 'X Inizio',
+ yStart: 'Y Inizio',
+ width: 'Larghezza',
+ height: 'Altezza',
+ instruction: 'Regola l\'area di rilevamento per focalizzare il piatto. Il riquadro verde mostra l\'area corrente.',
+ },
+ },
+
+ // Archives page
+ archives: {
+ title: 'Archivi di stampa',
+ searchPlaceholder: 'Cerca archivi...',
+ filterByPrinter: 'Filtra per stampante',
+ filterByStatus: 'Filtra per stato',
+ sortBy: 'Ordina per',
+ sortNewest: 'Piu recenti',
+ sortOldest: 'Meno recenti',
+ sortName: 'Nome',
+ sortDuration: 'Durata',
+ sortLargest: 'Piu grandi',
+ sortSmallest: 'Piu piccoli',
+ sortSize: 'Dimensione',
+ noArchives: 'Nessun archivio trovato',
+ noArchivesSearch: 'Nessun archivio corrisponde alla ricerca',
+ noArchivesYet: 'Nessun archivio ancora',
+ loadingArchives: 'Caricamento archivi...',
+ releaseToUpload: 'Rilascia per caricare',
+ showAll: 'Mostra tutti',
+ showFavoritesOnly: 'Solo preferiti',
+ gridView: 'Vista griglia',
+ listView: 'Vista elenco',
+ calendarView: 'Vista calendario',
+ manageTags: 'Gestisci tag',
+ showFailedPrints: 'Mostra stampe fallite',
+ hideFailedPrints: 'Nascondi stampe fallite',
+ printTime: 'Tempo di stampa',
+ filamentUsed: 'Filamento usato',
+ cost: 'Costo',
+ reprint: 'Ristampa',
+ preview: 'Anteprima',
+ deleteArchive: 'Elimina archivio',
+ deleteConfirm: 'Sei sicuro di eliminare questo archivio?',
+ favorite: 'Preferito',
+ unfavorite: 'Rimuovi dai preferiti',
+ viewDetails: 'Vedi dettagli',
+ status: {
+ completed: 'Completato',
+ failed: 'Fallito',
+ stopped: 'Fermato',
+ },
+ toast: {
+ source3mfAttached: 'Sorgente 3MF allegata: {{filename}}',
+ failedUploadSource3mf: 'Caricamento sorgente 3MF non riuscito',
+ source3mfRemoved: 'Sorgente 3MF rimossa',
+ failedRemoveSource3mf: 'Rimozione sorgente 3MF non riuscita',
+ f3dAttached: 'F3D allegato: {{filename}}',
+ failedUploadF3d: 'Caricamento F3D non riuscito',
+ f3dRemoved: 'F3D rimosso',
+ failedRemoveF3d: 'Rimozione F3D non riuscita',
+ timelapseAttached: 'Timelapse allegato: {{filename}}',
+ timelapseAlreadyAttached: 'Timelapse gia allegato',
+ noMatchingTimelapse: 'Nessun timelapse corrispondente',
+ failedScanTimelapse: 'Scansione timelapse non riuscita',
+ failedAttachTimelapse: 'Allegato timelapse non riuscito',
+ archiveDeleted: 'Archivio eliminato',
+ failedDeleteArchive: 'Eliminazione archivio non riuscita',
+ addedToFavorites: 'Aggiunto ai preferiti',
+ removedFromFavorites: 'Rimosso dai preferiti',
+ projectUpdated: 'Progetto aggiornato',
+ failedUpdateProject: 'Aggiornamento progetto non riuscito',
+ linkCopied: 'Link copiato negli appunti',
+ failedCopyLink: 'Copia link non riuscita',
+ photoDeleted: 'Foto eliminata',
+ failedDeletePhoto: 'Eliminazione foto non riuscita',
+ failedDeleteArchives: 'Eliminazione archivi non riuscita',
+ failedUpdateFavorites: 'Aggiornamento preferiti non riuscito',
+ exportDownloaded: 'Export scaricato',
+ exportFailed: 'Export non riuscito',
+ },
+ menu: {
+ print: 'Stampa',
+ schedule: 'Programma',
+ openInBambuStudio: 'Apri in Bambu Studio',
+ slice: 'Slice',
+ externalLink: 'Link esterno',
+ viewOnMakerWorld: 'Vedi su MakerWorld',
+ preview3d: 'Anteprima 3D',
+ viewTimelapse: 'Vedi Timelapse',
+ scanForTimelapse: 'Cerca Timelapse',
+ downloadSource3mf: 'Scarica Sorgente 3MF',
+ uploadSource3mf: 'Carica Sorgente 3MF',
+ replaceSource3mf: 'Sostituisci Sorgente 3MF',
+ removeSource3mf: 'Rimuovi Sorgente 3MF',
+ uploadF3d: 'Carica F3D',
+ replaceF3d: 'Sostituisci F3D',
+ downloadF3d: 'Scarica F3D',
+ removeF3d: 'Rimuovi F3D',
+ download: 'Scarica',
+ copyDownloadLink: 'Copia link download',
+ qrCode: 'QR Code',
+ viewPhotos: 'Vedi foto',
+ viewPhotosCount: 'Vedi foto ({{count}})',
+ projectPage: 'Pagina progetto',
+ addToFavorites: 'Aggiungi ai preferiti',
+ removeFromFavorites: 'Rimuovi dai preferiti',
+ edit: 'Modifica',
+ goToProject: 'Vai al progetto: {{name}}',
+ addToProject: 'Aggiungi al progetto',
+ removeFromProject: 'Rimuovi dal progetto',
+ loading: 'Caricamento...',
+ noProjectsAvailable: 'Nessun progetto disponibile',
+ select: 'Seleziona',
+ deselect: 'Deseleziona',
+ delete: 'Elimina',
+ },
+ permission: {
+ noReprint: 'Non hai il permesso di ristampare questo archivio',
+ noAddToQueue: 'Non hai il permesso di aggiungere alla coda',
+ noUpdateArchives: 'Non hai il permesso di aggiornare archivi',
+ noUploadFiles: 'Non hai il permesso di caricare file',
+ noDownload: 'Non hai il permesso di scaricare archivi',
+ noCopyLink: 'Non hai il permesso di copiare link download',
+ noDelete: 'Non hai il permesso di eliminare questo archivio',
+ noCreate: 'Non hai il permesso di creare archivi',
+ },
+ card: {
+ previousPlate: 'Piatto precedente',
+ nextPlate: 'Piatto successivo',
+ plateNumber: 'Piatto {{index}}',
+ moreOptions: 'Clic destro per altre opzioni',
+ addToFavorites: 'Aggiungi ai preferiti',
+ removeFromFavorites: 'Rimuovi dai preferiti',
+ cancelled: 'annullato',
+ failed: 'fallito',
+ duplicate: 'duplicato',
+ duplicateTitle: 'Questo modello e stato stampato prima',
+ openSource3mf: 'Apri sorgente 3MF in Bambu Studio (clic destro per altre opzioni)',
+ downloadF3d: 'Scarica file design Fusion 360',
+ viewTimelapse: 'Vedi timelapse',
+ viewPhoto: 'Vedi 1 foto',
+ viewPhotos: 'Vedi {{count}} foto',
+ openFolder: 'Apri cartella: {{name}}',
+ slicedFile: 'File slice - pronto a stampare',
+ sourceFile: 'Solo file sorgente - nessuna mappatura AMS disponibile',
+ gcode: 'GCODE',
+ source: 'SOURCE',
+ project: 'Progetto: {{name}}',
+ estimated: 'Stimato: {{time}}',
+ actual: 'Reale: {{time}}',
+ accuracy: 'Accuratezza: {{percent}}%',
+ filament: '{{weight}}g',
+ layer: '{{count}} strato',
+ layers: '{{count}} strati',
+ object: '{{count}} oggetto',
+ objects: '{{count}} oggetti',
+ slicedFor: 'Sliciato per {{model}}',
+ uploadedBy: 'Caricato da',
+ noPermissionReprint: 'Non hai il permesso di ristampare',
+ noPermissionEdit: 'Non hai il permesso di modificare archivi',
+ noPermissionDelete: 'Non hai il permesso di eliminare archivi',
+ reprint: 'Ristampa',
+ schedulePrint: 'Programma Stampa',
+ schedule: 'Programma',
+ openInBambuStudio: 'Apri in Bambu Studio',
+ openInBambuStudioToSlice: 'Apri in Bambu Studio per slice',
+ slice: 'Slice',
+ externalLink: 'Link esterno',
+ makerWorld: 'MakerWorld: {{designer}}',
+ viewProject: 'Vedi progetto',
+ noExternalLink: 'Nessun link esterno',
+ preview3d: 'Anteprima 3D',
+ download: 'Scarica',
+ edit: 'Modifica',
+ delete: 'Elimina',
+ },
+ modal: {
+ deleteArchive: 'Elimina Archivio',
+ deleteConfirm: 'Sei sicuro di eliminare "{{name}}"? Questa azione non puo essere annullata.',
+ deleteButton: 'Elimina',
+ removeSource3mf: 'Rimuovi Sorgente 3MF',
+ removeSource3mfConfirm: 'Sei sicuro di rimuovere il file sorgente 3MF da "{{name}}"? Questo eliminera il progetto slicer originale.',
+ removeButton: 'Rimuovi',
+ removeF3d: 'Rimuovi F3D',
+ removeF3dConfirm: 'Sei sicuro di rimuovere il file Fusion 360 da "{{name}}"?',
+ timelapse: '{{name}} - Timelapse',
+ selectTimelapse: 'Seleziona Timelapse',
+ selectTimelapseDesc: 'Nessun abbinamento automatico trovato. Seleziona il timelapse per questa stampa:',
+ deleteArchives: 'Elimina Archivi',
+ deleteArchivesConfirm: 'Sei sicuro di eliminare {{count}} archivio(i)? Questa azione non puo essere annullata.',
+ deleteCount: 'Elimina {{count}}',
+ },
+ page: {
+ title: 'Archivi',
+ printsCount: '{{filtered}} di {{total}} stampe',
+ dropFilesHere: 'Rilascia file .3mf qui',
+ releaseToUpload: 'Rilascia per caricare',
+ only3mfSupported: 'Solo file .3mf supportati',
+ close: 'Chiudi',
+ selected: '{{count}} selezionati',
+ selectAll: 'Seleziona tutto',
+ tags: 'Tag',
+ project: 'Progetto',
+ favorite: 'Preferito',
+ delete: 'Elimina',
+ toggledFavorites: 'Preferiti aggiornati per {{count}} archivio(i)',
+ failedUpdateFavorites: 'Aggiornamento preferiti non riuscito',
+ archivesDeleted: '{{count}} archivio(i) eliminati',
+ failedDeleteArchives: 'Eliminazione archivi non riuscita',
+ photoDeleted: 'Foto eliminata',
+ failedDeletePhoto: 'Eliminazione foto non riuscita',
+ },
+ list: {
+ name: 'Nome',
+ printer: 'Stampante',
+ date: 'Data',
+ size: 'Dimensione',
+ actions: 'Azioni',
+ hasTimelapse: 'Ha timelapse',
+ },
+ },
+
+ // Queue page
+ queue: {
+ title: 'Coda di stampa',
+ subtitle: 'Programma e gestisci i tuoi lavori di stampa',
+ addToQueue: 'Aggiungi alla coda',
+ // Print modal
+ print: 'Stampa',
+ reprint: 'Ristampa',
+ schedulePrint: 'Programma Stampa',
+ editQueueItem: 'Modifica elemento coda',
+ printToPrinters: 'Stampa su {{count}} Stampanti',
+ queueToPrinters: 'Metti in coda su {{count}} Stampanti',
+ sending: 'Invio...',
+ sendingProgress: 'Invio {{current}}/{{total}}...',
+ adding: 'Aggiunta...',
+ addingProgress: 'Aggiunta {{current}}/{{total}}...',
+ savingProgress: 'Salvataggio {{current}}/{{total}}...',
+ clearQueue: 'Svuota coda',
+ clearHistory: 'Svuota cronologia',
+ emptyQueue: 'La coda e vuota',
+ position: 'Posizione',
+ scheduledTime: 'Ora programmata',
+ moveUp: 'Sposta su',
+ moveDown: 'Sposta giu',
+ startNow: 'Avvia ora',
+ printingInProgress: 'Stampa in corso...',
+ viewArchive: 'Vedi archivio',
+ viewInFileManager: 'Vedi nel Gestore file',
+ itemCount: '{{count}} elemento',
+ itemCount_plural: '{{count}} elementi',
+ dragToReorder: 'Trascina per riordinare (solo ASAP)',
+ reorderHint: 'La posizione influisce solo sugli elementi ASAP. Quelli programmati partono all\'orario.',
+ addedBy: 'Aggiunto da {{name}}',
+ // Sections
+ sections: {
+ currentlyPrinting: 'In stampa',
+ queued: 'In coda',
+ history: 'Cronologia',
+ },
+ // Status
+ status: {
+ pending: 'In attesa',
+ waiting: 'In attesa',
+ printing: 'In stampa',
+ paused: 'In pausa',
+ completed: 'Completato',
+ failed: 'Fallito',
+ skipped: 'Saltato',
+ cancelled: 'Annullato',
+ },
+ // Summary cards
+ summary: {
+ printing: 'In stampa',
+ queued: 'In coda',
+ totalTime: 'Tempo totale coda',
+ history: 'Cronologia',
+ },
+ // Filters
+ filter: {
+ allPrinters: 'Tutte le stampanti',
+ unassigned: 'Non assegnato',
+ allStatus: 'Tutti gli stati',
+ allLocations: 'Tutte le posizioni',
+ any: 'Qualsiasi',
+ },
+ // Sort
+ sort: {
+ byPosition: 'Ordina per posizione',
+ byName: 'Ordina per nome',
+ byPrinter: 'Ordina per stampante',
+ bySchedule: 'Ordina per programma',
+ byDate: 'Ordina per data',
+ ascendingOldest: 'Crescente (piu vecchi)',
+ descendingNewest: 'Decrescente (piu recenti)',
+ },
+ // Badges
+ badges: {
+ staged: 'In staging',
+ requiresPrevious: 'Richiede successo precedente',
+ autoPowerOff: 'Spegnimento automatico',
+ },
+ // Empty state
+ empty: {
+ title: 'Nessuna stampa programmata',
+ description: 'Programma una stampa dalla pagina Archivi usando l\'opzione "Programma" nel menu contestuale, o trascina i file per iniziare.',
+ },
+ // Time
+ time: {
+ asap: 'ASAP',
+ overdue: 'Scaduto',
+ now: 'Ora',
+ lessThanMinute: 'Tra meno di un minuto',
+ inMinutes: 'Tra {{count}} min',
+ inHours: 'Tra {{count}} ore',
+ },
+ // Actions
+ actions: {
+ stopPrint: 'Ferma Stampa',
+ startPrint: 'Avvia Stampa',
+ requeue: 'Rimetti in coda',
+ },
+ // Bulk edit
+ bulkEdit: {
+ title: 'Modifica {{count}} elemento',
+ title_plural: 'Modifica {{count}} elementi',
+ description: 'Solo le impostazioni modificate saranno applicate agli elementi selezionati.',
+ printer: 'Stampante',
+ noChange: '— Nessun cambio —',
+ queueOptions: 'Opzioni coda',
+ staged: 'In staging (avvio manuale)',
+ autoPowerOff: 'Spegnimento automatico dopo stampa',
+ requirePrevious: 'Richiede successo precedente',
+ printOptions: 'Opzioni stampa',
+ bedLevelling: 'Livellamento piatto',
+ flowCalibration: 'Calibrazione flusso',
+ vibrationCalibration: 'Calibrazione vibrazioni',
+ layerInspection: 'Controllo primo layer',
+ timelapse: 'Timelapse',
+ useAms: 'Usa AMS',
+ applyChanges: 'Applica modifiche',
+ selectAll: 'Seleziona tutto',
+ deselectAll: 'Deseleziona tutto',
+ selected: '{{count}} selezionati',
+ editSelected: 'Modifica selezionati',
+ cancelSelected: 'Annulla selezionati',
+ },
+ // Confirmations
+ confirm: {
+ cancelTitle: 'Annulla stampa programmata',
+ cancelMessage: 'Sei sicuro di annullare "{{name}}"?',
+ stopTitle: 'Ferma Stampa',
+ stopMessage: 'Sei sicuro di fermare la stampa corrente "{{name}}"? Questo annullera il lavoro sulla stampante.',
+ removeTitle: 'Rimuovi dalla cronologia',
+ removeMessage: 'Sei sicuro di rimuovere "{{name}}" dalla cronologia coda?',
+ clearHistoryTitle: 'Svuota cronologia',
+ clearHistoryMessage: 'Sei sicuro di rimuovere {{count}} elemento(i) dalla cronologia?',
+ cancelButton: 'Annulla Stampa',
+ stopButton: 'Ferma Stampa',
+ thisPrint: 'questa stampa',
+ thisItem: 'questo elemento',
+ },
+ // Toast messages
+ toast: {
+ cancelled: 'Elemento coda annullato',
+ cancelFailed: 'Annullamento non riuscito',
+ removed: 'Elemento coda rimosso',
+ removeFailed: 'Rimozione non riuscita',
+ stopped: 'Stampa fermata',
+ stopFailed: 'Impossibile fermare stampa',
+ released: 'Stampa rilasciata in coda',
+ startFailed: 'Avvio stampa non riuscito',
+ reorderFailed: 'Riordino coda non riuscito',
+ historyCleared: 'Cancellati {{count}} elementi cronologia',
+ clearHistoryFailed: 'Svuotamento cronologia non riuscito',
+ updateFailed: 'Aggiornamento elementi non riuscito',
+ bulkCancelled: 'Annullati {{count}} elementi',
+ bulkCancelFailed: 'Annullamento elementi non riuscito',
+ },
+ // Permissions
+ permissions: {
+ noStopPrint: 'Non hai il permesso di fermare stampe',
+ noStartPrint: 'Non hai il permesso di avviare stampe',
+ noEdit: 'Non hai il permesso di modificare questo elemento coda',
+ noCancel: 'Non hai il permesso di annullare questo elemento coda',
+ noRequeue: 'Non hai il permesso di rimettere in coda elementi',
+ noRemove: 'Non hai il permesso di rimuovere questo elemento coda',
+ noClearHistory: 'Non hai il permesso di svuotare tutta la cronologia',
+ noEditItems: 'Non hai il permesso di modificare elementi coda',
+ noCancelItems: 'Non hai il permesso di annullare elementi coda',
+ },
+ },
+
+ // Statistics page
+ stats: {
+ title: 'Dashboard',
+ subtitle: 'Trascina i widget per riordinare. Clicca l\'icona occhio per nascondere.',
+ overview: 'Panoramica',
+ totalPrints: 'Stampe totali',
+ successRate: 'Tasso di successo',
+ totalPrintTime: 'Tempo totale di stampa',
+ printTime: 'Tempo di stampa',
+ totalFilament: 'Filamento totale usato',
+ filamentUsed: 'Filamento usato',
+ filamentCost: 'Costo filamento',
+ totalCost: 'Costo totale',
+ energyUsed: 'Energia usata',
+ energyCost: 'Costo energia',
+ averagePrintTime: 'Tempo medio di stampa',
+ printsPerDay: 'Stampe al giorno',
+ byPrinter: 'Per stampante',
+ printsByPrinter: 'Stampe per stampante',
+ byMaterial: 'Per materiale',
+ byMonth: 'Per mese',
+ last7Days: 'Ultimi 7 giorni',
+ last30Days: 'Ultimi 30 giorni',
+ last90Days: 'Ultimi 90 giorni',
+ allTime: 'Sempre',
+ // Widgets
+ quickStats: 'Statistiche rapide',
+ printActivity: 'Attivita di stampa',
+ filamentTypes: 'Tipi di filamento',
+ filamentTrends: 'Trend filamento',
+ failureAnalysis: 'Analisi guasti',
+ timeAccuracy: 'Accuratezza tempo',
+ successful: 'Riuscite:',
+ failed: 'Fallite:',
+ perfectEstimate: '100% = stima perfetta',
+ noTimeAccuracyData: 'Nessun dato accuratezza tempo',
+ noFilamentData: 'Nessun dato filamento',
+ noPrinterData: 'Nessun dato stampante',
+ noPrintData: 'Nessun dato stampa',
+ noPrintDataLast30Days: 'Nessun dato stampa negli ultimi 30 giorni',
+ failureReasons: 'Cause guasto',
+ topFailureReasons: 'Cause principali',
+ failedPrintsCount: '{{failed}} / {{total}} stampe fallite',
+ lastWeekRate: 'Settimana scorsa: {{rate}}%',
+ // Actions
+ resetLayout: 'Reimposta layout',
+ recalculateCosts: 'Ricalcola costi',
+ recalculateCostsHint: 'Ricalcola tutti i costi archivi usando i prezzi filamento correnti',
+ exportStats: 'Esporta statistiche',
+ exportAsCsv: 'Esporta come CSV',
+ exportAsExcel: 'Esporta come Excel',
+ hiddenCount: '{{count}} Nascosti',
+ // Toast
+ exportDownloaded: 'Export scaricato',
+ exportFailed: 'Export non riuscito',
+ layoutReset: 'Layout reimpostato',
+ recalculatedCosts: 'Costi ricalcolati per {{count}} archivi',
+ recalculateFailed: 'Ricalcolo costi non riuscito',
+ // Loading
+ loadingStats: 'Caricamento statistiche...',
+ // Permissions
+ noPermissionResetLayout: 'Non hai il permesso di reimpostare il layout',
+ noPermissionRecalculate: 'Non hai il permesso di ricalcolare i costi',
+ },
+
+ // Maintenance page
+ maintenance: {
+ title: 'Manutenzione',
+ overview: 'Panoramica',
+ allOk: 'Tutta la manutenzione aggiornata',
+ dueCount: '{{count}} elemento in scadenza',
+ dueCount_plural: '{{count}} elementi in scadenza',
+ warningCount: '{{count}} avviso',
+ warningCount_plural: '{{count}} avvisi',
+ totalPrintTime: 'Tempo totale di stampa',
+ nextMaintenance: 'Prossima manutenzione',
+ nothingDue: 'Niente in scadenza',
+ tasks: 'Attivita',
+ lastPerformed: 'Ultima esecuzione',
+ interval: 'Intervallo',
+ hoursRemaining: '{{hours}}h rimanenti',
+ hoursOverdue: '{{hours}}h in ritardo',
+ markDone: 'Segna come fatto',
+ performMaintenance: 'Esegui manutenzione',
+ history: 'Cronologia',
+ noHistory: 'Nessuna cronologia manutenzione',
+ editPrintHours: 'Modifica ore stampa',
+ currentHours: 'Ore attuali',
+ // Tabs
+ statusTab: 'Stato',
+ settingsTab: 'Impostazioni',
+ // Status
+ overdueCount: '{{count}} in ritardo',
+ dueSoonCount: '{{count}} in scadenza',
+ dueSoon: 'In scadenza',
+ allGood: 'Tutto ok',
+ overdueBy: 'In ritardo di {{duration}}',
+ dueIn: 'Scade tra {{duration}}',
+ timeLeft: '{{duration}} rimanenti',
+ // Duration formats
+ day: '1 giorno',
+ days: '{{count}} giorni',
+ week: '1 settimana',
+ weeks: '{{count}} settimane',
+ month: '1 mese',
+ months: '{{count}} mesi',
+ year: '1 anno',
+ // Settings
+ maintenanceTypes: 'Tipi di manutenzione',
+ maintenanceTypesDescription: 'Tipi di sistema e tue attivita personalizzate',
+ addCustomType: 'Aggiungi tipo personalizzato',
+ intervalType: 'Tipo intervallo',
+ intervalValue: 'Intervallo ({{type}})',
+ icon: 'Icona',
+ documentationLink: 'Link documentazione (opzionale)',
+ assignToPrinters: 'Assegna alle stampanti',
+ selectAtLeastOnePrinter: 'Seleziona almeno una stampante',
+ addType: 'Aggiungi tipo',
+ custom: 'Personalizzato',
+ printHours: 'Ore di stampa',
+ calendarDays: 'Giorni calendario',
+ exampleName: 'es. Sostituisci filtro HEPA',
+ viewDocumentation: 'Vedi documentazione',
+ timeBasedInterval: 'Intervallo basato sul tempo',
+ // Interval overrides
+ intervalOverrides: 'Override intervallo',
+ intervalOverridesDescription: 'Personalizza intervalli per stampanti specifiche',
+ // Printer assignment
+ assignedToPrinters: 'Assegnato alle stampanti:',
+ noPrintersAssigned: 'Nessuna stampante assegnata',
+ addPrinterShort: 'Aggiungi:',
+ printersAssignedClick: '{{count}} stampante(i) assegnata - clicca per gestire',
+ removeFromPrinter: 'Rimuovi da questa stampante',
+ // Types
+ types: {
+ lubricateRails: 'Lubrifica guide lineari',
+ cleanNozzle: 'Pulisci ugello/Hotend',
+ checkBelts: 'Controlla tensione cinghie',
+ cleanBuildPlate: 'Pulisci piatto',
+ checkExtruder: 'Controlla ingranaggi estrusore',
+ checkCooling: 'Controlla ventole raffreddamento',
+ generalInspection: 'Ispezione generale',
+ cleanCarbonRods: 'Pulisci aste in carbonio',
+ checkPtfeTube: 'Controlla tubo PTFE',
+ replaceHepaFilter: 'Sostituisci filtro HEPA',
+ replaceCarbonFilter: 'Sostituisci filtro carbone',
+ lubricateLeftNozzleRail: 'Lubrifica guida ugello sinistro',
+ },
+ // Toast
+ maintenanceComplete: 'Manutenzione segnata come completata',
+ typeUpdated: 'Tipo manutenzione aggiornato',
+ typeDeleted: 'Tipo manutenzione eliminato',
+ printHoursUpdated: 'Ore di stampa aggiornate',
+ printerAssigned: 'Stampante assegnata',
+ printerRemoved: 'Stampante rimossa',
+ // Confirmation
+ deleteTypeConfirm: 'Eliminare "{{name}}"?',
+ // Permissions
+ noPermissionUpdate: 'Non hai il permesso di aggiornare elementi manutenzione',
+ noPermissionPerform: 'Non hai il permesso di eseguire manutenzione',
+ noPermissionEditTypes: 'Non hai il permesso di modificare tipi manutenzione',
+ noPermissionDeleteTypes: 'Non hai il permesso di eliminare tipi manutenzione',
+ noPermissionEditHours: 'Non hai il permesso di modificare ore stampa',
+ noPermissionRemovePrinter: 'Non hai il permesso di rimuovere assegnazioni stampanti',
+ noPermissionAssignPrinter: 'Non hai il permesso di assegnare stampanti',
+ noPermissionEditIntervals: 'Non hai il permesso di modificare intervalli',
+ // Configure link
+ configureSettings: 'Configura tipi e intervalli manutenzione',
+ },
+
+ // Settings page
+ settings: {
+ title: 'Impostazioni',
+ general: 'Generale',
+ // Tab names
+ tabs: {
+ general: 'Generale',
+ smartPlugs: 'Prese smart',
+ notifications: 'Notifiche',
+ filament: 'Filamento',
+ network: 'Rete',
+ apiKeys: 'Chiavi API',
+ virtualPrinter: 'Stampante virtuale',
+ users: 'Utenti',
+ backup: 'Backup',
+ },
+ appearance: 'Aspetto',
+ notifications: 'Notifiche',
+ smartPlugs: 'Prese smart',
+ spoolman: 'Spoolman',
+ updates: 'Aggiornamenti',
+ language: 'Lingua',
+ languageDescription: 'Seleziona la lingua preferita',
+ theme: 'Tema',
+ themeLight: 'Chiaro',
+ themeDark: 'Scuro',
+ themeSystem: 'Sistema',
+ defaultView: 'Vista predefinita',
+ defaultViewDescription: "Pagina da mostrare all'apertura dell'app",
+ checkForUpdates: 'Controlla aggiornamenti',
+ autoUpdate: 'Aggiornamento automatico',
+ currentVersion: 'Versione attuale',
+ latestVersion: 'Ultima versione',
+ upToDate: 'Sei aggiornato',
+ updateAvailable: 'Aggiornamento disponibile',
+ // Notifications
+ notificationLanguage: 'Lingua notifiche',
+ notificationLanguageDescription: 'Lingua per notifiche push',
+ notificationProviders: 'Provider notifiche',
+ addProvider: 'Aggiungi provider',
+ editProvider: 'Modifica provider',
+ providerType: 'Tipo provider',
+ testNotification: 'Notifica di test',
+ testSuccess: 'Notifica di test inviata',
+ testFailed: 'Invio notifica di test fallito',
+ quietHours: 'Ore silenziose',
+ quietHoursDescription: 'Non disturbare in queste ore',
+ quietHoursStart: 'Inizio',
+ quietHoursEnd: 'Fine',
+ events: {
+ title: 'Eventi notifica',
+ printStart: 'Stampa avviata',
+ printComplete: 'Stampa completata',
+ printFailed: 'Stampa fallita',
+ printStopped: 'Stampa interrotta',
+ printProgress: 'Avanzamento',
+ printProgressDescription: 'Notifica al 25%, 50%, 75%',
+ printerOffline: 'Stampante offline',
+ printerError: 'Errore stampante',
+ filamentLow: 'Filamento in esaurimento',
+ maintenanceDue: 'Manutenzione dovuta',
+ maintenanceDueDescription: 'Notifica quando serve manutenzione',
+ },
+ // Smart Plugs
+ smartPlug: {
+ title: 'Prese smart',
+ add: 'Aggiungi presa smart',
+ edit: 'Modifica presa smart',
+ name: 'Nome',
+ ipAddress: 'Indirizzo IP',
+ linkedPrinter: 'Stampante collegata',
+ autoOn: 'Accensione automatica',
+ autoOnDescription: 'Accendi all\'avvio stampa',
+ autoOff: 'Spegnimento automatico',
+ autoOffDescription: 'Spegni dopo il completamento',
+ offDelay: 'Ritardo spegnimento',
+ offDelayMinutes: 'Minuti dopo la stampa',
+ offDelayTemp: 'Quando ugello sotto temperatura',
+ currentState: 'Stato attuale',
+ turnOn: 'Accendi',
+ turnOff: 'Spegni',
+ },
+ // Spoolman
+ spoolmanEnabled: 'Abilita integrazione Spoolman',
+ spoolmanUrl: 'URL Spoolman',
+ spoolmanConnected: 'Connesso',
+ spoolmanDisconnected: 'Disconnesso',
+ // Default printer
+ noDefaultPrinter: 'Nessuna predefinita (chiedi ogni volta)',
+ // Sidebar
+ sidebarOrder: 'Ordine barra laterale',
+ // Camera
+ saveThumbnails: 'Salva miniature',
+ captureFinishPhoto: 'Acquisisci foto finale',
+ noPrintersConfigured: 'Nessuna stampante configurata',
+ // Archive settings
+ archiveMode: {
+ always: 'Crea sempre voce archivio',
+ never: 'Non creare mai voce archivio',
+ ask: 'Chiedi ogni volta',
+ },
+ // Updates
+ checkForUpdatesLabel: 'Controlla aggiornamenti',
+ checkPrinterFirmware: 'Controlla firmware stampante',
+ // Queue
+ enableRetry: 'Abilita retry',
+ // Home Assistant
+ homeAssistantDescription: 'Controlla prese smart tramite Home Assistant',
+ // MQTT
+ mqttConnectedTo: 'Connesso a',
+ // Prometheus
+ prometheusDescription: 'Esponi dati stampante in formato Prometheus',
+ // Smart plugs empty state
+ noSmartPlugsTitle: 'Nessuna presa smart configurata',
+ noSmartPlugsDescription: 'Aggiungi una presa smart Tasmota per monitorare energia e automatizzare il controllo.',
+ // Notifications empty state
+ noProvidersTitle: 'Nessun provider configurato',
+ noProvidersDescription: 'Aggiungi un provider per ricevere avvisi.',
+ noTemplatesAvailable: 'Nessun template disponibile. Riavvia il backend per generare i template predefiniti.',
+ // API permissions
+ apiPermissionView: 'Visualizza stato stampante e coda',
+ apiPermissionEdit: 'Aggiungi e rimuovi elementi dalla coda di stampa',
+ // API keys
+ apiKeysEmptyTitle: 'Nessuna chiave API',
+ apiKeysEmptyDescription: 'Crea una chiave API per integrare servizi esterni.',
+ // Users
+ noUsersFound: 'Nessun utente trovato',
+ noGroupsFound: 'Nessun gruppo trovato',
+ noGroupsAvailable: 'Nessun gruppo disponibile',
+ passwordsDoNotMatch: 'Le password non coincidono',
+ systemGroupWarning: 'I nomi dei gruppi di sistema non possono essere modificati',
+ // Auth disabled
+ authDisabledTitle: 'Autenticazione disabilitata',
+ authDisabledFeature1: 'Richiedi accesso per usare il sistema',
+ authDisabledFeature2: 'Crea piu utenti con permessi basati sui gruppi',
+ authDisabledFeature3: 'Controlla accesso con 50+ permessi granulari',
+ // User deletion
+ userHasCreated: 'Questo utente ha creato:',
+ userItemsQuestion: 'Cosa vuoi fare con questi elementi?',
+ deleteUserConfirm: 'Sei sicuro di voler eliminare questo utente?',
+ actionCannotBeUndone: 'Questa azione non puo essere annullata.',
+ // Smart plugs
+ addFirstSmartPlug: 'Aggiungi la tua prima presa smart',
+ // Notifications
+ providers: 'Provider',
+ log: 'Log',
+ testAll: 'Testa tutto',
+ testResults: 'Risultati test',
+ testPassedCount: '{{count}} riusciti',
+ testFailedCount: '{{count}} falliti',
+ messageTemplates: 'Template messaggi',
+ messageTemplatesDescription: 'Personalizza i messaggi per ogni evento.',
+ // API Keys section
+ apiKeys: 'Chiavi API',
+ apiKeysDescription: 'Crea chiavi API per integrazioni esterne e webhook.',
+ createKey: 'Crea chiave',
+ apiKeyCreated: 'Chiave API creata con successo',
+ apiKeyCopyWarning: "Copia questa chiave ora - non verra mostrata di nuovo!",
+ useInApiBrowser: 'Usa nel Browser API',
+ createNewApiKey: 'Crea nuova chiave API',
+ keyName: 'Nome chiave',
+ keyNamePlaceholder: 'es., Home Assistant, OctoPrint',
+ readStatus: 'Leggi stato',
+ readStatusDescription: 'Visualizza stato stampante e coda',
+ manageQueue: 'Gestisci coda',
+ manageQueueDescription: 'Aggiungi e rimuovi elementi dalla coda di stampa',
+ controlPrinter: 'Controlla stampante',
+ controlPrinterDescription: 'Metti in pausa, riprendi e ferma stampe',
+ unnamedKey: 'Chiave senza nome',
+ lastUsed: 'Ultimo uso',
+ read: 'Lettura',
+ control: 'Controllo',
+ createFirstKey: 'Crea la tua prima chiave',
+ webhookEndpoints: 'Endpoint webhook',
+ webhookApiKeyHint: "Usa la tua chiave API nell'header X-API-Key.",
+ webhook: {
+ getAllStatus: 'Ottieni stato di tutte le stampanti',
+ getSpecificStatus: 'Ottieni stato di una stampante',
+ addToQueue: 'Aggiungi alla coda di stampa',
+ pausePrint: 'Metti in pausa stampa',
+ resumePrint: 'Riprendi stampa',
+ stopPrint: 'Ferma stampa',
+ },
+ apiBrowser: 'Browser API',
+ apiBrowserDescription: 'Esplora e testa tutti gli endpoint API disponibili.',
+ apiKeyForTesting: 'Chiave API per test',
+ apiKeyPlaceholder: 'Incolla qui la tua chiave API per testare gli endpoint autenticati...',
+ apiKeyHint: "Questa chiave verra inviata come header X-API-Key.",
+ deleteApiKeyTitle: 'Elimina chiave API',
+ deleteApiKeyMessage: 'Sei sicuro di voler eliminare questa chiave API? Le integrazioni che la usano non funzioneranno piu.',
+ deleteKey: 'Elimina chiave',
+ // Filament tab
+ amsDisplayThresholds: 'Soglie visualizzazione AMS',
+ amsThresholdsDescription: 'Configura soglie colore per umidita e temperatura AMS.',
+ humidity: 'Umidita',
+ goodGreen: 'Buono (verde)',
+ fairOrange: 'Discreto (arancione)',
+ aboveFairBad: 'Sopra soglia discreta mostra rosso (scarso)',
+ temperature: 'Temperatura',
+ goodBlue: 'Buono (blu)',
+ aboveFairHot: 'Sopra soglia discreta mostra rosso (caldo)',
+ historyRetention: 'Conservazione cronologia',
+ keepSensorHistory: 'Mantieni cronologia sensori per',
+ historyRetentionDescription: 'I dati piu vecchi saranno eliminati automaticamente',
+ printModal: 'Modale stampa',
+ expandCustomMapping: 'Espandi mapping personalizzato di default',
+ expandCustomMappingDescription: 'Quando stampi su piu stampanti, mostra mapping AMS per stampante espanso',
+ // User management
+ authentication: 'Autenticazione',
+ authEnabledDescription: 'La tua istanza e protetta con autenticazione',
+ authDisabledDescription: 'Abilita per richiedere accesso e gestire utenti',
+ authDisabledMessage: 'Abilita autenticazione per creare account, gestire permessi e proteggere la tua istanza Bambuddy.',
+ enableAuthentication: 'Abilita autenticazione',
+ currentUser: 'Utente corrente',
+ changePassword: 'Cambia password',
+ admin: 'Admin',
+ users: 'Utenti',
+ addUser: 'Aggiungi utente',
+ groups: 'Gruppi',
+ addGroup: 'Aggiungi gruppo',
+ system: 'Sistema',
+ noDescription: 'Nessuna descrizione',
+ userCount: '{{count}} utenti',
+ permissionCount: '{{count}} permessi',
+ createUser: 'Crea utente',
+ username: 'Nome utente',
+ enterUsername: 'Inserisci nome utente',
+ password: 'Password',
+ enterPassword: 'Inserisci password (min 6 caratteri)',
+ confirmPassword: 'Conferma password',
+ confirmPasswordPlaceholder: 'Conferma password',
+ // Title tooltips
+ viewReleaseOnGitHub: 'Vedi release su GitHub',
+ turnAllPlugsOn: 'Accendi tutte le prese',
+ turnAllPlugsOff: 'Spegni tutte le prese',
+ // Modal: Clear logs
+ clearNotificationLogs: 'Cancella log notifiche',
+ clearLogsMessage: 'Questo eliminera definitivamente tutti i log notifiche piu vecchi di 30 giorni. Questa azione non puo essere annullata.',
+ clearLogs: 'Cancella log',
+ // Modal: Reset UI
+ resetUiPreferences: 'Reimposta preferenze UI',
+ resetUiPreferencesMessage: 'Questo reimpostera le preferenze UI ai valori predefiniti: ordine barra laterale, tema, layout dashboard, modalita vista e preferenze ordinamento. Stampanti, archivi e impostazioni server NON saranno modificati. La pagina si ricarichera dopo la cancellazione.',
+ resetPreferences: 'Reimposta preferenze',
+ // Modal: Delete group
+ deleteGroupTitle: 'Elimina gruppo',
+ deleteGroupMessage: 'Sei sicuro di voler eliminare questo gruppo? Gli utenti in questo gruppo perderanno questi permessi.',
+ deleteGroup: 'Elimina gruppo',
+ // Modal: Disable auth
+ disableAuthenticationTitle: 'Disabilita autenticazione',
+ disableAuthenticationMessage: "Sei sicuro di voler disabilitare l'autenticazione? Questo rendera la tua istanza Bambuddy accessibile senza login. Tutti gli utenti resteranno nel database ma l'autenticazione sara disabilitata.",
+ disableAuthentication: 'Disabilita autenticazione',
+ // Additional settings
+ configureBambuddy: 'Configura Bambuddy',
+ systemDefault: 'Predefinito di sistema',
+ archiveSettings: 'Impostazioni archivio',
+ newWindow: 'Nuova finestra',
+ embeddedOverlay: 'Overlay incorporato',
+ externalCameras: 'Camere esterne',
+ costTracking: 'Tracciamento costi',
+ printsOnly: 'Solo stampe',
+ totalConsumption: 'Consumo totale',
+ dataManagement: 'Gestione dati',
+ clearNotificationLogsDescription: 'Elimina log notifiche piu vecchi di 30 giorni',
+ resetUiPreferencesDescription: 'Reimposta ordine barra laterale, tema, modalita vista e preferenze layout. Stampanti, archivi e impostazioni non vengono modificati.',
+ enableHomeAssistant: 'Abilita Home Assistant',
+ enableMqtt: 'Abilita MQTT',
+ useTls: 'Usa TLS',
+ enableMetricsEndpoint: 'Abilita endpoint metriche',
+ availableMetrics: 'Metriche disponibili',
+ editUser: 'Modifica utente',
+ deleteUserTitle: 'Elimina utente',
+ groupName: 'Nome gruppo',
+ // Placeholders
+ leaveEmptyForAnonymous: 'Lascia vuoto per anonimo',
+ leaveEmptyForNoAuth: 'Lascia vuoto per nessuna autenticazione',
+ enterNewPassword: 'Inserisci nuova password',
+ confirmNewPassword: 'Conferma nuova password',
+ enterGroupName: 'Inserisci nome gruppo',
+ enterDescriptionOptional: 'Inserisci descrizione (opzionale)',
+ enterCurrentPassword: 'Inserisci password attuale',
+ enterNewPasswordMin6: 'Inserisci nuova password (min 6 caratteri)',
+ toast: {
+ keyCopied: 'Chiave copiata negli appunti',
+ copyFailed: 'Copia chiave fallita',
+ keyAddedToBrowser: 'Chiave aggiunta al Browser API',
+ clearLogsFailed: 'Eliminazione log fallita',
+ uiPreferencesReset: 'Preferenze UI reimpostate. Aggiornamento...',
+ authDisabled: 'Autenticazione disabilitata con successo',
+ authDisableFailed: 'Disabilitazione autenticazione fallita',
+ apiKeyCreated: 'Chiave API creata',
+ apiKeyDeleted: 'Chiave API eliminata',
+ userCreated: 'Utente creato con successo',
+ userUpdated: 'Utente aggiornato con successo',
+ userDeleted: 'Utente eliminato con successo',
+ groupCreated: 'Gruppo creato con successo',
+ groupUpdated: 'Gruppo aggiornato con successo',
+ groupDeleted: 'Gruppo eliminato con successo',
+ fillRequiredFields: 'Compila tutti i campi obbligatori',
+ passwordsDoNotMatch: 'Le password non coincidono',
+ passwordTooShort: 'La password deve essere di almeno 6 caratteri',
+ enterGroupName: 'Inserisci un nome gruppo',
+ settingsSaved: 'Impostazioni salvate',
+ cameraSettingsSaved: 'Impostazioni camera salvate',
+ enterCameraUrl: 'Inserisci un URL camera',
+ passwordChanged: 'Password cambiata con successo',
+ connectionFailed: 'Connessione fallita',
+ testFailed: 'Test fallito',
+ cameraConnected: 'Camera connessa{{resolution}}',
+ },
+ testConnection: 'Testa connessione',
+ },
+
+ // Notifications (for push notifications)
+ notification: {
+ printStarted: {
+ title: 'Stampa avviata',
+ body: '{{printer}}: {{filename}} ha iniziato a stampare',
+ },
+ printCompleted: {
+ title: 'Stampa completata',
+ body: '{{printer}}: {{filename}} completata con successo',
+ },
+ printFailed: {
+ title: 'Stampa fallita',
+ body: '{{printer}}: {{filename}} fallita',
+ },
+ printStopped: {
+ title: 'Stampa interrotta',
+ body: '{{printer}}: {{filename}} interrotta',
+ },
+ printProgress: {
+ title: 'Avanzamento stampa',
+ body: '{{printer}}: {{filename}} al {{percent}}% completamento',
+ },
+ printerOffline: {
+ title: 'Stampante offline',
+ body: '{{printer}} e offline',
+ },
+ printerError: {
+ title: 'Errore stampante',
+ body: '{{printer}}: {{error}}',
+ },
+ filamentLow: {
+ title: 'Filamento in esaurimento',
+ body: '{{printer}}: Filamento in esaurimento',
+ },
+ maintenanceDue: {
+ title: 'Manutenzione dovuta',
+ body: '{{printer}}: {{items}} richiedono attenzione',
+ },
+ },
+
+ // Errors
+ errors: {
+ generic: 'Qualcosa e andato storto',
+ networkError: 'Errore di rete. Controlla la connessione.',
+ notFound: 'Non trovato',
+ unauthorized: 'Non autorizzato',
+ serverError: 'Errore server',
+ validationError: 'Controlla i dati inseriti',
+ printerConnectionFailed: 'Connessione alla stampante fallita',
+ saveFailed: 'Salvataggio modifiche fallito',
+ deleteFailed: 'Eliminazione fallita',
+ loadFailed: 'Caricamento dati fallito',
+ },
+
+ // HMS Errors modal
+ hmsErrors: {
+ title: 'Errori - {{name}}',
+ noErrors: 'Nessun errore',
+ viewOnWiki: 'Vedi su Bambu Lab Wiki',
+ clearInstructions: 'Cancella gli errori sulla stampante per rimuoverli qui.',
+ },
+
+ // MQTT Debug modal
+ mqttDebug: {
+ title: 'Log debug MQTT',
+ searchPlaceholder: 'Cerca topic o payload...',
+ noMessages: 'Nessun messaggio registrato',
+ startLoggingHint: 'Clicca "Avvia logging" per iniziare a catturare messaggi MQTT',
+ noMessagesMatch: 'Nessun messaggio corrisponde al filtro',
+ adjustFilterHint: 'Prova a modificare la ricerca o i filtri',
+ incoming: 'In ingresso',
+ outgoing: 'In uscita',
+ loggingStopped: 'Logging fermato',
+ loggingActive: 'Logging attivo - i messaggi si aggiornano automaticamente',
+ startLogging: 'Avvia logging',
+ stopLogging: 'Ferma logging',
+ clearLog: 'Pulisci log',
+ topic: 'Topic',
+ timestamp: 'Timestamp',
+ direction: 'Direzione',
+ all: 'Tutti',
+ },
+
+ // Printer File Manager modal (printer internal storage)
+ printerFiles: {
+ title: 'Gestore file',
+ storageUsed: 'Usato:',
+ storageFree: 'Libero:',
+ filterPlaceholder: 'Filtra file...',
+ deleteButton: 'Elimina',
+ deleteFiles: 'Elimina {{count}} file',
+ deleteFileConfirm: 'Eliminare "{{name}}"? Questa azione non puo essere annullata.',
+ deleteFilesConfirm: 'Eliminare {{count}} file selezionati? Questa azione non puo essere annullata.',
+ noFiles: 'Nessun file sulla stampante',
+ loadingFiles: 'Caricamento file...',
+ failedToLoad: 'Caricamento file fallito',
+ toast: {
+ filesDeleted: 'Eliminati {{count}} file',
+ deleteFailed: 'Eliminazione fallita: {{error}}',
+ },
+ },
+
+ // Confirmations
+ confirm: {
+ delete: 'Sei sicuro di voler eliminare questo?',
+ unsavedChanges: 'Hai modifiche non salvate. Sei sicuro di voler uscire?',
+ clearQueue: 'Sei sicuro di voler svuotare la coda?',
+ },
+
+ // Login page
+ login: {
+ title: 'Login Bambuddy',
+ subtitle: 'Accedi al tuo account',
+ username: 'Nome utente',
+ usernamePlaceholder: 'Inserisci il nome utente',
+ password: 'Password',
+ passwordPlaceholder: 'Inserisci la password',
+ signIn: 'Accedi',
+ signingIn: 'Accesso in corso...',
+ forgotPassword: 'Hai dimenticato la password?',
+ loginSuccess: 'Accesso riuscito',
+ loginFailed: 'Accesso fallito',
+ enterCredentials: 'Inserisci nome utente e password',
+ forgotPasswordTitle: 'Password dimenticata',
+ forgotPasswordMessage: 'Se hai dimenticato la password, contatta il tuo amministratore di sistema per reimpostarla.',
+ howToReset: 'Come reimpostare la password:',
+ resetStep1: 'Contatta il tuo amministratore Bambuddy',
+ resetStep2: 'Chiedi di reimpostare la password in Gestione utenti',
+ resetStep3: 'Possono impostare una nuova password temporanea',
+ resetStep4: 'Accedi con la nuova password e cambiala in Impostazioni',
+ gotIt: 'Capito',
+ },
+
+ // Setup page
+ setup: {
+ title: 'Configurazione Bambuddy',
+ subtitle: 'Configura autenticazione per la tua istanza Bambuddy',
+ enableAuth: 'Abilita autenticazione',
+ adminAccount: 'Account admin',
+ adminAccountDesc: 'Se esistono gia admin, l\'autenticazione verra abilitata usando gli account esistenti. Lascia i campi sotto vuoti per usare gli admin esistenti, oppure inserisci nuove credenziali per creare un nuovo utente admin.',
+ adminUsername: 'Nome utente admin',
+ adminPassword: 'Password admin',
+ optionalIfAdminExists: '(opzionale se esistono admin)',
+ adminUsernamePlaceholder: 'Inserisci nome utente admin (opzionale)',
+ adminPasswordPlaceholder: 'Inserisci password admin (opzionale)',
+ confirmPassword: 'Conferma password',
+ confirmPasswordPlaceholder: 'Conferma password admin',
+ settingUp: 'Configurazione...',
+ completeSetup: 'Completa configurazione',
+ toast: {
+ authEnabledAdminCreated: 'Autenticazione abilitata e utente admin creato',
+ authEnabledExistingAdmins: 'Autenticazione abilitata usando admin esistenti',
+ setupCompleted: 'Configurazione completata',
+ enterBothCredentials: 'Inserisci nome utente e password admin, oppure lascia entrambi vuoti per usare admin esistenti',
+ passwordsDoNotMatch: 'Le password non coincidono',
+ passwordTooShort: 'La password deve essere di almeno 6 caratteri',
+ },
+ },
+
+ // Password change
+ changePassword: {
+ title: 'Cambia password',
+ currentPassword: 'Password attuale',
+ currentPasswordPlaceholder: 'Inserisci password attuale',
+ newPassword: 'Nuova password',
+ newPasswordPlaceholder: 'Inserisci nuova password (min 6 caratteri)',
+ confirmPassword: 'Conferma nuova password',
+ confirmPasswordPlaceholder: 'Conferma nuova password',
+ passwordsDoNotMatch: 'Le password non coincidono',
+ passwordTooShort: 'La password deve essere di almeno 6 caratteri',
+ changing: 'Modifica in corso...',
+ success: 'Password cambiata con successo',
+ failed: 'Modifica password fallita',
+ },
+
+ // Plate detection alert
+ plateAlert: {
+ title: 'Stampa in pausa!',
+ message: 'Oggetti rilevati sul piatto. La stampa e stata messa automaticamente in pausa. Svuota il piatto e riprendi la stampa.',
+ understand: 'Ho capito',
+ },
+
+ // Camera page
+ camera: {
+ title: 'Vista camera',
+ invalidPrinterId: 'ID stampante non valido',
+ live: 'Live',
+ snapshot: 'Snapshot',
+ restartStream: 'Riavvia stream',
+ refreshSnapshot: 'Aggiorna snapshot',
+ fullscreen: 'Schermo intero',
+ exitFullscreen: 'Esci da schermo intero',
+ connectingToCamera: 'Connessione alla camera...',
+ capturingSnapshot: 'Acquisizione snapshot...',
+ connectionLost: 'Connessione persa',
+ connectionFailed: 'Connessione camera fallita',
+ reconnecting: 'Riconnessione tra {{countdown}}s... (tentativo {{attempt}}/{{max}})',
+ reconnectNow: 'Riconnetti ora',
+ cameraUnavailable: 'Camera non disponibile',
+ cameraUnavailableDesc: 'Assicurati che la stampante sia accesa e connessa.',
+ noCamera: 'Nessuna camera disponibile',
+ retry: 'Riprova',
+ cameraStream: 'Stream camera',
+ zoomOut: 'Zoom indietro',
+ zoomIn: 'Zoom avanti',
+ resetZoom: 'Reset zoom',
+ recording: 'Registrazione',
+ startRecording: 'Avvia registrazione',
+ stopRecording: 'Ferma registrazione',
+ },
+
+ // Groups management
+ groups: {
+ title: 'Gestione gruppi',
+ subtitle: 'Gestisci gruppi permessi per controllo accesso',
+ backToSettings: 'Torna a Impostazioni',
+ createGroup: 'Crea gruppo',
+ noPermission: 'Non hai il permesso di accedere a questa pagina.',
+ system: 'Sistema',
+ noDescription: 'Nessuna descrizione',
+ usersCount: '{{count}} utenti',
+ permissionsCount: '{{count}} permessi',
+ edit: 'Modifica',
+ delete: 'Elimina',
+ toast: {
+ created: 'Gruppo creato con successo',
+ updated: 'Gruppo aggiornato con successo',
+ deleted: 'Gruppo eliminato con successo',
+ enterGroupName: 'Inserisci un nome gruppo',
+ },
+ modal: {
+ editGroup: 'Modifica gruppo',
+ createGroup: 'Crea gruppo',
+ cancel: 'Annulla',
+ saving: 'Salvataggio...',
+ creating: 'Creazione...',
+ saveChanges: 'Salva modifiche',
+ },
+ form: {
+ groupName: 'Nome gruppo',
+ groupNamePlaceholder: 'Inserisci nome gruppo',
+ systemGroupWarning: 'I nomi dei gruppi di sistema non possono essere modificati',
+ description: 'Descrizione',
+ descriptionPlaceholder: 'Inserisci descrizione (opzionale)',
+ permissions: 'Permessi ({{count}} selezionati)',
+ },
+ deleteModal: {
+ title: 'Elimina gruppo',
+ message: 'Sei sicuro di voler eliminare questo gruppo? Gli utenti in questo gruppo perderanno questi permessi.',
+ confirm: 'Elimina gruppo',
+ },
+ },
+
+ // Users management
+ users: {
+ title: 'Gestione utenti',
+ subtitle: 'Gestisci utenti e accesso alla tua istanza Bambuddy',
+ backToSettings: 'Torna a Impostazioni',
+ createUser: 'Crea utente',
+ noPermission: 'Non hai il permesso di accedere a questa pagina.',
+ admin: 'Admin',
+ noGroups: 'Nessun gruppo',
+ active: 'Attivo',
+ inactive: 'Inattivo',
+ edit: 'Modifica',
+ delete: 'Elimina',
+ system: 'Sistema',
+ noGroupsAvailable: 'Nessun gruppo disponibile',
+ table: {
+ username: 'Nome utente',
+ groups: 'Gruppi',
+ status: 'Stato',
+ actions: 'Azioni',
+ },
+ toast: {
+ created: 'Utente creato con successo',
+ updated: 'Utente aggiornato con successo',
+ deleted: 'Utente eliminato con successo',
+ fillRequired: 'Compila tutti i campi obbligatori',
+ passwordsDoNotMatch: 'Le password non coincidono',
+ passwordTooShort: 'La password deve essere di almeno 6 caratteri',
+ },
+ modal: {
+ createUser: 'Crea utente',
+ editUser: 'Modifica utente',
+ cancel: 'Annulla',
+ creating: 'Creazione...',
+ saving: 'Salvataggio...',
+ saveChanges: 'Salva modifiche',
+ },
+ form: {
+ username: 'Nome utente',
+ usernamePlaceholder: 'Inserisci nome utente',
+ password: 'Password',
+ passwordPlaceholder: 'Inserisci password',
+ confirmPassword: 'Conferma password',
+ confirmPasswordPlaceholder: 'Conferma password',
+ newPasswordPlaceholder: 'Inserisci nuova password',
+ confirmNewPasswordPlaceholder: 'Conferma nuova password',
+ leaveBlankToKeep: 'lascia vuoto per mantenere attuale',
+ groups: 'Gruppi',
+ },
+ deleteModal: {
+ title: 'Elimina utente',
+ message: 'Sei sicuro di voler eliminare questo utente? Questa azione non puo essere annullata.',
+ confirm: 'Elimina utente',
+ },
+ },
+
+ // Stream overlay
+ streamOverlay: {
+ title: 'Overlay stream',
+ invalidPrinterId: 'ID stampante non valido',
+ cameraStream: 'Stream camera',
+ progress: 'Avanzamento',
+ eta: 'ETA',
+ tomorrow: 'Domani',
+ printerIdle: 'Stampante inattiva',
+ printerOffline: 'Stampante offline',
+ status: {
+ printing: 'In stampa',
+ paused: 'In pausa',
+ finished: 'Completata',
+ failed: 'Fallita',
+ idle: 'Inattiva',
+ unknown: 'Sconosciuto',
+ },
+ },
+
+ // Profiles
+ profiles: {
+ title: 'Profili',
+ subtitle: 'Gestisci preset slicer e calibrazioni pressure advance',
+ tabs: {
+ cloud: 'Profili cloud',
+ kprofiles: 'K-Profiles',
+ },
+ connectedAs: 'Connesso come',
+ logout: 'Esci',
+ noLogoutPermission: 'Non hai il permesso di disconnetterti',
+ failedToLoad: 'Caricamento profili fallito',
+ retry: 'Riprova',
+ time: {
+ justNow: 'Proprio ora',
+ minsAgo: '{{count}}m fa',
+ hoursAgo: '{{count}}h fa',
+ daysAgo: '{{count}}g fa',
+ },
+ toast: {
+ loggedOut: 'Disconnesso',
+ },
+ login: {
+ title: 'Connetti a Bambu Cloud',
+ subtitle: 'Sincronizza i preset del slicer tra dispositivi',
+ email: 'Email',
+ password: 'Password',
+ region: 'Regione',
+ regionGlobal: 'Globale',
+ regionChina: 'Cina',
+ verificationCode: 'Codice di verifica',
+ totpCode: 'Codice autenticatore',
+ checkEmail: 'Controlla la tua email ({{email}}) per un codice a 6 cifre',
+ enterTotpHint: 'Inserisci il codice a 6 cifre dalla tua app autenticatore',
+ accessToken: 'Access Token',
+ accessTokenHint: 'Incolla il tuo access token Bambu Lab (da Bambu Studio)',
+ back: 'Indietro',
+ loginButton: 'Accedi',
+ verifyButton: 'Verifica',
+ setTokenButton: 'Imposta token',
+ useToken: 'Usa access token invece',
+ useEmail: 'Accedi con email invece',
+ toast: {
+ loggedIn: 'Accesso riuscito',
+ codeSent: 'Codice di verifica inviato via email',
+ enterTotp: 'Inserisci il codice dalla tua app autenticatore',
+ tokenSet: 'Token impostato con successo',
+ },
+ },
+ presets: {
+ myPreset: 'Il mio preset (modificabile)',
+ duplicate: 'Duplica',
+ editable: 'Modificabile',
+ failedToLoadDetails: 'Caricamento dettagli preset fallito',
+ deleteConfirm: 'Eliminare questo preset?',
+ deleteWarning: 'Questo eliminera definitivamente "{{name}}" da Bambu Cloud. Questa azione non puo essere annullata.',
+ noDuplicatePermission: 'Non hai il permesso di duplicare preset',
+ noEditPermission: 'Non hai il permesso di modificare preset',
+ noDeletePermission: 'Non hai il permesso di eliminare preset',
+ types: {
+ filament: 'Preset filamento',
+ printer: 'Preset stampante',
+ process: 'Preset processo',
+ },
+ toast: {
+ deleted: 'Preset eliminato',
+ created: 'Preset creato',
+ updated: 'Preset aggiornato',
+ duplicated: 'Preset duplicato',
+ fieldAdded: 'Campo "{{key}}" aggiunto',
+ exported: 'Preset esportato',
+ },
+ baseLabel: 'Base: {{name}}',
+ currentLabel: 'Corrente: {{name}}',
+ newPreset: 'Nuovo preset',
+ editPreset: 'Modifica preset',
+ duplicatePreset: 'Duplica preset',
+ createNewPreset: 'Crea nuovo preset',
+ customizeSettings: 'Personalizza le impostazioni per il nuovo preset',
+ compareWithBase: 'Confronta con base',
+ compare: 'Confronta',
+ // CreatePresetModal - Basic Info
+ basePreset: 'Preset base',
+ selectBasePreset: 'Seleziona preset base...',
+ presetName: 'Nome preset',
+ myCustomPreset: 'Il mio preset personalizzato',
+ inheritsFrom: 'Deriva da',
+ dropJsonToImport: 'Rilascia JSON per importare',
+ // CreatePresetModal - Tabs
+ tabs: {
+ common: 'Comune',
+ allFields: 'Tutti i campi',
+ },
+ // CreatePresetModal - All Fields Tab
+ availableFields: 'Campi disponibili',
+ searchFieldsPlaceholder: 'Cerca campi...',
+ noMatchingFields: 'Nessun campo corrispondente',
+ allFieldsAdded: 'Tutti i campi aggiunti',
+ addCustomField: 'Aggiungi campo personalizzato',
+ yourOverrides: 'Le tue override',
+ noOverridesYet: 'Nessun override ancora',
+ clickFieldsToAdd: 'Clicca i campi a sinistra per aggiungerli',
+ saveAsTemplate: 'Salva come template',
+ jsonTip: 'Suggerimento: trascina e rilascia un file .json ovunque in questa modale per importare impostazioni',
+ },
+ cloudView: {
+ searchPlaceholder: 'Cerca preset...',
+ templates: 'Template',
+ refresh: 'Aggiorna',
+ newPreset: 'Nuovo preset',
+ clearFilters: 'Pulisci filtri',
+ // Compare mode
+ compareMode: 'Modalita confronto',
+ selectAnotherPreset: 'Seleziona un altro preset {{type}}',
+ clickTwoPresets: 'Clicca due preset dello stesso tipo per confrontare',
+ selectFirst: '1. Seleziona il primo',
+ selectSecond: '2. Seleziona il secondo',
+ compareNow: 'Confronta ora',
+ // Status row
+ lastSynced: 'Ultima sincronizzazione:',
+ showingCount: 'Mostrati {{showing}} di {{total}} preset',
+ noPresetsFound: 'Nessun preset trovato',
+ // Column headers
+ columns: {
+ filament: 'Filamento',
+ process: 'Processo',
+ printer: 'Stampante',
+ },
+ noFilamentPresets: 'Nessun preset filamento',
+ noProcessPresets: 'Nessun preset processo',
+ noPrinterPresets: 'Nessun preset stampante',
+ // Filters
+ filters: {
+ type: 'Tipo',
+ owner: 'Proprietario',
+ printer: 'Stampante',
+ nozzle: 'Ugello',
+ filament: 'Filamento',
+ layer: 'Layer',
+ all: 'Tutti',
+ myPresets: 'I miei preset',
+ builtIn: 'Integrati',
+ process: 'Processo',
+ },
+ // Permissions
+ noTemplatesPermission: 'Non hai il permesso di gestire i template',
+ noRefreshPermission: 'Non hai il permesso di aggiornare i profili',
+ noCreatePermission: 'Non hai il permesso di creare preset',
+ },
+ templates: {
+ title: 'Template rapidi',
+ noTemplates: 'Nessun template ancora',
+ createFirst: 'Crea template dall\'editor preset',
+ typeFilter: 'Tipo:',
+ deleteTitle: 'Elimina template',
+ deleteWarning: 'Questa azione non puo essere annullata',
+ deleteConfirm: 'Sei sicuro di voler eliminare "{{name}}"?',
+ namePlaceholder: 'Nome template',
+ descriptionPlaceholder: 'Descrizione',
+ settingsJson: 'Impostazioni (JSON)',
+ fieldsCount: '{{count}} campi',
+ shownInModals: 'Mostrati nelle modali',
+ hiddenInModals: 'Nascosti nelle modali',
+ apply: 'Applica',
+ toast: {
+ deleted: 'Template eliminato',
+ updated: 'Template aggiornato',
+ created: 'Template creato',
+ applied: 'Template applicato',
+ },
+ },
+ },
+
+ // Support/Debug
+ support: {
+ debugLoggingActive: 'Log debug attivo',
+ manageLogs: 'Gestisci',
+ },
+
+ // File manager
+ fileManager: {
+ title: 'Gestore file',
+ subtitle: 'Organizza e gestisci i tuoi file di stampa',
+ uploadFiles: 'Carica file',
+ newFolder: 'Nuova cartella',
+ folderName: 'Nome cartella',
+ folderNamePlaceholder: 'es., Parti funzionali',
+ renameFile: 'Rinomina file',
+ renameFolder: 'Rinomina cartella',
+ moveFiles: 'Sposta {{count}} file',
+ rootNoFolder: 'Radice (nessuna cartella)',
+ current: 'corrente',
+ linkFolder: 'Collega cartella',
+ linkFolderDescription: 'Collega "{{name}}" a un progetto o archivio per accesso rapido.',
+ project: 'Progetto',
+ archive: 'Archivio',
+ noProjectsFound: 'Nessun progetto trovato',
+ noArchivesFound: 'Nessun archivio trovato',
+ unlink: 'Scollega',
+ link: 'Collega',
+ dragDropFiles: 'Trascina e rilascia file qui',
+ dropFilesHere: 'Rilascia file qui',
+ orClickToBrowse: 'oppure clicca per sfogliare',
+ allFileTypesSupported: 'Tutti i tipi di file supportati. I file ZIP saranno estratti.',
+ zipFilesDetected: 'File ZIP rilevati',
+ zipExtractOptions: 'I file ZIP saranno estratti. Scegli come gestire la struttura cartelle:',
+ preserveZipStructure: 'Mantieni struttura cartelle dal ZIP',
+ createFolderFromZip: 'Crea cartella dal nome ZIP',
+ stlThumbnailGeneration: 'Generazione miniature STL',
+ zipMayContainStl: 'I file ZIP possono contenere STL. Le miniature possono essere generate durante l\'estrazione.',
+ thumbnailsCanBeGenerated: 'Le miniature possono essere generate per file STL. I modelli grandi possono richiedere piu tempo.',
+ generateThumbnailsForStl: 'Genera miniature per file STL',
+ threemfDetected: 'File 3MF rilevati',
+ threemfExtractionInfo: 'Modello stampante, materiale, colore e impostazioni stampa saranno estratti automaticamente dai file 3MF.',
+ willBeExtracted: 'Sara estratto',
+ filesExtracted: '{{count}} file estratti',
+ uploadComplete: 'Caricamento completato: {{succeeded}} riusciti',
+ uploadFailed: '{{count}} falliti',
+ uploading: 'Caricamento...',
+ changeLink: 'Cambia collegamento...',
+ linkTo: 'Collega a...',
+ linkToProjectOrArchive: 'Collega a progetto o archivio',
+ addToQueue: 'Aggiungi alla coda',
+ schedulePrint: 'Pianifica',
+ generateThumbnail: 'Genera miniatura',
+ generateThumbnails: 'Genera miniature',
+ generateThumbnailsForMissing: 'Genera miniature per STL senza miniatura',
+ gridView: 'Vista griglia',
+ listView: 'Vista elenco',
+ lowDiskSpaceWarning: 'Avviso spazio disco basso',
+ lowDiskSpaceDetails: 'Solo {{free}} liberi su {{total}} totali. La soglia e {{threshold}} GB nelle impostazioni.',
+ files: 'File',
+ folders: 'Cartelle',
+ size: 'Dimensione',
+ free: 'Libero',
+ allFiles: 'Tutti i file',
+ wrap: 'A capo',
+ enableTextWrapping: 'Abilita a capo testo',
+ disableTextWrapping: 'Disabilita a capo testo',
+ dragToResizeTooltip: 'Trascina per ridimensionare, doppio clic per reset',
+ searchFiles: 'Cerca file...',
+ allTypes: 'Tutti i tipi',
+ prints: 'Stampe',
+ ascending: 'Crescente',
+ descending: 'Decrescente',
+ resultsCount: '{{showing}} di {{total}} file',
+ selectAll: 'Seleziona tutto',
+ deselectAll: 'Deseleziona tutto',
+ selected: '{{count}} selezionati',
+ adding: 'Aggiunta...',
+ loadingFiles: 'Caricamento file...',
+ folderIsEmpty: 'La cartella e vuota',
+ noFilesYet: 'Nessun file ancora',
+ folderEmptyDescription: 'Carica file o sposta file in questa cartella per iniziare.',
+ noFilesDescription: 'Carica file per iniziare a organizzare i file di stampa.',
+ noMatchingFiles: 'Nessun file corrispondente',
+ noMatchingFilesDescription: 'Nessun file corrisponde ai criteri di ricerca o filtro.',
+ clearFilters: 'Pulisci filtri',
+ printedCount: 'Stampato {{count}}x',
+ uploadedBy: 'Caricato da',
+ deleteFolder: 'Elimina cartella',
+ deleteFile: 'Elimina file',
+ deleteFilesCount: 'Elimina {{count}} file',
+ deleteFolderConfirm: 'Sei sicuro di voler eliminare questa cartella? Tutti i file dentro saranno eliminati.',
+ deleteFileConfirm: 'Sei sicuro di voler eliminare questo file?',
+ deleteFilesConfirm: 'Sei sicuro di voler eliminare {{count}} file selezionati? Questa azione non puo essere annullata.',
+ deleting: 'Eliminazione...',
+ noPermissionRenameFolder: 'Non hai il permesso di rinominare cartelle',
+ noPermissionLinkFolder: 'Non hai il permesso di collegare cartelle',
+ noPermissionDeleteFolder: 'Non hai il permesso di eliminare cartelle',
+ noPermissionPrint: 'Non hai il permesso di stampare',
+ noPermissionAddToQueue: 'Non hai il permesso di aggiungere alla coda',
+ noPermissionDownload: 'Non hai il permesso di scaricare file',
+ noPermissionRenameFile: 'Non hai il permesso di rinominare questo file',
+ noPermissionGenerateThumbnail: 'Non hai il permesso di generare miniature',
+ noPermissionDeleteFile: 'Non hai il permesso di eliminare questo file',
+ noPermissionCreateFolder: 'Non hai il permesso di creare cartelle',
+ noPermissionUpload: 'Non hai il permesso di caricare file',
+ noPermissionMoveFiles: 'Non hai il permesso di spostare file',
+ noPermissionDeleteFiles: 'Non hai il permesso di eliminare file',
+ toast: {
+ folderCreated: 'Cartella creata',
+ folderDeleted: 'Cartella eliminata',
+ fileDeleted: 'File eliminato',
+ filesDeleted: 'Eliminati {{count}} file',
+ filesMoved: 'File spostati',
+ folderLinked: 'Cartella collegata',
+ folderUnlinked: 'Cartella scollegata',
+ addedToQueue: 'Aggiunti {{count}} file alla coda',
+ addedToQueuePartial: 'Aggiunti {{added}} file, {{failed}} falliti',
+ failedToAddToQueue: 'Aggiunta file fallita: {{error}}',
+ fileRenamed: 'File rinominato',
+ folderRenamed: 'Cartella rinominata',
+ thumbnailsGenerated: 'Generate {{count}} miniature',
+ thumbnailsGeneratedPartial: 'Generate {{succeeded}} miniature, {{failed}} fallite',
+ noStlMissingThumbnails: 'Nessun file STL senza miniature',
+ failedToGenerateThumbnails: 'Generazione miniature fallita: {{error}}',
+ thumbnailGenerated: 'Miniatura generata',
+ failedToGenerateThumbnail: 'Generazione miniatura fallita: {{error}}',
+ },
+ },
+
+ // Projects
+ projects: {
+ title: 'Progetti',
+ subtitle: 'Organizza e traccia i tuoi progetti di stampa 3D',
+ newProject: 'Nuovo progetto',
+ editProject: 'Modifica progetto',
+ deleteProject: 'Elimina progetto',
+ projectName: 'Nome progetto',
+ description: 'Descrizione',
+ noProjects: 'Nessun progetto ancora',
+ noProjectsFiltered: 'Nessun progetto {{status}}',
+ noProjectsFilteredHelp: 'Non hai progetti {{status}}. I progetti appariranno qui quando il loro stato cambia.',
+ createFirst: 'Crea il tuo primo progetto per organizzare stampe correlate, tracciare progressi e gestire i tuoi build.',
+ createFirstButton: 'Crea il tuo primo progetto',
+ create: 'Crea',
+ files: 'File',
+ prints: 'Stampe',
+ plates: 'piatti',
+ parts: 'parti',
+ lastModified: 'Ultima modifica',
+ deleteConfirm: 'Sei sicuro di voler eliminare questo progetto? Archivi e elementi in coda saranno scollegati ma non eliminati.',
+ addFiles: 'Aggiungi file',
+ removeFile: 'Rimuovi file',
+ viewDetails: 'Vedi dettagli',
+ // Modal fields
+ namePlaceholder: 'es., Build Voron 2.4',
+ descriptionPlaceholder: 'Descrizione opzionale...',
+ color: 'Colore',
+ targetPlates: 'Piatti target',
+ targetPlatesPlaceholder: 'es., 25',
+ targetPlatesHelp: 'Numero di job di stampa',
+ targetParts: 'Parti target',
+ targetPartsPlaceholder: 'es., 150',
+ targetPartsHelp: 'Totale oggetti necessari',
+ tagsLabel: 'Tag (separati da virgola)',
+ tagsPlaceholder: 'es., voron, funzionale, regalo',
+ dueDate: 'Data scadenza',
+ priority: 'Priorita',
+ priorityLow: 'Bassa',
+ priorityNormal: 'Normale',
+ priorityHigh: 'Alta',
+ priorityUrgent: 'Urgente',
+ // Status
+ statusActive: 'Attivo',
+ statusCompleted: 'Completato',
+ statusArchived: 'Archiviato',
+ done: 'Fatto',
+ completed: 'completato',
+ failed: 'fallito',
+ inQueue: 'in coda',
+ noPrintsYet: 'Nessuna stampa ancora',
+ // Footer stats
+ printJobs: 'Job di stampa (piatti)',
+ partsPrinted: 'Parti stampate',
+ failedParts: 'Parti fallite',
+ // Actions
+ import: 'Importa',
+ export: 'Esporta',
+ importProject: 'Importa progetto',
+ exportAll: 'Esporta tutti i progetti',
+ loading: 'Caricamento progetti...',
+ // Permissions
+ noEditPermission: 'Non hai il permesso di modificare progetti',
+ noDeletePermission: 'Non hai il permesso di eliminare progetti',
+ noCreatePermission: 'Non hai il permesso di creare progetti',
+ noImportPermission: 'Non hai il permesso di importare progetti',
+ noExportPermission: 'Non hai il permesso di esportare progetti',
+ // Toast
+ toast: {
+ created: 'Progetto creato',
+ updated: 'Progetto aggiornato',
+ deleted: 'Progetto eliminato',
+ imported: 'Progetto importato',
+ multipleImported: '{{count}} progetti importati',
+ importFailed: 'Import fallito',
+ exported: 'Progetti esportati (solo metadati)',
+ },
+ },
+
+ // Project detail page
+ projectDetail: {
+ notFound: 'Progetto non trovato',
+ backToProjects: 'Torna a Progetti',
+ export: 'Esporta',
+ exportProject: 'Esporta progetto',
+ noExportPermission: 'Non hai il permesso di esportare progetti',
+ noEditPermission: 'Non hai il permesso di modificare progetti',
+ partOf: 'Parte di:',
+ priorityLabel: 'Priorita:',
+ noPrints: 'Nessuna stampa in questo progetto ancora',
+ status: {
+ active: 'Attivo',
+ completed: 'Completato',
+ archived: 'Archiviato',
+ },
+ priority: {
+ low: 'Bassa',
+ normal: 'Normale',
+ high: 'Alta',
+ urgent: 'Urgente',
+ },
+ dueDate: {
+ overdue: 'Scaduto',
+ today: 'Scade oggi',
+ daysLeft: '{{count}} giorni rimanenti',
+ },
+ progress: {
+ platesProgress: 'Avanzamento piatti',
+ partsProgress: 'Avanzamento parti',
+ printJobs: 'job di stampa',
+ parts: 'parti',
+ percentComplete: '{{percent}}% completato',
+ remaining: '{{count}} rimanenti',
+ },
+ stats: {
+ printJobs: 'Job di stampa',
+ total: 'totale',
+ failed: '{{count}} falliti',
+ partsPrinted: '{{count}} parti stampate',
+ printTime: 'Tempo di stampa',
+ filamentUsed: 'Filamento usato',
+ },
+ cost: {
+ title: 'Tracciamento costi',
+ filamentCost: 'Costo filamento',
+ energy: 'Energia',
+ budget: 'Budget',
+ remaining: 'Rimanente',
+ },
+ subProjects: {
+ title: 'Sotto-progetti ({{count}})',
+ },
+ notes: {
+ title: 'Note',
+ noEditPermission: 'Non hai il permesso di modificare le note',
+ placeholder: 'Aggiungi note su questo progetto...',
+ empty: 'Nessuna nota ancora. Clicca Modifica per aggiungere note.',
+ },
+ files: {
+ title: 'File',
+ linkFolders: 'Collega cartelle dal Gestore file',
+ forQuickAccess: 'a questo progetto per accesso rapido.',
+ fileCount: '{{count}} file',
+ empty: 'Nessuna cartella collegata. Vai a Gestore file e collega una cartella a questo progetto.',
+ },
+ bom: {
+ title: 'Distinta materiali',
+ acquired: '{{completed}}/{{total}} acquisiti',
+ showAll: 'Mostra tutti',
+ hideDone: 'Nascondi completati',
+ addPart: 'Aggiungi parte',
+ noAddPermission: 'Non hai il permesso di aggiungere parti',
+ partNamePlaceholder: 'Nome parte (es., viti M3x8)',
+ partName: 'Nome parte',
+ qty: 'Qta',
+ price: 'Prezzo ({{currency}})',
+ sourcingUrlPlaceholder: 'URL fornitura (opzionale)',
+ remarksPlaceholder: 'Note (opzionale)',
+ deletePart: 'Elimina parte',
+ deleteConfirm: 'Sei sicuro di voler eliminare "{{name}}"?',
+ noUpdatePermission: 'Non hai il permesso di aggiornare parti',
+ noEditPermission: 'Non hai il permesso di modificare parti',
+ noDeletePermission: 'Non hai il permesso di eliminare parti',
+ totalCost: 'Costo totale:',
+ empty: 'Nessuna parte nella distinta materiali. Aggiungi hardware, elettronica o altri componenti da reperire.',
+ },
+ timeline: {
+ title: 'Timeline attivita',
+ empty: 'Nessuna attivita ancora.',
+ },
+ template: {
+ saveAsTemplate: 'Salva come template',
+ noCreatePermission: 'Non hai il permesso di creare template',
+ },
+ queue: {
+ title: 'Coda',
+ viewAll: 'Vedi tutto',
+ printing: '{{count}} in stampa',
+ queued: '{{count}} in coda',
+ },
+ prints: {
+ title: 'Stampe ({{count}})',
+ },
+ toast: {
+ projectUpdated: 'Progetto aggiornato',
+ partAdded: 'Parte aggiunta',
+ partRemoved: 'Parte rimossa',
+ exportFailed: 'Export fallito',
+ projectExported: 'Progetto esportato',
+ templateCreated: 'Template creato',
+ },
+ },
+
+ // System info
+ system: {
+ title: 'Informazioni sistema',
+ version: 'Versione',
+ uptime: 'Tempo attivo',
+ cpuUsage: 'Uso CPU',
+ memoryUsage: 'Uso memoria',
+ diskUsage: 'Uso disco',
+ networkInfo: 'Info rete',
+ logs: 'Log',
+ debugMode: 'Modalita debug',
+ enableDebug: 'Abilita log debug',
+ disableDebug: 'Disabilita log debug',
+ downloadLogs: 'Scarica log',
+ clearLogs: 'Cancella log',
+ dockerInfo: 'Info Docker',
+ containerName: 'Nome container',
+ imageName: 'Nome immagine',
+ platform: 'Piattaforma',
+ architecture: 'Architettura',
+ },
+
+ // Library (K Profiles)
+ library: {
+ title: 'Libreria filamenti',
+ addFilament: 'Aggiungi filamento',
+ editFilament: 'Modifica filamento',
+ deleteFilament: 'Elimina filamento',
+ vendor: 'Produttore',
+ material: 'Materiale',
+ color: 'Colore',
+ kFactor: 'K Factor',
+ temperature: 'Temperatura',
+ noFilaments: 'Nessun filamento in libreria',
+ deleteConfirm: 'Sei sicuro di voler eliminare questo filamento?',
+ importFromPrinter: 'Importa da stampante',
+ exportToFile: 'Esporta su file',
+ },
+
+ // Spoolman
+ spoolman: {
+ title: 'Integrazione Spoolman',
+ enabled: 'Spoolman abilitato',
+ url: 'URL Spoolman',
+ connected: 'Connesso',
+ disconnected: 'Non connesso',
+ testConnection: 'Testa connessione',
+ sync: 'Sincronizza',
+ syncing: 'Sincronizzazione...',
+ lastSync: 'Ultima sincronizzazione',
+ linkToSpoolman: 'Collega a Spoolman',
+ openInSpoolman: 'Apri in Spoolman',
+ unlinkSpool: 'Scollega bobina',
+ selectSpool: 'Seleziona bobina',
+ noUnlinkedSpools: 'Nessuna bobina scollegata disponibile',
+ linkSuccess: 'Bobina collegata a Spoolman con successo',
+ linkFailed: 'Collegamento bobina fallito',
+ spoolId: 'ID bobina',
+ weight: 'Peso',
+ remaining: 'Rimanente',
+ disableWeightSync: 'Disabilita sync peso stimato AMS',
+ disableWeightSyncDesc: 'Non aggiornare la capacita rimanente dalle stime AMS. Usalo se preferisci il tracciamento di Spoolman rispetto alle stime AMS. Le nuove bobine useranno comunque la stima AMS come peso iniziale.',
+ reportPartialUsage: 'Segnala uso parziale per stampe fallite',
+ reportPartialUsageDesc: 'Quando una stampa fallisce o viene annullata, segnala il filamento stimato usato fino a quel punto in base all\'avanzamento layer.',
+ },
+
+ // Timelapse
+ timelapse: {
+ title: 'Timelapse',
+ create: 'Crea timelapse',
+ download: 'Scarica',
+ delete: 'Elimina',
+ preview: 'Anteprima',
+ frameRate: 'Frame rate',
+ quality: 'Qualita',
+ processing: 'Elaborazione...',
+ noTimelapses: 'Nessun timelapse disponibile',
+ },
+
+ // AMS
+ ams: {
+ title: 'AMS',
+ slot: 'Slot',
+ empty: 'Vuoto',
+ emptySlot: 'Slot vuoto',
+ unknown: 'Sconosciuto',
+ humidity: 'Umidita',
+ temperature: 'Temperatura',
+ filamentType: 'Tipo filamento',
+ filamentColor: 'Colore',
+ remaining: 'Rimanente',
+ history: 'Cronologia AMS',
+ noHistory: 'Nessuna cronologia disponibile',
+ configureSlot: 'Configura slot',
+ externalSpool: 'Bobina esterna',
+ profile: 'Profilo',
+ kFactor: 'K Factor',
+ fill: 'Riempi',
+ configure: 'Configura',
+ },
+
+ // Print modal
+ printModal: {
+ title: 'Avvia stampa',
+ selectPrinter: 'Seleziona stampante',
+ selectPlate: 'Seleziona piatto',
+ filamentMapping: 'Mappatura filamento',
+ printSettings: 'Impostazioni stampa',
+ bedLeveling: 'Livellamento piatto',
+ flowCalibration: 'Calibrazione flusso',
+ vibrationCalibration: 'Calibrazione vibrazioni',
+ layerInspection: 'Ispezione primo layer',
+ timelapse: 'Timelapse',
+ startPrint: 'Avvia stampa',
+ addToQueue: 'Aggiungi alla coda',
+ cancel: 'Annulla',
+ noPrintersAvailable: 'Nessuna stampante disponibile',
+ printerBusy: 'Stampante occupata',
+ printerOffline: 'Stampante offline',
+ },
+
+ // Backup
+ backup: {
+ title: 'Backup e ripristino',
+ createBackup: 'Crea backup',
+ restoreBackup: 'Ripristina backup',
+ restoreDescription: 'Sostituisci tutti i dati da un file di backup',
+ downloadBackup: 'Scarica backup',
+ uploadBackup: 'Carica backup',
+ lastBackup: 'Ultimo backup',
+ autoBackup: 'Backup automatico',
+ backupNow: 'Esegui backup ora',
+ restoreWarning: 'Avviso: il ripristino sovrascrivera tutti i dati attuali.',
+ includeArchives: 'Includi archivi',
+ includeSettings: 'Includi impostazioni',
+ includeProfiles: 'Includi profili',
+ backupSuccess: 'Backup creato con successo',
+ restoreSuccess: 'Backup ripristinato con successo',
+ backupFailed: 'Backup fallito',
+ restoreFailed: 'Ripristino fallito',
+ restoreNote: 'La stampante virtuale verra fermata durante il ripristino',
+ },
+
+ // Tags
+ tags: {
+ title: 'Tag',
+ addTag: 'Aggiungi tag',
+ editTag: 'Modifica tag',
+ deleteTag: 'Elimina tag',
+ tagName: 'Nome tag',
+ tagColor: 'Colore tag',
+ noTags: 'Nessun tag',
+ deleteConfirm: 'Sei sicuro di voler eliminare questo tag?',
+ manageTags: 'Gestisci tag',
+ },
+
+ // Upload modal (archives)
+ uploadModal: {
+ title: 'Carica file 3MF',
+ dragDrop: 'Trascina e rilascia file .3mf qui',
+ or: 'o',
+ browseFiles: 'Sfoglia file',
+ extractionInfo: 'Il modello stampante sara estratto automaticamente dai metadati del file 3MF.',
+ uploaded: 'caricati',
+ failed: 'falliti',
+ uploading: 'Caricamento...',
+ upload: 'Carica',
+ uploadFailed: 'Caricamento fallito',
+ },
+
+ // Edit archive modal
+ editArchive: {
+ title: 'Modifica archivio',
+ name: 'Nome',
+ namePlaceholder: 'Nome stampa',
+ printer: 'Stampante',
+ noPrinter: 'Nessuna stampante',
+ project: 'Progetto',
+ noProject: 'Nessun progetto',
+ itemsPrinted: 'Elementi stampati',
+ itemsPrintedHelp: 'Numero di elementi prodotti in questo job di stampa',
+ notes: 'Note',
+ notesPlaceholder: 'Aggiungi note su questa stampa...',
+ externalLink: 'Link esterno',
+ externalLinkPlaceholder: 'https://printables.com/model/...',
+ externalLinkHelp: 'Link a Printables, Thingiverse o altra fonte',
+ tags: 'Tag',
+ tagsPlaceholder: 'Aggiungi tag...',
+ addMoreTags: 'Aggiungi altri tag...',
+ matchingTags: 'Tag corrispondenti "{{query}}"',
+ existingTags: 'Tag esistenti',
+ clickToAdd: '(clicca per aggiungere)',
+ status: 'Stato',
+ failureReason: 'Motivo fallimento',
+ selectReason: 'Seleziona motivo...',
+ photos: 'Foto del risultato stampato',
+ photosHelp: 'Clicca + per aggiungere foto del risultato stampato',
+ printResult: 'Risultato stampa',
+ saving: 'Salvataggio...',
+ // Failure reasons
+ failureReasons: {
+ adhesionFailure: 'Fallimento adesione',
+ spaghettiDetached: 'Spaghetti / staccato',
+ layerShift: 'Spostamento layer',
+ cloggedNozzle: 'Ugello intasato',
+ filamentRunout: 'Filamento esaurito',
+ warping: 'Warping',
+ stringing: 'Stringing',
+ underExtrusion: 'Sotto-estrusione',
+ powerFailure: 'Mancanza corrente',
+ userCancelled: 'Annullato dall\'utente',
+ other: 'Altro',
+ },
+ // Archive statuses
+ statuses: {
+ completed: 'Completato',
+ failed: 'Fallito',
+ aborted: 'Annullato',
+ printing: 'In stampa',
+ },
+ },
+
+ // K-Profiles
+ kProfiles: {
+ title: 'K-Profiles',
+ noPrintersConfigured: 'Nessuna stampante configurata',
+ addPrinterInSettings: 'Aggiungi una stampante in Impostazioni per gestire i K-profiles',
+ noActivePrinters: 'Nessuna stampante attiva',
+ enablePrinterConnection: 'Abilita una connessione stampante per vedere i K-profiles',
+ loadingProfiles: 'Caricamento K-Profiles...',
+ printerOffline: 'Stampante offline',
+ printerOfflineDesc: 'La stampante selezionata non e connessa. Accendila per vedere i K-profiles.',
+ noMatchingProfiles: 'Nessun profilo corrispondente',
+ noMatchingProfilesDesc: 'Nessun profilo corrisponde ai criteri di ricerca',
+ noKProfiles: 'Nessun K-Profile',
+ noKProfilesDesc: 'Nessun profilo pressure advance per ugello da {{diameter}}mm',
+ createFirstProfile: 'Crea primo profilo',
+ // Controls
+ printer: 'Stampante',
+ nozzle: 'Ugello',
+ refresh: 'Aggiorna',
+ addProfile: 'Aggiungi profilo',
+ export: 'Esporta',
+ import: 'Importa',
+ select: 'Seleziona',
+ selectAll: 'Seleziona tutto',
+ delete: 'Elimina',
+ // Filters
+ searchPlaceholder: 'Cerca per nome o filamento...',
+ allExtruders: 'Tutti gli estrusori',
+ leftOnly: 'Solo sinistro',
+ rightOnly: 'Solo destro',
+ allFlow: 'Tutto flow',
+ hfOnly: 'Solo HF',
+ sOnly: 'Solo S',
+ sortName: 'Ordina: Nome',
+ sortKValue: 'Ordina: K-Value',
+ sortFilament: 'Ordina: Filamento',
+ // Dual extruder labels
+ leftExtruder: 'Estrusore sinistro',
+ rightExtruder: 'Estrusore destro',
+ // Modal
+ modal: {
+ addTitle: 'Aggiungi K-Profile',
+ editTitle: 'Modifica K-Profile',
+ profileName: 'Nome profilo',
+ profileNamePlaceholder: 'Il mio profilo PLA',
+ kValue: 'K-Value',
+ kValuePlaceholder: '0.020',
+ kValueHelp: 'Intervallo tipico: 0.01 - 0.06 per PLA, 0.02 - 0.10 per PETG',
+ filament: 'Filamento',
+ selectFilament: 'Seleziona filamento...',
+ noFilamentsHelp: 'Nessun filamento trovato. Crea prima un K-profile in Bambu Studio.',
+ flowType: 'Tipo flow',
+ highFlow: 'High Flow',
+ standard: 'Standard',
+ nozzleSize: 'Dimensione ugello',
+ extruder: 'Estrusore',
+ extruders: 'Estrusori',
+ left: 'Sinistra',
+ right: 'Destra',
+ notes: 'Note (salvate localmente)',
+ notesPlaceholder: 'Aggiungi note su questo profilo...',
+ notesHelp: 'Le note sono salvate in Bambuddy, non sulla stampante',
+ syncing: 'Sincronizzazione con stampante...',
+ savingExtruder: 'Salvataggio su estrusore {{current}}/{{total}}...',
+ pleaseWait: 'Attendere',
+ },
+ // Delete confirmation
+ deleteConfirm: {
+ title: 'Elimina profilo',
+ cannotUndo: 'Questo non puo essere annullato',
+ message: 'Sei sicuro di voler eliminare "{{name}}" dalla stampante?',
+ },
+ // Bulk delete
+ bulkDelete: {
+ title: 'Elimina profili',
+ cannotUndo: 'Questo non puo essere annullato',
+ message: 'Sei sicuro di voler eliminare {{count}} profili selezionati dalla stampante?',
+ },
+ // Toast
+ toast: {
+ profileSaved: 'K-profile salvato',
+ profilesSaved: 'K-profile salvato su {{count}} estrusori',
+ selectAtLeastOneExtruder: 'Seleziona almeno un estrusore',
+ profileDeleted: 'K-profile eliminato',
+ profilesDeleted: 'Eliminati {{count}} profili',
+ exportedProfiles: 'Esportati {{count}} profili',
+ importedProfiles: 'Importati {{count}} di {{total}} profili',
+ noProfilesToExport: 'Nessun profilo da esportare',
+ invalidFileFormat: 'Formato file non valido',
+ failedToParseImport: 'Parsing file import fallito',
+ failedToSaveBatch: 'Salvataggio K-profiles fallito',
+ noteSaved: 'Nota salvata',
+ failedToSaveNote: 'Salvataggio nota fallito',
+ },
+ // Permissions
+ permission: {
+ noRead: 'Non hai il permesso di aggiornare i profili',
+ noCreate: 'Non hai il permesso di aggiungere profili',
+ noUpdate: 'Non hai il permesso di aggiornare K-profiles',
+ noDelete: 'Non hai il permesso di eliminare K-profiles',
+ noExport: 'Non hai il permesso di esportare profili',
+ noImport: 'Non hai il permesso di importare profili',
+ },
+ },
+
+ // Virtual Printer
+ virtualPrinter: {
+ title: 'Stampante virtuale',
+ running: 'In esecuzione',
+ stopped: 'Ferma',
+ description: {
+ default: 'Abilita una stampante virtuale che appare in Bambu Studio e OrcaSlicer. I file inviati a questa stampante saranno archiviati senza stampare.',
+ proxy: 'Abilita un proxy che inoltra il traffico slicer a una stampante reale, permettendo la stampa remota su qualsiasi rete.',
+ },
+ enable: {
+ title: 'Abilita stampante virtuale',
+ visibleInSlicer: 'Visibile come "Bambuddy" nella ricerca slicer',
+ proxyingTo: 'In proxy verso {{name}}',
+ notActive: 'Non attivo',
+ },
+ model: {
+ title: 'Modello stampante',
+ description: 'Seleziona il modello stampante da emulare.',
+ restartWarning: 'Cambiare il modello riavviera la stampante virtuale',
+ },
+ accessCode: {
+ title: 'Codice accesso',
+ isSet: 'Codice accesso impostato',
+ notSet: 'Nessun codice accesso impostato - richiesto per abilitare',
+ placeholder: 'Inserisci codice 8 caratteri',
+ placeholderChange: 'Inserisci nuovo codice per cambiare',
+ hint: 'Deve essere esattamente 8 caratteri. Usato dagli slicer per autenticarsi.',
+ charCount: '({{count}}/8)',
+ },
+ targetPrinter: {
+ title: 'Stampante target',
+ configured: 'Target proxy configurato',
+ notConfigured: 'Nessuna stampante target selezionata - richiesta per modalita proxy',
+ placeholder: 'Seleziona una stampante...',
+ hint: 'Seleziona la stampante a cui fare proxy. La stampante deve essere in modalita LAN.',
+ noPrinters: 'Nessuna stampante configurata. Aggiungi una stampante per usare la modalita proxy.',
+ },
+ remoteInterface: {
+ title: 'Interfaccia rete slicer',
+ configured: 'Proxy SSDP abilitato',
+ optional: 'Opzionale - per discovery SSDP tra reti',
+ placeholder: 'Seleziona interfaccia per rete slicer...',
+ hint: 'Seleziona l\'interfaccia di rete connessa allo slicer. Abilita scoperta automatica in Bambu Studio.',
+ },
+ mode: {
+ title: 'Modalita',
+ archive: 'Archivio',
+ archiveDesc: 'Archivia subito i file',
+ review: 'Revisione',
+ reviewDesc: 'Rivedi prima di archiviare',
+ queue: 'Coda',
+ queueDesc: 'Archivia e aggiungi alla coda',
+ proxy: 'Proxy',
+ proxyDesc: 'Inoltra a stampante reale',
+ },
+ setupRequired: {
+ title: 'Configurazione necessaria',
+ description: 'La stampante virtuale richiede configurazioni di sistema aggiuntive prima di funzionare. Include port forwarding, regole firewall e impostazioni specifiche della piattaforma.',
+ readGuide: 'Leggi la guida prima di abilitare',
+ },
+ howItWorks: {
+ title: 'Come funziona',
+ titleProxy: 'Come funziona (Modalita proxy)',
+ step1: 'Completa la guida di configurazione per la tua piattaforma',
+ step2: 'Abilita la stampante virtuale e imposta un codice accesso',
+ step3: 'In Bambu Studio o OrcaSlicer, vai su "Aggiungi stampante"',
+ step4: 'La stampante "Bambuddy" dovrebbe apparire nella lista',
+ step5: 'Connettiti usando il codice accesso impostato',
+ step6: 'Quando "stampi" su Bambuddy, il file 3MF viene archiviato',
+ proxyStep1: 'Seleziona la stampante target (deve essere in modalita LAN)',
+ proxyStep2: 'Per rete diversa: seleziona l\'interfaccia rete slicer',
+ proxyStep3: 'Abilita il proxy - la stampante appare via SSDP',
+ proxyStep4: 'Connettiti usando il codice accesso della stampante',
+ proxyStep5: 'Stampa normalmente - il traffico e inoltrato via Bambuddy',
+ proxyStep6: 'Lo streaming camera richiede NAT/IP forwarding (vedi docs)',
+ },
+ status: {
+ title: 'Dettagli stato',
+ printerName: 'Nome stampante',
+ model: 'Modello',
+ serialNumber: 'Numero seriale',
+ mode: 'Modalita',
+ pendingFiles: 'File in sospeso',
+ targetPrinter: 'Stampante target',
+ ftpPort: 'Porta FTP',
+ mqttPort: 'Porta MQTT',
+ ftpConnections: 'Connessioni FTP',
+ mqttConnections: 'Connessioni MQTT',
+ },
+ toast: {
+ updated: 'Impostazioni stampante virtuale aggiornate',
+ failedToUpdate: 'Aggiornamento impostazioni fallito',
+ accessCodeRequired: 'Imposta prima un codice accesso',
+ targetPrinterRequired: 'Seleziona prima una stampante target',
+ accessCodeEmpty: 'Il codice accesso non puo essere vuoto',
+ accessCodeLength: 'Il codice accesso deve essere esattamente 8 caratteri',
+ },
+ },
+
+ // Model Viewer
+ modelViewer: {
+ openInSlicer: 'Apri in slicer',
+ tabs: {
+ model: 'Modello 3D',
+ gcode: 'Anteprima G-code',
+ },
+ notAvailable: 'non disponibile',
+ notSliced: 'non sezionato',
+ plates: 'Piatti',
+ allPlates: 'Tutti i piatti',
+ plateNumber: 'Piatto {{number}}',
+ plateCount: '{{count}} piatto',
+ plateCount_other: '{{count}} piatti',
+ objectCount: '{{count}} oggetto',
+ objectCount_other: '{{count}} oggetti',
+ filamentCount: '{{count}} filamento',
+ filamentCount_other: '{{count}} filamenti',
+ eta: 'ETA {{minutes}} min',
+ noPreview: 'Nessuna anteprima disponibile per questo file',
+ pagination: {
+ pageOf: 'Pagina {{current}} di {{total}}',
+ prev: 'Prec',
+ next: 'Succ',
+ },
+ errors: {
+ failedToLoad: 'Caricamento file fallito',
+ noMeshes: 'Nessuna mesh trovata nel file 3MF',
+ unsupportedFormat: 'Formato file non supportato',
+ },
+ },
+
+ // Maintenance type descriptions (built-in)
+ maintenanceDescriptions: {
+ lubricateRails: 'Applica lubrificante alle guide lineari per movimento fluido',
+ cleanNozzle: 'Pulisci hotend e ugello per prevenire intasamenti',
+ checkBelts: 'Verifica tensione cinghie per stampe accurate',
+ cleanBuildPlate: 'Pulisci il piatto per migliore adesione',
+ checkExtruder: 'Ispeziona ingranaggi estrusore per usura',
+ checkCooling: 'Assicurati che le ventole di raffreddamento funzionino',
+ generalInspection: 'Ispezione generale stampante',
+ cleanCarbonRods: 'Pulisci le aste in carbonio per ridurre attrito',
+ checkPtfeTube: 'Ispeziona il tubo PTFE per usura o danni',
+ replaceHepaFilter: 'Sostituisci filtro HEPA per qualita aria',
+ replaceCarbonFilter: 'Sostituisci filtro a carbone attivo',
+ lubricateLeftNozzleRail: 'Lubrifica guida ugello sinistro (serie H2)',
+ },
+};