diff --git a/electron/i18n.ts b/electron/i18n.ts index e16ac86..1492578 100644 --- a/electron/i18n.ts +++ b/electron/i18n.ts @@ -9,10 +9,14 @@ import commonEs from "../src/i18n/locales/es/common.json"; import dialogsEs from "../src/i18n/locales/es/dialogs.json"; import commonFr from "../src/i18n/locales/fr/common.json"; import dialogsFr from "../src/i18n/locales/fr/dialogs.json"; +import commonIt from "../src/i18n/locales/it/common.json"; +import dialogsIt from "../src/i18n/locales/it/dialogs.json"; import commonJa from "../src/i18n/locales/ja-JP/common.json"; import dialogsJa from "../src/i18n/locales/ja-JP/dialogs.json"; import commonKo from "../src/i18n/locales/ko-KR/common.json"; import dialogsKo from "../src/i18n/locales/ko-KR/dialogs.json"; +import commonRu from "../src/i18n/locales/ru/common.json"; +import dialogsRu from "../src/i18n/locales/ru/dialogs.json"; import commonTr from "../src/i18n/locales/tr/common.json"; import dialogsTr from "../src/i18n/locales/tr/dialogs.json"; import commonVi from "../src/i18n/locales/vi/common.json"; @@ -22,21 +26,35 @@ import dialogsZh from "../src/i18n/locales/zh-CN/dialogs.json"; import commonZhTw from "../src/i18n/locales/zh-TW/common.json"; import dialogsZhTw from "../src/i18n/locales/zh-TW/dialogs.json"; -type Locale = "en" | "zh-CN" | "zh-TW" | "es" | "fr" | "ja-JP" | "ko-KR" | "tr" | "ar" | "vi"; +type Locale = + | "en" + | "ar" + | "es" + | "fr" + | "it" + | "ja-JP" + | "ko-KR" + | "ru" + | "tr" + | "vi" + | "zh-CN" + | "zh-TW"; type Namespace = "common" | "dialogs"; type MessageMap = Record; const messages: Record> = { en: { common: commonEn, dialogs: dialogsEn }, - "zh-CN": { common: commonZh, dialogs: dialogsZh }, - "zh-TW": { common: commonZhTw, dialogs: dialogsZhTw }, + ar: { common: commonAr, dialogs: dialogsAr }, es: { common: commonEs, dialogs: dialogsEs }, fr: { common: commonFr, dialogs: dialogsFr }, + it: { common: commonIt, dialogs: dialogsIt }, "ja-JP": { common: commonJa, dialogs: dialogsJa }, "ko-KR": { common: commonKo, dialogs: dialogsKo }, + ru: { common: commonRu, dialogs: dialogsRu }, tr: { common: commonTr, dialogs: dialogsTr }, - ar: { common: commonAr, dialogs: dialogsAr }, vi: { common: commonVi, dialogs: dialogsVi }, + "zh-CN": { common: commonZh, dialogs: dialogsZh }, + "zh-TW": { common: commonZhTw, dialogs: dialogsZhTw }, }; let currentLocale: Locale = "en"; @@ -44,15 +62,17 @@ let currentLocale: Locale = "en"; export function setMainLocale(locale: string) { if ( locale === "en" || - locale === "zh-CN" || - locale === "zh-TW" || + locale === "ar" || locale === "es" || locale === "fr" || + locale === "it" || locale === "ja-JP" || locale === "ko-KR" || + locale === "ru" || locale === "tr" || - locale === "ar" || - locale === "vi" + locale === "vi" || + locale === "zh-CN" || + locale === "zh-TW" ) { currentLocale = locale; } diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index 1056749..5d7534b 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -112,6 +112,7 @@ export function I18nProvider({ children }: { children: ReactNode }) { useEffect(() => { document.documentElement.lang = locale; + window.electronAPI?.setLocale?.(locale); }, [locale]); useEffect(() => { diff --git a/src/i18n/__tests__/tutorialHelpTranslations.test.ts b/src/i18n/__tests__/tutorialHelpTranslations.test.ts index b029570..5d06b79 100644 --- a/src/i18n/__tests__/tutorialHelpTranslations.test.ts +++ b/src/i18n/__tests__/tutorialHelpTranslations.test.ts @@ -4,6 +4,7 @@ import arDialogs from "@/i18n/locales/ar/dialogs.json"; import enDialogs from "@/i18n/locales/en/dialogs.json"; import esDialogs from "@/i18n/locales/es/dialogs.json"; import frDialogs from "@/i18n/locales/fr/dialogs.json"; +import itDialogs from "@/i18n/locales/it/dialogs.json"; import jaJPDialogs from "@/i18n/locales/ja-JP/dialogs.json"; import koKRDialogs from "@/i18n/locales/ko-KR/dialogs.json"; import ruDialogs from "@/i18n/locales/ru/dialogs.json"; @@ -39,16 +40,17 @@ const keysThatMayBeEmpty = new Set<(typeof tutorialHelpKeys)[number]>(["step1Des const dialogsByLocale = { en: enDialogs, - "zh-CN": zhCNDialogs, - "zh-TW": zhTWDialogs, + ar: arDialogs, es: esDialogs, fr: frDialogs, - tr: trDialogs, + it: itDialogs, + "ja-JP": jaJPDialogs, "ko-KR": koKRDialogs, ru: ruDialogs, - "ja-JP": jaJPDialogs, - ar: arDialogs, + tr: trDialogs, vi: viDialogs, + "zh-CN": zhCNDialogs, + "zh-TW": zhTWDialogs, } satisfies Record }>; describe("TutorialHelp translations", () => { diff --git a/src/i18n/config.ts b/src/i18n/config.ts index 70dd677..fb885eb 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,16 +1,17 @@ export const DEFAULT_LOCALE = "en" as const; export const SUPPORTED_LOCALES = [ "en", - "zh-CN", - "zh-TW", + "ar", "es", "fr", - "tr", - "ko-KR", + "it", "ja-JP", - "ar", + "ko-KR", "ru", + "tr", "vi", + "zh-CN", + "zh-TW", ] as const; export const I18N_NAMESPACES = [ "common", diff --git a/src/i18n/locales/it/common.json b/src/i18n/locales/it/common.json new file mode 100644 index 0000000..c829a98 --- /dev/null +++ b/src/i18n/locales/it/common.json @@ -0,0 +1,50 @@ +{ + "actions": { + "cancel": "Annulla", + "save": "Salva", + "delete": "Elimina", + "close": "Chiudi", + "share": "Condividi", + "done": "Fatto", + "open": "Apri", + "upload": "Carica", + "export": "Esporta", + "showInFolder": "Mostra nella cartella", + "file": "File", + "edit": "Modifica", + "view": "Visualizza", + "window": "Finestra", + "quit": "Esci", + "stopRecording": "Interrompi registrazione", + "undo": "Annulla", + "redo": "Ripeti", + "cut": "Taglia", + "copy": "Copia", + "paste": "Incolla", + "selectAll": "Seleziona tutto", + "minimize": "Riduci a icona", + "reload": "Ricarica", + "forceReload": "Forza ricarica", + "toggleDevTools": "Attiva/disattiva strumenti sviluppatore", + "actualSize": "Dimensione effettiva", + "zoomIn": "Ingrandisci", + "zoomOut": "Riduci", + "toggleFullScreen": "Attiva/disattiva schermo intero", + "recordingStatus": "Registrazione: {{source}}", + "about": "Info su OpenScreen", + "services": "Servizi", + "hide": "Nascondi OpenScreen", + "hideOthers": "Nascondi gli altri", + "unhide": "Mostra tutto" + }, + "playback": { + "play": "Riproduci", + "pause": "Pausa", + "fullscreen": "Schermo intero", + "exitFullscreen": "Esci dallo schermo intero" + }, + "locale": { + "name": "Italiano", + "short": "IT" + } +} diff --git a/src/i18n/locales/it/dialogs.json b/src/i18n/locales/it/dialogs.json new file mode 100644 index 0000000..5593b30 --- /dev/null +++ b/src/i18n/locales/it/dialogs.json @@ -0,0 +1,70 @@ +{ + "export": { + "complete": "Esportazione completata", + "yourFormatReady": "Il tuo {{format}} è pronto", + "showInFolder": "Mostra nella cartella", + "finalizingVideo": "Finalizzazione esportazione video...", + "compilingGifProgress": "Compilazione GIF... {{progress}}%", + "compilingGifWait": "Compilazione GIF... Potrebbe richiedere del tempo", + "takeMoment": "Ci potrebbe impiegare un momento...", + "failed": "Esportazione fallita", + "tryAgain": "Riprova", + "finalizingVideoTitle": "Finalizzazione video", + "compilingGif": "Compilazione GIF", + "exportingFormat": "Esportazione {{format}}", + "compiling": "Compilazione", + "renderingFrames": "Rendering fotogrammi", + "processing": "Elaborazione...", + "finalizing": "Finalizzazione...", + "compilingStatus": "Compilazione...", + "status": "Stato", + "format": "Formato", + "frames": "Fotogrammi", + "cancelExport": "Annulla esportazione", + "savedSuccessfully": "{{format}} salvato con successo!" + }, + "tutorial": { + "triggerLabel": "Come funziona il taglio", + "title": "Come funziona il taglio", + "description": "Capire come eliminare le parti indesiderate del tuo video.", + "explanationBefore": "Lo strumento Taglia funziona definendo i segmenti che vuoi", + "remove": "rimuovere", + "explanationMiddle": " — tutto ciò", + "covered": "coperto", + "explanationAfter": "da un segmento rosso verrà eliminato durante l'esportazione.", + "visualExample": "Esempio visivo", + "removed": "RIMOSSO", + "kept": "Mantenuto", + "part1": "Parte 1", + "part2": "Parte 2", + "part3": "Parte 3", + "finalVideo": "Video finale", + "step1Title": "1. Aggiungi taglio", + "step1DescriptionBefore": "Premi ", + "step1DescriptionAfter": " o clicca sull'icona delle forbici per contrassegnare una sezione da rimuovere.", + "step2Title": "2. Regolazione", + "step2Description": "Trascina i bordi della regione rossa per coprire esattamente ciò che vuoi eliminare." + }, + "unsavedChanges": { + "title": "Modifiche non salvate", + "message": "Hai delle modifiche non salvate.", + "detail": "Vuoi salvare il progetto prima di chiudere?", + "saveAndClose": "Salva e chiudi", + "discardAndClose": "Scarta e chiudi", + "loadProject": "Carica progetto…", + "saveProject": "Salva progetto…", + "saveProjectAs": "Salva progetto come…" + }, + "fileDialogs": { + "saveGif": "Salva GIF esportata", + "saveVideo": "Salva video esportato", + "selectVideo": "Seleziona file video", + "saveProject": "Salva progetto OpenScreen", + "openProject": "Apri progetto OpenScreen", + "gifImage": "Immagine GIF", + "mp4Video": "Video MP4", + "videoFiles": "File video", + "openscreenProject": "Progetto OpenScreen", + "allFiles": "Tutti i file" + } +} diff --git a/src/i18n/locales/it/editor.json b/src/i18n/locales/it/editor.json new file mode 100644 index 0000000..336d3e6 --- /dev/null +++ b/src/i18n/locales/it/editor.json @@ -0,0 +1,46 @@ +{ + "newRecording": { + "title": "Torna al registratore", + "description": "La sessione corrente è stata salvata.", + "cancel": "Annulla", + "confirm": "Conferma" + }, + "loadingVideo": "Caricamento video...", + "errors": { + "noVideoLoaded": "Nessun video caricato", + "videoNotReady": "Video non pronto", + "unableToDetermineSourcePath": "Impossibile determinare il percorso del video sorgente", + "failedToSaveGif": "Impossibile salvare la GIF", + "gifExportFailed": "Esportazione GIF fallita", + "failedToSaveVideo": "Impossibile salvare il video", + "exportFailed": "Esportazione fallita", + "exportFailedWithError": "Esportazione fallita: {{error}}", + "exportBackgroundLoadFailed": "Esportazione fallita: impossibile caricare l'immagine di sfondo ({{url}})", + "failedToSaveExport": "Impossibile salvare l'esportazione", + "failedToSaveExportedVideo": "Impossibile salvare il video esportato", + "failedToRevealInFolder": "Errore durante la visualizzazione nella cartella: {{error}}" + }, + "export": { + "canceled": "Esportazione annullata", + "exportedSuccessfully": "{{format}} esportato con successo" + }, + "project": { + "saveCanceled": "Salvataggio progetto annullato", + "failedToSave": "Impossibile salvare il progetto", + "savedTo": "Progetto salvato in {{path}}", + "failedToLoad": "Impossibile caricare il progetto", + "invalidFormat": "Formato file progetto non valido", + "loadedFrom": "Progetto caricato da {{path}}" + }, + "recording": { + "failedCameraAccess": "Impossibile richiedere l'accesso alla fotocamera.", + "cameraBlocked": "L'accesso alla fotocamera è bloccato. Abilita nelle impostazioni di sistema l'utilizzo della webcam.", + "systemAudioUnavailable": "Audio di sistema non disponibile. Registrazione senza audio di sistema.", + "microphoneDenied": "Accesso al microfono negato. La registrazione continuerà senza audio.", + "cameraDenied": "Accesso alla fotocamera negato. La registrazione continuerà senza webcam.", + "cameraDisconnected": "Webcam disconnessa.", + "cameraNotFound": "Fotocamera non trovata.", + "permissionDenied": "Autorizzazione di registrazione negata. Consenti la registrazione dello schermo.", + "accessibilityAllowAndRetry": "Consenti l'accesso all'accessibilità per OpenScreen, poi premi di nuovo registra per avviare il conto alla rovescia." + } +} diff --git a/src/i18n/locales/it/launch.json b/src/i18n/locales/it/launch.json new file mode 100644 index 0000000..fc7019e --- /dev/null +++ b/src/i18n/locales/it/launch.json @@ -0,0 +1,47 @@ +{ + "tooltips": { + "hideHUD": "Nascondi", + "closeApp": "Chiudi app", + "restartRecording": "Riavvia registrazione", + "cancelRecording": "Annulla registrazione", + "pauseRecording": "Metti in pausa registrazione", + "resumeRecording": "Riprendi registrazione", + "openVideoFile": "Apri file video", + "openProject": "Apri progetto" + }, + "audio": { + "enableSystemAudio": "Abilita audio di sistema", + "disableSystemAudio": "Disabilita audio di sistema", + "enableMicrophone": "Abilita microfono", + "disableMicrophone": "Disabilita microfono", + "defaultMicrophone": "Microfono predefinito" + }, + "webcam": { + "enableWebcam": "Abilita webcam", + "disableWebcam": "Disabilita webcam", + "defaultCamera": "Fotocamera predefinita", + "searching": "Ricerca in corso...", + "noneFound": "Nessuna fotocamera trovata", + "unavailable": "Fotocamera non disponibile" + }, + "cursor": { + "useEditableCursor": "Usa cursore modificabile", + "useSystemCursor": "Usa cursore di sistema" + }, + "sourceSelector": { + "loading": "Caricamento sorgenti...", + "screens": "Schermi ({{count}})", + "windows": "Finestre ({{count}})", + "defaultSourceName": "Schermo" + }, + "recording": { + "selectSource": "Seleziona una sorgente da registrare" + }, + "language": "Lingua", + "systemLanguagePrompt": { + "title": "Usare la lingua del sistema?", + "description": "Abbiamo rilevato {{language}} come lingua del sistema. Vuoi passare OpenScreen a {{language}}?", + "switch": "Passa a {{language}}", + "keepDefault": "Mantieni la lingua corrente" + } +} diff --git a/src/i18n/locales/it/settings.json b/src/i18n/locales/it/settings.json new file mode 100644 index 0000000..e609d08 --- /dev/null +++ b/src/i18n/locales/it/settings.json @@ -0,0 +1,205 @@ +{ + "zoom": { + "level": "Livello zoom", + "customScale": "Zoom personalizzato", + "selectRegion": "Seleziona una regione zoom da regolare", + "deleteZoom": "Elimina zoom", + "focusMode": { + "title": "Modalità messa a fuoco", + "manual": "Manuale", + "auto": "Automatico", + "autoDescription": "La fotocamera segue la posizione del cursore registrato" + }, + "threeD": { + "title": "Rotazione 3D", + "preset": { + "iso": "Iso", + "left": "Sinistra", + "right": "Destra" + } + }, + "position": { + "title": "Posizione messa a fuoco", + "x": "X (%)", + "y": "Y (%)", + "hint": "0 = più a sinistra / in alto, 100 = più a destra / in basso" + } + }, + "speed": { + "playbackSpeed": "Velocità di riproduzione", + "selectRegion": "Seleziona una regione velocità da regolare", + "deleteRegion": "Elimina regione velocità", + "customPlaybackSpeed": "Velocità di riproduzione personalizzata", + "maxSpeedError": "La velocità non può superare 16×" + }, + "trim": { + "deleteRegion": "Elimina regione taglio" + }, + "layout": { + "title": "Layout", + "preset": "Predefinito", + "selectPreset": "Seleziona predefinito", + "pictureInPicture": "Immagine nell'immagine", + "verticalStack": "Pila verticale", + "dualFrame": "Doppio frame", + "noWebcam": "Nessuna webcam", + "webcamShape": "Forma fotocamera", + "webcamSize": "Dimensione webcam" + }, + "effects": { + "title": "Effetti video", + "blurBg": "Sfuma sfondo", + "motionBlur": "Sfocatura movimento", + "off": "spento", + "on": "acceso", + "shadow": "Ombra", + "roundness": "Arrotondamento", + "padding": "Spaziatura" + }, + "background": { + "title": "Sfondo", + "image": "Immagine", + "color": "Colore", + "gradient": "Sfumatura", + "uploadCustom": "Carica personalizzato", + "gradientLabel": "Sfumatura {{index}}", + "colorWheel": "Ruota dei colori", + "colorPalette": "Tavolozza dei colori" + }, + "crop": { + "title": "Ritaglia", + "cropVideo": "Ritaglia video", + "dragInstruction": "Trascina su ogni lato per regolare l'area di ritaglio", + "ratio": "Proporzioni", + "free": "Libero", + "done": "Fatto", + "lockAspectRatio": "Blocca proporzioni", + "unlockAspectRatio": "Sblocca proporzioni" + }, + "exportFormat": { + "mp4": "MP4", + "gif": "GIF", + "mp4Video": "Video MP4", + "mp4Description": "File video di alta qualità", + "gifAnimation": "Animazione GIF", + "gifDescription": "Immagine animata per la condivisione" + }, + "exportQuality": { + "title": "Risoluzione esportazione", + "low": "720p", + "medium": "1080p", + "high": "Originale" + }, + "gifSettings": { + "frameRate": "Frequenza fotogrammi GIF", + "size": "Dimensione GIF", + "loop": "GIF in loop" + }, + "project": { + "save": "Salva progetto", + "load": "Carica progetto" + }, + "export": { + "videoButton": "Esporta video", + "gifButton": "Esporta GIF", + "chooseSaveLocation": "Scegli posizione di salvataggio" + }, + "links": { + "reportBug": "Segnala bug", + "starOnGithub": "Metti stella su GitHub" + }, + "imageUpload": { + "invalidFileType": "Tipo di file non valido", + "jpgOnly": "Carica un file immagine JPG o JPEG.", + "uploadSuccess": "Immagine personalizzata caricata con successo!", + "failedToUpload": "Impossibile caricare l'immagine", + "errorReading": "Si è verificato un errore durante la lettura del file." + }, + "annotation": { + "title": "Impostazioni annotazione", + "active": "Attivo", + "typeText": "Testo", + "typeImage": "Immagine", + "typeArrow": "Freccia", + "typeBlur": "Sfocatura", + "textContent": "Contenuto testo", + "textPlaceholder": "Inserisci il tuo testo...", + "fontStyle": "Stile carattere", + "selectStyle": "Seleziona stile", + "size": "Dimensione", + "customFonts": "Caratteri personalizzati", + "textColor": "Colore testo", + "background": "Sfondo", + "none": "Nessuno", + "color": "Colore", + "colorWheel": "Ruota dei colori", + "colorPalette": "Tavolozza dei colori", + "clearBackground": "Rimuovi sfondo", + "uploadImage": "Carica immagine", + "supportedFormats": "Formati supportati: JPG, PNG, GIF, WebP", + "arrowDirection": "Direzione freccia", + "strokeWidth": "Larghezza tratto: {{width}}px", + "arrowColor": "Colore freccia", + "blurType": "Tipo sfocatura", + "blurTypeBlur": "Sfocatura", + "blurTypeMosaic": "Sfocatura mosaico", + "blurColor": "Colore sfocatura", + "blurColorWhite": "Bianco", + "blurColorBlack": "Nero", + "blurShape": "Forma sfocatura", + "blurIntensity": "Intensità sfocatura", + "mosaicBlockSize": "Dimensione blocco mosaico", + "blurShapeRectangle": "Rettangolo", + "blurShapeOval": "Ovale", + "blurShapeFreehand": "A mano libera", + "deleteAnnotation": "Elimina annotazione", + "shortcutsAndTips": "Scorciatoie e suggerimenti", + "tipMovePlayhead": "Sposta la testina di riproduzione sulla sezione di annotazione sovrapposta e seleziona un elemento.", + "tipTabCycle": "Usa Tab per scorrere gli elementi sovrapposti.", + "tipShiftTabCycle": "Usa Maiusc+Tab per scorrere all'indietro.", + "invalidImageType": "Tipo di file non valido", + "imageFormatsOnly": "Carica un file immagine JPG, PNG, GIF o WebP.", + "imageUploadSuccess": "Immagine caricata con successo!", + "failedImageUpload": "Impossibile caricare l'immagine" + }, + "fontStyles": { + "classic": "Classico", + "editor": "Editor", + "strong": "Forte", + "typewriter": "Macchina da scrivere", + "deco": "Deco", + "simple": "Semplice", + "modern": "Moderno", + "clean": "Pulito" + }, + "customFont": { + "dialogTitle": "Aggiungi font Google", + "urlLabel": "URL importazione Google Fonts", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "urlHelp": "Ottieni questo da Google Fonts: Seleziona un font → Clicca \"Ottieni font\" → Copia l'URL @import", + "nameLabel": "Nome visualizzato", + "namePlaceholder": "Il mio font personalizzato", + "nameHelp": "Così apparirà il font nel selettore", + "addButton": "Aggiungi font", + "addingButton": "Aggiunta in corso...", + "errorEmptyUrl": "Inserisci un URL di importazione Google Fonts", + "errorInvalidUrl": "Inserisci un URL Google Fonts valido", + "errorEmptyName": "Inserisci un nome per il font", + "errorExtractFailed": "Impossibile estrarre la famiglia di font dall'URL", + "successMessage": "Font \"{{fontName}}\" aggiunto con successo", + "failedToAdd": "Impossibile aggiungere il font", + "errorTimeout": "Il font ha impiegato troppo tempo a caricarsi. Controlla l'URL e riprova.", + "errorLoadFailed": "Impossibile caricare il font. Verifica che l'URL di Google Fonts sia corretto." + }, + "cursor": { + "show": "Mostra cursore", + "size": "Dimensione", + "smoothing": "Smussatura", + "motionBlur": "Sfocatura movimento", + "clickBounce": "Rimbalzo clic", + "clipToBounds": "Ritaglia al canvas" + }, + "language": { + "title": "Lingua" + } +} diff --git a/src/i18n/locales/it/shortcuts.json b/src/i18n/locales/it/shortcuts.json new file mode 100644 index 0000000..4d0c65d --- /dev/null +++ b/src/i18n/locales/it/shortcuts.json @@ -0,0 +1,37 @@ +{ + "title": "Scorciatoie tastiera", + "customize": "Personalizza", + "configurable": "Configurabile", + "fixed": "Fisso", + "pressKey": "Premi un tasto…", + "clickToChange": "Clicca per cambiare", + "pressEscToCancel": "Premi Esc per annullare", + "helpText": "Clicca una scorciatoia e premi la nuova combinazione di tasti. Premi Esc per annullare.", + "resetToDefaults": "Ripristina predefiniti", + "alreadyUsedBy": "Già utilizzata da {{action}}", + "swap": "Scambia", + "reservedShortcut": "Questa scorciatoia è riservata a \"{{label}}\" e non può essere riassegnata.", + "savedToast": "Scorciatoie tastiera salvate", + "resetToast": "Ripristino alle scorciatoie predefinite — clicca Salva per applicare", + "actions": { + "addZoom": "Aggiungi zoom", + "addTrim": "Aggiungi taglio", + "addSpeed": "Aggiungi velocità", + "addAnnotation": "Aggiungi annotazione", + "addBlur": "Aggiungi sfocatura", + "addKeyframe": "Aggiungi fotogramma chiave", + "deleteSelected": "Elimina selezionato", + "playPause": "Riproduci / Pausa" + }, + "fixedActions": { + "undo": "Annulla", + "redo": "Ripeti", + "cycleAnnotationsForward": "Scorri annotazioni in avanti", + "cycleAnnotationsBackward": "Scorri annotazioni indietro", + "deleteSelectedAlt": "Elimina selezionato (alt)", + "panTimeline": "Panoramica timeline", + "zoomTimeline": "Zoom timeline", + "frameBack": "Fotogramma indietro", + "frameForward": "Fotogramma avanti" + } +} diff --git a/src/i18n/locales/it/timeline.json b/src/i18n/locales/it/timeline.json new file mode 100644 index 0000000..499a39a --- /dev/null +++ b/src/i18n/locales/it/timeline.json @@ -0,0 +1,55 @@ +{ + "buttons": { + "addZoom": "Aggiungi zoom (Z)", + "suggestZooms": "Suggerisci zoom dal cursore", + "addTrim": "Aggiungi taglio (T)", + "addAnnotation": "Aggiungi annotazione (A)", + "addBlur": "Aggiungi sfocatura (B)", + "addSpeed": "Aggiungi velocità (S)" + }, + "hints": { + "pressZoom": "Premi Z per aggiungere zoom", + "pressTrim": "Premi T per aggiungere taglio", + "pressAnnotation": "Premi A per aggiungere annotazione", + "pressBlur": "Premi B per aggiungere regione sfocatura", + "pressSpeed": "Premi S per aggiungere velocità" + }, + "labels": { + "pan": "Panoramica", + "zoom": "Zoom", + "trim": "Taglio", + "speed": "Velocità", + "zoomItem": "Zoom {{index}}", + "trimItem": "Taglio {{index}}", + "speedItem": "Velocità {{index}}", + "annotationItem": "Annotazione", + "blurItem": "Sfocatura {{index}}", + "imageItem": "Immagine", + "emptyText": "Testo vuoto" + }, + "emptyState": { + "noVideo": "Nessun video caricato", + "dragAndDrop": "Trascina e rilascia un video per iniziare a modificare" + }, + "errors": { + "cannotPlaceZoom": "Impossibile posizionare lo zoom qui", + "zoomExistsAtLocation": "Lo zoom esiste già in questa posizione o non c'è spazio sufficiente.", + "zoomSuggestionUnavailable": "Gestore suggerimenti zoom non disponibile", + "noCursorTelemetry": "Nessuna telemetria del cursore disponibile", + "noCursorTelemetryDescription": "Registra prima uno screencast per generare suggerimenti basati sul cursore.", + "noUsableTelemetry": "Nessuna telemetria del cursore utilizzabile", + "noUsableTelemetryDescription": "La registrazione non include dati sufficienti sul movimento del cursore.", + "noDwellMoments": "Nessun momento di sosta del cursore trovato", + "noDwellMomentsDescription": "Prova una registrazione con pause del cursore più lente sulle azioni importanti.", + "noAutoZoomSlots": "Nessuno slot di zoom automatico disponibile", + "noAutoZoomSlotsDescription": "I punti di sosta rilevati si sovrappongono alle regioni zoom esistenti.", + "cannotPlaceTrim": "Impossibile posizionare il taglio qui", + "trimExistsAtLocation": "Il taglio esiste già in questa posizione o non c'è spazio sufficiente.", + "cannotPlaceSpeed": "Impossibile posizionare la velocità qui", + "speedExistsAtLocation": "La regione velocità esiste già in questa posizione o non c'è spazio sufficiente." + }, + "success": { + "addedZoomSuggestions": "Aggiunto {{count}} suggerimento zoom basato sul cursore", + "addedZoomSuggestionsPlural": "Aggiunti {{count}} suggerimenti zoom basati sul cursore" + } +}