From 28e8a77fa3a54ed21d368be6f5eadb98f959c194 Mon Sep 17 00:00:00 2001 From: Francesco Lucarelli <67560467+fraluc06@users.noreply.github.com> Date: Fri, 5 Jun 2026 12:48:14 +0200 Subject: [PATCH] Fix typecheck mismatch by mapping rqlite to sqlite and add Italian locale (#787) Thanks for adding Italian locale support and fixing the rqlite dialect mapping, @fraluc06! --- apps/desktop/src/i18n/index.ts | 6 +- apps/desktop/src/i18n/locales/it.ts | 1958 +++++++++++++++++++++++++ apps/desktop/src/lib/localeOptions.ts | 1 + 3 files changed, 1963 insertions(+), 2 deletions(-) create mode 100644 apps/desktop/src/i18n/locales/it.ts diff --git a/apps/desktop/src/i18n/index.ts b/apps/desktop/src/i18n/index.ts index 341561bdd..dc3b16ac5 100644 --- a/apps/desktop/src/i18n/index.ts +++ b/apps/desktop/src/i18n/index.ts @@ -2,19 +2,20 @@ import { createI18n } from "vue-i18n"; import zhCN from "./locales/zh-CN"; import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage"; -export type Locale = "en" | "es" | "zh-CN" | "zh-TW"; +export type Locale = "en" | "es" | "it" | "zh-CN" | "zh-TW"; type LocaleMessages = Record; type I18nGlobal = { locale: { value: Locale }; setLocaleMessage: (locale: Locale, messages: LocaleMessages) => void; }; -const supportedLocales: Locale[] = ["en", "es", "zh-CN", "zh-TW"]; +const supportedLocales: Locale[] = ["en", "es", "it", "zh-CN", "zh-TW"]; const defaultLocale: Locale = "zh-CN"; const loadedLocales = new Set([defaultLocale]); const localeLoaders: Record, () => Promise<{ default: LocaleMessages }>> = { en: () => import("./locales/en"), es: () => import("./locales/es"), + it: () => import("./locales/it"), "zh-TW": () => import("./locales/zh-TW"), }; @@ -41,6 +42,7 @@ export function localeFromLanguageTag(value: string | null | undefined): Locale } if (normalized === "en" || normalized.startsWith("en-")) return "en"; if (normalized === "es" || normalized.startsWith("es-")) return "es"; + if (normalized === "it" || normalized.startsWith("it-")) return "it"; return null; } diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts new file mode 100644 index 000000000..414ad54a1 --- /dev/null +++ b/apps/desktop/src/i18n/locales/it.ts @@ -0,0 +1,1958 @@ +export default { + app: { + name: "DBX", + }, + auth: { + setupTitle: "Imposta la password di accesso", + setupDescription: "Imposta una password per proteggere la tua istanza", + loginDescription: "Strumento di gestione del database", + newPassword: "Inserisci la nuova password", + confirmPassword: "Conferma la password", + enterPassword: "Inserisci la password di accesso", + passwordMismatch: "Le password non corrispondono", + setPassword: "Imposta Password", + login: "Accedi", + processing: "Elaborazione...", + loginFailed: "Password errata", + connectFailed: "Connessione non riuscita", + changePassword: "Cambia Password", + oldPassword: "Password attuale", + oldPasswordWrong: "La password attuale non è corretta", + passwordChanged: "Password modificata con successo", + changePasswordFailed: "Impossibile modificare la password", + changePasswordDescription: "Inserisci la password attuale e scegline una nuova", + }, + toolbar: { + newConnection: "Nuova Connessione", + newQuery: "Nuova Query", + execute: "Esegui", + executeShortcut: "Esegui selezione/query (Cmd+Enter)", + stopQuery: "Interrompi query", + explainPlan: "Spiega piano", + stopExplain: "Interrompi spiegazione", + formatSql: "Formatta SQL", + formatSqlFailed: "Impossibile formattare SQL", + saveSql: "Salva nella Libreria SQL", + openSql: "Apri file SQL", + theme: "Tema", + themeLight: "Chiaro", + themeDark: "Scuro", + themeSystem: "Segui Sistema", + sqlSaved: "SQL salvato", + sqlOpenFailed: "Impossibile aprire il file: {message}", + sqlSaveFailed: "Impossibile salvare il file: {message}", + driverManager: "Gestione Driver", + updatableDriverCount: "Driver aggiornabili", + }, + updates: { + title: "Aggiornamenti", + check: "Verifica aggiornamenti", + availableTitle: "Aggiornamento disponibile", + availableMessage: "DBX {latest} è disponibile. Stai usando la versione {current}.", + upToDate: "DBX è aggiornato ({version}).", + failed: "Verifica aggiornamenti non riuscita: {error}", + rateLimited: + "Le verifiche degli aggiornamenti di GitHub sono temporaneamente limitate. Puoi comunque aprire la pagina delle release per verificare manualmente.", + openRelease: "Apri Release", + downloadAndInstall: "Scarica e Installa", + portableManualUpdate: + "Le build portatili non possono utilizzare l'installer in-app. Scarica lo ZIP portatile dalla pagina delle release, quindi estrailo nella cartella DBX corrente per mantenere portable.dbx e i dati.", + downloading: "Download in corso {progress}%", + downloadFailed: "Download dell'aggiornamento non riuscito: {error}", + restart: "Esci e Riavvia", + restartFailed: "Impossibile riavviare l'app: {error}", + exitAndUpdate: "Esci e Aggiorna", + reopenHint: "L'applicazione si riavvierà per completare l'aggiornamento", + dockerUsersRun: "Gli utenti Docker dovrebbero eseguire", + toUpdate: "per aggiornare", + }, + sidebar: { + connections: "CONNESSIONI", + noConnections: "Nessuna connessione", + import: "Importa Connessioni", + importDbx: "Importa Configurazione DBX", + importNavicat: "Importa Navicat NCX", + importDbeaver: "Importa DBeaver", + export: "Esporta Connessioni", + collapse: "Riduci barra laterale", + expand: "Espandi barra laterale", + showMore: "Mostra altri {count}...", + filterByType: "Filtra per tipo", + searchScopeConnection: "Connessione", + searchScopeDatabase: "Database", + searchScopeSchema: "Schema", + searchScopeTable: "Tabella", + searchScopeView: "Vista", + clearFilter: "Cancella filtro", + locateActiveTab: "Trova nella barra laterale", + }, + savedSql: { + saveToLibrary: "Salva nella Libreria SQL", + save: "Salva", + saved: "SQL salvato", + saveFailed: "Impossibile salvare SQL: {message}", + fileName: "Nome file", + folder: "Cartella", + rootFolder: "Libreria SQL", + newFolder: "Nuova Cartella SQL", + newFolderDefault: "Nuova Cartella", + renameFolder: "Rinomina Cartella", + deleteFolder: "Elimina Cartella", + deleteFolderConfirm: "Eliminare “{name}” e tutti i file SQL al suo interno?", + open: "Apri SQL", + renameFile: "Rinomina SQL", + deleteFile: "Elimina SQL", + deleteFileConfirm: "Eliminare “{name}”?", + }, + connection: { + title: "Nuova Connessione", + name: "Nome", + namePlaceholder: "Nome connessione, generato automaticamente se vuoto", + type: "Tipo", + host: "Host", + filePath: "Percorso File", + createDuckDbFile: "Crea file DuckDB", + memoryDatabasePathHint: "Usa :memory: per creare un database SQLite o DuckDB in memoria.", + sqliteExtensions: "Estensioni SQLite", + sqliteExtensionsPlaceholder: "/percorso/per/regexp.dylib\n/percorso/per/text.dylib|sqlite3_text_init", + sqliteExtensionsHint: + "Una .dylib/.so/.dll per riga. Usa “percorso|punto di ingresso” quando è richiesto un punto di ingresso. Caricata alla connessione, poi load_extension viene disabilitata.", + sqliteExtensionBrowse: "Seleziona estensione SQLite", + user: "Utente", + password: "Password", + database: "Database", + databasePlaceholder: "Opzionale", + databasePlaceholderWithDefault: "Opzionale, predefinito {database}", + defaultDatabase: "DB Predefinito", + authDatabase: "DB di Autenticazione", + authDatabasePlaceholder: "Opzionale, spesso admin", + authMechanism: "Meccanismo di Autenticazione", + authMechanismDefault: "Predefinito", + serviceName: "Servizio/SID", + serviceNameOnly: "Nome Servizio", + version: "Versione", + driverInstallHintPrefix: "Installa il driver richiesto da ", + driverInstallHintSuffix: " nella barra degli strumenti superiore prima di connetterti.", + driverName: "Nome Driver", + driverNamePlaceholder: "Nome del fornitore o dell'ambiente", + urlParams: "Parametri URL", + sslEnable: "Abilita connessione crittografata", + caCertPath: "Certificato CA", + caCertPathPlaceholder: "Opzionale, es. ~/.yandex/RootCA.crt", + caCertPathBrowse: "Sfoglia certificato", + redisTlsInsecure: "Salta verifica certificato", + redisTlsInsecureHint: "Equivalente a redis-cli --tls --insecure, per certificati auto-firmati o CA private.", + mysqlTlsMode: "Modalità TLS", + mysqlTlsModePreferred: "Preferita", + mysqlTlsModeDisabled: "Disabilitata", + mysqlTlsModeRequired: "Richiesta", + mysqlTlsModeVerifyCa: "Verifica CA", + mysqlTlsModeVerifyIdentity: "Verifica Identità", + mysqlCaCertHint: + "Richiesto per Verifica CA e Verifica Identità quando il certificato del server usa una CA privata.", + mysqlClientCert: "Autenticazione Client", + mysqlClientCertPlaceholder: "/percorso/per/client.crt", + mysqlClientKeyPlaceholder: "/percorso/per/client.key", + mysqlClientCertHint: + "Il certificato client e la chiave privata devono essere forniti insieme quando MySQL richiede mTLS.", + mysqlClientCertBrowse: "Scegli certificato client", + mysqlClientKeyBrowse: "Scegli chiave privata client", + postgresSslMode: "Modalità TLS", + postgresSslModeDisable: "Disabilita", + postgresSslModePrefer: "Preferisci", + postgresSslModeRequire: "Richiedi", + postgresSslModeVerifyCa: "Verifica CA", + postgresSslModeVerifyFull: "Verifica Completa", + postgresServerCert: "CA Server", + postgresRootCertPlaceholder: "/percorso/per/ca.crt", + postgresRootCertHint: + "Usa questo per verifica-ca o verifica-completa quando il certificato del server è firmato da una CA privata.", + postgresRootCertBrowse: "Scegli certificato CA", + postgresClientCert: "Autenticazione Client", + postgresClientCertPlaceholder: "/percorso/per/client.crt", + postgresClientKeyPlaceholder: "/percorso/per/client.key", + postgresClientCertHint: + "Il certificato client e la chiave privata devono essere forniti insieme quando PostgreSQL richiede mTLS.", + postgresClientCertBrowse: "Scegli certificato client", + postgresClientKeyBrowse: "Scegli chiave privata client", + connectionUrlOptional: "URL (opzionale)", + connectionUrlPlaceholder: "postgresql://utente:password{'@'}host:5432/db?sslmode=require", + parseConnectionUrl: "Analizza URL di connessione", + parseConnectionUrlApplied: "URL di connessione applicato", + parseConnectionUrlFailed: "Impossibile analizzare l'URL di connessione: {message}", + mode: "Modalità Connessione", + modeForm: "Modulo", + redisStandaloneMode: "Standalone", + redisSentinelMode: "Sentinel", + redisClusterMode: "Cluster", + oceanbaseMySQLMode: "Modalità MySQL", + oceanbaseOracleMode: "Modalità Oracle", + redisFirstSentinel: "Primo Sentinel", + redisFirstClusterNode: "Primo Nodo Seed", + redisSentinelNodes: "Nodi Sentinel", + redisClusterNodes: "Nodi Seed Cluster", + redisSentinelMaster: "Nome Master", + redisSentinelUser: "Utente Sentinel", + redisSentinelPassword: "Password Sentinel", + redisSentinelTls: "TLS Sentinel", + redisSentinelTlsHint: "Usa TLS quando ti connetti ai nodi Sentinel", + searchDatabasePlaceholder: "Cerca tipi di database", + iconView: "Vista icone", + listView: "Vista elenco", + selectedDatabase: "Selezionato", + noDatabaseMatches: "Nessun database corrispondente", + next: "Avanti", + back: "Precedente", + basicTab: "Connessione", + tlsTab: "TLS/SSL", + test: "Test", + testing: "Verifica in corso...", + copyTestResult: "Copia risultato test", + saveAndConnect: "Salva & Connetti", + save: "Salva", + editTitle: "Modifica Connessione", + testSuccess: "Connessione riuscita", + connecting: "Connessione a {name}...", + connectSuccess: "Connesso a {name}", + connectFailed: "Connessione non riuscita: {message}", + driverNotInstalled: "Il driver {driver} non è installato. Installalo da Gestione Driver.", + jreNotInstalled: "Il runtime JRE {jre} non è installato. Installalo da Gestione Driver.", + systemJavaNotFound: + "Runtime Java di sistema non trovato in PATH. Installa Java o scegli un eseguibile Java personalizzato.", + customJavaPathEmpty: "Il percorso del runtime Java personalizzato è vuoto. Scegli un eseguibile Java.", + jdbcPluginNotInstalled: + "Il plugin JDBC non è installato. Installa il plugin JDBC opzionale per utilizzare questa connessione.", + lastError: "Errore di connessione", + clearError: "Cancella errore di connessione", + saveFailed: "Impossibile salvare la connessione: {message}", + deleted: "Connessione eliminata", + copied: "Copiato", + disconnected: "Disconnesso", + databaseConnectionClosed: "Connessione al database chiusa: {name}", + duplicated: "Connessione duplicata", + groupDeleted: "Gruppo eliminato", + loadFailed: "Impossibile caricare le connessioni salvate: {message}", + sshTunnel: "Tunnel SSH", + advancedTab: "Avanzate", + sshEnable: "Connetti tramite tunnel SSH", + sshHost: "Host SSH", + sshUser: "Utente SSH", + sshPassword: "Password SSH", + sshPasswordPlaceholder: "Lascia vuoto per usare la chiave", + sshKeyPath: "Percorso Chiave", + sshKeyPassphrase: "Passphrase Chiave", + sshKeyPassphrasePlaceholder: "Lascia vuoto se la chiave non è crittografata", + sshKeyPathBrowse: "Sfoglia", + sshExposeLan: "Esponi tunnel alla LAN", + sshConnectTimeout: "Timeout SSH (secondi)", + sshHops: "Hop SSH", + sshHopAdd: "Aggiungi hop", + sshHopDuplicate: "Duplica", + sshHopDelete: "Elimina", + sshHopMoveUp: "Sposta su", + sshHopMoveDown: "Sposta giù", + sshHopName: "Nome Hop", + sshHopNamePlaceholder: "Bastion, jump host, gateway di produzione", + sshHopDefaultName: "Hop {index}", + sshHopInvalidHost: "{hop}: Host SSH richiesto", + sshHopInvalidUser: "{hop}: Utente SSH richiesto", + sshHopInvalidPort: "{hop}: La porta SSH deve essere compresa tra 1 e 65535", + sshHopInvalidAuth: "{hop}: password o percorso chiave richiesti", + sshHopInvalidTimeout: "{hop}: Il timeout SSH deve essere compreso tra 1 e 300 secondi", + connectTimeout: "Timeout Connessione (secondi)", + queryTimeout: "Timeout Query (secondi)", + proxy: "Proxy", + proxyEnable: "Connetti database tramite proxy", + proxyType: "Tipo Proxy", + proxyHost: "Host Proxy", + proxyUsername: "Utente Proxy", + proxyUsernamePlaceholder: "Opzionale", + proxyPassword: "Password Proxy", + proxyPasswordPlaceholder: "Opzionale", + jdbcUrl: "URL JDBC", + jdbcUrlPlaceholder: "jdbc:postgresql://localhost:5432/database", + jdbcDriverClass: "Classe Driver (opzionale)", + jdbcDriverClassPlaceholder: + "La maggior parte dei driver si registra automaticamente; usa com.vendor.jdbc.Driver si necessario", + jdbcDriverPaths: "JAR del Driver", + jdbcDriverSelectPlaceholder: "Scegli il driver importato", + jdbcDriverPathsPlaceholder: "/percorso/per/driver.jar\n/percorso/per/un-altro-driver.jar", + jdbcDriverBrowse: "Scegli file JAR del driver JDBC", + jdbcDocs: "Visualizza documentazione JDBC", + jdbcPluginHint: + "Installa prima il plugin DBX JDBC, quindi importa il file JAR del driver JDBC del fornitore del database.", + dmCompatHint: "Richiede il driver ODBC DM8 installato sul sistema.", + dmDownload: "Scarica da Dameng", + mongoLegacyHint: + "MongoDB precedente a 4.2 richiede il driver MongoDB (Legacy). Se l'autenticazione fallisce e l'utente è stato creato in admin, imposta DB di Autenticazione su admin.", + compatible: "Compatibile", + mainstream: "Popolare", + color: "Colore", + colorNone: "Nessun colore", + colorGreen: "Verde", + colorYellow: "Giallo", + colorOrange: "Arancione", + colorRed: "Rosso", + colorBlue: "Blu", + colorPurple: "Viola", + }, + editor: { + pressToExecute: "Premi {mod}+Enter per eseguire", + pressToSaveSql: "Premi {mod}+S per salvare SQL", + queryTimeoutError: "Timeout della query ({seconds}s). Verifica se la connessione al database è integra.", + connectionMayBeLost: "La connessione potrebbe essere andata perduta. Aggiorna i dati e riprova.", + showResultsPane: "Mostra risultati", + hideResultsPane: "Nascondi risultati", + noDatabase: "Nessun database selezionato", + selectConnection: "Seleziona connessione", + searchConnection: "Cerca connessioni...", + selectDatabase: "Seleziona database", + searchDatabase: "Cerca database...", + selectSchema: "Seleziona schema", + setDefaultDatabase: "Imposta Predefinito", + defaultDatabase: "Predefinito", + completion: { + nullValue: "Valore NULL", + isNull: "Verifica se NULL", + isNotNull: "Verifica se non NULL", + stringLiteral: "Costante stringa", + numericLiteral: "Costante numerica", + booleanValue: "Valore booleano", + starExpansionColumns: "{count} colonne", + functionDescriptions: { + COUNT: "Restituisce il numero di righe", + SUM: "Restituisce la somma di una colonna numerica", + AVG: "Restituisce la media di una colonna numerica", + MIN: "Restituisce il valore minimo", + MAX: "Restituisce il valore massimo", + GROUP_CONCAT: "Concatena i valori del gruppo in una stringa", + STRING_AGG: "Concatena le stringhe del gruppo", + CONCAT: "Concatena più stringhe", + CONCAT_WS: "Concatena le stringhe con un separatore", + SUBSTRING: "Estrae una sottostringa", + REPLACE: "Sostituisce il contenuto in una stringa", + TRIM: "Rimuove gli spazi iniziali e finali", + UPPER: "Converte in maiuscolo", + LOWER: "Converte in minuscolo", + LENGTH: "Restituisce la lunghezza della stringa", + REGEXP_REPLACE: "Sostituisce utilizzando un'espressione regolare", + DATE_FORMAT: "Formatta una data con il formato specificato", + DATEDIFF: "Calcola la differenza tra due date", + DATE_ADD: "Aggiunge un intervallo a una data", + DATE_SUB: "Sottrae un intervallo da una data", + EXTRACT: "Estrae una parte di data", + NOW: "Restituisce la data e l'ora correnti", + ROUND: "Arrotonda alla quantità specificata di decimali", + FLOOR: "Arrotonda per difetto", + CEIL: "Arrotonda per eccesso", + ABS: "Restituisce il valore assoluto", + MOD: "Restituisce il resto della divisione", + COALESCE: "Restituisce il primo argomento non NULL", + IFNULL: "Restituisce un valore sostitutivo se NULL", + NULLIF: "Restituisce NULL se gli argomenti sono uguali", + CAST: "Converte un'espressione in un tipo di destinazione", + JSON_EXTRACT: "Estrae un valore da JSON", + JSON_VALUE: "Estrae un valore scalare da JSON", + JSON_OBJECT: "Crea un oggetto JSON", + JSON_ARRAY: "Crea un array JSON", + }, + }, + contextMenu: { + executeSelection: "Esegui selezione", + executeCurrent: "Esegui SQL", + copySelection: "Copia selezione", + selectAll: "Seleziona tutto", + }, + search: { + find: "Trova", + replace: "Sostituisci", + replaceAll: "Sostituisci Tutto", + caseSensitive: "Maiuscole/Minuscole", + regex: "Espressione regolare", + collapseReplace: "Comprimi sostituzione", + expandReplace: "Espandi sostituzione", + prevMatch: "Precedente (Shift+Enter)", + nextMatch: "Successivo (Enter)", + close: "Chiudi (Esc)", + noResults: "Nessun risultato", + }, + }, + tabs: { + sql: "SQL", + table: "Tabella", + tableData: "Dati Tabella", + redis: "Redis", + mongo: "Mongo", + objects: "Oggetti", + tooltipTitle: "Titolo:", + tooltipConnection: "Connessione:", + tooltipDatabase: "Database:", + tooltipTable: "Tabella:", + tooltipCollection: "Collezione:", + tooltipSchema: "Schema:", + resultN: "Risultato {n}", + scrollLeft: "Scorri schede a sinistra", + scrollRight: "Scorri schede a destra", + openTabs: "Schede aperte", + openDataTabs: "Tabelle aperte", + }, + chart: { + title: "Grafico", + type: "Tipo", + line: "Linea", + bar: "Barre", + pie: "Torta", + noNumericData: "Nessun dato numerico disponibile per il grafico", + }, + grid: { + rows: "{count} righe", + totalRows: "Totale {count} righe", + totalRowCount: "({count} in totale)", + rowsAffected: "{count} righe interessate", + querySuccess: "Query eseguita con successo", + noRows: "Nessun dato", + noRowsDescription: "Questo set di risultati non contiene record.", + noSearchResults: "Nessuna corrispondenza", + noSearchResultsDescription: "Prova con un'altra parola chiave.", + noFilteredRows: "Nessuna riga corrisponde al filtro", + noFilteredRowsDescription: "Regola il testo di ricerca o il filtro dello stato della riga.", + copy: "Copia", + copyDdl: "Copia DDL", + copyCell: "Copia Cella", + copyRow: "Copia Riga (JSON)", + copyColumnJson: "Copia Colonna (JSON)", + copyRowInsert: "Copia come INSERT", + copyRowInsertWithoutPrimaryKeys: "Copia come INSERT senza Chiavi Primarie", + copyRowUpdate: "Copia come UPDATE", + copyAll: "Copia Tutto (TSV)", + selection: "Selezione", + copySelectionTsv: "Copia Selezione (TSV)", + copySelectionCsv: "Copia Selezione (CSV)", + copySelectionJson: "Copia Selezione (JSON)", + copySelectionSql: "Copia Selezione come elenco SQL IN", + clearSelection: "Cancella Selezione", + export: "Esporta", + exportCsv: "Esporta CSV", + exportXlsx: "Esporta XLSX", + exportJson: "Esporta JSON", + exportMarkdown: "Esporta Markdown", + exportSql: "Esporta SQL INSERT", + exportSelectedRowsCsv: "Esporta Righe Selezionate come CSV", + exportSelectedRowsXlsx: "Esporta Righe Selezionate come XLSX", + exportSelectedRowsJson: "Esporta Righe Selezionate come JSON", + exportSelectedRowsMarkdown: "Esporta Righe Selezionate come Markdown", + exportSelectedRowsSql: "Esporta Righe Selezionate come SQL INSERT", + exported: "Esportato", + exportFailed: "Esportazione non riuscita: {message}", + copied: "Copiato", + copyFailed: "Copia non riuscita: {message}", + domRenderMode: "DOM", + canvasRenderMode: "Canvas", + renderModeHint: "Passa dal rendering Canvas al grid di fallback DOM.", + filter: "Filtra", + filterBuilder: "Filtri", + filterBuilderTitle: "Filtri", + filterBuilderHint: "Crea condizioni visive e combinale con l'input WHERE.", + filterBuilderSummary: "{count} regole", + filterBuilderAddRule: "Aggiungi regola", + filterBuilderColumn: "Colonna", + filterBuilderValue: "Valore", + filterBuilderNoValue: "Nessun valore richiesto", + filterBuilderEmpty: "Aggiungi una regola per iniziare a filtrare le righe.", + resetFilterBuilder: "Reimposta regole", + filterBuilderEquals: "Uguale a", + filterBuilderNotEquals: "Diverso da", + filterBuilderContains: "Contiene", + filterBuilderNotContains: "Non contiene", + filterBuilderGreaterThan: "Maggiore di", + filterBuilderLessThan: "Minore di", + filterBuilderIsNull: "È NULL", + filterBuilderIsNotNull: "Non è NULL", + columnActions: "Azioni colonna", + localFilter: "Filtro colonna locale", + localFilterFor: "Filtro Locale Per '{column}'", + columnFormatter: "Formattatore colonna", + columnFormatterFor: "Formattatore per '{column}'", + columnFormatterHint: "Formatta solo la visualizzazione; i valori effettivi rimangono invariati.", + formatterType: "Tipo", + formatterDatetime: "Timestamp Unix", + formatterJsonPath: "Percorso JSON", + formatterMask: "Maschera testo", + formatterCustomTemplate: "Modello personalizzato", + formatterTimestampUnit: "Unità timestamp", + formatterUnitAuto: "Auto", + formatterUnitSeconds: "Secondi", + formatterUnitMilliseconds: "Millisecondi", + formatterJsonPathInput: "Percorso JSON", + formatterMaskPrefix: "Prefisso visibile", + formatterMaskSuffix: "Suffisso visibile", + formatterSavedCustom: "Modelli salvati", + formatterNewCustom: "Nuovo modello", + formatterCustomName: "Nome modello", + formatterCustomNamePlaceholder: "Esempio: Etichetta utente", + formatterCustomTemplateInput: "Modello", + formatterCustomTemplateHint: + "Variabili disponibili: ${value}, ${upper}, ${lower}, ${length}. Assegna un nome per salvarlo nell'elenco.", + formatterPreview: "Anteprima", + saveFormatter: "Salva", + clearFormatter: "Cancella", + searchValues: "Cerca valori...", + filterTypedValue: "Usa '{value}'", + value: "Valore", + count: "Conteggio", + applyFilter: "Applica Filtro", + clearLocalFilters: "Cancella filtri colonna locali", + columnVisibility: "Colonne", + columnVisibilityHint: "Almeno una colonna deve rimanere visibile.", + searchColumns: "Cerca colonne...", + invertColumnVisibility: "Inverti", + showAllColumns: "Mostra tutte", + viewOptions: "Opzioni visualizzazione", + hideNullColumns: "Nascondi NULL", + hideNullColumnsHint: "Nascondi le colonne i cui valori sono tutti NULL nel risultato corrente.", + moreValues: "altri {count} valori, continua a digitare per restringere i risultati", + filterByValue: "Filtra per Questo Valore", + filterExcludeValue: "Escludi Questo Valore", + filterLike: "Contiene il Valore", + filterNotLike: "Non Contiene il Valore", + filterLessThan: "Minore del Valore", + filterGreaterThan: "Maggiore del Valore", + filterIsNull: "Mostra Valori NULL", + filterIsNotNull: "Mostra Valori Non-NULL", + clearFilter: "Cancella Filtro", + sort: "Ordina", + sortAscending: "Ordina in modo crescente", + sortDescending: "Ordina in modo decrescente", + clearSort: "Rimuovi Ordinamento", + pasted: "Incollato!", + search: "Cerca...", + searchOrWhere: "Cerca o inserisci una clausola WHERE...", + applyWhere: "Applica WHERE", + filterRows: "Filtra righe", + filterAllRows: "Tutte le righe", + filterChangedRows: "Modificate", + page: "Pagina {page}", + rowsPerPage: "Righe per pagina", + customRowsPerPage: "Righe personalizzate", + applyPageSize: "Applica", + save: "Salva", + discard: "Scarta", + dismiss: "Ignora", + addRow: "Aggiungi Riga", + cloneRow: "Clona come Nuova Riga", + deleteRow: "Elimina Riga", + deleteRows: "Elimina {count} Righe", + cloneRows: "Clona {count} come Nuove Righe", + restoreRows: "Ripristina {count} Righe", + copyRows: "Copia {count} Righe (JSON)", + copyColumnsJson: "Copia {count} Colonne (JSON)", + copyRowsInsert: "Copia {count} Righe come INSERT", + copyRowsInsertWithoutPrimaryKeys: "Copia {count} Righe come INSERT senza Chiavi Primarie", + copyRowsUpdate: "Copia {count} Righe come UPDATE", + selectedRows: "{count} righe selezionate", + restoreRow: "Ripristina Riga", + statusClean: "Pulito", + statusNew: "Nuovi Elementi", + statusEdited: "Elementi Aggiornati", + statusDeleted: "Elementi Eliminati", + pendingChanges: "{count} in sospeso", + selectedCells: "{count} selezionate", + bulkEditSelection: "Modifica di Massa Selezione", + bulkEditTitle: "Modifica di Massa Selezione", + bulkEditDescription: "Imposta le {count} celle selezionate su questo valore.", + bulkEditValuePlaceholder: "Valore, o NULL", + applyBulkEdit: "Applica", + cellDetails: "Dettagli Cella", + cellDetailLayoutBottom: "Sposta in Basso", + cellDetailLayoutRight: "Sposta a Destra", + openCellDetailsDialog: "Apri Dettagli Cella", + rowDetails: "Dettagli Riga", + rowDetailsFor: "Dettagli Riga {row}", + openRowDetailsDialog: "Apri Dettagli Riga", + openColumnDetailsDialog: "Apri Dettagli Colonna", + columnDetailsFor: "Dettagli Colonna {column}", + columnsCount: "{count} colonne", + rowCount: "Righe", + rowsCount: "{count} righe", + fieldIndex: "N.", + cellValue: "Valore", + valueEditor: "Editor dei Valori", + imagePreview: "Anteprima Immagine", + imageLoadFailed: "Caricamento immagine non riuscito", + geometryPreview: "Anteprima Geometria", + zoomIn: "Ingrandisci", + zoomOut: "Rimpicciolisci", + fitImage: "Adatta alla Finestra", + openImage: "Apri Immagine", + columnName: "Colonna", + columnType: "Tipo", + columnComment: "Commento", + rowNumber: "Riga", + valueLength: "Lunghezza", + nullValue: "NULL", + noComment: "Nessun commento", + formattedJson: "JSON Formattato", + formattedValue: "Valore Formattato", + rawValue: "Valore Grezzo", + largeValuePreviewHint: "Anteprima dei primi {count} caratteri. La copia utilizzerà comunque il valore completo.", + copyValue: "Copia Valore", + downloadBinaryValue: "Scarica Valore", + downloadSaved: "Salvato in {path}", + downloadStarted: "Download avviato: {fileName}", + binaryDownload: { + binary: "Binario grezzo", + utf8: "Testo decodificato (UTF-8)", + gbk: "Testo decodificato (GBK)", + }, + copyRowTsv: "Copia Riga (TSV)", + copyColumnValues: "Copia Colonna (JSON)", + copyColumnTsv: "Copia Colonna (TSV)", + editValue: "Modifica Valore", + formatJson: "Formatta JSON", + setNull: "Imposta NULL", + restoreOriginalValue: "Ripristina Originale", + copyColumnName: "Copia Nome Colonna", + copyAlterColumnSql: "Copia come SQL ALTER", + alterSqlCopied: "SQL ALTER copiato negli appunti", + alterSqlCopiedWithWarnings: "SQL ALTER copiato negli appunti ({count} avviso/i)", + noAlterSqlAvailable: "Nessun SQL ALTER disponibile per questa colonna", + copyAlterSqlFailed: "Copia non riuscita: {message}", + copySqlCondition: "Copia Condizione SQL", + transpose: "Traspone Riga", + rowsPerPageShort: " righe", + columnDetails: "Dettagli Colonna", + tableInfo: "Informazioni Tabella", + tableInfoColumns: "Colonne", + tableInfoIndexes: "Indici", + tableInfoForeignKeys: "Chiavi Esterne", + tableInfoTriggers: "Trigger", + tableInfoNullable: "Nullabile", + tableInfoEmpty: "Nessun metadato", + tableInfoSearch: "Cerca...", + tableInfoNoResults: "Nessun risultato", + queryError: "Errore Query", + dataUnavailable: "I dati della tabella devono essere ricaricati.", + refresh: "Aggiorna", + commit: "Commit", + rollback: "Rollback", + transactionSaveHint: "Applica {count} modifica/he in sospeso in una transazione.", + nonTransactionalSaveHint: + "Salva {count} modifica/he in sospeso una ad una. In caso di errore, le modifiche salvate in precedenza non saranno annullate.", + keylessEditWarning: "Nessuna chiave primaria", + keylessEditWarningHint: + "Questa tabella non ha chiavi primarie. Gli aggiornamenti e le eliminazioni utilizzano tutti i valori originali delle righe nella clausola WHERE; le righe duplicate esatte potrebbero essere influenzate contemporaneamente.", + queryEditReady: "Modificabile", + queryEditReadyHint: + "Questo risultato a tabella singola proviene da “{table}”. Puoi modificare, eliminare o aggiungere righe, quindi utilizzare l'azione delle modifiche in sospeso per salvare.", + queryEditReadOnly: "Risultato in sola lettura", + queryEditUnsupported: { + "not-select": "Solo i risultati di query SELECT possono essere modificati direttamente.", + cte: "Le query con WITH/CTE non sono ancora modificabili. Usa una semplice SELECT a tabella singola.", + "set-operation": + "I risultati di UNION, INTERSECT o EXCEPT non possono essere mappati in sicurezza alle righe di origine.", + aggregation: + "I risultati di DISTINCT, GROUP BY, HAVING e aggregazioni non possono essere modificati direttamente.", + "external-source": + "I file esterni e i risultati di funzioni tabella non possono essere riscritti direttamente. Importali in una tabella di database prima di modificarli.", + "complex-source": + "JOIN, tabelle multiple e sottoquery non possono essere mappati in sicurezza ad una singola riga di origine.", + "computed-columns": + "Le espressioni calcolate o i risultati di funzioni non possono essere riscritti. Seleziona invece nomi di colonna grezzi.", + "no-table": "Nessuna tabella di origine modificabile rilevata.", + "no-primary-key": + "La tabella di destinazione non ha chiavi primarie, quindi le righe non possono essere aggiornate o eliminate in sicurezza.", + "primary-key-not-returned": + "Nel risultato manca la colonna della chiave primaria. Includila con il suo nome di colonna originale.", + "aliased-columns": + "Le colonne del risultato utilizzano alias o espressioni. Seleziona le colonne modificabili con i loro nomi originali.", + "metadata-unavailable": + "DBX non è riuscito a caricare i metadati della tabella, quindi la modifica del risultato è disabilitata.", + }, + sortUnsupported: + "Questo SQL non supporta l'ordinamento sull'intero risultato. Riprova con una query SELECT semplice.", + truncatedHint: + "Risultati troncati a {count} righe. Usa la paginazione a piè di pagina o regola le righe per pagina.", + }, + exportProgress: { + title: "Esportazione Dati Tabella", + fetching: "Recupero dati dal database...", + writing: "Scrittura su file...", + done: "Esportazione completata!", + error: "Esportazione non riuscita", + cancelled: "Esportazione annullata.", + rowsCount: "{exported} / {total} righe", + rowsExported: "{count} righe esportate", + rowsShort: "righe", + cancel: "Annulla", + close: "Chiudi", + tooltip: "Stato Esportazione", + popoverTitle: "Esportazioni", + noTasks: "Nessuna esportazione", + clearFinished: "Cancella completate", + showMore: "Mostra altri {count}", + showLess: "Mostra meno", + delete: "Rimuovi", + }, + welcome: { + title: "Area di Lavoro Database", + subtitle: "Scegli una connessione a sinistra per esplorare lo schema, oppure apri direttamente una scheda query.", + connections: "Connessioni", + connected: "Connesso", + databaseTypes: "Tipi Database", + quickConnections: "Avvio Rapido", + quickConnectionsHint: "Fai clic su una connessione per aprire una scheda query.", + shortcuts: "Scorciatoie", + shortcutsHint: "Avvia la prossima azione da qui.", + tip: "Puoi anche espandere le connessioni a sinistra e fare clic con il tasto destro su database o tabelle per altre azioni.", + tipSidebar: "Fai clic su una tabella a sinistra per visualizzarne i dati", + tipExecute: "per eseguire la query", + fileOpened: "Aperto {name}", + mcpTitle: "Integrazione Agente AI", + mcpDescription: + "Oltre all'assistente AI integrato, puoi utilizzare Claude Code, Cursor e altri agenti di sviluppo per interrogare i tuoi database tramite MCP.", + mcpLearnMore: "Scopri di più", + }, + common: { + language: "Lingua", + loading: "Caricamento...", + stopping: "Interruzione...", + close: "Chiudi", + }, + explain: { + title: "Piano di Spiegazione", + tree: "Albero", + summary: "Riepilogo", + running: "Lettura del piano di spiegazione...", + empty: "Nessun piano di spiegazione", + nodeCount: "{count} nodi", + node: "Nodo", + relation: "Tabella", + index: "Indice", + cost: "Costo", + rows: "Righe", + details: "Dettagli", + unsupported: "Il piano di spiegazione non è ancora supportato per questo database", + emptySql: "Nessun SQL da spiegare", + unsafe: "Questa prima versione spiega solo istruzioni SELECT / WITH / TABLE / VALUES", + }, + lineage: { + title: "Lineage dei Campi", + open: "Visualizza Lineage dei Campi", + loading: "Lettura metadati in corso {done}/{total}", + empty: "Nessun lineage correlato trovato", + noFiltered: "Nessun risultato corrisponde ai filtri correnti", + targetField: "Campo Corrente", + searchPlaceholder: "Cerca tabelle, campi, viste o frammenti SQL...", + showing: "Mostrati {shown}/{total} risultati", + all: "Tutti", + certain: "Sicuro", + likely: "Probabile", + possible: "Possibile", + queryHistory: "Cronologia Query", + openTable: "Apri tabella", + copy: "Copia nome", + copied: "Copiato", + kind: { + foreignKey: "Chiave Esterna", + viewReference: "Vista", + historyReference: "Cronologia SQL", + sameName: "Stesso Nome", + }, + description: { + foreignKeyIncoming: + "{target} punta al campo corrente tramite una chiave esterna. Si tratta di una dipendenza verificata.", + foreignKeyOutgoing: + "Il campo corrente fa riferimento a {target} tramite una chiave esterna. Si tratta di una dipendenza verificata.", + viewLikely: + "La definizione della vista menziona sia la tabella che il campo di destinazione, indicando solitamente una dipendenza della query.", + viewPossible: + "La definizione della vista menziona un campo con lo stesso nome ma non la tabella di destinazione, pertanto richiede conferma.", + historyLikely: + "Un'istruzione SQL della cronologia menziona sia la tabella che il campo di destinazione. Utilizzalo come contesto per l'analisi dell'impatto.", + historyPossible: + "Un'istruzione SQL della cronologia menziona un campo con lo stesso nome. Potrebbe essere correlata, ma necessita di contesto.", + sameName: + "Un'altra tabella ha un campo con lo stesso nome. Potrebbe condividere il significato aziendale ma non è una dipendenza verificata del database.", + }, + cancel: "Annulla", + refresh: "Analizza di Nuovo", + }, + connectionGroup: { + createGroup: "Nuovo Gruppo", + groupNamePlaceholder: "Nome gruppo", + renameGroup: "Rinomina Gruppo", + deleteGroup: "Elimina Gruppo", + moveToGroup: "Sposta nel Gruppo", + moveToNewGroup: "Sposta in un Nuovo Gruppo", + ungrouped: "Non raggruppati", + newGroup: "Nuovo Gruppo...", + newGroupDefault: "Nuovo Gruppo", + deleteGroupConfirmTitle: "Elimina Gruppo", + deleteGroupConfirmMessage: + 'Eliminare il gruppo "{name}"? Le connessioni al suo interno verranno spostate al livello principale.', + }, + databaseSearch: { + title: "Cerca nel Database", + open: "Cerca nel Database", + keyword: "Parola chiave", + keywordPlaceholder: "Inserisci un ID utente, un'email, un numero d'ordine...", + limitPerTable: "Per tabella", + search: "Cerca", + searching: "Ricerca in corso", + stop: "Interrompi", + hint: "Scansiona le tabelle normali nel database o schema corrente. Le colonne binarie vengono saltate e ciascuna tabella è limitata per evitare il caricamento simultaneo di troppi dati.", + loadingTables: "Lettura dell'elenco delle tabelle...", + progress: "Scansionate {done}/{total} tabelle", + resultCount: "{count} corrispondenze", + limitedTables: "Rilevato schema di grandi dimensioni; vengono scansionate solo le prime {count} tabelle", + results: "Risultati", + openResult: "Apri", + waiting: "In attesa di corrispondenze...", + noResults: "Nessuna corrispondenza finora", + errors: "Alcune tabelle non sono riuscite", + }, + configExport: { + passphraseTitle: "Crittografa ed Esporta", + passphraseImportTitle: "Decrittografa e Importa", + passphraseExportHint: + "Per includere le password di connessione nell'esportazione, imposta una passphrase per la crittografia. Avrai bisogno della stessa passphrase per importare.", + passphraseImportHint: "Questo file è crittografato. Inserisci la passphrase per decrittografarlo e importarlo.", + passphrase: "Passphrase", + passphraseConfirm: "Conferma Passphrase", + passphrasePlaceholder: "Inserisci passphrase", + passphraseConfirmPlaceholder: "Re-inserisci passphrase", + passphraseRequired: "La passphrase è richiesta", + passphraseMismatch: "Le passphrase non corrispondono", + passphraseTooShort: "La passphrase deve essere di almeno 4 caratteri", + exportEncrypted: "Esporta", + decryptImport: "Decrittografa e Importa", + wrongPassphrase: "Passphrase errata o file corrotto", + exportSuccess: "Connessioni esportate con successo", + importSuccess: "Importata/e {count} connessione/i", + importNavicatSuccess: + "Importata/e {count} connessione/i Navicat. Inserisci le password mancanti prima di testare la connessione.", + importDbeaverSuccess: + "Importata/e {count} connessione/i DBeaver. Inserisci le password mancanti prima di testare la connessione.", + importNone: "Nessuna nuova connessione da importare", + importLayoutConfirm: "Il file importato contiene gruppi di connessioni. Vuoi applicarli?", + importLayoutTitle: "Importa Gruppi", + importLayoutApply: "Applica", + }, + ai: { + placeholder: "Descrivi la tua query in linguaggio naturale...", + settings: "Impostazioni AI", + noConfig: "L'AI non è configurata. Configura il tuo provider AI in Impostazioni > AI.", + provider: "Provider", + model: "Modello", + browseModels: "Sfoglia modelli", + refreshModels: "Aggiorna modelli", + loadingModels: "Caricamento modelli...", + searchModels: "Cerca modelli", + noModels: "Nessun modello caricato", + modelListHint: "Fai clic su aggiorna per caricare i modelli dal provider.", + modelListUnsupported: "Questo provider non supporta il recupero di un elenco di modelli.", + modelListEndpointRequired: "Inserisci un endpoint prima di caricare i modelli.", + modelListApiKeyRequired: "Inserisci una chiave API prima di caricare i modelli.", + run: "Esegui", + readingSchema: "Lettura schema", + noConnection: "Nessuna connessione disponibile per questa scheda", + noSql: "Nessun SQL da elaborare", + sqlPreview: "Anteprima SQL", + copySql: "Copia SQL", + copyCode: "Copia Codice", + executeSql: "Esegui SQL", + copyAll: "Copia Tutto", + copied: "Copiato", + replace: "Sostituisci Editor", + append: "Accoda all'Editor", + apply: "Applica all'Editor", + clear: "Cancella Chat", + welcome: "Dimmi cosa vorresti interrogare e io scriverò il codice SQL", + newChat: "Nuova Chat", + thinking: "Riflessione...", + reasoningProcess: "Processo di riflessione", + stopGenerating: "Interrompi generazione", + tableMentionEmpty: "Nessuna tabella corrispondente", + tableMentionPlaceholderHint: "Digita {'@'} per menzionare le tabelle per il contesto", + tableMentionTypes: { + table: "Tabella", + view: "Vista", + systemTable: "Tabella di sistema", + temporaryTable: "Tabella temporanea", + }, + modes: { + ask: "Chiedi", + agent: "Agente", + }, + modeHints: { + ask: "Genera SQL e spiegazioni senza eseguirli automaticamente", + agent: "Esegui automaticamente le query sicure quando possibile", + }, + fixWithAi: "Correggi con AI", + truncated: "Contesto troncato", + contextSummary: "{database} · {tables} tabelle", + autoSqlBlocked: + "L'SQL generato dall'AI è sembrato troppo rischioso per l'esecuzione automatica. Rivedilo manualmente prima di eseguirlo.", + agentSteps: { + generated: "SQL generato", + noSql: "Nessun SQL trovato", + safe: "Sicurezza superata", + needsConfirm: "Richiede conferma", + blocked: "Bloccato", + autoExecute: "Pronto per l'esecuzione", + notRequested: "Esecuzione non richiesta", + skipped: "Non eseguito", + }, + agentStepTitles: { + riskCheck: "Controllo rischi: {action} · {category} · {environment} · {reasons}", + blocked: "L'esecuzione è stata bloccata dalla politica dei rischi. Rivedi l'SQL manualmente.", + requiresConfirmation: "Questo SQL richiede una conferma prima dell'esecuzione.", + askMode: "La modalità Chiedi non esegue automaticamente l'SQL.", + unsupportedAction: "L'azione AI corrente non esegue automaticamente l'SQL.", + noSql: "La risposta non includeva un blocco di codice SQL eseguibile.", + notRequested: "L'utente non ha richiesto l'esecuzione dell'SQL.", + skipped: "Questo passaggio non è stato eseguito.", + }, + proxy: "Proxy", + proxyEnable: "Invia richieste AI tramite proxy", + proxyUrl: "URL Proxy", + settingsHint: + "La configurazione viene salvata nella cartella dei dati locali dell'app. Le richieste vengono inviate dal backend Tauri invece che direttamente dal frontend.", + enableThinking: "Pensiero (Thinking)", + enableThinkingOn: "Abilitato", + enableThinkingOff: "Disabilitato", + enableThinkingHint: + "Questa opzione ha effetto solo sulle API /chat/completions e sui modelli supportati. Quando è disabilitata, può ridurre notevolmente l'uso dei token, ma la qualità dei risultati generati potrebbe diminuire leggermente.", + actions: { + generate: "Genera SQL", + explain: "Spiega SQL", + optimize: "Ottimizza SQL", + fix: "Correggi Errore", + convert: "Converti Dialetto", + sampleData: "Dati di Esempio", + }, + placeholders: { + generate: "Descrivi cosa desideri interrogare, es. ordini per utente negli ultimi 7 giorni", + explain: "Opzionale: aggiungi cosa desideri comprendere", + optimize: "Opzionale: aggiungi un obiettivo, es. ridurre le scansioni complete della tabella", + fix: "Incolla l'errore o descrivi il risultato atteso", + convert: "es. converti in PostgreSQL / MySQL / SQL Server", + sampleData: "Descrivi i dati di esempio o le istruzioni di test da generare", + }, + }, + contextMenu: { + openConnection: "Apri Connessione", + closeConnection: "Chiudi Connessione", + closeDatabaseConnection: "Chiudi Connessione Database", + deleteConnection: "Elimina Connessione", + confirmDeleteTitle: "Elimina Connessione", + confirmDeleteMessage: 'Sei sicuro di voler eliminare "{name}"? Questa azione non può essere annullata.', + editConnection: "Modifica Connessione", + selectVisibleDatabases: "Seleziona Database Visibili", + duplicateConnection: "Duplica Connessione", + newQuery: "Nuova Query", + openObjectBrowser: "Esplora Oggetti", + viewData: "Visualizza Dati", + editStructure: "Modifica Struttura", + refreshChildren: "Aggiorna", + pin: "Fissa", + unpin: "Sblocca", + refreshTab: "Aggiorna Dati", + renameTab: "Rinomina Scheda", + compactTabTitle: "Accorcia Titoli Schede", + closeTab: "Chiudi Scheda", + closeOtherTabs: "Chiudi Altre Schede", + closeAllTabs: "Chiudi Tutte le Schede", + copyName: "Copia Nome", + setDefaultDatabase: "Imposta come Database Predefinito", + clearDefaultDatabase: "Cancella Database Predefinito", + exportDatabase: "Esporta Database", + exportDatabaseSuccess: "Esportate {count} tabelle, fino a {limit} righe ciascuna", + exportDatabaseFailed: "Impossibile esportare il database: {message}", + importData: "Importa Dati", + exportData: "Esporta Dati", + exportStructure: "Esporta Struttura", + exportStructurePreviewTitle: "Struttura - {name}", + exportStructurePreviewTitleMultiple: "Struttura - {count} oggetti", + exportStructureLoading: "Caricamento struttura...", + copyStructure: "Copia Struttura", + copyStructureAs: "Copia Struttura Come", + copyStructureAsTsv: "TSV (per Excel)", + copyStructureAsMarkdown: "Tabella Markdown", + structureDocTable: "Tabella", + structureDocColumn: "Colonna", + structureDocType: "Tipo", + structureDocPrimaryKey: "Chiave Primaria", + structureDocNullable: "Nullabile", + structureDocDefault: "Predefinito", + structureDocComment: "Commento", + structureDocYes: "Sì", + structureDocNo: "No", + structureDocCopied: "Struttura copiata", + structureDocCopyFallbackHint: + "La copia automatica è stata bloccata. Fai di nuovo clic su Copia o seleziona il contenuto di seguito.", + saveStructure: "Salva SQL", + exportStructureCopied: "Struttura copiata", + createTable: "Crea Tabella", + createView: "Crea Vista", + dropTable: "Elimina Tabella (DROP)", + emptyTable: "Svuota Tabella", + truncateTable: "Tronca Tabella (TRUNCATE)", + duplicateStructure: "Clona come Nuova Tabella", + renameObject: "Rinomina", + renameObjectTitle: "Rinomina Oggetto", + renameObjectNamePlaceholder: "Nuovo nome", + renameObjectSuccess: '"{oldName}" rinominato in "{newName}"', + confirmDropTableTitle: "Elimina Tabella", + confirmDropTableMessage: + 'Sei sicuro di voler eliminare (DROP) la tabella "{name}"? Questa operazione eliminerà permanentemente la tabella e tutti i suoi dati.', + confirmEmptyTableTitle: "Svuota Tabella", + confirmEmptyTableMessage: 'Sei sicuro di voler eliminare tutti i dati da "{name}"?', + confirmTruncateTableTitle: "Tronca Tabella", + confirmTruncateTableMessage: + 'Sei sicuro di voler troncare (TRUNCATE) la tabella "{name}"? Questa operazione rimuoverà tutte le righe.', + dropTableSuccess: 'Tabella "{name}" eliminata', + editView: "Modifica Vista", + viewSource: "Visualizza Origine", + viewDdl: "Visualizza DDL", + dropObject: "Elimina Oggetto", + dropView: "Elimina Vista", + dropColumn: "Elimina Colonna", + dropIndex: "Elimina Indice", + dropForeignKey: "Elimina Chiave Esterna", + dropTrigger: "Elimina Trigger", + batchDrop: "Elimina selezionati ({count})", + executeProcedure: "Esegui Procedura", + confirmExecuteProcedureTitle: "Esegui Procedura", + confirmExecuteProcedureMessage: + 'Eseguire la procedura "{name}"? È possibile compilare o regolare i valori dei parametri prima.', + loadingProcedureParameters: "Caricamento parametri...", + procedureParametersUnavailable: + "Impossibile caricare i metadati dei parametri. Puoi comunque modificare l'SQL di seguito ed eseguirlo.", + noProcedureParameters: "Nessun parametro trovato. L'SQL corrente verrà eseguito come mostrato.", + inputParameters: "{count} parametri di input", + outputParameters: "{count} parametri di output", + parameterName: "Nome", + parameterType: "Tipo", + parameterMode: "Modalità", + parameterValue: "Valore", + parameterNull: "NULL", + parameterDefault: "DEFAULT", + parameterDefaultHint: + "Quando DEFAULT è selezionato, DBX omette quell'argomento in modo che il database utilizzi il valore predefinito della procedura.", + parameterValuePlaceholder: "Inserisci valore", + outputOnly: "Solo output", + sqlPreview: "Anteprima SQL", + resetSqlPreview: "Reimposta SQL", + openInSqlEditor: "Apri nell'Editor", + dropProcedure: "Elimina Procedura", + dropFunction: "Elimina Funzione", + confirmDropViewTitle: "Elimina Vista", + confirmDropViewMessage: 'Sei sicuro di voler eliminare la vista "{name}"?', + confirmDropObjectTitle: "Elimina Oggetto", + confirmDropObjectMessage: 'Sei sicuro di voler eliminare "{name}"?', + confirmDropColumnTitle: "Elimina Colonna", + confirmDropIndexTitle: "Elimina Indice", + confirmDropForeignKeyTitle: "Elimina Chiave Esterna", + confirmDropTriggerTitle: "Elimina Trigger", + confirmDropTableChildObjectMessage: 'Sei sicuro di voler eliminare "{name}" da "{table}"?', + confirmBatchDropTitle: "Elimina Oggetti Selezionati", + confirmBatchDropMessage: + "Sei sicuro di voler eliminare {count} oggetti selezionati? Questa azione non può essere annullata.", + confirmDropProcedureTitle: "Elimina Procedura", + confirmDropProcedureMessage: 'Sei sicuro di voler eliminare la procedura "{name}"?', + confirmDropFunctionTitle: "Elimina Funzione", + confirmDropFunctionMessage: 'Sei sicuro di voler eliminare la funzione "{name}"?', + dropViewSuccess: 'Vista "{name}" eliminata', + dropProcedureSuccess: 'Procedura "{name}" eliminata', + dropFunctionSuccess: 'Funzione "{name}" eliminata', + dropTableChildObjectSuccess: '"{name}" eliminato', + batchDropSuccess: "Eliminati {count} oggetti", + emptyTableSuccess: 'Tutti i dati eliminati da "{name}"', + truncateTableSuccess: 'Tabella "{name}" troncata', + duplicateStructureSuccess: 'Tabella clonata come "{name}"', + tableOperationFailed: "Operazione non riuscita: {message}", + duplicateNameTitle: "Clona as Nuova Tabella", + duplicateNamePlaceholder: "Nuovo nome tabella", + createDatabase: "Crea Database", + createDuckDbFile: "Crea File Database", + dropDatabase: "Elimina Database", + confirmDropDatabaseTitle: "Elimina Database", + confirmDropDatabaseMessage: + 'Sei sicuro di voler eliminare il database "{name}"? Questa operazione eliminerà permanentemente il database e tutti i suoi dati.', + createDatabaseSuccess: 'Database "{name}" creato', + createDuckDbFileSuccess: 'File di database DuckDB "{name}" creato e collegato', + createDuckDbFileDesktopOnly: "La creazione di file di database DuckDB è disponibile solo nell'applicazione desktop", + dropDatabaseSuccess: 'Database "{name}" eliminato', + createDatabaseNamePlaceholder: "Nome database", + createDatabaseCharset: "Set di caratteri", + createDatabaseCharsetPlaceholder: "es. utf8mb4", + createDatabaseCollation: "Collation", + createDatabaseCollationPlaceholder: "es. utf8mb4_unicode_ci", + createSchema: "Crea Schema", + dropSchema: "Elimina Schema", + confirmDropSchemaTitle: "Elimina Schema", + confirmDropSchemaMessage: + 'Sei sicuro di voler eliminare lo schema "{name}"? Questa operazione eliminerà permanentemente lo schema e tutti i suoi oggetti.', + createSchemaSuccess: 'Schema "{name}" creato', + dropSchemaSuccess: 'Schema "{name}" eliminato', + createSchemaNamePlaceholder: "Nome schema", + }, + visibleDatabases: { + title: "Database Visibili", + description: 'Scegli quali database mostrare sotto "{connection}".', + searchPlaceholder: "Cerca database...", + selectedCount: "{selected}/{total} selezionati", + selectAll: "Seleziona tutto", + clear: "Cancella", + showAll: "Mostra tutto", + showSystemDatabases: "Mostra database di sistema", + save: "Salva", + loadFailed: "Impossibile caricare i database: {message}", + }, + tree: { + savedSql: "Libreria SQL", + defaultDatabase: "DB Predefinito", + columns: "Colonne", + indexes: "Indici", + foreignKeys: "Chiavi Esterne", + triggers: "Trigger", + tables: "Tabelle", + views: "Viste", + procedures: "Procedure", + functions: "Funzioni", + packages: "Pacchetti", + partitions: "Partizioni", + objectBrowser: "Sfoglia in Esplora Oggetti ({count})", + }, + objects: { + all: "Tutti", + tables: "Tabelle", + views: "Viste", + procedures: "Procedure", + functions: "Funzioni", + packages: "Pacchetti", + table: "Tabella", + partitions: "{count} partizioni", + view: "Vista", + procedure: "Procedura", + function: "Funzione", + package: "Pacchetto", + packageBody: "Corpo del Pacchetto", + name: "Nome", + type: "Tipo", + createdAt: "Creato", + updatedAt: "Aggiornato", + source: "Codice Sorgente", + saveSource: "Salva", + cancelEdit: "Annulla", + sourceSaved: "Sorgente salvato", + sourceSaveFailed: "Impossibile salvare il sorgente: {message}", + schemaColumn: "Schema", + comment: "Commento", + loadingSchemas: "Caricamento schemi...", + schema: "Schema", + search: "Cerca tabelle, viste, funzioni o procedure...", + loading: "Caricamento oggetti...", + empty: "Nessun oggetto trovato", + selectedTables: "{count} tabelle selezionate", + exportSelected: "Esporta selezionate", + dropSelected: "Elimina selezionate", + clearSelection: "Cancella selezione", + confirmBatchDropTitle: "Elimina Tabelle Selezionate", + confirmBatchDropMessage: + "Sei sicuro di voler eliminare {count} tabelle selezionate? Questa azione non può essere annullata.", + batchDropSuccess: "Eliminate {count} tabelle", + }, + structureEditor: { + title: "Modifica Struttura Tabella", + createTitle: "Crea Tabella", + editTabTitle: "Modifica: {tableName}", + tableName: "Nome Tabella", + refresh: "Aggiorna Struttura", + density: "Densità", + densityCompact: "Compatta", + densityStandard: "Standard", + densityComfortable: "Comoda", + columns: "Colonne", + indexes: "Indici", + foreignKeys: "Chiavi Esterne", + triggers: "Trigger", + addColumn: "Aggiungi Colonna", + addIndex: "Aggiungi Indice", + columnName: "Colonna", + dataType: "Tipo", + typePlaceholder: "Seleziona o digita...", + noMatchingType: "Nessun tipo corrispondente", + length: "Lunghezza", + nullable: "Nullabile", + primaryKey: "Chiave Primaria", + defaultValue: "Valore Predefinito", + comment: "Commento", + editComment: "Modifica commento", + commentPlaceholder: "Inserisci commento colonna...", + tableCommentPlaceholder: "Inserisci commento tabella...", + tableCommentUnsupported: "I commenti della tabella non sono supportati da questo database", + actions: "Azioni", + indexName: "Indice", + indexColumns: "Colonne", + indexColumnsPlaceholder: "Seleziona colonne...", + unique: "Unico", + indexType: "Tipo", + includedColumns: "Incluse", + includedColumnsPlaceholder: "Seleziona colonne...", + filter: "Filtro", + primary: "Primario", + drop: "Elimina", + restore: "Ripristina", + remove: "Rimuovi", + moveColumnUp: "Sposta colonna su", + moveColumnDown: "Sposta colonna giù", + yes: "Sì", + no: "No", + emptyReadonly: "Nessun record", + sqlPreview: "Anteprima SQL", + noChanges: "Nessuna modifica", + apply: "Applica Modifiche", + ready: "Pronto", + saved: "Struttura tabella aggiornata", + copySql: "Copia SQL", + extendedProperties: "Esteso", + autoIncrement: "Auto Incremento", + onUpdateCurrentTimestamp: "Aggiorna Ora Automaticamente", + identity: "Identità", + identityGeneration: "Generazione", + identitySeed: "Seed", + identityIncrement: "Incremento", + }, + diagram: { + title: "Diagramma delle Relazioni", + open: "Visualizza Diagramma", + selectConnection: "Seleziona connessione", + selectDatabase: "Seleziona database", + selectSchema: "Seleziona schema", + searchTables: "Cerca tabelle, colonne, chiavi...", + refresh: "Aggiorna diagramma", + loading: "Lettura relazioni...", + loadingProgress: "Lettura relazioni... {loaded}/{total}", + partialError: "Saltati i metadati per {count} tabelle che non è stato possibile caricare", + selectTarget: "Seleziona una connessione e un database", + empty: "Nessuna tabella da visualizzare", + noMatches: "Nessuna tabella corrispondente", + tablesCount: "{count} tabelle", + relationshipsCount: "{count} relazioni", + tableMode: "Visualizzazione Tabella", + engineeringMode: "ER Ingegneristico", + allTables: "Tutte le Tabelle", + relatedTables: "Tabelle Correlate", + moreColumns: "+ {count} colonne", + exportSvg: "Esporta SVG", + exportedSvg: "SVG esportato", + exportSvgFailed: "Impossibile esportare SVG: {message}", + zoomIn: "Ingrandisci", + zoomOut: "Rimpicciolisci", + resetLayout: "Reimposta layout", + }, + redis: { + selectKey: "Seleziona una chiave per visualizzarne il valore", + noKeys: "Nessuna chiave trovata", + pattern: "pattern (es. user:*)", + fuzzyPattern: "la chiave contiene...", + fuzzyMatch: "Fuzzy", + fuzzyMatchTitle: "Corrispondenza fuzzy: cerca le chiavi per testo semplice contenuto", + valueSearchPlaceholder: "il valore contiene...", + searchByKey: "Chiave", + searchByValue: "Valore", + keys: "{count} chiavi", + loadingKeys: "Caricamento chiavi...", + searchingValues: "Ricerca nei valori...", + loadMoreKeys: "Carica altre chiavi", + fetchAllKeys: "Recupera tutto", + stopFetchAll: "Interrompi", + fetchAllProgress: "{loaded} di {total} chiavi caricate", + fetchAllProgressUnknown: "{loaded} chiavi caricate", + items: "{count} elementi", + fields: "{count} campi", + members: "{count} membri", + loadedItems: "{loaded} di {total} elementi caricati", + loadedFields: "{loaded} di {total} campi caricati", + loadedMembers: "{loaded} di {total} membri caricati", + entries: "{count} voci", + noExpiry: "nessuna scadenza", + columnType: "Tipo", + columnKey: "Chiave", + columnValue: "Valore", + columnSize: "Dimensione", + columnTTL: "TTL", + binaryStringReadonlyHint: + "I valori delle stringhe binarie sono mostrati come testo con escape in modalità sola lettura; la modifica dei byte grezzi non è supportata.", + selectedKeys: "Chiavi selezionate", + deleteGroup: "Elimina gruppo", + deleteGroupDetails: "{target}\n{count} chiavi", + flushDb: "Pulisci DB corrente", + flushDbMessage: "Questo eliminerà ogni chiave nel database Redis corrente e non può essere annullato. Continuare?", + flushDbDetails: "Destinazione: Redis db{db}\nAmbito: tutte le chiavi nel DB corrente", + flushDbConfirm: "Pulisci DB", + flushDbSuccess: "Redis db{db} pulito", + keyDetail: "Dettaglio chiave", + commandLine: "Console dei comandi", + selectKeyForDetail: "Seleziona una chiave per visualizzare i dettagli", + commandWelcome: "Benvenuto nella console comandi di Redis", + commandPlaceholder: "Comando Redis, es. GET user:1", + commandPrefix: "CMD", + commandHint: "Inserisci un comando Redis, es. SMEMBERS feature:flags", + executeCommand: "Esegui comando", + commandEmpty: "Inserisci un comando Redis", + commandEmptyResult: "Esegui un comando Redis per vedere il risultato", + commandBlocked: "Questo comando Redis è bloccato per sicurezza", + createKey: "Crea chiave", + createKeyName: "Chiave", + createKeyNamePlaceholder: "user:1", + createKeyType: "Tipo", + createValue: "Valore", + createMember: "Membro", + createField: "Campo", + createFieldPlaceholder: "nome", + createScore: "Punteggio", + createValuePlaceholder: "valore", + createKeySubmit: "Crea", + createKeyNameRequired: "Inserisci un nome chiave", + createFieldRequired: "Inserisci un campo hash", + createScoreInvalid: "Inserisci un punteggio valido", + fieldRequired: "Inserisci un nome campo", + valueRequired: "Inserisci un valore", + memberRequired: "Inserisci un membro", + ttlInvalid: "Inserisci un TTL valido in secondi (-1 per nessuna scadenza)", + member: "Membro", + memberDetail: "Dettaglio membro", + viewMember: "Visualizza valore completo", + copyMember: "Copia membro", + copied: "Copiato", + copyInsertStatement: "Copia Istruzione di Inserimento", + copyInsertStatementBinary: "Impossibile generare l'istruzione di inserimento per dati binari", + editMember: "Modifica", + jsonView: "Visualizzazione JSON", + rawContent: "Contenuto grezzo", + wordWrap: "A capo automatico", + }, + mongo: { + documents: "{count} documenti", + addField: "Aggiungi Campo", + deleteField: "Elimina Campo", + field: "Campo", + value: "Valore", + fieldPlaceholder: "Nome campo", + emptyCollection: "Collezione vuota", + selectDocument: "Seleziona un documento", + readonlyId: "_id è in sola lettura", + invalidJsonValue: "Questa cella non contiene un valore JSON valido", + duplicateField: "Nome campo duplicato: {field}", + edit: "Modifica", + documentView: "Visualizzazione Documento", + tableView: "Visualizzazione Tabella", + filterPlaceholder: "Filtra...", + sortPlaceholder: "Ordina...", + }, + history: { + title: "Cronologia", + search: "Cerca nella cronologia...", + empty: "Ancora nessuna cronologia", + failed: "Non riuscita", + success: "Riuscita", + restore: "Ripristina nell'editor", + copy: "Copia SQL", + delete: "Elimina", + clear: "Cancella Cronologia", + viewDetails: "Visualizza dettagli", + analyzeWithAi: "Analizza con AI", + aiAnalyzeNoConnection: + "Impossibile analizzare questa voce della cronologia poiché la sua connessione non esiste più.", + aiAnalysisTab: "Analisi Cronologia", + rollback: "Rollback", + rollbackSql: "SQL di Rollback", + rollbackAvailable: "Disponibile", + rollbackUnavailable: "Nessun SQL di rollback", + rollbackConfirm: "Eseguire l'SQL di rollback generato per questa voce della cronologia?", + rollbackSuccess: "Rollback eseguito", + rollbackFailed: "Rollback non riuscito: {message}", + confirmDelete: "Eliminare questa voce della cronologia?", + confirmClear: "Cancellare tutta la cronologia?", + filters: { + all: "Tutti", + query: "Query", + data_change: "Modifiche dati", + schema_change: "Modifiche schema", + failed: "Non riuscite", + }, + kinds: { + query: "Query", + data_change: "Modifica dati", + schema_change: "Modifica schema", + import: "Importazione", + transfer: "Trasferimento", + }, + kindShort: { + query: "SQL", + data_change: "Dati", + schema_change: "DDL", + import: "Importa", + transfer: "Sposta", + }, + detail: { + kind: "Tipo", + operation: "Operazione", + connection: "Connessione", + database: "Database", + target: "Destinazione", + time: "Ora", + duration: "Durata", + affectedRows: "Righe interessate", + rollback: "Rollback", + status: "Stato", + error: "Errore", + }, + }, + dangerDialog: { + title: "Operazione Pericolosa", + message: + "Questa istruzione SQL potrebbe modificare o eliminare i dati in modo irreversibile. Sei sicuro di volerla eseguire?", + suppressFuturePrompts: "Non chiedere più per SQL pericolosi", + deleteMessage: "Questa operazione di eliminazione potrebbe essere irreversibile. Continuare?", + deleteConfirm: "Conferma Eliminazione", + deleteRowMessage: + "Questa riga verrà contrassegnata per l'eliminazione e rimossa dal database dopo il salvataggio. Continuare?", + deleteRowsMessage: + "Queste {count} righe verranno contrassegnate per l'eliminazione e rimosse dal database dopo il salvataggio. Continuare?", + deleteRowDetails: "Tabella: {table}", + deleteRowDetailsNoTable: "Riga del risultato corrente", + redisKeyDetails: "Chiave Redis: {key}", + redisHashFieldDetails: "Hash Redis: {key}\nCampo: {field}", + redisListItemDetails: "Lista Redis: {key}\nIndice: {index}", + redisSetMemberDetails: "Set Redis: {key}\nMembro: {member}", + mongoDocumentDetails: "Collezione MongoDB: {collection}\n_id Documento: {id}", + mongoFieldDetails: "Campo: {field}", + mongoArrayItemDetails: "Indice elemento array: {index}", + cancel: "Annulla", + confirm: "Esegui", + }, + transfer: { + title: "Trasferimento Dati", + source: "Sorgente", + target: "Destinazione", + sourceConnection: "Connessione Sorgente", + sourceDatabase: "Database Sorgente", + sourceSchema: "Schema Sorgente", + targetConnection: "Connessione Destinazione", + targetDatabase: "Database Destinazione", + targetSchema: "Schema Destinazione", + tables: "Tabelle", + selectAll: "Seleziona Tutto", + deselectAll: "Deseleziona Tutto", + createTable: "Crea tabella se non esiste", + transferMode: "Modalità trasferimento", + modeAppend: "Accoda (INSERT)", + modeOverwrite: "Sovrascrivi (TRUNCATE + INSERT)", + modeUpsert: "Aggiorna/Inserisci (INSERT o UPDATE per chiave primaria)", + batchSize: "Dimensione lotto", + start: "Avvia Trasferimento", + cancel: "Annulla", + progress: "Trasferimento in corso...", + transferring: "Trasferimento di {table}...", + completed: "Trasferimento completato", + completedWithErrors: "Completato con {count} tabella non riuscita | Completato con {count} tabelle non riuscite", + failed: "Trasferimento non riuscito", + cancelled: "Trasferimento annullato", + rowsTransferred: "{count} righe trasferite", + tableProgress: "{current} / {total} tabelle", + noSqlConnections: "Nessuna connessione SQL disponibile", + selectTables: "Seleziona le tabelle da trasferire", + searchTables: "Cerca tabelle...", + noTables: "Nessuna tabella", + selectSourceFirst: "Seleziona prima la connessione e il database sorgente", + tableError: "Tabella {table} non riuscita: {error}", + overallProgress: "Progresso complessivo", + dataTransfer: "Trasferimento Dati", + }, + tableImport: { + title: "Importa Dati Tabella", + target: "Tabella di destinazione", + selectFile: "Seleziona File", + file: "File", + rows: "Righe", + mapped: "Mappata", + mapping: "Mappatura Colonne", + skipColumn: "Salta", + preview: "Anteprima", + mode: "Modalità importazione", + append: "Accoda dati", + truncate: "Tronca quindi importa", + progress: "Progresso", + start: "Avvia Importazione", + success: "Importate {count} righe", + }, + sqlFile: { + title: "Esegui File SQL", + file: "File", + selectSqlFile: "Seleziona file SQL", + browse: "Sfoglia", + previewingLines: "Anteprima di {count} righe", + previewingFirstLines: "Anteprima delle prime {count} righe", + target: "Destinazione", + connection: "Connessione", + selectConnection: "Seleziona connessione", + database: "Database", + selectDatabase: "Seleziona database", + databasePlaceholder: "Nome database", + options: "Opzioni", + continueOnError: "Continua in caso di errore", + cancelling: "Annullamento in corso...", + cancel: "Annulla", + execute: "Esegui", + statement: "Istruzione", + succeeded: "Riuscito", + failed: "Non riuscito", + affectedRows: "Righe interessate", + currentStatement: "Istruzione corrente", + status: { + idle: "Inattivo", + started: "Avviato", + running: "In esecuzione", + statementDone: "Istruzione completata", + statementFailed: "Istruzione non riuscita", + done: "Completato", + error: "Errore", + cancelled: "Annullato", + }, + }, + diff: { + title: "Confronta Database", + source: "Sorgente", + target: "Destinazione", + selectConnection: "Seleziona connessione", + selectDatabase: "Seleziona database", + selectSchema: "Seleziona schema", + ignoreComments: "Ignora differenze nei commenti", + compare: "Confronta", + comparing: "Confronto degli schemi...", + noDifferences: "Nessuna differenza trovata", + table: "Tabella", + status: "Stato", + details: "Dettagli", + added: "Aggiunta", + removed: "Rimossa", + modified: "Modificata", + indexes: "Indici", + foreignKeys: "Chiavi esterne", + triggers: "Trigger", + comments: "Commenti", + newTable: "Nuova tabella", + dropTable: "Elimina tabella", + generatedSql: "SQL di Sincronizzazione", + copySql: "Copia SQL", + executeSync: "Esegui Sincronizzazione", + syncSuccess: "Sincronizzazione eseguita con successo", + swap: "Inverti sorgente e destinazione", + syncProgress: "Esecuzione in corso: {current}/{total}", + syncSummary: "Riuscite {success}, non riuscite {failed}", + }, + dataCompare: { + title: "Confronta Dati", + selectTable: "Seleziona tabella", + sourceTables: "Tabelle sorgente", + targetTable: "Tabella di destinazione", + searchTables: "Cerca tabelle...", + selectedTables: "{selected}/{total} selezionate", + selectAllTables: "Seleziona tutte", + deselectAllTables: "Deseleziona tutte", + selectSourceTables: + "Seleziona prima la connessione e il database sorgente, quindi scegli le tabelle da confrontare", + noTables: "Nessuna tabella disponibile per il confronto", + autoMatchHint: "La modalità batch associa automaticamente le tabelle di destinazione con lo stesso nome", + matchedTables: "{matched}/{total} tabelle associate", + missingTargetTables: "Tabelle di destinazione con lo stesso nome mancanti: {tables}", + keyColumns: "Colonne Chiave", + keyColumnsPlaceholder: "Colonne primarie o uniche separate da virgola", + keyColumnsAutoHint: + "Lascia vuoto per rilevare automaticamente le chiavi primarie per il confronto a tabella singola, o per tabella nel confronto batch.", + rowCounts: "Sorgente {source} righe, destinazione {target} righe; confronto completo completato", + previewLimitOption: "Anteprima {count}", + compare: "Confronta Dati", + summary: "Aggiunte {added}, rimosse {removed}, modificate {modified}", + batchSummary: + "Confrontate {tables} tabelle: {different} diverse, {same} identiche, {failed} non riuscite; aggiunte {added}, rimosse {removed}, modificate {modified}", + comparingTable: "Confronto di {current}/{total}: {table}", + keyColumnsInline: "Colonne chiave: {columns}", + selectedInline: "Selezionate {selected}/{total}", + selectedSummary: "Selezionate: aggiunte {added}, rimosse {removed}, modificate {modified}", + selectAllKind: "Seleziona tutti i {kind}", + clearKind: "Cancella {kind}", + clearSelection: "Cancella tutte le selezioni", + showAllRows: "Mostra tutte le {count}", + showLessRows: "Mostra meno", + remainingRows: "altre {count} righe nascoste nell'anteprima", + planningSync: "Aggiornamento del piano di sincronizzazione...", + noSelectedDifferences: "Nessuna differenza selezionata per l'esecuzione", + planSummary: + "Piano: {inserts} inserimenti, {updates} aggiornamenti, {deletes} eliminazioni, {statements} istruzioni", + statusDifferent: "Diverse", + statusSame: "Identiche", + statusError: "Non riuscite", + noKeyColumns: "Seleziona almeno una colonna chiave", + missingKeyColumns: + "Le colonne chiave devono esistere sia nella tabella sorgente che in quella di destinazione: {columns}", + noCommonColumns: "Le tabelle sorgente e destinazione non hanno colonne comuni da confrontare", + targetTableMissing: "Tabella di destinazione non trovata: {table}", + noComparableTables: + "Nessuna tabella confrontabile trovata. Verifica se esistono tabelle di destinazione con lo stesso nome.", + noDifferences: "I dati sono identici, nessun SQL di sincronizzazione necessario", + syncSuccess: "Sincronizzazione dei dati eseguita con successo", + }, + settings: { + title: "Impostazioni", + editorTab: "Editor", + appearanceTab: "Aspetto", + navigationTab: "Navigazione", + dataTab: "Dati", + redisTab: "Redis", + shortcutsTab: "Scorciatoie", + snippetsTab: "Snippet", + syncTab: "Sincronizzazione", + aiTab: "AI", + mcpTab: "MCP", + jdbcTab: "Driver JDBC", + securityTab: "Sicurezza", + aboutTab: "Informazioni", + fontFamily: "Famiglia Carattere (Font)", + selectFont: "Seleziona font...", + searchFont: "Cerca font...", + loadingFonts: "Caricamento font...", + noFontsFound: "Nessun font trovato", + useCustomFont: "Usa “{font}”", + languageTitle: "Lingua / Language", + fontSize: "Dimensione Carattere", + uiScale: "Scala UI", + uiScaleDescription: + "Scala l'intera interfaccia utente desktop per display ad alta densità (High-DPI). Le modifiche si applicano immediatamente e vengono ripristinate al prossimo avvio.", + theme: "Tema", + selectTheme: "Seleziona tema...", + followAppTheme: "Segui il tema dell'applicazione", + appLayout: "Layout dell'Interfaccia", + appLayoutSeparated: "Separato moderno", + appLayoutSeparatedDescription: "Separazione chiara dei pannelli con schede stile blocco.", + appLayoutClassic: "Classico compatto", + appLayoutClassicDescription: "Barra delle schede continua con intestazioni di pannello compatte.", + iconTheme: "Stile icona e logo", + iconThemeDefault: "Predefinito", + iconThemeDefaultDescription: "Utilizza l'icona colorata dell'app DBX.", + iconThemeBlack: "Nero", + iconThemeBlackDescription: "Utilizza il marchio DBX nero per la finestra, la barra delle applicazioni e il logo.", + showTrayIcon: "Mostra icona nella barra delle applicazioni/menu", + showTrayIconDescription: + "Se disattivato, non viene mostrata alcuna icona, ma la chiusura della finestra nasconderà comunque DBX in background.", + dataGridDisplay: "Visualizzazione griglia dati", + showColumnCommentsInHeader: "Mostra i commenti delle colonne sotto i nomi", + showColumnCommentsInHeaderDescription: + "Visualizza i commenti delle colonne della tabella direttamente sotto i nomi delle colonne nella griglia.", + compactColumnHeaderActions: "Strumenti intestazione colonna compatti", + compactColumnHeaderActionsDescription: + "Sposta gli strumenti del formattatore e dei filtri locali in un menu 'altro' in modo che i nomi delle colonne abbiano la priorità.", + sidebarActivation: "Attivazione barra laterale", + sidebarActivationSingle: "Singolo clic", + sidebarActivationSingleDescription: "Apri gli elementi della barra laterale con un solo clic.", + sidebarActivationDouble: "Doppio clic", + sidebarActivationDoubleDescription: "Un singolo clic seleziona le righe; un doppio clic apre gli elementi.", + sidebarObjectDisplay: "Layout oggetti barra laterale", + sidebarObjectDisplayGrouped: "Vista avanzata", + sidebarObjectDisplayGroupedDescription: + "Raggruppa gli oggetti per tabelle, viste, procedure e funzioni per i database con più tipi di oggetti.", + sidebarObjectDisplaySimple: "Vista semplice", + sidebarObjectDisplaySimpleDescription: + "Elenca tabelle e viste direttamente sotto ogni database o schema per ridurre i livelli intermedi.", + autoSelectActiveSidebarNode: "Seleziona sempre l'elemento aperto", + autoSelectActiveSidebarNodeDescription: + "Quando passi da una scheda all'altra, seleziona la tabella, la collezione o il file SQL visibile corrispondente nella barra laterale.", + disconnectTabHandlingMode: "Schede dopo la disconnessione", + disconnectTabHandlingModeDescription: + "Scegli come gestire le schede correlate dopo la chiusura di una connessione o di un database.", + disconnectTabHandlingModeCloseTabs: "Chiudi tutte le schede", + disconnectTabHandlingModeCloseTabsDescription: "Chiudi tutte le schede correlate per la connessione o il database.", + disconnectTabHandlingModeKeepTabsClearResults: "Chiudi schede oggetti, mantieni schede SQL", + disconnectTabHandlingModeKeepTabsClearResultsDescription: + "Chiudi i dati delle tabelle, l'esplorazione degli oggetti e le schede della struttura mantenendo le schede delle query SQL e il testo SQL, e cancella anche lo stato di esecuzione e le sessioni dei risultati.", + disconnectTabHandlingModeKeepTabsKeepResults: "Non chiudere le schede correlate", + disconnectTabHandlingModeKeepTabsKeepResultsDescription: + "Mantieni le schede correlate, il testo SQL e i risultati correnti senza ulteriore pulizia.", + reuseDataTab: "Riusa scheda dati", + reuseDataTabDescription: + "Quando fai clic su una tabella nella barra laterale, riutilizza la scheda dati esistente invece di crearne una nuova ogni volta.", + sidebarHiddenTablePrefixes: "Prefissi dei nomi delle tabelle nascosti", + sidebarHiddenTablePrefixesDescription: + "Un prefisso per riga. Solo le etichette di tabelle, viste e collezioni della barra laterale vengono abbreviate; i suggerimenti e le azioni utilizzano ancora il nome completo.", + sidebarHiddenTablePrefixesPlaceholder: "Esempio:\nODS_\nT8Y2_LONG_", + sidebarHideTableComments: "Nascondi i commenti delle tabelle nella barra laterale", + sidebarHideTableCommentsDescription: + "Nascondi i commenti in linea delle tabelle/viste mostrati accanto ai nomi nell'albero della barra laterale per risparmiare spazio orizzontale.", + sidebarAllowHorizontalScroll: "Consenti scorrimento orizzontale barra laterale", + sidebarAllowHorizontalScrollDescription: + "Mostra i nomi lunghi di tabelle, viste e collezioni per intero consentendo lo scorrimento orizzontale della barra laterale.", + snippetsDescription: "Personalizza i modelli di snippet SQL attivati nell'editor.", + snippetsAdd: "Aggiungi Snippet", + snippetsLabel: "Etichetta", + snippetsPrefix: "Prefisso", + snippetsBody: "Corpo SQL", + snippetsLabelPlaceholder: "es. select *", + snippetsPrefixPlaceholder: "es. sel", + snippetsBodyPlaceholder: "SELECT *\nFROM tabella\nLIMIT 100;", + snippetsRestoreDefaults: "Ripristina Predefiniti", + snippetsAddTitle: "Aggiungi Snippet", + snippetsEditTitle: "Modifica Snippet", + syncWebDavTitle: "Sincronizzazione WebDAV", + syncWebDavDescription: + "Carica o ripristina uno snapshot di DBX da un servizio di archiviazione compatibile con WebDAV.", + syncEndpoint: "URL WebDAV", + syncUsername: "Nome utente", + syncPassword: "Password", + syncPasswordPlaceholder: "Inserisci password", + syncClearSavedPassword: "Cancella password salvata", + syncRememberWebDavPassword: "Ricorda la password dell'app WebDAV", + syncSavedPassword: "(salvata)", + syncRememberWebDavPasswordDescription: + "La password viene crittografata e memorizzata solo su questo dispositivo. Non viene sincronizzata su WebDAV e non sostituisce la password di sincronizzazione.", + syncRemotePath: "Percorso snapshot remoto", + syncRemotePathDescription: "DBX creerà le cartelle superiori mancanti durante il caricamento.", + syncSecretNotice: + "Per impostazione predefinita, DBX sincronizza solo i dettagli e le impostazioni di connessione. Le password dei database, le password SSH, le password proxy, le stringhe di connessione e le chiavi API AI rimangono locali.", + syncSecrets: "Sincronizza i segreti crittografati", + syncSecretsDescription: + "Se abilitato, DBX crittografa le password del database, le password SSH e le chiavi API AI prima di caricarle su WebDAV.", + syncSecretsPassphrase: "Password di sincronizzazione", + syncSecretsPassphraseDescription: + "Questa password viene utilizzata solo per crittografare e ripristinare i dati sensibili. DBX non la salva; inseriscila nuovamente su ciascun dispositivo.", + syncTest: "Verifica", + syncUpload: "Carica", + syncDownload: "Scarica", + syncTestSuccess: "La destinazione WebDAV è raggiungibile.", + syncUploadSuccess: "Caricati {bytes} byte su {path}.", + syncDownloadSuccess: "Scaricati e applicati {bytes} byte da {path}.", + syncSecretsApplied: "I segreti crittografati sono stati ripristinati.", + syncSecretsSkipped: "I segreti crittografati erano presenti ma non sono stati ripristinati.", + syncDownloadConfirm: + "Scaricare e applicare lo snapshot DBX remoto? I metadati locali e i file SQL salvati verranno sostituiti.", + apply: "Applica", + applyAndClose: "Applica e Chiudi", + reset: "Reimposta", + resetDefaults: "Ripristina Predefiniti", + save: "Salva", + cancel: "Annulla", + executeMode: "Modalità Esecuzione (Cmd+Enter)", + executeModeAll: "Esegui tutto l'SQL", + executeModeCurrent: "Esegui istruzione al cursore", + wordWrap: "A capo automatico", + wordWrapDescription: "Incolonna le righe SQL lunghe entro la larghezza dell'editor", + confirmDangerousSqlExecution: "Conferma prima di SQL pericoloso", + confirmDangerousSqlExecutionDescription: + "Se disattivato, ALTER, DROP, DELETE, TRUNCATE e altri SQL pericolosi verranno eseguiti senza la finestra di avviso.", + redisScanPageSize: "Conteggio scansione Redis", + redisScanPageSizeDescription: "Chiavi richieste per pagina SCAN di Redis durante la navigazione delle chiavi.", + redisScanPageSizeOption: "{count} chiavi", + exportBatchSize: "Dimensione del lotto di esportazione", + exportBatchSizeDescription: + "Righe recuperate per lotto durante l'esportazione dei dati della tabella (100-100000).", + exportSection: "Esportazione", + shortcutExecuteSql: "Esegui SQL", + shortcutFind: "Trova", + shortcutReplace: "Sostituisci", + shortcutSaveSql: "Salva SQL", + shortcutAcceptCompletion: "Accetta completamento", + shortcutCopyCurrentRow: "Copia riga dati corrente", + shortcutDeleteCurrentRow: "Elimina riga dati corrente", + shortcutNewQuery: "Nuova query", + shortcutCloseTab: "Chiudi scheda", + shortcutFocusSearch: "Focalizza ricerca", + shortcutZoomInUi: "Ingrandisci UI", + shortcutZoomOutUi: "Rimpicciolisci UI", + shortcutResetUiZoom: "Reimposta zoom UI", + shortcutRefreshData: "Aggiorna dati", + shortcutToggleTranspose: "Attiva/disattiva vista trasposta", + shortcutCancelSearch: "Annulla ricerca", + shortcutScopeGlobal: "Globale", + shortcutScopeEditor: "Editor SQL", + shortcutScopeGrid: "Griglia dati", + shortcutScopeSearch: "Cerca campi", + shortcutPressShortcut: "Premi scorciatoia", + shortcutConflict: "Questa scorciatoia è in conflitto con un'altra azione nello stesso ambito.", + preview: "Anteprima in tempo reale", + jdbcPlugin: "Plugin DBX JDBC", + jdbcPluginInstall: "Installa plugin JDBC", + jdbcPluginInstallSuccess: "Plugin JDBC installato", + jdbcPluginUpdate: "Aggiorna", + jdbcPluginUninstall: "Disinstalla", + jdbcPluginUninstallSuccess: "Plugin JDBC disinstallato", + jdbcPluginInstalled: "Installato: v{version}", + jdbcPluginIncompatible: "Protocollo incompatibile", + jdbcPluginNotInstalled: "Non installato", + jdbcDrivers: "JAR del driver JDBC", + jdbcImport: "Importa JAR", + jdbcImportPath: "Percorso di importazione", + jdbcDriverPathPlaceholder: "/percorso/per/driver.jar", + jdbcImportSuccess: "Importato/i {count} file del driver", + jdbcDeleteSuccess: "Driver rimosso", + jdbcNoDrivers: "Nessun driver JDBC ancora importato.", + mcpTitle: "Server MCP", + mcpDescription: + "Verifica l'installazione e la versione del Server DBX MCP utilizzata da Claude Code, Cursor e altri agenti.", + mcpChecking: "Verifica in corso", + mcpStatusUnknown: "Non verificato", + mcpStatusError: "Verifica non riuscita", + mcpReady: "Pronto", + mcpNotInstalled: "Non installato", + mcpUpdateAvailable: "Aggiornamento disponibile", + mcpCurrent: "Versione corrente", + mcpLatest: "Ultima versione", + mcpVersionMissing: "Nessuna installazione globale rilevata", + mcpVersionUnknown: "Sconosciuta", + mcpAvailable: "Disponibile", + mcpUnavailable: "Non disponibile", + mcpBinPath: "Comando path", + mcpInstallCommand: "Comando di installazione", + mcpUpdateCommand: "Comando di aggiornamento", + mcpConfig: "Configurazione MCP", + mcpCodexConfig: "Configurazione Codex", + mcpCodexConfigPath: "Codex può utilizzare ~/.codex/config.toml o un .codex/config.toml a livello di progetto.", + mcpReadonlyMode: "Modalità sola lettura", + mcpReadonlyModeDescription: + "Aggiunge DBX_MCP_ALLOW_WRITES=0 alla configurazione di esempio in modo che la sessione MCP rimanga di sola query.", + mcpAllowDangerous: "Consenti SQL pericoloso", + mcpAllowDangerousDescription: + "Aggiunge DBX_MCP_ALLOW_DANGEROUS_SQL=1 alla configurazione di esempio in modo che siano consentite istruzioni come DROP, TRUNCATE, ALTER e simili.", + mcpDetectionTiming: + "DBX esegue la verifica automaticamente all'apertura di questa pagina; usa di nuovo Verifica per aggiornare.", + mcpNpmBoundary: + "DBX verifica e spiega solo lo stato di MCP; l'installazione e gli aggiornamenti vengono comunque eseguiti tramite npm.", + mcpRefresh: "Verifica di nuovo", + mcpGuide: "Guida MCP", + aboutDescription: "Uno strumento di gestione di database leggero e open-source.", + community: "Community", + qqGroup: "Gruppo QQ", + wechatGroup: "Gruppo WeChat", + wechatGroupInvite: "Invito Tencent Docs", + project: "Progetto", + openSource: "Repository open-source", + officialDocs: "Documenti ufficiali", + }, + driverStore: { + progressJreExtract: "Estrazione JRE...", + progressDownloadJre: "Download JRE in corso", + progressDownloadDriver: "Download driver in corso", + usageTitle: "Utilizzo dello spazio di archiviazione", + usageTotal: "Totale {size}", + usageTotalLabel: "Totale", + calculating: "Calcolo in corso...", + usageManagedJre: "JRE gestito", + usageAgentDrivers: "Agenti driver integrati", + usageJdbcPlugin: "Plugin JDBC", + usageJdbcDriverJars: "JAR dei driver JDBC", + javaRuntimeSaved: "Impostazioni Java Runtime salvate", + javaRuntimeSaveFailed: "Impossibile salvare le impostazioni del runtime Java: {error}", + chooseJavaExecutable: "Scegli l'eseguibile Java", + driverInstallSuccess: "Driver {label} installato", + driverInstallFailed: "Installazione del driver {label} non riuscita: {error}", + driverUpdateBlocked: "Chiudi queste connessioni al database prima di aggiornare i driver: {labels}", + upgradeAllSuccess: "{count} driver aggiornato/i", + upgradeAllPartial: "{count} driver aggiornato/i. Saltati: {failed}", + upgradeAllFailed: "Aggiornamento in blocco non riuscito: {error}", + driverUninstallSuccess: "Driver {label} disinstallato", + driverUninstallFailed: "Disinstillazione del driver {label} non riuscita: {error}", + chooseOfflineDriverPackage: "Scegli pacchetto driver offline", + offlineImportSuccess: "Importazione offline completata. Installato/i {count} driver.", + offlineImportFailed: "Importazione offline non riuscita: {error}", + driverImportSuccess: "Driver {label} importato", + driverImportFailed: "Importazione del driver {label} non riuscita: {error}", + chooseDriverJar: "Scegli il file JAR del driver", + jreReinstallSuccess: "JRE {jre} reinstallato", + jreReinstallFailed: "Reinstallazione del JRE {jre} non riuscita: {error}", + jreUninstallSuccess: "JRE {jre} disinstallato", + chooseJdbcPluginZip: "Scegli il file zip del plugin JDBC", + agentDrivers: "Driver integrati", + jdbcDrivers: "Driver JDBC", + importing: "Importazione in corso...", + importOfflinePackage: "Importa pacchetto offline", + refresh: "Aggiorna", + javaRuntime: "Java Runtime", + javaRuntimeManaged: "JRE gestito da DBX", + javaRuntimeSystem: "Java di sistema", + javaRuntimeCustom: "Percorso personalizzato", + saving: "Salvataggio...", + customJavaPathPlaceholder: "/percorso/per/java o /percorso/per/jdk", + choose: "Scegli", + systemJavaHint: "Usa java dal PATH corrente.", + jreRuntimeTitle: "Runtime JRE {jre}", + notInstalled: "Non installato", + reinstalling: "Reinstallazione in corso", + installing: "Installazione in corso", + install: "Installa", + reinstall: "Reinstalla", + uninstall: "Disinstalla", + jreRuntime: "Runtime JRE", + jreRuntimeAutoDownloadHint: "Scaricato automaticamente durante l'installazione di un driver per la prima volta", + driversUpdatable: "{count} driver può essere aggiornato | {count} driver possono essere aggiornati", + upgradingProgress: "Aggiornamento in corso ({current}/{total})", + upgradeAll: "Aggiorna tutti", + queued: "In coda", + importLocalJar: "Importa JAR locale", + updating: "Aggiornamento in corso", + update: "Aggiorna", + localInstall: "Installazione locale", + runtimeDrivers: "Runtime", + runtimeTitle: "Runtime del driver", + runtimeHint: "Le metriche di runtime vengono raccolte solo mentre questo pannello è aperto.", + runtimeRunning: "In esecuzione", + runtimeMemory: "Memoria", + runtimeHealth: "Stato", + runtimeHealth_healthy: "Sano", + runtimeHealth_warning: "Avviso", + runtimeHealth_error: "Errore", + runtimeLastError: "Ultimo errore", + runtimeEmpty: "Nessun runtime di driver ancora avviato. Apri una connessione guidata da agenti per avviarne uno.", + runtimeKindAgent: "Agente", + runtimeKindPlugin: "Plugin", + runtimeSourceDaemon: "Demone", + runtimeSourceConnection: "Connessione", + runtimeStatus_running: "In esecuzione", + runtimeStatus_stopped: "Arrestato", + runtimeStatus_error: "Errore", + runtimeStatus_unknown: "Sconosciuto", + runtimePid: "PID", + runtimeUptime: "Tempo di attività", + runtimeActions: "Azioni", + runtimeStop: "Arresta", + runtimeRestart: "Riavvia", + runtimeControlConnectionOwned: "Chiudi la connessione al database per arrestare questo runtime.", + runtimeStopSuccess: "Runtime {label} arrestato", + runtimeStopFailed: "Arresto di {label} non riuscito: {error}", + runtimeRestartSuccess: "Runtime {label} riavviato", + runtimeRestartFailed: "Riavvio di {label} non riuscito: {error}", + }, + databaseExport: { + title: "Esporta Database", + includeStructure: "Struttura tabella (DDL)", + dropTableIfExists: "Aggiungi DROP TABLE IF EXISTS prima del DDL", + includeData: "Dati tabella (INSERT)", + includeObjects: "Viste / Procedure / Funzioni", + tableSelection: "Tabelle", + selectedTables: "{selected}/{total} selezionate", + selectAllTables: "Seleziona tutte", + filterTables: "Cerca tabelle...", + clearTables: "Cancella", + loadingTables: "Caricamento tabelle...", + tableLoadError: "Caricamento tabelle non riuscito: {error}", + noTables: "Nessuna tabella trovata", + export: "Esporta", + exporting: "Esportazione in corso...", + currentTable: "Corrente: {table} ({current}/{total})", + rowsExported: "{count} righe esportate", + exportSuccess: "Database esportato con successo", + exportError: "Esportazione non riuscita: {error}", + exportCancelled: "Esportazione annullata", + }, +}; diff --git a/apps/desktop/src/lib/localeOptions.ts b/apps/desktop/src/lib/localeOptions.ts index 2efdf8433..0fa2d084e 100644 --- a/apps/desktop/src/lib/localeOptions.ts +++ b/apps/desktop/src/lib/localeOptions.ts @@ -3,6 +3,7 @@ import type { Locale } from "@/i18n"; export const LOCALE_OPTIONS: { value: Locale; flag: string; label: string }[] = [ { value: "en", flag: "🇺🇸", label: "English" }, { value: "es", flag: "🇪🇸", label: "Español" }, + { value: "it", flag: "🇮🇹", label: "Italiano" }, { value: "zh-CN", flag: "🇨🇳", label: "简体中文" }, { value: "zh-TW", flag: "繁", label: "繁體中文" }, ];