* feat(code): isolate Design JSX execution - Transform JSX with the existing Sucrase dependency and execute it in a disposable opaque-origin iframe worker - Block ambient network capabilities and enforce source, timeout, output, depth, and element limits - Validate that only bounded plain structured data returns to the application * feat(code): add editable Design JSX - Add a lazy CodeMirror editor with JSX syntax support, completion, diagnostics, and bounded scrolling - Convert validated sandbox output into trusted Design JSX helpers before rendering - Apply or insert JSX as one undoable graph transaction while preserving dirty drafts * feat(code): localize JSX editor actions - Add translated-message fallbacks for editing, applying, inserting, and draft state - Document the editable JSX workflow in the unreleased changelog * fix(code): satisfy typed sandbox validation - Keep the sandbox document terminator literal and preserve optional selection handling under type-aware lint * test(code): resolve sandbox probes through app aliases * fix(code): bound sandbox results before cloning - Enforce string, array, object, depth, element, and byte limits inside the disposable worker - Retain host-side validation as a second structured-data boundary * fix(code): keep JSX and HTML editing modes separate - Switch generated Tailwind output back to OpenPencil JSX before editing - Close the JSX editor when opening HTML/CSS import and avoid stacking both editors * feat(code): support authored Design JSX programs - Allow local constants, function components, arrays, conditionals, fragments, and multiple roots - Preserve replacement positions for multiple selected roots and reject mixed-parent or locked selections - Cover multi-root undo, redo, and all-or-nothing rollback * feat(code): add explicit JSX view mode - Let authors leave CodeMirror without applying a draft - Keep the editable surface and HTML/CSS importer mutually exclusive * feat(code): diagnose unknown JSX vocabulary - Warn on OpenPencil elements and properties that are absent from the canonical schema - Surface diagnostics inline through CodeMirror lint markers * test(code): accept WebKit isolation diagnostics - Cover the sandbox architecture against Playwright WebKit - Accept engine-specific wording while preserving the same unavailable-window assertion * refactor(code): consolidate Design JSX vocabulary - Drive renderer warnings, completion, and diagnostics from one supported-property schema - Recognize locally declared components and add focused schema and transform tests - Replace CodeMirror basicSetup with an explicit feature set and remove the umbrella package * fix(code): support Design JSX variable helpers * refactor(code): unify JSX sandbox validation * fix(code): account for complete sandbox output * fix(code): preserve locked JSX descendants * fix(code): preserve JSX sibling order * fix(code): recompute JSX parent layouts * feat(code): add live code previews * test(code): centralize graph assertions * fix(code): harden live preview sessions * docs: describe live code editing * fix(code): update editor accessibility labels * fix(code): use theme-aware error colors * fix(dev): stop Vite disconnect error loops * fix(code): clarify live preview status * fix(ui): avoid tooltip attribute warnings * test(code): assert semantic preview status * refactor(code): remove obsolete editor messages * fix(code): harden preview concurrency and isolation * fix(code): cancel stale reset previews
292 lines
15 KiB
JSON
292 lines
15 KiB
JSON
{
|
||
"cancel": "Annulla",
|
||
"apply": "Applica",
|
||
"close": "Chiudi",
|
||
"recoverUnsavedWork": "Recupera il lavoro non salvato",
|
||
"recoverUnsavedWorkDescription": "OpenPencil ha trovato documenti di una sessione precedente.",
|
||
"restore": "Ripristina",
|
||
"discard": "Scarta",
|
||
"recoveryFailed": "Impossibile ripristinare questo documento.",
|
||
"rename": "Rinomina",
|
||
"renameLayers": "Rinomina {count} livelli",
|
||
"renamePreview": "Anteprima",
|
||
"renameMatch": "Corrispondenza",
|
||
"renameTo": "Rinomina in",
|
||
"renameCurrentName": "Nome attuale",
|
||
"renameNumberAscending": "Numero ↑",
|
||
"renameNumberDescending": "Numero ↓",
|
||
"renameStartAscendingFrom": "Inizia ordine crescente da",
|
||
"renameStopDescendingAt": "Termina ordine decrescente a",
|
||
"renameInvalidPattern": "Espressione regolare non valida",
|
||
"ok": "OK",
|
||
"copy": "Copia",
|
||
"copied": "Copiato",
|
||
"createCollection": "Crea raccolta",
|
||
"localVariables": "Variabili locali",
|
||
"noVariableCollections": "Nessuna raccolta di variabili",
|
||
"connectAIProvider": "Collega un provider AI per iniziare a chattare.",
|
||
"connect": "Connetti",
|
||
"testConnection": "Verifica connessione",
|
||
"testingConnection": "Verifica in corso…",
|
||
"connectionTestSuccess": "Connessione riuscita. Il modello è raggiungibile.",
|
||
"connectionTestMissingAPIKey": "Inserisci una chiave API prima della verifica.",
|
||
"connectionTestMissingBaseURL": "Inserisci un URL di base prima della verifica.",
|
||
"connectionTestMissingModel": "Inserisci un ID modello prima della verifica.",
|
||
"connectionTestInvalidBaseURL": "L’URL di base non è valido. Usa un URL completo come https://api.example.com/v1.",
|
||
"connectionTestAuthFailed": "Autenticazione non riuscita. Controlla la chiave API.",
|
||
"connectionTestInsufficientCredit": "L’account del provider non dispone di credito o quota sufficiente. Ricaricalo e riprova.",
|
||
"connectionTestModelNotFound": "Modello non trovato. Controlla l’ID modello.",
|
||
"connectionTestAPITypeMismatch": "Questo endpoint non sembra supportare il tipo di API selezionato. Prova Completions o Responses.",
|
||
"connectionTestBrowserNetworkFailed": "Impossibile raggiungere questo endpoint dal browser. Prova l’app desktop o usa un endpoint con CORS abilitato.",
|
||
"connectionTestNetworkFailed": "Impossibile raggiungere l’endpoint. Controlla l’URL e la connessione di rete.",
|
||
"connectionTestUnknownFailed": "Verifica della connessione non riuscita. Controlla le impostazioni del provider e riprova.",
|
||
"getAPIKey": "Ottieni una chiave API {provider} →",
|
||
"oneKeyManyModels": "Una chiave per oltre 100 modelli di tutti i provider.",
|
||
"describeChange": "Descrivi una modifica…",
|
||
"describeCreateOrChange": "Descrivi cosa vuoi creare o cambiare.",
|
||
"stopGenerating": "Interrompi generazione",
|
||
"sendMessage": "Invia messaggio",
|
||
"baseURLPlaceholder": "Base URL (es. http://localhost:11434/v1)",
|
||
"modelIDPlaceholder": "Model ID (es. llama-3.3-70b)",
|
||
"yourName": "Il tuo nome",
|
||
"enterYourName": "Inserisci il tuo nome",
|
||
"shareThisFile": "Condividi questo file",
|
||
"joinRoom": "Entra nella stanza",
|
||
"join": "Entra",
|
||
"roomLink": "Link della stanza",
|
||
"joinCollaboration": "Partecipa alla collaborazione",
|
||
"orJoinRoom": "o entra in una stanza",
|
||
"pasteRoomLinkOrId": "Incolla il link o l'ID della stanza",
|
||
"connected": "Connesso",
|
||
"search": "Cerca…",
|
||
"noResults": "Nessun risultato",
|
||
"share": "Condividi",
|
||
"appUpToDate": "OpenPencil è aggiornato",
|
||
"updateAvailableTitle": "Aggiorna OpenPencil",
|
||
"updateAvailable": "OpenPencil {version} è disponibile.",
|
||
"updateInstallPrompt": "Scaricare e installare ora? L’app verrà riavviata dopo l’installazione dell’aggiornamento.",
|
||
"downloadingUpdate": "Download di OpenPencil {version}",
|
||
"updateInstalledTitle": "Aggiornamento installato",
|
||
"updateInstalled": "OpenPencil {version} è stato installato{size}. Riavvio in corso.",
|
||
"updateCheckFailed": "Impossibile controllare gli aggiornamenti: {error}",
|
||
"updateUnavailable": "Gli aggiornamenti non sono ancora disponibili. Pubblica prima una release firmata con latest.json.",
|
||
"renameCollection": "Rinomina raccolta",
|
||
"deleteCollection": "Elimina raccolta",
|
||
"modes": "Modalita",
|
||
"addMode": "Aggiungi modalita",
|
||
"renameMode": "Rinomina modalita",
|
||
"duplicateMode": "Duplica modalita",
|
||
"deleteMode": "Elimina modalita",
|
||
"setDefaultMode": "Imposta come predefinita",
|
||
"aiProvider": "AI Provider",
|
||
"providerSettings": "Provider settings",
|
||
"openProviderSettings": "Apri impostazioni provider",
|
||
"settings": "Impostazioni",
|
||
"settingsDescription": "Gestisci integrazioni e preferenze dell’app.",
|
||
"settingsAIAndAgents": "IA e agenti",
|
||
"models": "Modelli",
|
||
"modelsDescription": "Configura modelli riutilizzabili e le connessioni ai provider.",
|
||
"mcpConnections": "Connessioni MCP",
|
||
"mcpConnectionsDescription": "Consenti agli agenti ACP di accedere a strumenti e servizi remoti attendibili.",
|
||
"addConnection": "Aggiungi connessione",
|
||
"addMCPConnection": "Aggiungi connessione MCP",
|
||
"editMCPConnection": "Modifica connessione MCP",
|
||
"mcpConnectionEditorDescription": "Configura un server Streamable HTTP e l’autenticazione facoltativa.",
|
||
"connectionName": "Nome connessione",
|
||
"mcpServerURL": "URL server MCP",
|
||
"enableMCPConnection": "Abilita per gli agenti ACP",
|
||
"mcpBearerAuthentication": "Usa autenticazione Bearer",
|
||
"mcpBearerToken": "Token Bearer",
|
||
"mcpBearerTokenPlaceholder": "Inserisci il token Bearer",
|
||
"mcpBearerTokenRequired": "Inserisci un token Bearer prima di abilitare questa connessione.",
|
||
"deleteMCPConnection": "Elimina connessione",
|
||
"deleteMCPConnectionDescription": "Eliminare questa connessione MCP e il token Bearer salvato?",
|
||
"noMCPConnections": "Nessuna connessione MCP esterna configurata.",
|
||
"addModel": "Aggiungi modello",
|
||
"editModel": "Modifica modello",
|
||
"modelEditorDescription": "Provider, modello, credenziali e funzionalità.",
|
||
"modelName": "Nome",
|
||
"modelConfiguration": "Modello",
|
||
"connectionSettings": "Connessione",
|
||
"modelCapabilities": "Funzionalità",
|
||
"modelCapabilitiesDetected": "Rilevate dal modello selezionato.",
|
||
"modelCapabilitiesManual": "Dichiara la compatibilità di questo modello personalizzato.",
|
||
"modelCapabilityTools": "Chiamate agli strumenti",
|
||
"modelCapabilityVision": "Input immagini",
|
||
"modelCapabilityToolsShort": "Strumenti",
|
||
"modelCapabilityVisionShort": "Visione",
|
||
"selectDesignModel": "Seleziona modello di progettazione",
|
||
"modelNeedsCredential": "Chiave necessaria",
|
||
"modelAgentConnection": "Agente",
|
||
"saveModel": "Salva modello",
|
||
"deleteModel": "Elimina modello",
|
||
"deleteModelDescription": "Eliminare questo modello e le relative assegnazioni?",
|
||
"modelAssignments": "Assegnazioni",
|
||
"modelAssignmentsDescription": "Scegli quale modello gestisce ogni tipo di attività.",
|
||
"modelRoleDesign": "Agente di design",
|
||
"modelRoleReview": "Revisione",
|
||
"modelRoleFast": "Attività rapide",
|
||
"modelRoleVision": "Visione",
|
||
"modelRoleDesignDescription": "Chat IA e modifiche alla tela",
|
||
"modelRoleReviewDescription": "Revisioni esplicite di piani e design",
|
||
"modelRoleFastDescription": "Attività economiche in background",
|
||
"modelRoleVisionDescription": "Screenshot e riferimenti visivi",
|
||
"modelRoleUseDesign": "Come Design",
|
||
"noModel": "Nessuno",
|
||
"back": "Indietro",
|
||
"settingsMedia": "Media",
|
||
"vectorization": "Vettorializzazione immagini",
|
||
"vectorizationDescription": "Invia i livelli immagine a Recraft o fal.ai e restituisce vettori modificabili. Potrebbero essere applicati costi.",
|
||
"vectorizeProvider": "Servizio di vettorializzazione",
|
||
"settingsStorage": "Archiviazione cloud",
|
||
"storageWorkspace": "Area di archiviazione",
|
||
"openStorageWorkspace": "Apri area",
|
||
"newStoredDocument": "Nuovo documento",
|
||
"emptyStorageWorkspace": "Nessun documento archiviato.",
|
||
"loadingDocuments": "Caricamento documenti…",
|
||
"storageNotConfigured": "Configura l’archiviazione prima di usare quest’area.",
|
||
"copyStorageCors": "Copia JSON CORS",
|
||
"storageEndpoint": "Endpoint",
|
||
"storageBucket": "Bucket",
|
||
"storageRegion": "Regione",
|
||
"storageAccessKeyID": "ID chiave di accesso",
|
||
"storageSecretAccessKey": "Chiave di accesso segreta",
|
||
"save": "Salva",
|
||
"credentialStorage": "Credenziali: {backend}",
|
||
"credentialBackendNative": "portachiavi di sistema",
|
||
"credentialBackendBrowser": "archiviazione browser crittografata",
|
||
"credentialBackendMemory": "solo questa sessione",
|
||
"rememberCredentials": "Ricorda le credenziali in questo browser",
|
||
"done": "Done",
|
||
"apiKey": "API Key",
|
||
"apiType": "API Type",
|
||
"baseURL": "Base URL",
|
||
"modelID": "Model ID",
|
||
"customModelID": "ID modello personalizzato",
|
||
"customModel": "Modello personalizzato…",
|
||
"advancedModelSettings": "Impostazioni avanzate",
|
||
"outputLimit": "Limite di output",
|
||
"outputLimitAutomatic": "Raccomandazione automatica",
|
||
"reasoningEffort": "Impegno di ragionamento",
|
||
"reasoningEffortPlaceholder": "es. low, high, none",
|
||
"reasoningEffortDescription": "Valore facoltativo specifico del provider.",
|
||
"supported": "Supportato",
|
||
"unsupported": "Non supportato",
|
||
"tokens": "token",
|
||
"maxOutputTokens": "Token di output massimi",
|
||
"chatInsufficientCredit": "L’account del provider non dispone di credito o quota sufficiente. Ricaricalo e riprova.",
|
||
"chatOutputLimit": "Il modello ha esaurito i token di output durante il ragionamento. Aumenta i token di output massimi o riduci lo sforzo di ragionamento.",
|
||
"chatRequestFailed": "La richiesta al modello non è riuscita. Controlla le impostazioni del provider e riprova.",
|
||
"clear": "Clear",
|
||
"keySavedReplace": "Key saved — enter new to replace",
|
||
"getAPIKeyGeneric": "Get API key →",
|
||
"pexelsAPIKey": "Pexels API Key (stock photos)",
|
||
"unsplashAccessKey": "Unsplash Access Key",
|
||
"stockPhotoToolOptional": "Optional — for stock_photo tool",
|
||
"pexelsAlternativeOptional": "Optional — alternative to Pexels",
|
||
"getPexelsAPIKey": "Get free Pexels API key →",
|
||
"getUnsplashAccessKey": "Get free Unsplash access key →",
|
||
"completions": "Completions",
|
||
"responses": "Responses",
|
||
"copiedExclamation": "Copiato!",
|
||
"copyMessage": "Copia messaggio",
|
||
"copyJSXReference": "Copia riferimento props JSX negli appunti",
|
||
"jsxUpToDate": "Up to date",
|
||
"newTab": "Nuova scheda",
|
||
"closeTab": "Chiudi {name}",
|
||
"showUI": "Mostra interfaccia ({shortcut})",
|
||
"fontSettings": "Impostazioni font",
|
||
"fontIssueFound": "Uno stile di font non è disponibile o è stato sostituito",
|
||
"fontIssuesFound": "{count} stili di font non sono disponibili o sono stati sostituiti",
|
||
"selectAffectedLayers": "Seleziona livelli",
|
||
"retryFonts": "Riprova i font",
|
||
"retryingFonts": "Nuovo tentativo…",
|
||
"expandFontIssues": "Mostra problemi dei font",
|
||
"collapseFontIssues": "Nascondi problemi dei font",
|
||
"noFontSubstitute": "nessun sostituto disponibile",
|
||
"affectedLayer": "1 livello interessato",
|
||
"affectedLayerCount": "{count} livelli interessati",
|
||
"fontSettingsDesktopDescription": "Accedi ai font di sistema, ai provider online, ai pacchetti di fallback e ai download nella cache.",
|
||
"fontSettingsBrowserDescription": "Consenti al browser di accedere ai font locali e gestisci i provider di font online.",
|
||
"localFonts": "Font locali",
|
||
"onlineFonts": "Font online",
|
||
"downloadedCache": "Cache scaricata",
|
||
"lastUpdated": "Ultimo aggiornamento",
|
||
"enabled": "Abilitato",
|
||
"disabled": "Disabilitato",
|
||
"denied": "Negato",
|
||
"unavailable": "Non disponibile",
|
||
"notRequested": "Non richiesto",
|
||
"never": "Mai",
|
||
"systemFontAccess": "Accesso ai font di sistema",
|
||
"systemFontsAvailable": "I font di sistema sono disponibili.",
|
||
"allowBrowserFontAccess": "Consenti l’accesso ai font del browser quando mancano font di sistema.",
|
||
"allow": "Consenti",
|
||
"requesting": "Richiesta…",
|
||
"onlineFontProviders": "Provider di font online",
|
||
"downloadMissingWebFonts": "Scarica i font web mancanti tramite i provider abilitati.",
|
||
"webFontProvidersRequireDesktopApp": "I cataloghi dei provider di font online non sono disponibili nell’app web. Scarica l’app desktop per sfogliare e caricare i font dei provider.",
|
||
"clipboardImageUnavailableWeb": "Il design incollato contiene 1 immagine che non può essere caricata nell’app web. Usa l’app desktop per includerla.",
|
||
"clipboardImagesUnavailableWeb": "Il design incollato contiene {count} immagini che non possono essere caricate nell’app web. Usa l’app desktop per includerle.",
|
||
"clipboardImageFetchFailed": "Impossibile recuperare 1 immagine da Figma. Controlla che il file sorgente sia accessibile e riprova.",
|
||
"clipboardImagesFetchFailed": "Impossibile recuperare {count} immagini da Figma. Controlla che il file sorgente sia accessibile e riprova.",
|
||
"enable": "Abilita",
|
||
"disable": "Disabilita",
|
||
"fallbackPacks": "Pacchetti di fallback",
|
||
"downloadFallbackPacksDescription": "Scarica fallback CJK e arabi prima di aprire file che li richiedono.",
|
||
"download": "Scarica",
|
||
"downloading": "Download…",
|
||
"refresh": "Aggiorna",
|
||
"clearCache": "Svuota cache",
|
||
"localFontAccessEnabled": "Accesso ai font locali abilitato.",
|
||
"localFontAccessNotGranted": "Accesso ai font locali non concesso.",
|
||
"onlineFontProvidersEnabled": "Provider di font online abilitati.",
|
||
"onlineFontProvidersDisabled": "Provider di font online disabilitati.",
|
||
"fontProviderEnabled": "{provider} abilitato.",
|
||
"fontProviderDisabled": "{provider} disabilitato.",
|
||
"fallbackFontsDownloaded": "Font di fallback scaricati.",
|
||
"fallbackFontsDownloadFailed": "Impossibile scaricare i font di fallback.",
|
||
"downloadedFontCacheCleared": "Cache dei font scaricati svuotata.",
|
||
"downloadedFontCacheClearFailed": "Impossibile svuotare la cache dei font scaricati.",
|
||
"you": "Tu",
|
||
"youSuffix": "tu",
|
||
"followingPeerStop": "Segui {name} (clic per interrompere)",
|
||
"clickToFollowPeer": "Fai clic per seguire {name}",
|
||
"importLabel": "Importa",
|
||
"importHTMLCSS": "Importa HTML/CSS",
|
||
"importHTMLCSSDescription": "Incolla HTML con CSS facoltativo o CSS Tailwind compilato.",
|
||
"paste": "Incolla",
|
||
"importFailed": "Importazione non riuscita. Controlla l’HTML e il CSS e riprova.",
|
||
"importReplacesDocument": "L’importazione sostituisce il documento corrente.",
|
||
"importing": "Importazione…",
|
||
"importToCanvas": "Importa nell’area di lavoro",
|
||
"inThisRoom": "In questa stanza",
|
||
"disconnect": "Disconnetti",
|
||
"toolFinished": "Fine",
|
||
"unknownTool": "Strumento sconosciuto",
|
||
"permissionRequest": "{tool} richiede l’autorizzazione.",
|
||
"mobilePanelNavigation": "Navigazione pannello mobile",
|
||
"toolOptions": "Opzioni di {tool}",
|
||
"removeGradientStop": "Rimuovi punto sfumatura",
|
||
"notifications": "Notifiche",
|
||
"saveAsPrompt": "Salva con nome:",
|
||
"browserFileAPINotSupported": "Il browser non supporta l’API dei file locali. I file verranno scaricati anziché salvati nella posizione corrente.",
|
||
"useChrome": "Usa Chrome",
|
||
"orEdgeForFullSupport": "o Edge per il supporto completo.",
|
||
"dismiss": "Chiudi",
|
||
"toolRunning": "Esecuzione…",
|
||
"toolError": "Errore",
|
||
"permissionRequestTitle": "Richiesta di autorizzazione",
|
||
"codeSource": "Code source",
|
||
"codeSourceDesignJSX": "Design JSX",
|
||
"codeSourceTailwindJSX": "Tailwind JSX",
|
||
"codeSourceHTMLCSS": "HTML/CSS",
|
||
"codeEditorDesignLabel": "Design JSX",
|
||
"codeEditorHTMLCSSLabel": "HTML and CSS",
|
||
"codeUpdating": "Updating…",
|
||
"codeUpdatedLive": "Updated live",
|
||
"codePreviewFailed": "Preview failed",
|
||
"codeGeneratedReadOnly": "Generated, read only",
|
||
"codeReset": "Reset"
|
||
}
|