diff --git a/app/src/i18n/index.ts b/app/src/i18n/index.ts
index 2deb3a5dd..85de47893 100644
--- a/app/src/i18n/index.ts
+++ b/app/src/i18n/index.ts
@@ -7,6 +7,7 @@ import ptBR from './locales/pt-BR/translation.json';
import zhCN from './locales/zh-CN/translation.json';
import zhTW from './locales/zh-TW/translation.json';
import fr from './locales/fr/translation.json';
+import it from './locales/it/translation.json';
export const SUPPORTED_LANGUAGES = [
{ code: 'en', label: 'English' },
@@ -15,6 +16,7 @@ export const SUPPORTED_LANGUAGES = [
{ code: 'zh-CN', label: '简体中文' },
{ code: 'zh-TW', label: '繁體中文' },
{ code: 'fr', label: 'Français' },
+ { code: 'it', label: 'Italiano' },
] as const;
export type LanguageCode = (typeof SUPPORTED_LANGUAGES)[number]['code'];
@@ -30,6 +32,7 @@ i18n
'zh-CN': { translation: zhCN },
'zh-TW': { translation: zhTW },
fr: { translation: fr },
+ it: { translation: it },
},
fallbackLng: 'en',
supportedLngs: SUPPORTED_LANGUAGES.map((l) => l.code),
diff --git a/app/src/i18n/locales/it/translation.json b/app/src/i18n/locales/it/translation.json
new file mode 100644
index 000000000..5c21cb9d6
--- /dev/null
+++ b/app/src/i18n/locales/it/translation.json
@@ -0,0 +1,1273 @@
+{
+ "common": {
+ "cancel": "Annulla",
+ "save": "Salva",
+ "delete": "Elimina",
+ "edit": "Modifica",
+ "close": "Chiudi",
+ "confirm": "Conferma",
+ "loading": "Caricamento…",
+ "error": "Errore",
+ "unknown": "Sconosciuto",
+ "unknownError": "Errore sconosciuto"
+ },
+ "nav": {
+ "generate": "Genera",
+ "stories": "Storie",
+ "captures": "Acquisizioni",
+ "voices": "Voci",
+ "effects": "Effetti",
+ "audio": "Audio",
+ "models": "Modelli",
+ "settings": "Impostazioni",
+ "updateBadge": "Aggiorna"
+ },
+ "captures": {
+ "title": "Acquisizioni",
+ "beta": "Beta",
+ "searchPlaceholder": "Cerca trascrizioni…",
+ "snippetEmpty": "(nessuna trascrizione)",
+ "noTranscriptError": "L'acquisizione non ha ancora una trascrizione",
+ "captureCardLabel": "Acquisizione · {{when}}",
+ "header": {
+ "modelSummary": "Whisper {{stt}} · Qwen3 · {{llm}}"
+ },
+ "source": {
+ "dictation": "Dettatura",
+ "recording": "Registrazione",
+ "file": "File"
+ },
+ "transcript": {
+ "refined": "Perfezionata",
+ "raw": "Grezza",
+ "refinedHint": "Perfezionata con Qwen3 · {{model}}",
+ "rawHint": "Trascritto con Whisper {{model}}"
+ },
+ "actions": {
+ "configure": "Configura",
+ "import": "Importa",
+ "importing": "Caricamento…",
+ "dictate": "Detta",
+ "stop": "Interrompi",
+ "copy": "Copia",
+ "refine": "Perfeziona",
+ "reRefine": "Perfeziona di nuovo",
+ "export": "Esporta",
+ "exportDropdownLabel": "Esporta acquisizione come",
+ "exportAudio": "Audio (WAV)",
+ "exportTranscript": "Trascrizione (TXT)",
+ "exportMarkdown": "Markdown (MD)",
+ "delete": "Elimina",
+ "playAs": "Riproduci come {{name}}",
+ "playAsFallback": "Riproduci come…",
+ "playAsGenerating": "Generazione in corso…",
+ "playAsStop": "Interrompi · {{name}}",
+ "playAsStopFallback": "Interrompi · Voce",
+ "playAsDropdownLabel": "Riproduci trascrizione come"
+ },
+ "empty": {
+ "noMatches": "Nessuna acquisizione corrisponde a \"{{query}}\"",
+ "none": "Ancora nessuna acquisizione.",
+ "loading": "Caricamento acquisizioni…",
+ "pickOne": "Scegli un'acquisizione per vedere la trascrizione.",
+ "holdToRecord": "Tieni premuto per registrare",
+ "toggleHandsFree": "Attiva/disattiva mani libere",
+ "pressShortcut": "Premi la scorciatoia in qualsiasi punto del computer per avviare la tua prima acquisizione.",
+ "turnOnShortcut": "Attiva la scorciatoia globale per dettare da ovunque — oppure clicca su Detta qui sopra per un'acquisizione nell'app.",
+ "openSettings": "Apri impostazioni Acquisizioni"
+ },
+ "deleteDialog": {
+ "title": "Elimina acquisizione",
+ "description": "Questo eliminerà permanentemente l'acquisizione, il suo audio e la sua trascrizione. L'azione non può essere annullata.",
+ "deleting": "Eliminazione in corso…"
+ },
+ "toast": {
+ "deleteFailed": "Eliminazione non riuscita",
+ "playAsFailed": "Riproduzione non riuscita",
+ "noVoice": "Nessun profilo vocale",
+ "noVoiceDescription": "Crea un profilo vocale prima di usare Riproduci come.",
+ "transcriptCopied": "Trascrizione copiata",
+ "copyFailed": "Copia non riuscita",
+ "exportSuccess": "Esportato in {{path}}",
+ "exportFailed": "Esportazione non riuscita",
+ "exportEmpty": "Nulla da esportare",
+ "shortcutNotArmed": "Scorciatoia attiva, ma non ancora pronta",
+ "shortcutNotArmedDescription_one": "Il download di {{names}} è ancora necessario. Apri la scheda Acquisizioni per iniziare.",
+ "shortcutNotArmedDescription_other": "Il download di {{names}} è ancora necessario. Apri la scheda Acquisizioni per iniziare."
+ },
+ "pill": {
+ "recording": "Registrazione in corso",
+ "transcribing": "Trascrizione in corso",
+ "refining": "Perfezionamento in corso",
+ "speaking": "Riproduzione voce in corso",
+ "completed": "Fatto",
+ "stopAria": "Interrompi registrazione",
+ "errorFallback": "Qualcosa è andato storto",
+ "errorCopyTooltip": "Clicca per copiare l'errore"
+ },
+ "chord": {
+ "capturing": "Acquisizione in corso…",
+ "pressShortcut": "Premi la tua scorciatoia",
+ "noKeys": "Nessun tasto ancora",
+ "unsupported": "\"{{key}}\" non è supportato nelle combinazioni. Prova con un tasto modificatore o una lettera.",
+ "notSet": "Non impostato"
+ },
+ "readiness": {
+ "title": "Alcune cose prima di poter dettare",
+ "subheading": "La scorciatoia rimane disattivata finché tutto ciò che segue non è pronto.",
+ "downloadButton": "Scarica",
+ "downloading": "Download in corso…",
+ "downloadingPercent": "Download in corso… {{pct}}%",
+ "downloadStarted": "Download avviato",
+ "downloadStartedDescription": "Il download di {{name}} è avviato. La scorciatoia si attiverà al termine del processo.",
+ "downloadFailed": "Download non riuscito",
+ "stt": {
+ "label": "{{name}} (da voce a testo)",
+ "ready": "Modello scaricato.",
+ "missing": "Necessario per trascrivere il tuo audio",
+ "missingWithSize": "Necessario per trascrivere il tuo audio · {{size}}"
+ },
+ "llm": {
+ "label": "{{name}} (perfezionamento)",
+ "ready": "Modello scaricato.",
+ "missing": "Sistemazione della trascrizione grezza prima dell'incollo",
+ "missingWithSize": "Sistemazione della trascrizione grezza prima dell'incollo · {{size}}"
+ },
+ "inputMonitoring": {
+ "label": "Permesso Monitoraggio input",
+ "ready": "macOS consente a Voicebox di rilevare la tua scorciatoia globale.",
+ "missing": "macOS deve consentire a Voicebox di rilevare la scorciatoia globale.",
+ "openSettings": "Apri Impostazioni"
+ },
+ "accessibility": {
+ "label": "Permesso Accessibilità",
+ "ready": "Voicebox può incollare le trascrizioni in altre app.",
+ "missing": "Richiesto per poter incollare le trascrizioni nell'app in primo piano.",
+ "openSettings": "Apri Impostazioni"
+ }
+ },
+ "permissions": {
+ "accessibility": {
+ "title": "Concedi il permesso di Accessibilità per attivare l'incollo automatico",
+ "body": "Voicebox richiede Impostazioni di Sistema → Privacy e Sicurezza → Accessibilità per incollare le trascrizioni in altre app. Senza di questo, la tua dettatura verrà comunque salvata nella scheda Acquisizioni.",
+ "openSettings": "Apri Impostazioni",
+ "recheck": "L'ho abilitato",
+ "rechecking": "Verifica in corso…",
+ "stillMissing": "Non ancora rilevato. Di solito macOS richiede la chiusura e la riapertura di Voicebox dopo aver attivato il permesso."
+ },
+ "inputMonitoring": {
+ "title": "Concedi il Monitoraggio input per attivare la scorciatoia globale",
+ "body": "Voicebox richiede Impostazioni di Sistema → Privacy e Sicurezza → Monitoraggio input per rilevare la tua combinazione di dettatura. L'opzione è attiva, ma macOS sta bloccando gli eventi della tastiera finché non lo consenti.",
+ "openSettings": "Opzioni Impostazioni",
+ "recheck": "L'ho abilitato",
+ "rechecking": "Verifica in corso…",
+ "stillMissing": "Non ancora rilevato. Di solito macOS richiede la chiusura e la riapertura di Voicebox dopo aver attivato il permesso."
+ }
+ }
+ },
+ "voicesTab": {
+ "title": "Voci",
+ "loading": "Caricamento voci…",
+ "searchPlaceholder": "Cerca voci…",
+ "newVoice": "Nuova voce",
+ "avatarAlt": "Avatar di {{name}}",
+ "selectChannels": "Seleziona canali…",
+ "channelDefaultLabel": "{{name}} (Predefinito)",
+ "columns": {
+ "name": "Nome",
+ "language": "Lingua",
+ "generations": "Generazioni",
+ "samples": "Campioni",
+ "effects": "Effetti",
+ "channels": "Canali"
+ }
+ },
+ "voiceInspector": {
+ "loading": "Caricamento…",
+ "defaultEffectsHint": "Applicati automaticamente alle nuove generazioni con questa voce.",
+ "fields": {
+ "description": "Descrizione"
+ },
+ "toast": {
+ "invalidImageFormat": "Seleziona un formato PNG, JPG o WebP",
+ "avatarUpdated": "Avatar aggiornato",
+ "savedDescription": "\"{{name}}\" salvato."
+ }
+ },
+ "audioChannels": {
+ "title": "Canali audio",
+ "newChannel": "Nuovo canale",
+ "loading": "Caricamento…",
+ "confirmDelete": "Eliminare questo canale?",
+ "noVoicesAssigned": "Nessuna voce assegnata",
+ "selectDevice": "Seleziona dispositivo",
+ "addDevice": "Aggiungi dispositivo",
+ "addVoice": "Aggiungi voce",
+ "defaultSuffix": "predefinito",
+ "empty": {
+ "message": "Ancora nessun canale audio. Crea il tuo primo canale per reindirizzare le voci a dispositivi specifici.",
+ "action": "Crea canale"
+ },
+ "labels": {
+ "outputDevices": "Dispositivi di output",
+ "assignedVoices": "Voci assegnate"
+ },
+ "devices": {
+ "title": "Dispositivi disponibili",
+ "defaultNote": "Il canale predefinito utilizza il dispositivo predefinito di sistema",
+ "toggleHint": "Clicca sui dispositivi per aggiungerli o rimuoverli dal canale selezionato",
+ "selectHint": "Seleziona un canale per assegnare i dispositivi",
+ "empty": "Nessun dispositivo audio trovato",
+ "requiresTauri": "La selezione del dispositivo audio richiede Tauri"
+ },
+ "fields": {
+ "name": "Nome canale",
+ "namePlaceholder": "es. Virtual Cable, Broadcast"
+ },
+ "createDialog": {
+ "title": "Crea canale audio",
+ "description": "Crea un nuovo canale audio (bus) per reindirizzare le voci a dispositivi di output specifici.",
+ "action": "Crea"
+ },
+ "editDialog": {
+ "title": "Modifica canale",
+ "description": "Aggiorna le impostazioni del canale e le assegnazioni delle voci."
+ }
+ },
+ "profileForm": {
+ "createTitle": "Crea voce",
+ "editTitle": "Modifica voce",
+ "createDescription": "Crea un nuovo profilo vocale da un campione audio o da una voce integrata.",
+ "editDescription": "Aggiorna i dettagli del tuo profilo vocale e gestisci i campioni.",
+ "draftRestored": "Bozza ripristinata",
+ "discard": "Scarta",
+ "source": {
+ "clone": "Clona da audio",
+ "builtin": "Voce integrata"
+ },
+ "builtin": {
+ "hint": "Scegli una voce predefinita. Queste non richiedono un campione audio.",
+ "badge": "Voce integrata",
+ "note": "Questo profilo utilizza una voce integrata. La voce non può essere modificata dopo la creazione."
+ },
+ "sampleTabs": {
+ "upload": "Carica",
+ "record": "Registra",
+ "system": "Audio di sistema"
+ },
+ "fields": {
+ "engine": "Motore",
+ "voice": "Voce",
+ "name": "Nome",
+ "namePlaceholder": "La mia voce",
+ "descriptionLabel": "Descrizione (Facoltativa)",
+ "descriptionPlaceholder": "Descrivi questa voce…",
+ "language": "Lingua",
+ "referenceText": "Testo di riferimento",
+ "referenceTextPlaceholder": "Inserisci il testo esatto pronunciato nell'audio…",
+ "defaultEngine": "Motore predefinito",
+ "noPreference": "Nessuna preferenza",
+ "defaultEngineHint": "Seleziona automaticamente questo motore quando viene scelto il profilo.",
+ "defaultEffects": "Effetti predefiniti",
+ "defaultEffectsHint": "Effetti applicati automaticamente a tutte le nuove generazioni con questa voce.",
+ "personalityLabel": "Personalità",
+ "personalityPlaceholder": "es. \"un pirata scontroso che parla solo con metafore marinaresche\"",
+ "personalityHint": "Chi è questa voce e come parla. Guida il pulsante Componi e l'opzione di riscrittura nel personaggio nella pagina di generazione. Lascia vuoto per nasconderli entrambi."
+ },
+ "avatar": {
+ "alt": "Anteprima avatar"
+ },
+ "actions": {
+ "saving": "Salvataggio…",
+ "saveChanges": "Salva modifiche",
+ "createProfile": "Crea profilo"
+ },
+ "validation": {
+ "nameRequired": "Il nome è richiesto",
+ "referenceRequired": "Il testo di riferimento è richiesto quando si aggiunge un campione",
+ "sampleRequired": "Il campione audio è richiesto",
+ "referenceTextRequired": "Il testo di riferimento è richiesto",
+ "audioTooLong": "L'audio è troppo lungo ({{duration}}). La durata massima è {{max}}.",
+ "audioFailed": "Impossibile convalidare il file audio. Prova con un file diverso."
+ },
+ "toast": {
+ "recordingComplete": "Registrazione completata",
+ "recordingCompleteDescription": "L'audio è stato registrato con successo.",
+ "recordingError": "Errore di registrazione",
+ "systemAudioCaptured": "Audio di sistema acquisito",
+ "systemAudioCapturedDescription": "L'audio è stato acquisito con successo.",
+ "systemAudioError": "Errore di acquisizione dell'audio di sistema",
+ "transcribeFailed": "Trascrizione non riuscita",
+ "transcribeFailedFallback": "Impossibile trascrivere l'audio",
+ "noFile": "Nessun file selezionato",
+ "noFileDescription": "Seleziona prima un file audio.",
+ "invalidFile": "Tipo di file non valido",
+ "invalidImageFormat": "Seleziona un file immagine (PNG, JPG o WebP)",
+ "fileTooLarge": "File troppo grande",
+ "imageTooLargeDescription": "L'immagine deve essere inferiore a 5MB",
+ "avatarRemoved": "Avatar rimosso",
+ "avatarRemovedDescription": "L'immagine dell'avatar è stata rimossa con successo.",
+ "avatarRemoveFailed": "Impossibile rimuovere l'avatar",
+ "avatarUploadFailed": "Caricamento dell'avatar non riuscito",
+ "avatarUploadFailedFallback": "Impossibile caricare l'avatar",
+ "effectsUpdateFailed": "Aggiornamento degli effetti non riuscito",
+ "effectsUpdateFailedFallback": "Impossibile salvare la catena di effetti",
+ "voiceUpdated": "Voce aggiornata",
+ "voiceUpdatedDescription": "\"{{name}}\" è stata aggiornata con successo.",
+ "noVoiceSelected": "Nessuna voce selezionata",
+ "noVoiceSelectedDescription": "Seleziona una voce integrata.",
+ "profileCreated": "Profilo creato",
+ "profileCreatedBuiltin": "\"{{name}}\" è stato creato con una voce integrata.",
+ "profileCreatedSample": "\"{{name}}\" è stato creato con un campione.",
+ "sampleRequired": "Campione audio richiesto",
+ "sampleRequiredDescription": "Fornisci un campione audio per creare il profilo vocale.",
+ "referenceTextRequired": "Testo di riferimento richiesto",
+ "referenceTextRequiredDescription": "Fornisci il testo di riferimento per il campione audio.",
+ "invalidAudio": "File audio non valido",
+ "invalidAudioDescription": "La durata dell'audio è {{duration}}, ma il massimo consentito è {{max}}.",
+ "validationError": "Errore di convalida",
+ "rollbackFailed": "Ripristino non riuscito",
+ "rollbackFailedDescription": "Impossibile rimuovere il profilo creato dopo il fallimento del caricamento del campione.",
+ "profileRolledBack": "Il profilo è stato ripristinato.",
+ "sampleFailed": "Impossibile aggiungere il campione",
+ "sampleFailedDescription": "Impossibile aggiungere il campione.",
+ "sampleFailedRolledBack": "Impossibile aggiungere il campione. Il profilo è stato ripristinato.",
+ "saveFailed": "Impossibile salvare il profilo"
+ }
+ },
+ "audioSample": {
+ "chooseFile": "Scegli file",
+ "uploadHint": "Clicca per scegliere un file o trascinalo qui. Durata massima: 30 secondi.",
+ "fileUploaded": "File caricato",
+ "fileLabel": "File: {{name}}",
+ "play": "Riproduci",
+ "pause": "Pausa",
+ "transcribe": "Trascrivi",
+ "transcribing": "Trascrizione in corso…",
+ "remove": "Rimuovi",
+ "startRecording": "Avvia registrazione",
+ "recordHint": "Clicca per avviare la registrazione. Durata massima: 30 secondi.",
+ "stopRecording": "Interrompi registrazione",
+ "remaining": "{{time}} rimanenti",
+ "recordingComplete": "Registrazione completata",
+ "recordAgain": "Registra di nuovo",
+ "startCapture": "Avvia acquisizione",
+ "systemHint": "Acquisisci l'audio dal tuo sistema. Durata massima: 30 secondi.",
+ "stopCapture": "Interrompi acquisizione",
+ "captureComplete": "Acquisizione completata",
+ "captureAgain": "Acquisisci di nuovo"
+ },
+ "sampleList": {
+ "loading": "Caricamento campioni…",
+ "empty": {
+ "title": "Ancora nessun campione",
+ "hint": "Aggiungi il tuo primo campione audio per iniziare"
+ },
+ "editing": "Modifica della trascrizione",
+ "placeholder": "Inserisci il testo di riferimento…",
+ "saving": "Salvataggio…",
+ "editTranscription": "Modifica trascrizione",
+ "deleteSample": "Elimina campione",
+ "addSample": "Aggiungi campione",
+ "note": "Nota: Un singolo campione di 30 secondi rappresenta la combinazione ideale. La qualità potrebbe diminuire con più campioni. In un aggiornamento futuro, i campioni potrebbero essere intercambiabili e contrassegnati per stili diversi della stessa voce.",
+ "deleteDialog": {
+ "title": "Elimina campione",
+ "description": "Sei sicuro di voler eliminare questo campione audio? Questa azione non può essere annullata.",
+ "deleting": "Eliminazione in corso…"
+ },
+ "player": {
+ "play": "Riproduci campione",
+ "pause": "Pausa campione",
+ "stop": "Interrompi",
+ "stopAria": "Interrompi riproduzione",
+ "position": "Posizione riproduzione campione",
+ "positionValue": "{{current}} di {{total}}"
+ },
+ "toast": {
+ "invalidText": "Testo non valido",
+ "invalidTextDescription": "Il testo di riferimento non può essere vuoto.",
+ "updated": "Campione aggiornato",
+ "updatedDescription": "Il testo di riferimento è stato aggiornato con successo.",
+ "updateFailed": "Aggiornamento non riuscito",
+ "updateFailedFallback": "Impossibile aggiornare il campione"
+ }
+ },
+ "profiles": {
+ "card": {
+ "noDescription": "Nessuna descrizione",
+ "designed": "progettato",
+ "export": "Esporta profilo",
+ "edit": "Modifica profilo",
+ "delete": "Elimina profilo",
+ "selectLabel": "{{name}}, {{language}}. Seleziona come voce per la generazione.",
+ "selectLabelSelected": "{{name}}, {{language}}. Selezionato come voce per la generazione."
+ },
+ "list": {
+ "errorLoading": "Errore durante il caricamento dei profili: {{message}}",
+ "empty": "Ancora nessun profilo vocale. Crea il tuo primo profilo per iniziare.",
+ "createVoice": "Crea voce",
+ "unsupportedNote": "È possibile selezionare solo i profili vocali supportati dal modello attuale."
+ },
+ "deleteDialog": {
+ "title": "Elimina profilo",
+ "body": "Sei sicuro di voler eliminare \"{{name}}\"? Questa azione non può essere annullata.",
+ "deleting": "Eliminazione in corso…"
+ }
+ },
+ "effects": {
+ "title": "Effetti",
+ "newPreset": "Nuovo preset",
+ "noDescription": "Nessuna descrizione",
+ "placeholder": "Seleziona un preset o creane uno nuovo",
+ "effectCount_one": "{{count}} effetto",
+ "effectCount_other": "{{count}} effetti",
+ "sections": {
+ "builtin": "Integrati",
+ "custom": "Personalizzati",
+ "new": "Nuovo"
+ },
+ "badge": {
+ "builtin": "integrato"
+ },
+ "unsaved": {
+ "title": "Preset non salvato",
+ "hint": "Configura gli effetti nel pannello di destra."
+ },
+ "detail": {
+ "newTitle": "Nuovo preset",
+ "editTitle": "Modifica preset",
+ "savePreset": "Salva preset",
+ "saveAsCustom": "Salva come personalizzato",
+ "saving": "Salvataggio…",
+ "deleting": "Eliminazione in corso…"
+ },
+ "fields": {
+ "name": "Nome",
+ "namePlaceholder": "Il mio preset…",
+ "description": "Descrizione",
+ "descriptionPlaceholder": "Descrivi cosa fa questo preset…"
+ },
+ "preview": {
+ "label": "Anteprima",
+ "button": "Anteprima",
+ "processing": "Elaborazione in corso…",
+ "hint": "L'anteprima applica gli effetti alla versione pulita senza salvare."
+ },
+ "saveAs": {
+ "title": "Salva come preset personalizzato",
+ "description": "Crea un nuovo preset personalizzato basato sulla catena di effetti attuale.",
+ "suggestedName": "{{name}} (Copia)"
+ },
+ "toast": {
+ "saved": "Preset salvato",
+ "createdDescription": "\"{{name}}\" è stato creato.",
+ "updated": "Preset aggiornato",
+ "deleted": "Preset eliminato",
+ "saveFailed": "Salvataggio non riuscito",
+ "deleteFailed": "Eliminazione non riuscita",
+ "previewFailed": "Anteprima non riuscita",
+ "nameRequired": "Nome richiesto"
+ },
+ "chain": {
+ "loadPreset": "Carica preset…",
+ "addEffect": "Aggiungi effetto…",
+ "clear": "Svuota",
+ "enable": "Abilita",
+ "disable": "Disabilita",
+ "remove": "Rimuovi"
+ },
+ "types": {
+ "chorus": {
+ "label": "Chorus / Flanger",
+ "params": {
+ "rate_hz": "Velocità LFO (Hz)",
+ "depth": "Profondità di modulazione",
+ "feedback": "Quantità di feedback",
+ "centre_delay_ms": "Ritardo centrale (ms)",
+ "mix": "Miscela Wet/Dry"
+ }
+ },
+ "reverb": {
+ "label": "Riverbero",
+ "params": {
+ "room_size": "Dimensione stanza",
+ "damping": "Smorzamento alte frequenze",
+ "wet_level": "Livello Wet",
+ "dry_level": "Livello Dry",
+ "width": "Ampiezza stereo"
+ }
+ },
+ "delay": {
+ "label": "Delay",
+ "params": {
+ "delay_seconds": "Tempo di ritardo (secondi)",
+ "feedback": "Quantità di feedback",
+ "mix": "Miscela Wet/Dry"
+ }
+ },
+ "compressor": {
+ "label": "Compressore",
+ "params": {
+ "threshold_db": "Soglia (dB)",
+ "ratio": "Rapporto di compressione",
+ "attack_ms": "Tempo di attacco (ms)",
+ "release_ms": "Tempo di rilascio (ms)"
+ }
+ },
+ "gain": {
+ "label": "Guadagno",
+ "params": {
+ "gain_db": "Guadagno (dB)"
+ }
+ },
+ "highpass": {
+ "label": "Filtro passa-alto",
+ "params": {
+ "cutoff_frequency_hz": "Frequenza di taglio (Hz)"
+ }
+ },
+ "lowpass": {
+ "label": "Filtro passa-basso",
+ "params": {
+ "cutoff_frequency_hz": "Frequenza di taglio (Hz)"
+ }
+ },
+ "pitch_shift": {
+ "label": "Pitch Shift",
+ "params": {
+ "semitones": "Semitoni di spostamento"
+ }
+ }
+ },
+ "builtinPresets": {
+ "Robotic": {
+ "name": "Robotico",
+ "description": "Voce robotica metallica (flanger con LFO lento e feedback elevato)"
+ },
+ "Radio": {
+ "name": "Radio",
+ "description": "Voce sottile da radio AM con filtraggio passa-banda e leggera compressione"
+ },
+ "Echo Chamber": {
+ "name": "Camera d'eco",
+ "description": "Riverbero ampio con eco prolungato"
+ },
+ "Deep Voice": {
+ "name": "Voce profonda",
+ "description": "Tonalità più bassa con maggiore calore"
+ }
+ }
+ },
+ "stories": {
+ "title": "Storie",
+ "newStory": "Nuova storia",
+ "loading": "Caricamento storie…",
+ "searchPlaceholder": "Cerca storie…",
+ "empty": {
+ "title": "Ancora nessuna storia",
+ "hint": "Crea la tua prima storia per iniziare",
+ "noMatches": "Nessuna storia corrisponde a \"{{query}}\""
+ },
+ "row": {
+ "itemCount_one": "{{count}} elemento",
+ "itemCount_other": "{{count}} elementi",
+ "ariaLabel": "Storia {{name}}, {{count}} elementi, {{updated}}",
+ "actionsLabel": "Azioni per {{name}}"
+ },
+ "createDialog": {
+ "title": "Crea nuova storia",
+ "description": "Crea una nuova storia per organizzare le tue generazioni vocali in conversazioni.",
+ "action": "Crea",
+ "creating": "Creazione in corso…"
+ },
+ "editDialog": {
+ "title": "Modifica storia",
+ "description": "Aggiorna il nome e la descrizione della storia.",
+ "saving": "Salvataggio in corso…"
+ },
+ "deleteDialog": {
+ "title": "Sei sicuro?",
+ "description": "Questo eliminerà permanentemente la storia e tutti i suoi elementi. Questa azione non può essere annullata.",
+ "deleting": "Eliminazione in corso…"
+ },
+ "fields": {
+ "name": "Nome",
+ "namePlaceholder": "La mia storia",
+ "descriptionLabel": "Descrizione (facoltativa)",
+ "descriptionPlaceholder": "Una conversazione tra…"
+ },
+ "toast": {
+ "nameRequired": "Nome richiesto",
+ "nameRequiredDescription": "Inserisci il nome della storia",
+ "created": "Storia creata",
+ "createdDescription": "\"{{name}}\" è stata creata",
+ "createFailed": "Impossibile creare la storia",
+ "updateFailed": "Impossibile aggiornare la storia",
+ "deleteFailed": "Impossibile eliminare la storia"
+ }
+ },
+ "storyContent": {
+ "selectStory": {
+ "title": "Seleziona una storia",
+ "hint": "Scegli una storia dall'elenco per visualizzarne il contenuto"
+ },
+ "loading": "Caricamento storia…",
+ "notFound": {
+ "title": "Storia non trovata",
+ "hint": "Impossibile caricare la storia selezionata"
+ },
+ "generatingCount_one": "Generazione di {{count}} traccia audio",
+ "generatingCount_other": "Generazione di {{count}} tracce audio",
+ "add": "Aggiungi",
+ "searchPlaceholder": "Cerca per nome o trascrizione…",
+ "searchNoMatches": "Nessuna generazione corrispondente trovata",
+ "searchNoAvailable": "Nessuna generazione disponibile",
+ "exportAudio": "Esporta audio",
+ "empty": {
+ "title": "Nessun elemento in questa storia",
+ "hint": "Genera del testo parlato utilizzando la casella sottostante per aggiungere elementi"
+ },
+ "itemActions": {
+ "playFromHere": "Riproduci da qui",
+ "regenerate": "Rigenera",
+ "removeFromStory": "Rimuovi dalla storia"
+ },
+ "importAudio": "Importa audio…",
+ "importing": "Importazione in corso…",
+ "dropToImport": "Rilascia l'audio per importarlo",
+ "toast": {
+ "removeFailed": "Impossibile rimuovere l'elemento",
+ "reorderFailed": "Impossibile riordinare gli elementi",
+ "exportFailed": "Impossibile esportare l'audio",
+ "addFailed": "Impossibile aggiungere la generazione",
+ "regenerateFailed": "Impossibile rigenerare",
+ "importFailed": "Impossibile importare l'audio"
+ }
+ },
+ "history": {
+ "empty": "Ancora nessuna generazione vocale…",
+ "actions": {
+ "menu": "Azioni",
+ "play": "Riproduci",
+ "exportAudio": "Esporta audio",
+ "exportPackage": "Esporta pacchetto",
+ "applyEffects": "Applica effetti",
+ "regenerate": "Rigenera"
+ },
+ "deleteDialog": {
+ "title": "Elimina generazione",
+ "body": "Sei sicuro di voler eliminare questa generazione da \"{{name}}\"? Questa azione non può essere annullata.",
+ "deleting": "Eliminazione in corso…"
+ },
+ "clearFailedDialog": {
+ "title": "Cancella generazioni non riuscite",
+ "body_one": "Questo eliminerà permanentemente {{count}} generazione non riuscita dalla tua cronologia. L'azione non può essere annullata.",
+ "body_other": "Questo eliminerà permanentemente {{count}} generazioni non riuscite dalla tua cronologia. L'azione non può essere annullata.",
+ "clearing": "Cancellazione in corso…",
+ "clearAll": "Cancella tutto"
+ },
+ "importDialog": {
+ "title": "Importa generazione",
+ "body": "Importa la generazione da \"{{name}}\". Questo la aggiungerà alla tua cronologia.",
+ "importing": "Importazione in corso…",
+ "action": "Importa"
+ },
+ "effectsDialog": {
+ "title": "Applica effetti",
+ "body": "Configura gli effetti di post-elaborazione da applicare a questa generazione. Verrà creata una nuova versione.",
+ "sourceLabel": "Sorgente",
+ "sourcePlaceholder": "Seleziona la versione sorgente",
+ "apply": "Applica",
+ "applying": "Applicazione in corso…"
+ }
+ },
+ "generation": {
+ "placeholder": {
+ "storyWithEffects": "Genera testo parlato per \"{{name}}\"… (digita / per gli effetti)",
+ "story": "Genera testo parlato per \"{{name}}\"…",
+ "profile": "Genera testo parlato usando {{name}}…",
+ "effectsHint": "Digita / per effetti come [risata], [sospiro]…",
+ "selectVoice": "Seleziona un profilo vocale qui sopra…"
+ },
+ "button": {
+ "generate": "Genera testo parlato",
+ "generating": "Generazione in corso…",
+ "selectFirst": "Seleziona prima un profilo vocale"
+ },
+ "instruct": {
+ "show": "Mostra istruzioni di pronuncia",
+ "hide": "Nascondi istruzioni di pronuncia",
+ "tooltip": "Istruzioni di pronuncia (tono, emozione, ritmo)",
+ "placeholder": "Istruzioni di pronuncia — es. Parla lentamente con calore, Autorevole e chiaro…"
+ },
+ "voiceSelector": {
+ "placeholder": "Seleziona una voce…"
+ },
+ "effects": {
+ "none": "Nessun effetto",
+ "profileDefault": "Predefinito del profilo"
+ },
+ "compose": {
+ "tooltip": "Componi",
+ "ariaLabel": "Componi una battuta nel personaggio",
+ "failedTitle": "Composizione non riuscita",
+ "failedDescription": "Impossibile generare il testo da questa personalità."
+ },
+ "persona": {
+ "tooltipActive": "Parla nel personaggio",
+ "tooltipInactive": "Parla nel personaggio",
+ "ariaLabelActive": "Parla nel personaggio",
+ "ariaLabelInactive": "Parla nel personaggio"
+ }
+ },
+ "main": {
+ "importVoice": "Importa voce",
+ "createVoice": "Crea voce",
+ "import": {
+ "invalidTitle": "Tipo di file non valido",
+ "invalidDescription": "Seleziona un file .voicebox.zip valido",
+ "successTitle": "Profilo importato",
+ "successDescription": "Profilo vocale importato con successo",
+ "failedTitle": "Impossibile importare il profilo",
+ "dialogTitle": "Importa profilo",
+ "dialogDescription": "Importa il profilo da \"{{name}}\". Questo creerà un nuovo profilo contenente tutti i campioni.",
+ "importing": "Importazione in corso…",
+ "action": "Importa"
+ }
+ },
+ "settings": {
+ "tabs": {
+ "general": "Generali",
+ "generation": "Generazione",
+ "captures": "Acquisizioni",
+ "mcp": "MCP",
+ "gpu": "GPU",
+ "logs": "Log",
+ "changelog": "Registro modifiche",
+ "about": "Informazioni"
+ },
+ "language": {
+ "label": "Lingua",
+ "description": "Scegli la lingua di visualizzazione di Voicebox."
+ },
+ "theme": {
+ "label": "Tema",
+ "description": "Adatta al sistema, oppure scegli un aspetto fisso chiaro o scuro.",
+ "options": {
+ "system": "Sistema",
+ "light": "Chiaro",
+ "dark": "Scuro"
+ }
+ },
+ "general": {
+ "docs": {
+ "title": "Leggi la documentazione"
+ },
+ "discord": {
+ "title": "Unisciti a Discord",
+ "subtitle": "Ricevi aiuto e condividi le voci"
+ },
+ "serverUrl": {
+ "title": "URL del server",
+ "description": "L'indirizzo del server backend di Voicebox.",
+ "invalidUrl": "Inserisci un URL valido",
+ "updatedTitle": "URL del server aggiornato",
+ "updatedDescription": "Connesso a {{url}}"
+ },
+ "keepServerRunning": {
+ "title": "Mantieni il server in esecuzione alla chiusura dell'app",
+ "description": "Il server continuerà a funzionare in background dopo la chiusura dell'applicazione.",
+ "failedTitle": "Impossibile aggiornare l'impostazione",
+ "failedDescription": "Impossibile sincronizzare l'impostazione con il backend.",
+ "updatedTitle": "Impostazione aggiornata",
+ "runningDescription": "Il server rimarrà in esecuzione alla chiusura dell'app",
+ "stoppedDescription": "Il server si arresterà alla chiusura dell'app"
+ },
+ "networkAccess": {
+ "title": "Consenti l'accesso alla rete",
+ "description": "Rende il server accessibile da altri dispositivi sulla tua rete. Riavvia l'app dopo la modifica.",
+ "updatedTitle": "Impostazione aggiornata",
+ "enabled": "Accesso alla rete abilitato. Riavvia l'app per applicare le modifiche.",
+ "disabled": "Accesso alla rete disabilitato. Riavvia l'app per applicare le modifiche."
+ },
+ "connection": {
+ "connecting": "Connessione in corso",
+ "offline": "Offline",
+ "online": "Online"
+ },
+ "updates": {
+ "title": "Aggiornamenti dell'app",
+ "devSuffix": " (sviluppo)",
+ "devMode": {
+ "title": "Modalità di sviluppo",
+ "description": "Gli aggiornamenti automatici sono disabilitati in modalità di sviluppo."
+ },
+ "check": {
+ "title": "Controlla aggiornamenti",
+ "available": "Versione {{version}} disponibile",
+ "checking": "Verifica in corso…",
+ "upToDate": "L'applicazione è aggiornata",
+ "button": "Controlla"
+ },
+ "error": "Errore di aggiornamento",
+ "download": {
+ "title": "Aggiorna alla versione {{version}}",
+ "description": "Scarica e installa l'ultima versione.",
+ "button": "Scarica"
+ },
+ "downloading": "Download dell'aggiornamento in corso…",
+ "ready": {
+ "title": "Aggiornamento pronto per l'installazione",
+ "description": "La versione {{version}} è stata scaricata. Riavvia per completare.",
+ "button": "Riavvia ora"
+ }
+ },
+ "api": {
+ "title": "Accesso API",
+ "description": "Integra Voicebox nel tuo flusso di lavoro tramite l'API REST all'indirizzo {{url}}",
+ "viewReference": "Visualizza il riferimento API completo",
+ "endpoints": {
+ "generate": "Genera testo parlato",
+ "health": "Stato del server",
+ "profiles": "Elenca voci",
+ "history": "Generazioni passate"
+ }
+ }
+ },
+ "generation": {
+ "title": "Generazione",
+ "description": "Controlli per la generazione di testi lunghi. Queste impostazioni si applicano a tutti i motori.",
+ "chunkLimit": {
+ "title": "Limite di suddivisione automatica",
+ "description": "I testi lunghi vengono suddivisi in blocchi in corrispondenza dei confini delle frasi. Valori più bassi possono migliorare la qualità per output lunghi.",
+ "value": "{{chars}} caratteri"
+ },
+ "crossfade": {
+ "title": "Dissolvenza incrociata tra blocchi",
+ "description": "Sfuma l'audio tra i blocchi per rendere fluide le transizioni. Imposta a 0 per un taglio netto.",
+ "cut": "Taglio netto",
+ "ms": "{{ms}}ms"
+ },
+ "normalize": {
+ "title": "Normalizza audio",
+ "description": "Regola il volume dell'output a un livello coerente in tutte le generazioni."
+ },
+ "autoplay": {
+ "title": "Riproduzione automatica alla generazione",
+ "description": "Riproduci automaticamente l'audio al completamento di una generazione."
+ },
+ "folder": {
+ "title": "Cartella delle generazioni",
+ "description": "Cartella del disco in cui vengono memorizzati i file audio generati.",
+ "open": "Apri"
+ },
+ "sidebar": {
+ "aboutTitle": "Informazioni sulla generazione vocale",
+ "aboutBody": "Clona una voce da un breve campione, quindi genera testo parlato in qualsiasi voce e in qualsiasi lingua. Integra la sintesi vocale (TTS) in agenti IA, giochi, podcast o narrazioni a lungo formato.",
+ "differencesTitle": "Cosa cambia",
+ "clone": {
+ "title": "Clona qualsiasi voce in pochi secondi.",
+ "body": "Bastano pochi secondi di audio di riferimento. Supporto multi-campione per una qualità superiore quando ne hai bisogno."
+ },
+ "engines": {
+ "title": "Sette motori, 23 lingue.",
+ "body": "Scegli il compromesso più adatto alle tue esigenze tra qualità, velocità o copertura multilingue."
+ },
+ "agentReady": {
+ "title": "Pronto per gli agenti.",
+ "body": "API REST con controllo per singolo profilo — assegna a qualsiasi IA una voce che hai clonato."
+ }
+ }
+ },
+ "captures": {
+ "dictation": {
+ "title": "Dettatura",
+ "description": "Acquisisci audio da qualsiasi punto del tuo computer con una scorciatoia globale.",
+ "globalShortcut": {
+ "title": "Scorciatoia globale",
+ "description": "Tieni premuta la scorciatoia per registrare da qualsiasi punto del tuo computer. Rilascia per trascrivere."
+ },
+ "pushToTalk": {
+ "title": "Scorciatoia Push-to-talk",
+ "description": "Tieni premuti questi tasti in qualsiasi punto del sistema per registrare. Rilascia per interrompere e trascrivere.",
+ "change": "Cambia"
+ },
+ "toggle": {
+ "title": "Scorciatoia di attivazione/disattivazione",
+ "description": "Premi una volta per avviare una registrazione a mani libere. Premi di nuovo per interromperla. Di solito corrisponde alla combinazione push-to-talk più lo Spazio.",
+ "change": "Cambia"
+ },
+ "chordPicker": {
+ "pttTitle": "Imposta la scorciatoia push-to-talk",
+ "pttDescription": "Tieni premuti i tasti che desideri utilizzare, quindi rilasciali e clicca su Salva. L'indicatore del tasto modificatore sul lato destro mostra se si tratta della variante sinistra o destra.",
+ "toggleTitle": "Imposta la scorciatoia di attivazione/disattivazione",
+ "toggleDescription": "Tieni premuti i tasti che desideri utilizzare, quindi rilasciali e clicca su Salva. Scegli una combinazione diversa rispetto a quella del push-to-talk."
+ },
+ "preview": {
+ "title": "Anteprima",
+ "description": "Cosa appare sullo schermo mentre tieni premuta la scorciatoia."
+ },
+ "copyToClipboard": {
+ "title": "Copia trascrizione negli appunti",
+ "description": "La trascrizione ripulita viene salvata negli appunti al termine dell'acquisizione."
+ },
+ "autoPaste": {
+ "title": "Incollo automatico nel campo di testo attivo",
+ "description": "Se un campo di inserimento testo è attivo in un'altra app, incolla direttamente al suo interno. Voicebox salva e ripristina il contenuto precedente dei tuoi appunti."
+ }
+ },
+ "transcription": {
+ "title": "Trascrizione",
+ "description": "Scegli quale modello di riconoscimento vocale (speech-to-text) eseguire sulle tue acquisizioni.",
+ "model": {
+ "title": "Modello di trascrizione",
+ "description": "Whisper è integrato in Voicebox ed è eseguito interamente sul tuo computer.",
+ "base": "Whisper Base · 74M · {{tail}}",
+ "small": "Whisper Small · 244M · {{tail}}",
+ "medium": "Whisper Medium · 769M · {{tail}}",
+ "large": "Whisper Large · 1.5B · {{tail}}",
+ "turbo": "Whisper Turbo · Large v3 ridotto · {{tail}}",
+ "tail": {
+ "fast": "Veloce",
+ "balanced": "Bilanciato",
+ "higher": "Precisione superiore",
+ "best": "Massima precisione",
+ "nearBest": "Precisione quasi massima, veloce"
+ }
+ },
+ "language": {
+ "title": "Lingua",
+ "description": "Il rilevamento automatico funziona per la maggior parte delle acquisizioni. Imposta una lingua fissa se parli sempre la stessa.",
+ "auto": "Rilevamento automatico",
+ "en": "Inglese",
+ "es": "Spagnolo",
+ "fr": "Francese",
+ "de": "Tedesco",
+ "ja": "Giapponese",
+ "zh": "Cinese",
+ "hi": "Hindi"
+ },
+ "archive": {
+ "title": "Archivia audio",
+ "description": "Conserva la registrazione originale insieme a ciascuna trascrizione."
+ }
+ },
+ "refinement": {
+ "title": "Perfezionamento",
+ "description": "Esegui facoltativamente un modello linguistico locale (LLM) sulle trascrizioni per rimuovere intercalari, correggere la punteggiatura e le autocorrezioni.",
+ "auto": {
+ "title": "Perfeziona automaticamente le trascrizioni",
+ "description": "Viene eseguito dopo ogni acquisizione. Puoi comunque passare dalla versione grezza a quella perfezionata nella scheda Acquisizioni."
+ },
+ "model": {
+ "title": "Modello di perfezionamento",
+ "description": "I modelli più grandi sono più lenti ma gestiscono meglio le sottili autocorrezioni e il vocabolario tecnico.",
+ "size06": "Qwen3 · 0.6B · 400 MB · {{tail}}",
+ "size17": "Qwen3 · 1.7B · 1.1 GB · {{tail}}",
+ "size40": "Qwen3 · 4B · 2.5 GB · {{tail}}",
+ "tail": {
+ "veryFast": "Molto veloce",
+ "fast": "Veloce",
+ "fullQuality": "Massima qualità"
+ }
+ },
+ "smartCleanup": {
+ "title": "Pulizia intelligente",
+ "description": "Rimuovi gli intercalari (ehm, uh, cioè), ripristina la punteggiatura e correggi le maiuscole senza riformulare il testo."
+ },
+ "selfCorrection": {
+ "title": "Rimuovi autocorrezioni",
+ "description": "Quando cambi idea a metà frase (\"anzi no...\", \"aspetta, volevo dire...\"), elimina la parte ritrattata e mantieni solo l'intenzione finale."
+ },
+ "preserveTechnical": {
+ "title": "Preserva i termini tecnici",
+ "description": "Mantieni gli identificatori di codice, i nomi dei comandi e gli acronimi esattamente come vengono pronunciati. Attiva questa opzione quando detti all'interno di un prompt di codice."
+ }
+ },
+ "playback": {
+ "title": "Riproduzione",
+ "description": "Voce predefinita per l'azione \"Riproduci come\" nella scheda Acquisizioni.",
+ "defaultVoice": {
+ "title": "Voce predefinita",
+ "description": "Utilizzata quando clicchi su Riproduci come senza scegliere prima una voce. Puoi modificarla per ogni singola acquisizione.",
+ "noClonedVoices": "Ancora nessuna voce clonata",
+ "noneSelected": "Nessuna selezionata",
+ "clonedVoices": "Voci clonate"
+ }
+ },
+ "storage": {
+ "title": "Archiviazione",
+ "description": "Le acquisizioni vengono salvate come file audio e di trascrizione accoppiati nella cartella dei dati di Voicebox.",
+ "retention": {
+ "title": "Conservazione",
+ "description": "Per quanto tempo conservare le acquisizioni. Si applica sia all'audio che alle trascrizioni.",
+ "forever": "Conserva per sempre",
+ "d90": "90 giorni",
+ "d30": "30 giorni",
+ "d7": "7 giorni"
+ },
+ "folder": {
+ "title": "Cartella delle acquisizioni",
+ "description": "Cartella del disco in cui vengono memorizzati l'audio e le trascrizioni delle acquisizioni.",
+ "open": "Apri"
+ }
+ },
+ "sidebar": {
+ "aboutTitle": "Informazioni sulle Acquisizioni",
+ "aboutBody": "Tieni premuta una scorciatoia in qualsiasi punto del tuo computer, parla e Voicebox trasformerà la tua voce in testo. Riproducilo con qualsiasi voce clonata, incollalo in qualsiasi app o invialo direttamente al tuo agente di programmazione.",
+ "differencesTitle": "Cosa cambia",
+ "local": {
+ "title": "Interamente locale.",
+ "body": "Whisper e il modello LLM di perfezionamento vengono eseguiti sull'hardware del tuo computer. Nessun cloud, nessun account, la tua voce non lascia mai la macchina."
+ },
+ "playAs": {
+ "title": "Riproduci con qualsiasi voce.",
+ "body": "Le trascrizioni possono essere rilette da qualsiasi profilo che hai clonato."
+ },
+ "crossPlatform": {
+ "title": "Multipiattaforma.",
+ "body": "Stessa scorciatoia, stesso flusso di lavoro su macOS, Windows e Linux."
+ },
+ "windowsCaveat": {
+ "title": "Attenzione su Windows",
+ "body": "La scorciatoia non si attiverà mentre Voicebox stesso o qualsiasi applicazione eseguita come amministratore è in primo piano. Ci stiamo lavorando."
+ }
+ }
+ },
+ "mcp": {
+ "install": {
+ "title": "Installa nel tuo agente",
+ "description": "Voicebox espone un server MCP locale ogni volta che l'app è aperta. Incolla uno di questi frammenti nella configurazione MCP del tuo agente.",
+ "http": {
+ "title": "HTTP (consigliato)",
+ "description": "Per i client che supportano HTTP MCP — Claude Code, Cursor, Windsurf, VS Code."
+ },
+ "claudeCode": {
+ "title": "Comando a riga singola per Claude Code",
+ "description": "Si registra tramite l'interfaccia a riga di comando (CLI) di Claude Code."
+ },
+ "stdio": {
+ "title": "Stdio (alternativa)",
+ "description": "Per i client che avviano solo processi stdio. Il file binario shim viene fornito insieme all'app."
+ },
+ "copy": "Copia",
+ "copied": "Copiato"
+ },
+ "defaultVoice": {
+ "title": "Voce predefinita",
+ "description": "Utilizzata quando un agente chiama voicebox.speak senza specificare un profilo e non ha un'associazione per singolo client.",
+ "label": "Voce di riproduzione predefinita",
+ "labelHint": "Condivisa con il menu a discesa 'Riproduci come voce' della scheda Acquisizioni — una sola voce predefinita per la riproduzione passiva.",
+ "none": "(nessuna)"
+ },
+ "bindings": {
+ "title": "Voce per singolo agente",
+ "description": "Associa agenti specifici a voci specifiche, in modo da poter capire chi sta parlando senza guardare lo schermo. L'agente si identifica tramite l'intestazione X-Voicebox-Client-Id (o la variabile d'ambiente VOICEBOX_CLIENT_ID per stdio).",
+ "empty": "Ancora nessuna associazione. Aggiungine una qui sotto, quindi configura il tuo client MCP per inviare il corrispondente X-Voicebox-Client-Id.",
+ "lastSeen": "ultimo rilevamento {{when}}",
+ "lastSeenTitle": "Ultimo rilevamento {{when}}",
+ "neverConnected": "mai connesso",
+ "defaultOption": "(predefinita)",
+ "removeAria": "Rimuovi associazione per {{client}}",
+ "add": {
+ "title": "Aggiungi un'associazione",
+ "clientIdPlaceholder": "id client (es. claude-code)",
+ "labelPlaceholder": "etichetta (facoltativa)",
+ "action": "Aggiungi associazione"
+ }
+ },
+ "sidebar": {
+ "aboutTitle": "Informazioni su MCP",
+ "aboutBody": "Il protocollo Model Context Protocol consente al tuo agente di programmazione IA — Claude Code, Cursor, Windsurf — di chiamare gli strumenti di Voicebox. Parla con una voce clonata, trascrivi tracce audio, sfoglia le acquisizioni.",
+ "toolsTitle": "Strumenti disponibili",
+ "tools": {
+ "speak": "Pronuncia il testo all'interno di un profilo vocale.",
+ "transcribe": "Riconoscimento vocale Whisper STT su una traccia.",
+ "listCaptures": "Dettature / registrazioni recenti.",
+ "listProfiles": "Profili vocali disponibili."
+ },
+ "postSpeak": "Esposto anche come POST /speak per script di shell, ACP, A2A."
+ }
+ },
+ "gpu": {
+ "cpuOnly": "Solo CPU",
+ "vramUsed": "{{mb}} MB VRAM",
+ "noAcceleration": "Nessuna accelerazione GPU rilevata",
+ "active": "Attiva",
+ "cuda": {
+ "title": "Backend CUDA",
+ "activeTitle": "Backend CUDA attivo",
+ "description": "Accelerazione GPU NVIDIA tramite un backend CUDA scaricabile.",
+ "downloading": "Download del backend CUDA in corso…",
+ "downloadingShort": "Download in corso…",
+ "updating": "Aggiornamento in corso…"
+ },
+ "activeBackend": {
+ "description": "L'accelerazione GPU è attualmente abilitata."
+ },
+ "restart": {
+ "ready": "Server riavviato con successo",
+ "waiting": "Riavvio del server in corso…",
+ "stopping": "Arresto del server in corso…"
+ },
+ "download": {
+ "title": "Scarica il backend CUDA",
+ "description": "Download di circa 2,4 GB. Richiede una GPU NVIDIA con supporto CUDA.",
+ "button": "Scarica"
+ },
+ "switchToCuda": {
+ "title": "Passa al backend CUDA",
+ "description": "Il backend CUDA è stato scaricato ed è pronto. Riavvia per abilitarlo.",
+ "button": "Riavvia"
+ },
+ "switchToCpu": {
+ "title": "Passa al backend CPU",
+ "description": "Disabilita l'accelerazione GPU. Potrai scaricare nuovamente il backend GPU in un secondo momento.",
+ "button": "Passa a CPU"
+ }, "remove": {
+ "title": "Rimuovi il backend CUDA",
+ "description": "Elimina il file binario CUDA scaricato per liberare spazio sul disco.",
+ "button": "Rimuovi"
+ },
+ "errors": {
+ "downloadFailed": "Download non riuscito",
+ "downloadStart": "Impossibile avviare il download",
+ "restartFailed": "Riavvio non riuscito",
+ "switchCpu": "Impossibile passare alla CPU",
+ "deleteCuda": "Impossibile eliminare il backend CUDA",
+ "deleteRocm": "Impossibile eliminare il backend ROCm"
+ },
+ "footer": "Voicebox rileva e utilizza automaticamente la migliore GPU disponibile sul tuo sistema. Sui Mac con chip Apple Silicon, il backend MLX viene eseguito nativamente sul Neural Engine e sulla GPU tramite Metal Performance Shaders (MPS), senza richiedere alcuna configurazione aggiuntiva. Su Windows, puoi scaricare i backend opzionali CUDA (NVIDIA) o ROCm (AMD) per l'inferenza con accelerazione hardware. Dove disponibili tramite PyTorch, sono supportati anche Intel XPU e DirectML. Quando non viene rilevata alcuna GPU, Voicebox si affida alla CPU — tutti i motori continuano a funzionare, solo più lentamente.",
+ "rocm": {
+ "title": "Backend AMD ROCm",
+ "activeTitle": "Backend ROCm attivo",
+ "description": "Accelerazione GPU AMD tramite un backend ROCm scaricabile.",
+ "downloading": "Download del backend ROCm in corso…",
+ "downloadingShort": "Download in corso…",
+ "updating": "Aggiornamento in corso…"
+ },
+ "downloadRocm": {
+ "title": "Scarica il backend AMD ROCm",
+ "description": "Download di circa 2-3 GB. Richiede una GPU AMD Radeon con supporto ROCm.",
+ "button": "Scarica"
+ },
+ "switchToRocm": {
+ "title": "Passa al backend ROCm",
+ "description": "Il backend ROCm è stato scaricato ed è pronto. Riavvia per abilitarlo.",
+ "button": "Riavvia"
+ },
+ "removeRocm": {
+ "title": "Rimuovi il backend ROCm",
+ "description": "Elimina il file binario ROCm scaricato per liberare spazio sul disco.",
+ "button": "Rimuovi"
+ }
+ },
+ "logs": {
+ "title": "Log del server",
+ "lineCount_one": "{{count}} riga",
+ "lineCount_other": "{{count}} righe",
+ "scrollToBottom": "Scorri fino in fondo",
+ "clear": "Svuota",
+ "empty": "Ancora nessun log disponibile.",
+ "devHint": "I log del server vengono acquisiti solo quando l'app gestisce il processo del server (build di produzione)."
+ },
+ "changelog": {
+ "devBadge": "sviluppo",
+ "showLess": "Mostra meno",
+ "showMore": "Mostra di più"
+ },
+ "about": {
+ "tagline": "Lo studio di sintesi vocale open source. Clona voci, genera testo parlato, applica effetti e sviluppa applicazioni vocali — tutto eseguito localmente sul tuo computer.",
+ "createdBy": "Creato da",
+ "buyCoffee": "Offrimi un caffè",
+ "license": "Rilasciato sotto licenza MIT"
+ }
+ },
+ "models": {
+ "title": "Modelli",
+ "subtitle": "Scarica e gestisci i modelli di intelligenza artificiale per la generazione vocale e la trascrizione",
+ "defaultName": "Modello",
+ "unknownSize": "Dimensione sconosciuta",
+ "sections": {
+ "voiceGeneration": "Generazione vocale",
+ "transcription": "Trascrizione",
+ "languageModels": "Modelli linguistici"
+ },
+ "status": {
+ "loaded": "Caricato"
+ },
+ "storage": {
+ "location": "Posizione di archiviazione",
+ "open": "Apri",
+ "change": "Cambia",
+ "migrating": "Migrazione in corso…",
+ "reset": "Ripristina",
+ "pickerTitle": "Scegli la cartella di archiviazione dei modelli"
+ },
+ "progress": {
+ "connecting": "Connessione in corso…",
+ "connectingHf": "Connessione a HuggingFace in corso…"
+ },
+ "problems": {
+ "title": "Problemi",
+ "clearAll": "Cancella tutto",
+ "noDetails": "Nessun dettaglio sull'errore disponibile. Prova a scaricare di nuovo.",
+ "startedAt": "avviato alle {{time}}"
+ },
+ "detail": {
+ "loadingInfo": "Caricamento informazioni modello…",
+ "byAuthor": "di {{author}}",
+ "downloads": "Download",
+ "likes": "Mi piace",
+ "license": "Licenza",
+ "languagesCount": "{{count}} lingue supportate",
+ "languagesList": "Lingue: {{list}}",
+ "onDisk": "{{size}} su disco"
+ },
+ "actions": {
+ "download": "Scarica",
+ "retry": "Riprova download",
+ "unload": "Disattiva",
+ "unloading": "Disattivazione in corso…",
+ "unloadFirst": "Disattiva il modello prima di eliminarlo",
+ "deleteModel": "Elimina modello"
+ },
+ "deleteDialog": {
+ "title": "Elimina modello",
+ "body": "Sei sicuro di voler eliminare {{name}}?",
+ "sizeNote": "Questo libererà {{size}} di spazio sul disco. Il modello dovrà essere scaricato nuovamente se desideri utilizzarlo ancora.",
+ "deleting": "Eliminazione in corso…"
+ },
+ "migrateDialog": {
+ "title": "Spostare i modelli nella nuova posizione?",
+ "description": "Il server si arresterà durante lo spostamento dei modelli nella nuova cartella. Si riavvierà automaticamente al termine della migrazione.",
+ "action": "Sposta modelli",
+ "preparing": "Preparazione in corso…",
+ "restartingServer": "Riavvio del server in corso…"
+ },
+ "migrate": {
+ "title": "Spostamento dei modelli",
+ "offline": "Il server è offline durante lo spostamento dei modelli."
+ },
+ "toast": {
+ "downloadFailed": "Download non riuscito",
+ "cancelFailed": "Annullamento non riuscito",
+ "cancelFailedDescription": "Impossibile annullare l'attività di download.",
+ "deleted": "Modello eliminato",
+ "deletedDescription": "{{name}} è stato eliminato con successo.",
+ "deleteFailed": "Eliminazione non riuscita",
+ "unloaded": "Modello disattivato",
+ "unloadedDescription": "{{name}} è stato rimosso dalla memoria.",
+ "unloadFailed": "Disattivazione non riuscita",
+ "openFolderFailed": "Impossibile aprire la cartella del modello",
+ "pickerFailed": "Impossibile aprire il selettore di cartelle",
+ "resetToDefault": "Ripristinato alla posizione predefinita. Riavvio del server in corso…",
+ "noModelsToMigrate": "Nessun modello da migrare",
+ "noModelsToMigrateDescription": "Scarica almeno un modello prima di modificare la posizione di archiviazione.",
+ "migrated": "Modelli spostati con successo",
+ "migrationFailed": "Migrazione non riuscita",
+ "migrationFailedGeneric": "Impossibile migrare i modelli",
+ "migrationConnectionLost": "Connessione interrotta durante la migrazione"
+ }
+ }
+}