From dfba5c1bde33c1b0f4100ff22778812d6554cabd Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 27 Jun 2026 23:41:14 +0800 Subject: [PATCH] feat(i18n): add withEnglishFallback and fill missing translations across 7 locales --- apps/desktop/src/i18n/locales/en.ts | 33 ++ apps/desktop/src/i18n/locales/es.ts | 502 +++++++++++++++++++++- apps/desktop/src/i18n/locales/fallback.ts | 30 ++ apps/desktop/src/i18n/locales/it.ts | 436 ++++++++++++++++++- apps/desktop/src/i18n/locales/ja.ts | 167 ++++++- apps/desktop/src/i18n/locales/pt-BR.ts | 434 ++++++++++++++++++- apps/desktop/src/i18n/locales/zh-CN.ts | 20 +- apps/desktop/src/i18n/locales/zh-TW.ts | 373 +++++++++++++++- 8 files changed, 1983 insertions(+), 12 deletions(-) create mode 100644 apps/desktop/src/i18n/locales/fallback.ts diff --git a/apps/desktop/src/i18n/locales/en.ts b/apps/desktop/src/i18n/locales/en.ts index fbf7735ed..68c591187 100644 --- a/apps/desktop/src/i18n/locales/en.ts +++ b/apps/desktop/src/i18n/locales/en.ts @@ -890,6 +890,9 @@ export default { close: "Close", cancel: "Cancel", save: "Save", + copy: "Copy", + import: "Import", + remove: "Remove", retry: "Retry", more: "More", done: "Done", @@ -2212,8 +2215,27 @@ export default { syncProgress: "Executing: {current}/{total}", syncSummary: "Succeeded {success}, failed {failed}", configSaved: "Config saved", + configDeleted: "Config deleted", + sourceObject: "Source object", + targetObject: "Target object", + operation: "Operation", + selectedCount: "{selected} selected of {total}", + saveConfig: "Save config", + loadConfig: "Load config", + options: "Options", + ddlCompare: "DDL compare", + deployScript: "Deploy script", + deployScriptAll: "All deploy scripts", + deployScriptDesc: "SQL script for the selected object", + deployScriptAllDesc: "SQL script for all selected objects", + copy: "Copy", + execute: "Execute", + executeAll: "Execute all", + executeSuccess: "Executed successfully", selectObjectToCompare: "Select an object to view DDL comparison", noDdlAvailable: "No DDL available", + noDeployScript: "No deploy script", + noDeployScriptAll: "No deploy script for selected objects", sourceDdl: "Source DDL", targetDdl: "Target DDL", objectNotExistsInSource: "This object does not exist in the source database", @@ -2237,6 +2259,10 @@ export default { delete: "Delete", modify: "Modify", cancel: "Cancel", + prevStep: "Previous", + recompare: "Compare again", + maximize: "Maximize", + restore: "Restore", operationLabel: { modify: "Objects to modify", create: "Objects to create", @@ -2262,6 +2288,13 @@ export default { affectedRows: "Affected Rows", executedStatements: "Executed Statements", serverVersion: "Server Version", + info: "Info", + connType: "Connection type", + connName: "Connection name", + host: "Host", + port: "Port", + copied: "Copied to clipboard", + saveConfigPrompt: "Please enter config name:", close: "Close", }, schemaDiff: { diff --git a/apps/desktop/src/i18n/locales/es.ts b/apps/desktop/src/i18n/locales/es.ts index 49ab6c200..67d7df02e 100644 --- a/apps/desktop/src/i18n/locales/es.ts +++ b/apps/desktop/src/i18n/locales/es.ts @@ -1,4 +1,6 @@ -export default { +import { withEnglishFallback } from "./fallback"; + +export default withEnglishFallback({ app: { name: "DBX", }, @@ -34,6 +36,8 @@ export default { formatSqlFailed: "Error al formatear el SQL", keywordCaseLower: "Usar palabras clave SQL en minúsculas", keywordCaseUpper: "Usar palabras clave SQL en mayúsculas", + previewSql: "Vista previa de SQL", + hidePreviewSql: "Ocultar vista previa de SQL", saveSql: "Guardar en biblioteca SQL", openSql: "Abrir archivo SQL", theme: "Tema", @@ -153,6 +157,11 @@ export default { h2FilePathRequired: "La ruta del archivo H2 no puede estar vacía", createDuckDbFile: "Crear archivo DuckDB", createSqliteFile: "Crear base de datos SQLite", + memoryDatabasePathHint: "Usa :memory: para crear una base de datos SQLite o DuckDB en memoria.", + sqliteExtensions: "Extensiones de SQLite", + sqliteExtensionsPlaceholder: "/ruta/a/regexp.dylib\n/ruta/a/text.dylib|sqlite3_text_init", + sqliteExtensionsHint: 'Una .dylib/.so/.dll por línea. Usa "ruta|punto de entrada" cuando se requiera un punto de entrada. Se cargan al conectar, luego load_extension se deshabilita.', + sqliteExtensionBrowse: "Seleccionar extensión de SQLite", user: "Usuario", password: "Contraseña", database: "Base de datos", @@ -174,6 +183,8 @@ export default { driverName: "Nombre del driver", driverNamePlaceholder: "Nombre del proveedor o entorno", urlParams: "Parámetros de URL", + gbaseServer: "GBASEDBTSERVER", + informixServer: "INFORMIXSERVER", sslEnable: "Habilitar conexión cifrada", caCertPath: "Certificado CA", caCertPathPlaceholder: "Opcional, p. ej. ~/.yandex/RootCA.crt", @@ -231,6 +242,23 @@ export default { redisSentinelTls: "TLS Sentinel", redisSentinelTlsHint: "Usar TLS al conectar con nodos Sentinel", redisKeySeparator: "Separador de espacio de nombres de clave", + etcdEndpoints: "Endpoints", + etcdEndpointsHint: "Una entrada por línea. Déjalo en blanco para usar el host y puerto de arriba.", + etcdCaCertPlaceholder: "/ruta/a/ca.crt", + etcdCaCertBrowse: "Elegir certificado CA", + etcdClientAuth: "Autenticación de cliente", + etcdClientCertPlaceholder: "/ruta/a/client.crt", + etcdClientKeyPlaceholder: "/ruta/a/client.key", + etcdClientCertHint: "El certificado y la clave privada deben proporcionarse juntos cuando etcd requiere mTLS.", + etcdClientCertBrowse: "Elegir certificado de cliente", + etcdClientKeyBrowse: "Elegir clave privada de cliente", + etcdClientCertPairRequired: "El certificado y la clave privada deben proporcionarse juntos.", + zookeeperConnectString: "Cadena de conexión", + zookeeperConnectStringHint: "Entradas host:puerto separadas por coma o por línea. Déjalo en blanco para usar el host y puerto de arriba.", + zookeeperCreateModePersistent: "Persistente", + zookeeperCreateModeEphemeral: "Efímero", + zookeeperCreateModePersistentSequential: "Persistente secuencial", + zookeeperCreateModeEphemeralSequential: "Efímero secuencial", nacosConsoleUrl: "URL de consola", nacosConsoleUrlHint: "Usa la dirección de consola/admin API de Nacos. Nacos 3 Docker normalmente expone la consola en 8085; despliegues antiguos pueden compartir 8848 con el puerto de servicio.", nacosConsoleUrlRequired: "La URL de consola de Nacos es obligatoria", @@ -331,6 +359,8 @@ export default { jdbcDriverClassPlaceholder: "La mayoría de los drivers se registran automáticamente; usa com.vendor.jdbc.Driver si es necesario", jdbcDriverPaths: "JARs del driver JDBC", jdbcDriverSelectPlaceholder: "Seleccionar driver importado", + jdbcManualClasspath: "Classpath manual", + jdbcManualClasspathCount: "{count} rutas", jdbcDriverPathsPlaceholder: "/ruta/al/driver.jar\n/ruta/a/otro-driver.jar", jdbcDriverBrowse: "Seleccionar JAR del driver JDBC", jdbcDocs: "Ver documentación JDBC", @@ -358,13 +388,18 @@ export default { showResultsPane: "Mostrar resultados", hideResultsPane: "Ocultar resultados", noDatabase: "Sin base de datos seleccionada", + unsavedChangesTitle: "Cambios sin guardar", + unsavedChangesMessage: "Esta pestaña tiene cambios sin guardar que se perderán si se cierra. ¿Guardar antes de cerrar?", + discardChanges: "Descartar", selectConnection: "Seleccionar conexión", searchConnection: "Buscar conexiones...", selectDatabase: "Seleccionar base de datos", + selectDatabaseRequired: "Selecciona una base de datos primero", searchDatabase: "Buscar bases de datos...", selectSchema: "Seleccionar esquema", setDefaultDatabase: "Establecer como predeterminada", defaultDatabase: "Predeterminada", + clearDatabase: "Limpiar base de datos", completion: { nullValue: "Valor NULL", isNull: "Comprobar si es NULL", @@ -443,6 +478,11 @@ export default { table: "Tabla", tableData: "Datos de tabla", redis: "Redis", + etcd: "etcd", + zookeeper: "ZooKeeper", + vector: "Vector", + users: "Usuarios y Privilegios", + executionSummary: "Resumen de ejecución", mongo: "Mongo", objects: "Objetos", tooltipTitle: "Título:", @@ -452,11 +492,40 @@ export default { tooltipCollection: "Colección:", tooltipSchema: "Esquema:", resultN: "Resultado {n}", + runN: "Ejecutar {n}", + resultRuns: "Ejecuciones de resultado", + removeRun: "Eliminar ejecución {n}", + autoKeepResults: "Conservar resultados automáticamente", + autoKeepResultsEnabled: "Conservación automática activada", + autoKeepResultsDisabled: "Conservación automática desactivada", + missingResultRun: "Este resultado ya no está disponible", + exportResultArchive: "Guardar archivo de resultados", + importResultArchive: "Importar resultados", + importedResultArchive: "Resultados importados", + resultArchiveExported: "Resultados exportados", + resultArchiveImported: "Resultados importados", + resultArchiveUnavailable: "No hay resultados guardados disponibles para exportar", + resultArchiveImportInvalid: "No se pudo abrir este archivo de resultados", + resultArchiveExportFailed: "Error al exportar resultados: {message}", + resultArchiveImportFailed: "Error al importar resultados: {message}", scrollLeft: "Desplazar pestañas a la izquierda", scrollRight: "Desplazar pestañas a la derecha", openTabs: "Pestañas abiertas", openDataTabs: "Tablas abiertas", }, + executionSummary: { + empty: "Sin resumen de ejecución", + executing: "Ejecutando...", + statement: "Sentencia", + type: "Tipo", + rows: "Filas", + affected: "Afectadas", + time: "Tiempo", + success: "Éxito", + error: "Error", + returnedTable: "Devolvió una tabla de resultados de {count} columnas", + noTable: "No se devolvió ninguna tabla de resultados", + }, chart: { title: "Gráfico", type: "Tipo", @@ -528,6 +597,7 @@ export default { exportFailed: "Error al exportar: {message}", copied: "Copiado", copyFailed: "Error al copiar: {message}", + previewSqlEmpty: "No hay cambios SQL pendientes para previsualizar", domRenderMode: "DOM", canvasRenderMode: "Canvas", renderModeHint: "Alterna entre el renderizado Canvas y la cuadrícula DOM de respaldo.", @@ -553,6 +623,30 @@ export default { columnActions: "Acciones de columna", localFilter: "Filtro local de columna", localFilterFor: "Filtro local para '{column}'", + columnFormatter: "Formateador de columna", + columnFormatterFor: "Formateador para '{column}'", + columnFormatterHint: "Solo formatea la visualización; los valores sin procesar no cambian.", + formatterType: "Tipo", + formatterDatetime: "Marca de tiempo Unix", + formatterJsonPath: "Ruta JSON", + formatterMask: "Enmascarar texto", + formatterCustomTemplate: "Plantilla personalizada", + formatterTimestampUnit: "Unidad de marca de tiempo", + formatterUnitAuto: "Automático", + formatterUnitSeconds: "Segundos", + formatterUnitMilliseconds: "Milisegundos", + formatterJsonPathInput: "Ruta JSON", + formatterMaskPrefix: "Prefijo visible", + formatterMaskSuffix: "Sufijo visible", + formatterSavedCustom: "Plantillas guardadas", + formatterNewCustom: "Nueva plantilla", + formatterCustomName: "Nombre de plantilla", + formatterCustomNamePlaceholder: "Ejemplo: Etiqueta de usuario", + formatterCustomTemplateInput: "Plantilla", + formatterCustomTemplateHint: "Variables disponibles: ${value}, ${upper}, ${lower}, ${length}. Asígnale un nombre para guardarla en la lista.", + formatterPreview: "Vista previa", + saveFormatter: "Guardar", + clearFormatter: "Limpiar", searchValues: "Buscar valores...", filterTypedValue: "Usar '{value}'", value: "Valor", @@ -599,6 +693,8 @@ export default { filterChangedRows: "Modificadas", page: "Página {page}", rowsPerPage: "Filas por página", + customRowsPerPage: "Filas personalizadas", + applyPageSize: "Aplicar", save: "Guardar", discard: "Descartar", dismiss: "Cerrar", @@ -686,6 +782,11 @@ export default { restoreOriginalValue: "Restaurar original", copyColumnName: "Copiar nombre de columna", copySqlCondition: "Copiar condición SQL", + copyAlterColumnSql: "Copiar como SQL ALTER", + alterSqlCopied: "SQL ALTER copiado al portapapeles", + alterSqlCopiedWithWarnings: "SQL ALTER copiado al portapapeles ({count} advertencia(s))", + noAlterSqlAvailable: "No hay SQL ALTER disponible para esta columna", + copyAlterSqlFailed: "Error al copiar: {message}", transpose: "Transponer fila", transposeMultiRowToggle: "Varias filas", transposeSingleRow: "Fila actual", @@ -695,15 +796,43 @@ export default { columnDetails: "Detalles de columna", tableInfoSearch: "Buscar...", tableInfoNoResults: "Sin resultados", + tableInfo: "Información de tabla", + tableInfoColumns: "Columnas", + tableInfoIndexes: "Índices", + tableInfoForeignKeys: "Claves foráneas", + tableInfoTriggers: "Disparadores", + tableInfoNullable: "Nulable", + tableInfoEmpty: "Sin metadatos", queryError: "Error de consulta", dataUnavailable: "Los datos de la tabla deben volver a cargarse.", + dataUnavailableHintPrefix: "Presiona ", + dataUnavailableHintSuffix: " o haz clic en Actualizar abajo para recargar.", refresh: "Actualizar", + undoChange: "Deshacer cambio", + redoChange: "Rehacer cambio", commit: "Confirmar", rollback: "Revertir", transactionSaveHint: "Confirma {count} cambio(s) pendiente(s) en una transacción.", nonTransactionalSaveHint: "Guarda {count} cambio(s) pendiente(s) uno por uno. Si uno falla, los cambios anteriores correctos no se revierten.", keylessEditWarning: "Sin clave primaria", keylessEditWarningHint: "Esta tabla no tiene clave primaria. Las actualizaciones y eliminaciones usan todos los valores originales de la fila en WHERE; filas duplicadas exactas pueden verse afectadas juntas.", + queryEditReady: "Editable", + queryEditReadyHint: 'Este resultado de una sola tabla proviene de "{table}". Puedes editar, eliminar o agregar filas, luego usa la acción de cambios pendientes para guardar.', + queryEditReadOnly: "Resultado de solo lectura", + queryEditUnsupported: { + "not-select": "Solo los resultados de consultas SELECT pueden editarse directamente.", + cte: "Las consultas con WITH/CTE aún no son editables. Usa un SELECT simple de una sola tabla.", + "set-operation": "Los resultados de UNION, INTERSECT o EXCEPT no pueden asignarse de forma segura a las filas de origen.", + aggregation: "Los resultados con DISTINCT, GROUP BY, HAVING y agregaciones no pueden editarse directamente.", + "external-source": "Los archivos externos y los resultados de funciones de tabla no pueden escribirse directamente. Impórtalos a una tabla de base de datos antes de editarlos.", + "complex-source": "JOINs, múltiples tablas y subconsultas no pueden asignarse de forma segura a una fila de origen.", + "computed-columns": "Las expresiones calculadas o los resultados de funciones no pueden escribirse de vuelta. Selecciona nombres de columna originales.", + "no-table": "No se detectó ninguna tabla de origen editable.", + "no-primary-key": "La tabla de destino no tiene clave primaria, por lo que las filas no pueden actualizarse o eliminarse de forma segura.", + "primary-key-not-returned": "Al resultado le falta la columna de clave primaria original. Inclúyela por su nombre de columna original.", + "aliased-columns": "Las columnas de resultado usan alias o expresiones. Selecciona columnas editables por sus nombres originales.", + "metadata-unavailable": "DBX no pudo cargar los metadatos de la tabla, por lo que la edición de resultados está deshabilitada.", + }, sortUnsupported: "Este SQL no admite ordenamiento del resultado completo. Intenta con una consulta SELECT simple.", truncatedHint: "Los resultados están limitados a 10.000 filas. Usa LIMIT/OFFSET en tu consulta para paginar.", }, @@ -725,6 +854,13 @@ export default { clearFinished: "Limpiar finalizados", showMore: "Mostrar {count} más", showLess: "Mostrar menos", + failedTooltip: "{count} tarea en segundo plano fallida | {count} tareas en segundo plano fallidas", + databaseExportTitle: "Copia de seguridad: {name}", + sqlFileTitle: "Archivo SQL: {name}", + dataTransferTitle: "Transferencia de datos: {name}", + objectsCount: "{current} / {total} objetos", + tablesCount: "{current} / {total} tablas", + statementsCount: "{done} exitosas, {failed} fallidas", delete: "Eliminar", }, welcome: { @@ -756,6 +892,9 @@ export default { close: "Cerrar", cancel: "Cancelar", save: "Guardar", + copy: "Copiar", + import: "Importar", + remove: "Eliminar", retry: "Reintentar", more: "Más", done: "Listo", @@ -893,6 +1032,7 @@ export default { ai: { placeholder: "Describe tu consulta en lenguaje natural...", settings: "Configuración de IA", + noConfig: "La IA no está configurada. Configura tu proveedor de IA en Ajustes > IA.", provider: "Proveedor", model: "Modelo", browseModels: "Explorar modelos", @@ -941,6 +1081,22 @@ export default { thinking: "Procesando...", reasoningProcess: "Proceso de razonamiento", stopGenerating: "Detener generación", + tableMentionEmpty: "Sin tablas coincidentes", + tableMentionPlaceholderHint: "Escribe {'@'} para mencionar tablas como contexto", + tableMentionTypes: { + table: "Tabla", + view: "Vista", + systemTable: "Tabla del sistema", + temporaryTable: "Tabla temporal", + }, + modes: { + ask: "Preguntar", + agent: "Agente", + }, + modeHints: { + ask: "Genera SQL y explicaciones sin ejecutarlos automáticamente", + agent: "Ejecuta consultas seguras automáticamente cuando sea posible", + }, fixWithAi: "Corregir con IA", truncated: "Contexto truncado", contextSummary: "{database} · {tables} tablas", @@ -948,10 +1104,45 @@ export default { proposalConfirmYes: "Sí, continuar", proposalConfirmNo: "No, gracias", proposalConfirmTitle: "Confirmación de acción requerida", + agentSteps: { + generated: "SQL generado", + noSql: "No se encontró SQL", + safe: "Verificación de seguridad superada", + needsConfirm: "Requiere confirmación", + blocked: "Bloqueado", + autoExecute: "Listo para ejecutar", + notRequested: "No se solicitó ejecución", + skipped: "No ejecutado", + callingTool: "Llamando herramienta...", + toolDone: "Herramienta completada", + toolError: "Error de herramienta", + executeSafe: "Verificación de seguridad superada · Ejecutado", + executeBlocked: "Bloqueado por verificación de seguridad", + contextCompacted: "Contexto comprimido", + }, + agentStepTitles: { + riskCheck: "Verificación de riesgo: {action} · {category} · {environment} · {reasons}", + blocked: "La ejecución fue bloqueada por la política de riesgos. Revisa el SQL manualmente.", + requiresConfirmation: "Este SQL requiere confirmación antes de ejecutarse.", + askMode: "El modo Preguntar no ejecuta SQL automáticamente.", + unsupportedAction: "La acción de IA actual no ejecuta SQL automáticamente.", + noSql: "La respuesta no incluía un bloque de código SQL ejecutable.", + notRequested: "El usuario no solicitó ejecutar el SQL.", + skipped: "Este paso no se ejecutó.", + }, proxy: "Proxy", proxyEnable: "Enviar solicitudes de IA mediante proxy", proxyUrl: "URL del proxy", + enableThinking: "Razonamiento", + enableThinkingOn: "Activado", + enableThinkingOff: "Desactivado", + enableThinkingHint: "Esta opción solo tiene efecto en APIs /chat/completions y modelos compatibles. Cuando está desactivado, puede reducir significativamente el uso de tokens, pero la calidad de los resultados generados puede disminuir ligeramente.", anthropicMessagesHint: "Las API compatibles con Anthropic Messages suelen usar /v1/messages.", + contextWindow: "Ventana de contexto", + contextWindowAuto: "Auto (detectar desde el nombre del modelo)", + contextWindowHint: "Tokens. Déjalo vacío para detección automática. Configúralo manualmente para modelos locales/personalizados.", + codexCliPath: "Ruta de Codex CLI", + codexCliPathHint: "Déjalo vacío para usar codex desde PATH. Inicia sesión por separado con codex login.", actions: { generate: "Generar SQL", explain: "Explicar SQL", @@ -981,7 +1172,11 @@ export default { editConnection: "Editar conexión", revealDatabaseFile: "Mostrar en el explorador", selectVisibleDatabases: "Seleccionar bases visibles", + configureVisibleObjects: "Filtro de objetos visibles", + userAdmin: "Usuarios y Privilegios", + openUserAdmin: "Abrir Usuarios y Privilegios", duplicateConnection: "Duplicar conexión", + instanceInfo: "Información de la instancia", newQuery: "Nueva consulta", newSql: "Nuevo SQL", generateSql: "Generar SQL", @@ -999,6 +1194,7 @@ export default { refreshTab: "Actualizar datos", renameTab: "Renombrar pestaña", duplicateTab: "Duplicar pestaña", + compactTabTitle: "Acortar títulos de pestañas", closeTab: "Cerrar pestaña", closeOtherTabs: "Cerrar otras pestañas", closeAllTabs: "Cerrar todas las pestañas", @@ -1043,6 +1239,10 @@ export default { emptyTable: "Vaciar tabla", truncateTable: "Truncar tabla", duplicateStructure: "Clonar como tabla nueva", + renameObject: "Renombrar", + renameObjectTitle: "Renombrar objeto", + renameObjectNamePlaceholder: "Nuevo nombre", + renameObjectSuccess: '"{oldName}" renombrado a "{newName}"', confirmDropTableTitle: "Eliminar tabla", confirmDropTableMessage: '¿Estás seguro de que deseas eliminar "{name}"? Esto borrará permanentemente la tabla y todos sus datos.', confirmEmptyTableTitle: "Vaciar tabla", @@ -1124,6 +1324,18 @@ export default { confirmDropCollectionMessage: '¿Estás seguro de que deseas eliminar la colección "{name}"? Esto borrará permanentemente la colección y todos sus documentos.', dropCollectionSuccess: 'Colección "{name}" eliminada', createDatabaseNamePlaceholder: "Nombre de la base de datos", + createDatabaseCharset: "Conjunto de caracteres", + createDatabaseCharsetPlaceholder: "ej. utf8mb4", + createDatabaseCharsetSearchPlaceholder: "Buscar o escribir un conjunto de caracteres", + createDatabaseCharsetEmpty: "No se encontraron conjuntos de caracteres", + createDatabaseCharsetLoading: "Cargando conjuntos de caracteres...", + createDatabaseCharsetCustomOption: 'Usar "{value}"', + createDatabaseCollation: "Cotejamiento", + createDatabaseCollationPlaceholder: "ej. utf8mb4_unicode_ci", + createDatabaseCollationSearchPlaceholder: "Buscar o escribir un cotejamiento", + createDatabaseCollationEmpty: "No se encontraron cotejamientos", + createDatabaseCollationLoading: "Cargando cotejamientos...", + createDatabaseCollationCustomOption: 'Usar "{value}"', createSchema: "Crear esquema", dropSchema: "Eliminar esquema", confirmDropSchemaTitle: "Eliminar esquema", @@ -1166,6 +1378,8 @@ export default { }, tree: { savedSql: "Biblioteca SQL", + userAdmin: "Usuarios y Privilegios", + linkedServers: "Servidores vinculados", defaultDatabase: "Base predeterminada", columns: "Columnas", indexes: "Índices", @@ -1173,6 +1387,7 @@ export default { triggers: "Disparadores", tables: "Tablas", views: "Vistas", + materializedViews: "Vistas materializadas", procedures: "Procedimientos", functions: "Funciones", sequences: "Secuencias", @@ -1181,6 +1396,51 @@ export default { loadMore: "Cargar más...", objectBrowser: "Explorar en el navegador de objetos ({count})", }, + userAdmin: { + title: "Usuarios y Privilegios", + unsupported: "Se admiten conexiones compatibles con MySQL y PostgreSQL. Los modelos de permisos de SQL Server, Oracle y otros se pueden agregar próximamente.", + newUser: "Nuevo usuario", + anonymous: "Anónimo", + roleName: "Nombre del rol", + allowLogin: "Permitir inicio de sesión", + searchUser: "Buscar usuario o host", + loadingUsers: "Cargando usuarios...", + loadingGrants: "Cargando permisos...", + emptyUsers: "No se encontraron usuarios, o la cuenta actual no puede leer la lista de usuarios.", + pluginUnknown: "Plugin de autenticación desconocido", + grants: "Permisos", + noGrants: "No se encontraron permisos", + privilegeEditor: "Editor de privilegios", + privilegeHint: "Elige privilegios, base de datos y tabla, luego previsualiza el SQL antes de aplicar. * significa global o todas las tablas.", + database: "Base de datos", + schema: "Esquema", + table: "Tabla", + scope: "Ámbito de concesión", + scopeDatabase: "Base de datos", + scopeSchema: "Esquema", + scopeTable: "Tabla", + scopeRole: "Pertenencia a rol", + memberRole: "Rol miembro", + privileges: "Privilegios", + grantOption: "Permitir más concesiones (WITH GRANT OPTION)", + adminOption: "Permitir gestión de membresía (WITH ADMIN OPTION)", + grant: "Conceder", + revoke: "Revocar", + username: "Nombre de usuario", + host: "Host", + changePassword: "Cambiar contraseña", + newPassword: "Nueva contraseña", + lock: "Bloquear", + unlock: "Desbloquear", + disableLogin: "Deshabilitar inicio de sesión", + enableLogin: "Habilitar inicio de sesión", + dropUser: "Eliminar usuario", + previewSql: "Vista previa de SQL", + sqlPreview: "Vista previa de SQL", + applySql: "Aplicar SQL", + applySuccess: "Privilegios de usuario actualizados", + applyFailed: "Ejecución fallida: {message}", + }, objects: { all: "Todos", tables: "Tablas", @@ -1244,6 +1504,8 @@ export default { configureColumnTemplates: "Configurar campos predefinidos", presetFieldsTemplate: "Conjunto de campos predefinidos", addIndex: "Agregar índice", + addForeignKey: "Agregar clave foránea", + addTrigger: "Agregar disparador", columnName: "Columna", dataType: "Tipo", typePlaceholder: "Seleccionar o escribir...", @@ -1267,6 +1529,15 @@ export default { includedColumns: "Incluidas", includedColumnsPlaceholder: "Seleccionar columnas...", filter: "Filtro", + foreignKeyName: "Clave foránea", + referencedSchema: "Esquema ref", + referencedTable: "Tabla ref", + referencedColumn: "Columna ref", + onDelete: "Al eliminar", + onUpdate: "Al actualizar", + defaultAction: "Predeterminado", + triggerName: "Disparador", + triggerStatement: "Sentencia del disparador", primary: "Primaria", drop: "Eliminar", restore: "Restaurar", @@ -1317,6 +1588,78 @@ export default { zoomIn: "Acercar", zoomOut: "Alejar", resetLayout: "Restablecer diseño", + modelRelationships: "Relaciones de modelo", + copyJoinSql: "Copiar SQL", + customRelationshipsCount: "{count} modeladas", + relationshipName: "Nombre", + relationshipNamePlaceholder: "Opcional", + sourceTable: "Tabla de origen", + sourceColumn: "Columna de origen", + targetTable: "Tabla de destino", + targetColumn: "Columna de destino", + cardinality: "Cardinalidad", + cardinalityOneToMany: "1:N", + cardinalityManyToOne: "N:1", + cardinalityOneToOne: "1:1", + addRelationship: "Agregar relación", + removeRelationship: "Eliminar relación", + relationshipIncomplete: "Selecciona ambas columnas de origen y destino", + relationshipSelfInvalid: "Una relación no puede apuntar a la misma columna", + relationshipExists: "Esta relación ya existe", + relationshipAdded: "Relación agregada", + noJoinSql: "No hay SQL de relación para copiar", + }, + etcd: { + prefixPlaceholder: "Prefijo, ej. /app/", + newKey: "Nueva clave", + loadingKeys: "Cargando claves...", + empty: "No se encontraron claves", + loadMore: "Cargar más", + selectKey: "Selecciona una clave para ver su valor", + loadingValue: "Cargando valor...", + notFound: "Clave no encontrada", + edit: "Editar", + editKey: "Editar clave", + delete: "Eliminar", + deleteTitle: "Eliminar clave de etcd", + keyPlaceholder: "/ruta/a/clave", + keyRequired: "La clave es obligatoria", + saved: "Clave guardada", + deleted: "Clave eliminada", + base64Readonly: "Los valores Base64 son de solo lectura en esta versión.", + }, + zookeeper: { + prefixPlaceholder: "Prefijo de ruta, ej. /app/", + newKey: "Nuevo Znode", + loadingKeys: "Cargando znodes...", + empty: "No se encontraron znodes", + loadMore: "Cargar más", + selectKey: "Selecciona un znode para ver su valor", + loadingValue: "Cargando valor...", + notFound: "Znode no encontrado", + edit: "Editar", + editKey: "Editar Znode", + delete: "Eliminar", + deleteTitle: "Eliminar znode de ZooKeeper", + keyPlaceholder: "/ruta/a/znode", + keyRequired: "La ruta del znode es obligatoria", + saved: "Znode guardado", + deleted: "Znode eliminado", + base64Readonly: "Los valores Base64 son de solo lectura en esta versión.", + createMode: "Modo de creación", + createModePersistent: "Persistente", + createModeEphemeral: "Efímero", + createModePersistentSequential: "Persistente secuencial", + createModeEphemeralSequential: "Efímero secuencial", + add: "Agregar", + value: "Valor", + metadata: "Información del nodo", + prettyJson: "Bonito", + invalidJson: "JSON no válido", + summaryRevision: "rev", + summaryVersion: "ver", + summaryLease: "lease", + summarySize: "tamaño", }, redis: { selectKey: "Selecciona una clave para ver su valor", @@ -1433,6 +1776,27 @@ export default { pubsubSend: "Enviar", pubsubPublishFailed: "Publicación fallida: {error}", pubsubWsConnectFailed: "Conexión WebSocket fallida: {error}", + copyInsertStatement: "Copiar sentencia INSERT", + copyInsertStatementBinary: "No se puede generar una sentencia INSERT para datos binarios", + formatJson: "Formatear", + compressJson: "Comprimir", + jsonFormatError: "Formato JSON no válido", + slowlog: "Slow Log", + slowlogCount: "Conteo", + slowlogQuery: "Consulta", + slowlogNode: "Nodo", + slowlogSelectNode: "Seleccionar un nodo", + slowlogNodeRequired: "Selecciona un nodo primero", + slowlogEmpty: "Haz clic en Consultar para obtener entradas del slow log", + slowlogFetchFailed: "Error al obtener slow log: {error}", + slowlogColumnId: "ID", + slowlogColumnTimestamp: "Marca de tiempo", + slowlogColumnDuration: "Duración (μs)", + slowlogColumnCommand: "Comando", + slowlogColumnClientAddr: "Cliente", + slowlogColumnClientName: "Nombre del cliente", + slowlogTotal: "{count} entradas", + slowlogDetailTitle: "Entrada de Slow Log #{id}", }, mongo: { documents: "{count} documentos", @@ -1449,6 +1813,21 @@ export default { edit: "Editar", documentView: "Vista de documento", tableView: "Vista de tabla", + filterPlaceholder: "Filtro...", + sortPlaceholder: "Orden...", + }, + vector: { + collectionFallback: "colección", + productCollection: "Colección de {product}", + browse: "Examinar", + upsert: "Upsert", + delete: "Eliminar", + reset: "Restablecer", + refresh: "Actualizar", + run: "Ejecutar", + apply: "Aplicar", + requestEditor: "Editor de solicitudes vectoriales", + operationSuccess: "Operación completada. La vista previa de la colección se ha actualizado.", }, history: { title: "Historial", @@ -1460,6 +1839,7 @@ export default { restore: "Restaurar en el editor", copy: "Copiar SQL", delete: "Eliminar", + clear: "Limpiar historial", viewDetails: "Ver detalles", analyzeWithAi: "Analizar con IA", aiAnalyzeNoConnection: "No se puede analizar esta entrada porque su conexión ya no existe.", @@ -1598,6 +1978,13 @@ export default { tableError: "Error en tabla {table}: {error}", overallProgress: "Progreso general", dataTransfer: "Transferencia de datos", + sourceSchema: "Esquema de origen", + targetSchema: "Esquema de destino", + runInBackground: "Ejecutar en segundo plano", + newTask: "Nueva transferencia", + editConfig: "Editar config", + retry: "Reintentar", + targetTableBusy: "Otra transferencia ya está escribiendo en la(s) tabla(s) de destino: {tables}", }, tableImport: { title: "Importar datos a tabla", @@ -1774,6 +2161,7 @@ export default { databasePlaceholder: "Nombre de la base de datos", options: "Opciones", continueOnError: "Continuar en caso de error", + runInBackground: "Ejecutar en segundo plano", cancelling: "Cancelando...", cancel: "Cancelar", execute: "Ejecutar", @@ -1800,6 +2188,11 @@ export default { selectConnection: "Seleccionar conexión", selectDatabase: "Seleccionar base de datos", selectSchema: "Seleccionar esquema", + connection: "Conexión", + database: "Base de datos", + schema: "Esquema", + recentConfigs: "Configs recientes", + selectRecentConfig: "Seleccionar config reciente", ignoreComments: "Ignorar diferencias de comentarios", compare: "Comparar", comparing: "Comparando esquemas...", @@ -1823,6 +2216,55 @@ export default { swap: "Intercambiar origen y destino", syncProgress: "Ejecutando: {current}/{total}", syncSummary: "Exitosos {success}, fallidos {failed}", + configSaved: "Config guardada", + configDeleted: "Config eliminada", + sourceObject: "Objeto de origen", + targetObject: "Objeto de destino", + operation: "Operación", + selectedCount: "{selected} seleccionados de {total}", + saveConfig: "Guardar config", + loadConfig: "Cargar config", + options: "Opciones", + ddlCompare: "DDL comparar", + deployScript: "Script de despliegue", + deployScriptAll: "Todos los scripts de despliegue", + deployScriptDesc: "Script SQL para el objeto seleccionado", + deployScriptAllDesc: "Script SQL para todos los objetos seleccionados", + copy: "Copiar", + execute: "Ejecutar", + executeAll: "Ejecutar todo", + executeSuccess: "Ejecutado exitosamente", + selectObjectToCompare: "Selecciona un objeto para ver la comparación DDL", + noDdlAvailable: "No hay DDL disponible", + noDeployScript: "No hay script de despliegue", + noDeployScriptAll: "No hay script de despliegue para los objetos seleccionados", + sourceDdl: "DDL de origen", + targetDdl: "DDL de destino", + objectNotExistsInSource: "Este objeto no existe en la base de datos de origen", + objectNotExistsInTarget: "Este objeto no existe en la base de datos de destino", + nextStepDeploy: "Siguiente (Revisar despliegue)", + deployReview: "Revisión de despliegue", + backToResult: "Volver al resultado", + copyScript: "Copiar script", + exportSql: "Exportar .sql", + deployToServer: "Desplegar en servidor", + deployConfirmTitle: "Confirmación final", + deployConfirmMessage: "Estás a punto de desplegar los siguientes cambios en la base de datos de destino", + targetServer: "Servidor de destino", + dbVersion: "Versión de base de datos", + targetDatabase: "Base de datos de destino", + targetSchema: "Esquema de destino", + useTransaction: "Ejecutar en transacción (reversión automática en caso de error)", + confirmDeploy: "Confirmar despliegue", + exportSuccess: "Exportación exitosa", + create: "Crear", + delete: "Eliminar", + modify: "Modificar", + cancel: "Cancelar", + prevStep: "Anterior", + recompare: "Comparar de nuevo", + maximize: "Maximizar", + restore: "Restaurar", operationLabel: { modify: "Objetos a modificar", create: "Objetos a crear", @@ -1840,6 +2282,22 @@ export default { foreignKey: "Clave foránea", trigger: "Disparador", }, + noObjectsSelected: "Selecciona objetos para desplegar", + deploySuccess: "Despliegue exitoso", + deployFailed: "Despliegue fallido", + deploySuccessMessage: "Script SQL ejecutado exitosamente en la base de datos de destino", + deployFailedMessage: "Ocurrió un error durante la ejecución", + affectedRows: "Filas afectadas", + executedStatements: "Sentencias ejecutadas", + serverVersion: "Versión del servidor", + info: "Información", + connType: "Tipo de conexión", + connName: "Nombre de conexión", + host: "Host", + port: "Puerto", + copied: "Copiado al portapapeles", + saveConfigPrompt: "Por favor ingresa el nombre de la config:", + close: "Cerrar", }, schemaDiff: { optionsTitle: "Opciones de comparación", @@ -2041,6 +2499,7 @@ export default { uiScaleDescription: "Escala toda la interfaz de escritorio para pantallas de alta densidad. Los cambios se aplican al instante y se restauran al volver a abrir.", theme: "Tema", selectTheme: "Seleccionar tema...", + followAppTheme: "Seguir el tema de la aplicación", appLayout: "Diseño de la interfaz", appLayoutSeparated: "Moderno separado", appLayoutSeparatedDescription: "Separación clara de paneles con pestañas en bloque.", @@ -2061,6 +2520,10 @@ export default { closeActionMinimize: "Minimizar a la bandeja", updateNotificationsEnabled: "Activar recordatorios de actualización", updateNotificationsEnabledDescription: "Al desactivarlo, DBX no comprobará automáticamente actualizaciones de la app ni de los controladores, ni mostrará indicadores. Las comprobaciones manuales siguen disponibles.", + updateDownloadSource: "Origen de descarga de actualizaciones", + updateDownloadSourceDescription: "Elige de dónde se descargan los instaladores de actualización. Se recomienda la fuente oficial; CNB puede ser más rápida en redes de China continental.", + updateDownloadSourceOfficial: "Fuente oficial (recomendada)", + updateDownloadSourceCnb: "CNB", debugLoggingEnabled: "Activar logs de depuración", debugLoggingEnabledDescription: "Registra logs de diagnóstico locales del lado del usuario al investigar reportes. Desactivado por defecto.", debugLogsCopy: "Copiar logs", @@ -2170,6 +2633,8 @@ export default { reset: "Restablecer", resetDefaults: "Restablecer valores por defecto", resetAllDefaults: "Restablecer todos los valores por defecto", + save: "Guardar", + cancel: "Cancelar", executeMode: "Modo de ejecución (Cmd+Enter)", executeModeAll: "Ejecutar todo el SQL", executeModeCurrent: "Ejecutar sentencia en el cursor", @@ -2186,6 +2651,13 @@ export default { redisScanPageSizeOption: "{count} claves", exportBatchSize: "Tamaño de lote de exportación", exportBatchSizeDescription: "Filas obtenidas por lote al exportar datos de tabla (100-100000).", + exportRowLimitEnabled: "Limitar filas exportadas", + exportRowLimitEnabledDescription: "Cuando está activado, las exportaciones de resultados de consultas y datos de tabla se detienen en el límite de filas indicado abajo.", + exportRowLimit: "Límite de filas de exportación", + exportRowLimitDescription: "Máximo de filas para exportaciones de resultados de consultas y datos de tabla.", + exportRowLimitUnlimited: "Sin límite", + queryExportKeysetOptimizationEnabled: "Intentar optimización keyset", + queryExportKeysetOptimizationEnabledDescription: "Solo aplica a consultas de una sola tabla reconocidas de forma segura; las consultas complejas usan el método estándar automáticamente.", exportSection: "Exportar", shortcutExecuteSql: "Ejecutar SQL", shortcutFind: "Buscar", @@ -2326,6 +2798,8 @@ export default { progressJreExtract: "Extrayendo JRE...", progressDownloadJre: "Descargando JRE", progressDownloadDriver: "Descargando driver", + progressDownloadJdbcPlugin: "Descargando plugin JDBC", + progressJdbcPluginExtract: "Instalando plugin JDBC...", usageTitle: "Uso de almacenamiento", usageTotal: "Total {size}", usageTotalLabel: "Total", @@ -2334,6 +2808,16 @@ export default { usageAgentDrivers: "Agentes de driver integrados", usageJdbcPlugin: "Plugin JDBC", usageJdbcDriverJars: "JARs de driver JDBC", + offlineDownloadHint: "Para entornos sin conexión a internet, descarga los paquetes de drivers offline en una máquina con conexión, luego impórtalos aquí.", + offlineDownloadLink: "Descargas de drivers offline", + searchDrivers: "Buscar nombre de driver, tipo, versión...", + searchJdbcDrivers: "Buscar nombre o ruta del driver JDBC...", + jdbcMavenCoordinatePlaceholder: "Coordenada Maven, ej. org.postgresql:postgresql:42.7.7", + jdbcMavenInstall: "Instalar desde Maven", + jdbcMavenInstallSuccess: "Driver JDBC Maven instalado", + jdbcSourceMaven: "Maven", + jdbcSourceManual: "Manual", + noMatchingDrivers: "Sin coincidencias.", javaRuntimeSaved: "Ajustes de Java guardados", javaRuntimeSaveFailed: "Error al guardar los ajustes de Java: {error}", chooseJavaExecutable: "Seleccionar ejecutable Java", @@ -2451,12 +2935,26 @@ export default { exportSuccess: "Base de datos exportada exitosamente", exportError: "Error al exportar: {error}", exportCancelled: "Exportación cancelada", + filterTables: "Buscar tablas...", + runInBackground: "Ejecutar en segundo plano", }, nacos: { configs: "Configuraciones", services: "Servicios", raw: "Raw", namespace: "Namespace", + createNamespace: "Crear Namespace", + editNamespace: "Editar Namespace", + creatingNamespace: "Creando...", + updatingNamespace: "Actualizando...", + namespaceCreated: 'Namespace "{name}" creado', + namespaceUpdated: 'Namespace "{name}" actualizado', + namespaceId: "ID del Namespace", + namespaceIdPlaceholder: "Déjalo vacío para que Nacos lo genere", + namespaceName: "Nombre del Namespace", + namespaceNamePlaceholder: "Ingresa un nombre de namespace", + namespaceDesc: "Descripción", + namespaceDescPlaceholder: "Por defecto, el nombre del namespace", dataId: "Data ID", group: "Grupo", format: "Formato", @@ -2560,4 +3058,4 @@ export default { test: "Probar", readOnly: "Solo lectura", }, -}; +}); diff --git a/apps/desktop/src/i18n/locales/fallback.ts b/apps/desktop/src/i18n/locales/fallback.ts new file mode 100644 index 000000000..63c0d3b34 --- /dev/null +++ b/apps/desktop/src/i18n/locales/fallback.ts @@ -0,0 +1,30 @@ +import en from "./en"; + +type LocaleMessages = Record; + +function cloneMessage(value: unknown): unknown { + if (value && typeof value === "object" && !Array.isArray(value)) { + return mergeMessages(value as LocaleMessages, {}); + } + return value; +} + +function mergeMessages(base: LocaleMessages, override: LocaleMessages): LocaleMessages { + const result: LocaleMessages = {}; + for (const [key, value] of Object.entries(base)) { + result[key] = cloneMessage(value); + } + for (const [key, value] of Object.entries(override)) { + const baseValue = result[key]; + if (baseValue && value && typeof baseValue === "object" && typeof value === "object" && !Array.isArray(baseValue) && !Array.isArray(value)) { + result[key] = mergeMessages(baseValue as LocaleMessages, value as LocaleMessages); + } else { + result[key] = value; + } + } + return result; +} + +export function withEnglishFallback(messages: LocaleMessages): LocaleMessages { + return mergeMessages(en as LocaleMessages, messages); +} diff --git a/apps/desktop/src/i18n/locales/it.ts b/apps/desktop/src/i18n/locales/it.ts index 9743abe55..21adc74ab 100644 --- a/apps/desktop/src/i18n/locales/it.ts +++ b/apps/desktop/src/i18n/locales/it.ts @@ -1,4 +1,6 @@ -export default { +import { withEnglishFallback } from "./fallback"; + +export default withEnglishFallback({ app: { name: "DBX", }, @@ -34,6 +36,8 @@ export default { formatSqlFailed: "Impossibile formattare SQL", keywordCaseLower: "Usa parole chiave SQL minuscole", keywordCaseUpper: "Usa parole chiave SQL maiuscole", + previewSql: "Anteprima SQL", + hidePreviewSql: "Nascondi anteprima SQL", saveSql: "Salva nella Libreria SQL", openSql: "Apri file SQL", theme: "Tema", @@ -163,6 +167,9 @@ export default { database: "Database", databasePlaceholder: "Opzionale", databasePlaceholderWithDefault: "Opzionale, predefinito {database}", + userAdmin: "Utenti e Privilegi", + linkedServers: "Server Collegati", + materializedViews: "Viste Materializzate", defaultDatabase: "DB Predefinito", authDatabase: "DB di Autenticazione", authDatabasePlaceholder: "Opzionale, spesso admin", @@ -179,6 +186,8 @@ export default { driverName: "Nome Driver", driverNamePlaceholder: "Nome del fornitore o dell'ambiente", urlParams: "Parametri URL", + gbaseServer: "GBASEDBTSERVER", + informixServer: "INFORMIXSERVER", sslEnable: "Abilita connessione crittografata", caCertPath: "Certificato CA", caCertPathPlaceholder: "Opzionale, es. ~/.yandex/RootCA.crt", @@ -236,6 +245,23 @@ export default { redisSentinelTls: "TLS Sentinel", redisSentinelTlsHint: "Usa TLS quando ti connetti ai nodi Sentinel", redisKeySeparator: "Separatore namespace chiavi", + etcdEndpoints: "Endpoint", + etcdEndpointsHint: "Un endpoint per riga. Lascia vuoto per usare l'host e la porta sopra.", + etcdCaCertPlaceholder: "/percorso/per/ca.crt", + etcdCaCertBrowse: "Scegli certificato CA", + etcdClientAuth: "Autenticazione Client", + etcdClientCertPlaceholder: "/percorso/per/client.crt", + etcdClientKeyPlaceholder: "/percorso/per/client.key", + etcdClientCertHint: "Il certificato client e la chiave privata devono essere forniti insieme quando etcd richiede mTLS.", + etcdClientCertBrowse: "Scegli certificato client", + etcdClientKeyBrowse: "Scegli chiave privata client", + etcdClientCertPairRequired: "Il certificato client e la chiave privata devono essere forniti insieme.", + zookeeperConnectString: "Stringa di connessione", + zookeeperConnectStringHint: "Voci host:porta separate da virgola o da riga. Lascia vuoto per usare l'host e la porta sopra.", + zookeeperCreateModePersistent: "Persistente", + zookeeperCreateModeEphemeral: "Effimero", + zookeeperCreateModePersistentSequential: "Persistente Sequenziale", + zookeeperCreateModeEphemeralSequential: "Effimero Sequenziale", nacosConsoleUrl: "URL console", nacosConsoleUrlHint: "Usa l'indirizzo console/admin API di Nacos. Nacos 3 Docker di solito espone la console su 8085; distribuzioni più vecchie possono condividere 8848 con la porta di servizio.", nacosConsoleUrlRequired: "L'URL console Nacos è obbligatorio", @@ -336,6 +362,8 @@ export default { 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", + jdbcManualClasspath: "Classpath manuale", + jdbcManualClasspathCount: "{count} percorsi", jdbcDriverPathsPlaceholder: "/percorso/per/driver.jar\n/percorso/per/un-altro-driver.jar", jdbcDriverBrowse: "Scegli file JAR del driver JDBC", jdbcDocs: "Visualizza documentazione JDBC", @@ -363,13 +391,18 @@ export default { showResultsPane: "Mostra risultati", hideResultsPane: "Nascondi risultati", noDatabase: "Nessun database selezionato", + unsavedChangesTitle: "Modifiche non salvate", + unsavedChangesMessage: "Questa scheda ha modifiche non salvate che andranno perse se chiudi. Salvare prima di chiudere?", + discardChanges: "Scarta", selectConnection: "Seleziona connessione", searchConnection: "Cerca connessioni...", selectDatabase: "Seleziona database", + selectDatabaseRequired: "Seleziona prima un database", searchDatabase: "Cerca database...", selectSchema: "Seleziona schema", setDefaultDatabase: "Imposta Predefinito", defaultDatabase: "Predefinito", + clearDatabase: "Cancella database", completion: { nullValue: "Valore NULL", isNull: "Verifica se NULL", @@ -448,8 +481,13 @@ export default { table: "Tabella", tableData: "Dati Tabella", redis: "Redis", + etcd: "etcd", + zookeeper: "ZooKeeper", mongo: "Mongo", + vector: "Vector", objects: "Oggetti", + users: "Utenti e Privilegi", + executionSummary: "Riepilogo Esecuzione", tooltipTitle: "Titolo:", tooltipConnection: "Connessione:", tooltipDatabase: "Database:", @@ -457,11 +495,40 @@ export default { tooltipCollection: "Collezione:", tooltipSchema: "Schema:", resultN: "Risultato {n}", + runN: "Esegui {n}", + resultRuns: "Esecuzioni risultati", + removeRun: "Rimuovi esecuzione {n}", + autoKeepResults: "Mantieni automaticamente i risultati", + autoKeepResultsEnabled: "Mantieni risultati abilitato", + autoKeepResultsDisabled: "Mantieni risultati disabilitato", + missingResultRun: "Questo risultato non e piu disponibile", + exportResultArchive: "Salva Archivio Risultati", + importResultArchive: "Importa Risultati", + importedResultArchive: "Risultati importati", + resultArchiveExported: "Risultati esportati", + resultArchiveImported: "Risultati importati", + resultArchiveUnavailable: "Nessun risultato salvato disponibile per l'esportazione", + resultArchiveImportInvalid: "Questo archivio risultati non puo essere aperto", + resultArchiveExportFailed: "Esportazione risultati non riuscita: {message}", + resultArchiveImportFailed: "Importazione risultati non riuscita: {message}", scrollLeft: "Scorri schede a sinistra", scrollRight: "Scorri schede a destra", openTabs: "Schede aperte", openDataTabs: "Tabelle aperte", }, + executionSummary: { + empty: "Nessun riepilogo esecuzione", + executing: "Esecuzione...", + statement: "Istruzione", + type: "Tipo", + rows: "Righe", + affected: "Interessate", + time: "Tempo", + success: "Riuscita", + error: "Errore", + returnedTable: "Restituita una tabella con {count} colonne", + noTable: "Nessuna tabella restituita", + }, chart: { title: "Grafico", type: "Tipo", @@ -533,6 +600,11 @@ export default { exportFailed: "Esportazione non riuscita: {message}", copied: "Copiato", copyFailed: "Copia non riuscita: {message}", + previewSqlEmpty: "Nessuna modifica SQL in sospeso da visualizzare", + dataUnavailableHintPrefix: "Premi ", + dataUnavailableHintSuffix: " o fai clic su Aggiorna qui sotto per ricaricare.", + undoChange: "Annulla modifica", + redoChange: "Ripeti modifica", domRenderMode: "DOM", canvasRenderMode: "Canvas", renderModeHint: "Passa dal rendering Canvas al grid di fallback DOM.", @@ -786,6 +858,13 @@ export default { showMore: "Mostra altri {count}", showLess: "Mostra meno", delete: "Rimuovi", + failedTooltip: "{count} attività in background non riuscita | {count} attività in background non riuscite", + databaseExportTitle: "Backup database: {name}", + sqlFileTitle: "File SQL: {name}", + dataTransferTitle: "Trasferimento dati: {name}", + objectsCount: "{current} / {total} oggetti", + tablesCount: "{current} / {total} tabelle", + statementsCount: "{done} riuscite, {failed} non riuscite", }, welcome: { title: "Area di Lavoro Database", @@ -816,6 +895,9 @@ export default { close: "Chiudi", cancel: "Annulla", save: "Salva", + copy: "Copia", + import: "Importa", + remove: "Rimuovi", retry: "Riprova", more: "Altro", done: "Fatto", @@ -1055,6 +1137,11 @@ export default { proxyEnable: "Invia richieste AI tramite proxy", proxyUrl: "URL Proxy", anthropicMessagesHint: "Le API compatibili con Anthropic Messages di solito usano /v1/messages.", + contextWindow: "Finestra di Contesto", + contextWindowAuto: "Auto (rileva dal nome del modello)", + contextWindowHint: "Token. Lascia vuoto per il rilevamento automatico. Imposta manualmente per modelli locali/personalizzati.", + codexCliPath: "Percorso Codex CLI", + codexCliPathHint: "Lascia vuoto per usare codex dal PATH. Esegui login separatamente con codex login.", enableThinking: "Pensiero (Thinking)", enableThinkingOn: "Abilitato", enableThinkingOff: "Disabilitato", @@ -1088,6 +1175,10 @@ export default { editConnection: "Modifica Connessione", revealDatabaseFile: "Mostra nel file manager", selectVisibleDatabases: "Seleziona Database Visibili", + configureVisibleObjects: "Filtro Oggetti Visibili", + userAdmin: "Utenti e Privilegi", + openUserAdmin: "Apri Utenti e Privilegi", + instanceInfo: "Informazioni Istanza", duplicateConnection: "Duplica Connessione", newQuery: "Nuova Query", newSql: "Nuovo SQL", @@ -1290,6 +1381,8 @@ export default { }, tree: { savedSql: "Libreria SQL", + userAdmin: "Utenti e Privilegi", + linkedServers: "Server Collegati", defaultDatabase: "DB Predefinito", columns: "Colonne", indexes: "Indici", @@ -1297,6 +1390,7 @@ export default { triggers: "Trigger", tables: "Tabelle", views: "Viste", + materializedViews: "Viste Materializzate", procedures: "Procedure", functions: "Funzioni", sequences: "Sequenze", @@ -1305,6 +1399,51 @@ export default { loadMore: "Carica altro...", objectBrowser: "Sfoglia in Esplora Oggetti ({count})", }, + userAdmin: { + title: "Utenti e Privilegi", + unsupported: "Connessioni compatibili con MySQL e PostgreSQL sono supportate. SQL Server, Oracle e altri modelli di autorizzazione possono essere aggiunti in seguito.", + newUser: "Nuovo Utente", + anonymous: "Anonimo", + roleName: "Nome ruolo", + allowLogin: "Consenti login", + searchUser: "Cerca utente o host", + loadingUsers: "Caricamento utenti...", + loadingGrants: "Caricamento privilegi...", + emptyUsers: "Nessun utente trovato, oppure l'account corrente non puo leggere l'elenco utenti.", + pluginUnknown: "Plugin di autenticazione sconosciuto", + grants: "Privilegi", + noGrants: "Nessun privilegio trovato", + privilegeEditor: "Editor Privilegi", + privilegeHint: "Scegli privilegi, database e tabella, quindi visualizza l'anteprima SQL prima di applicare. * indica globale o tutte le tabelle.", + database: "Database", + schema: "Schema", + table: "Tabella", + scope: "Ambito concessione", + scopeDatabase: "Database", + scopeSchema: "Schema", + scopeTable: "Tabella", + scopeRole: "Appartenenza ruolo", + memberRole: "Ruolo membro", + privileges: "Privilegi", + grantOption: "Consenti ulteriori concessioni (WITH GRANT OPTION)", + adminOption: "Consenti gestione appartenenza (WITH ADMIN OPTION)", + grant: "Concedi", + revoke: "Revoca", + username: "Nome utente", + host: "Host", + changePassword: "Cambia Password", + newPassword: "Nuova password", + lock: "Blocca", + unlock: "Sblocca", + disableLogin: "Disabilita Login", + enableLogin: "Abilita Login", + dropUser: "Elimina Utente", + previewSql: "Anteprima SQL", + sqlPreview: "Anteprima SQL", + applySql: "Applica SQL", + applySuccess: "Privilegi utente aggiornati", + applyFailed: "Esecuzione non riuscita: {message}", + }, objects: { all: "Tutti", tables: "Tabelle", @@ -1391,6 +1530,17 @@ export default { includedColumns: "Incluse", includedColumnsPlaceholder: "Seleziona colonne...", filter: "Filtro", + addForeignKey: "Aggiungi Chiave Esterna", + addTrigger: "Aggiungi Trigger", + foreignKeyName: "Chiave esterna", + referencedSchema: "Schema rif.", + referencedTable: "Tabella rif.", + referencedColumn: "Colonna rif.", + onDelete: "On delete", + onUpdate: "On update", + defaultAction: "Predefinito", + triggerName: "Trigger", + triggerStatement: "Istruzione trigger", primary: "Primario", drop: "Elimina", restore: "Ripristina", @@ -1432,6 +1582,26 @@ export default { relationshipsCount: "{count} relazioni", tableMode: "Visualizzazione Tabella", engineeringMode: "ER Ingegneristico", + modelRelationships: "Relazioni Modello", + copyJoinSql: "Copia SQL", + customRelationshipsCount: "{count} modellati", + relationshipName: "Nome", + relationshipNamePlaceholder: "Opzionale", + sourceTable: "Tabella sorgente", + sourceColumn: "Colonna sorgente", + targetTable: "Tabella destinazione", + targetColumn: "Colonna destinazione", + cardinality: "Cardinalita", + cardinalityOneToMany: "1:N", + cardinalityManyToOne: "N:1", + cardinalityOneToOne: "1:1", + addRelationship: "Aggiungi relazione", + removeRelationship: "Rimuovi relazione", + relationshipIncomplete: "Seleziona sia la colonna sorgente che quella di destinazione", + relationshipSelfInvalid: "Una relazione non puo avere come destinazione la stessa colonna", + relationshipExists: "Questa relazione esiste gia", + relationshipAdded: "Relazione aggiunta", + noJoinSql: "Nessun SQL di relazione da copiare", allTables: "Tutte le Tabelle", relatedTables: "Tabelle Correlate", moreColumns: "+ {count} colonne", @@ -1442,6 +1612,58 @@ export default { zoomOut: "Rimpicciolisci", resetLayout: "Reimposta layout", }, + etcd: { + prefixPlaceholder: "Prefisso, es. /app/", + newKey: "Nuova Chiave", + loadingKeys: "Caricamento chiavi...", + empty: "Nessuna chiave trovata", + loadMore: "Carica altro", + selectKey: "Seleziona una chiave per visualizzarne il valore", + loadingValue: "Caricamento valore...", + notFound: "Chiave non trovata", + edit: "Modifica", + editKey: "Modifica Chiave", + delete: "Elimina", + deleteTitle: "Elimina chiave etcd", + keyPlaceholder: "/percorso/per/la/chiave", + keyRequired: "La chiave e obbligatoria", + saved: "Chiave salvata", + deleted: "Chiave eliminata", + base64Readonly: "I valori Base64 sono in sola lettura in questa versione.", + }, + zookeeper: { + prefixPlaceholder: "Prefisso percorso, es. /app/", + newKey: "Nuovo Znode", + loadingKeys: "Caricamento znodes...", + empty: "Nessuno znode trovato", + loadMore: "Carica altro", + selectKey: "Seleziona uno znode per visualizzarne il valore", + loadingValue: "Caricamento valore...", + notFound: "Znode non trovato", + edit: "Modifica", + editKey: "Modifica Znode", + delete: "Elimina", + deleteTitle: "Elimina znode ZooKeeper", + keyPlaceholder: "/percorso/per/znode", + keyRequired: "Il percorso znode e obbligatorio", + saved: "Znode salvato", + deleted: "Znode eliminato", + base64Readonly: "I valori Base64 sono in sola lettura in questa versione.", + createMode: "Modalita Creazione", + createModePersistent: "Persistente", + createModeEphemeral: "Effimero", + createModePersistentSequential: "Persistente Sequenziale", + createModeEphemeralSequential: "Effimero Sequenziale", + add: "Aggiungi", + value: "Valore", + metadata: "Informazioni Nodo", + prettyJson: "Formatta", + invalidJson: "JSON non valido", + summaryRevision: "rev", + summaryVersion: "ver", + summaryLease: "lease", + summarySize: "dimensione", + }, redis: { selectKey: "Seleziona una chiave per visualizzarne il valore", noKeys: "Nessuna chiave trovata", @@ -1535,6 +1757,9 @@ export default { jsonView: "Visualizzazione JSON", rawContent: "Contenuto grezzo", wordWrap: "A capo automatico", + formatJson: "Formatta", + compressJson: "Comprimi", + jsonFormatError: "Formato JSON non valido", clearHistory: "Cancella cronologia comandi", historyCleared: "Cronologia comandi Redis cancellata", blockedCommand: "Il comando {command} è bloccato per sicurezza. Disattiva l'icona scudo nella barra degli strumenti per consentirlo.", @@ -1559,6 +1784,22 @@ export default { pubsubSend: "Invia", pubsubPublishFailed: "Pubblicazione fallita: {error}", pubsubWsConnectFailed: "Connessione WebSocket fallita: {error}", + slowlog: "Slow Log", + slowlogCount: "Conteggio", + slowlogQuery: "Query", + slowlogNode: "Nodo", + slowlogSelectNode: "Seleziona un nodo", + slowlogNodeRequired: "Seleziona prima un nodo", + slowlogEmpty: "Fai clic su Query per recuperare le voci dello slow log", + slowlogFetchFailed: "Recupero slow log non riuscito: {error}", + slowlogColumnId: "ID", + slowlogColumnTimestamp: "Timestamp", + slowlogColumnDuration: "Durata (µs)", + slowlogColumnCommand: "Comando", + slowlogColumnClientAddr: "Client", + slowlogColumnClientName: "Nome Client", + slowlogTotal: "{count} voci", + slowlogDetailTitle: "Voce Slow Log #{id}", }, mongo: { documents: "{count} documenti", @@ -1578,6 +1819,19 @@ export default { filterPlaceholder: "Filtra...", sortPlaceholder: "Ordina...", }, + vector: { + collectionFallback: "collezione", + productCollection: "Collezione {product}", + browse: "Sfoglia", + upsert: "Upsert", + delete: "Elimina", + reset: "Reimposta", + refresh: "Aggiorna", + run: "Esegui", + apply: "Applica", + requestEditor: "Editor richieste vettoriali", + operationSuccess: "Operazione completata. L'anteprima della collezione e stata aggiornata.", + }, history: { title: "Cronologia", search: "Cerca nella cronologia...", @@ -1729,6 +1983,11 @@ export default { tableError: "Tabella {table} non riuscita: {error}", overallProgress: "Progresso complessivo", dataTransfer: "Trasferimento Dati", + runInBackground: "Esegui in background", + newTask: "Nuovo trasferimento", + editConfig: "Modifica config", + retry: "Riprova", + targetTableBusy: "Un altro trasferimento sta gia scrivendo le tabelle di destinazione: {tables}", }, tableImport: { title: "Importa Dati Tabella", @@ -1923,6 +2182,7 @@ export default { error: "Errore", cancelled: "Annullato", }, + runInBackground: "Esegui in background", }, diff: { title: "Confronta Schemi", @@ -1954,6 +2214,142 @@ export default { swap: "Inverti sorgente e destinazione", syncProgress: "Esecuzione in corso: {current}/{total}", syncSummary: "Riuscite {success}, non riuscite {failed}", + connection: "Connessione", + database: "Database", + schema: "Schema", + recentConfigs: "Configurazioni Recenti", + selectRecentConfig: "Seleziona configurazione recente", + configSaved: "Configurazione salvata", + configDeleted: "Configurazione eliminata", + sourceObject: "Oggetto sorgente", + targetObject: "Oggetto destinazione", + operation: "Operazione", + selectedCount: "{selected} selezionati di {total}", + saveConfig: "Salva configurazione", + loadConfig: "Carica configurazione", + options: "Opzioni", + ddlCompare: "Confronto DDL", + deployScript: "Script di deploy", + deployScriptAll: "Tutti gli script di deploy", + deployScriptDesc: "Script SQL per l'oggetto selezionato", + deployScriptAllDesc: "Script SQL per tutti gli oggetti selezionati", + copy: "Copia", + execute: "Esegui", + executeAll: "Esegui tutto", + executeSuccess: "Eseguito con successo", + selectObjectToCompare: "Seleziona un oggetto per visualizzare il confronto DDL", + noDdlAvailable: "Nessun DDL disponibile", + noDeployScript: "Nessuno script di deploy", + noDeployScriptAll: "Nessuno script di deploy per gli oggetti selezionati", + sourceDdl: "DDL Sorgente", + targetDdl: "DDL Destinazione", + objectNotExistsInSource: "Questo oggetto non esiste nel database sorgente", + objectNotExistsInTarget: "Questo oggetto non esiste nel database di destinazione", + nextStepDeploy: "Avanti (Revisiona Deploy)", + deployReview: "Revisione Deploy", + backToResult: "Torna al Risultato", + copyScript: "Copia Script", + exportSql: "Esporta .sql", + deployToServer: "Distribuisci sul Server", + deployConfirmTitle: "Conferma Finale", + deployConfirmMessage: "Stai per distribuire le seguenti modifiche al database di destinazione", + targetServer: "Server Destinazione", + dbVersion: "Versione Database", + targetDatabase: "Database Destinazione", + targetSchema: "Schema Destinazione", + useTransaction: "Esegui in transazione (rollback automatico in caso di errore)", + confirmDeploy: "Conferma Deploy", + exportSuccess: "Esportazione riuscita", + create: "Crea", + delete: "Elimina", + modify: "Modifica", + cancel: "Annulla", + prevStep: "Precedente", + recompare: "Confronta di nuovo", + maximize: "Massimizza", + restore: "Ripristina", + operationLabel: { + modify: "Oggetti da modificare", + create: "Oggetti da creare", + delete: "Oggetti da eliminare", + none: "Nessuna operazione", + }, + objectKindLabel: { + table: "Tabella", + view: "Vista", + function: "Funzione", + sequence: "Sequenza", + rule: "Regola", + owner: "Proprietario", + index: "Indice", + foreignKey: "Chiave Esterna", + trigger: "Trigger", + }, + noObjectsSelected: "Seleziona gli oggetti da distribuire", + deploySuccess: "Deploy Riuscito", + deployFailed: "Deploy Non Riuscito", + deploySuccessMessage: "Script SQL eseguito con successo sul database di destinazione", + deployFailedMessage: "Si e verificato un errore durante l'esecuzione", + affectedRows: "Righe Interessate", + executedStatements: "Istruzioni Eseguite", + serverVersion: "Versione Server", + info: "Info", + connType: "Tipo connessione", + connName: "Nome connessione", + host: "Host", + port: "Porta", + copied: "Copiato negli appunti", + saveConfigPrompt: "Inserisci nome configurazione:", + close: "Chiudi", + }, + schemaDiff: { + optionsTitle: "Opzioni di Confronto", + selectConfig: "Seleziona configurazione", + newConfigName: "Nuova Configurazione", + newConfig: "Nuova Configurazione", + renameConfig: "Rinomina Configurazione", + duplicateConfig: "Duplica Configurazione", + deleteConfig: "Elimina Configurazione", + exportConfig: "Esporta Configurazione", + exportAllConfigs: "Esporta Tutte le Configurazioni", + importConfig: "Importa Configurazione", + importFromFile: "Importa da File", + importFromText: "Importa da Testo", + importPlaceholder: "Incolla configurazione JSON...", + importInvalidJson: "Formato JSON non valido", + configName: "Nome Configurazione", + tableFilter: "Filtro tabella", + tableFilterHint: "Corrisponde ai nomi completi delle tabelle con regex. Non digitare /.../. ^ indica inizia con, $ indica finisce con, | indica o.", + tableFilterHintShort: "Limita confronto con regex nome tabella", + tableFilterHelp: "Aiuto filtro tabella", + tableFilterHelpRule: "Corrisponde ai nomi completi delle tabelle. Non digitare /.../.", + tableFilterHelpBlank: "Includi vuoto significa tutte le tabelle. Salta vuoto significa nessuna esclusione.", + tableFilterHelpExample: "^user_ significa inizia con user_; _bak$ significa finisce con _bak; a|b significa a o b.", + tableIncludePattern: "Confronta solo tabelle corrispondenti", + tableIncludePatternPlaceholder: "es. ^utente_", + tableExcludePattern: "Salta tabelle corrispondenti", + tableExcludePatternPlaceholder: "es. _bak$", + tableFilterPriority: "Quando entrambi corrispondono", + tableFilterPriorityExclude: "Escludi prevale", + tableFilterPriorityInclude: "Includi prevale", + options: { + tables: "Confronta tabelle", + primaryKeys: "Confronta chiavi primarie", + foreignKeys: "Confronta chiavi esterne", + uniqueKeys: "Confronta chiavi univoche", + checks: "Confronta vincoli check", + exclusions: "Confronta vincoli di esclusione", + views: "Confronta viste", + functions: "Confronta funzioni", + indexes: "Confronta indici", + sequences: "Confronta sequenze", + triggers: "Confronta trigger", + rules: "Confronta regole", + owners: "Confronta proprietari", + cascadeDelete: "Usa CASCADE delete", + sequenceLastValues: "Confronta ultimi valori sequenza", + compareColumnOrder: "Confronta ordine colonne", + }, }, dataCompare: { title: "Confronta Dati", @@ -2127,6 +2523,10 @@ export default { closeActionMinimize: "Riduci a icona", updateNotificationsEnabled: "Abilita promemoria aggiornamenti", updateNotificationsEnabledDescription: "Se disattivato, DBX non controllerà automaticamente gli aggiornamenti dell'app o dei driver e non mostrerà badge. I controlli manuali restano disponibili.", + updateDownloadSource: "Fonte download aggiornamenti", + updateDownloadSourceDescription: "Scegli da dove scaricare gli installer degli aggiornamenti. La fonte ufficiale è consigliata; CNB può essere più veloce sulle reti della Cina continentale.", + updateDownloadSourceOfficial: "Fonte ufficiale (consigliata)", + updateDownloadSourceCnb: "CNB", debugLoggingEnabled: "Abilita log di debug", debugLoggingEnabledDescription: "Registra log diagnostici locali lato utente durante l'analisi delle segnalazioni. Disattivato per impostazione predefinita.", debugLogsCopy: "Copia log", @@ -2252,6 +2652,13 @@ export default { redisScanPageSize: "Conteggio scansione Redis", redisScanPageSizeDescription: "Chiavi richieste per pagina SCAN di Redis durante la navigazione delle chiavi.", redisScanPageSizeOption: "{count} chiavi", + exportRowLimitEnabled: "Limita righe esportate", + exportRowLimitEnabledDescription: "Quando attivo, l'esportazione dei risultati di query e dei dati tabella si ferma al limite di righe sotto.", + exportRowLimit: "Limite righe esportazione dati", + exportRowLimitDescription: "Numero massimo di righe per l'esportazione dei risultati di query e dei dati tabella.", + exportRowLimitUnlimited: "Illimitato", + queryExportKeysetOptimizationEnabled: "Prova ottimizzazione keyset", + queryExportKeysetOptimizationEnabledDescription: "Si applica solo a query a tabella singola riconosciute in sicurezza; le query complesse ricadono automaticamente.", exportBatchSize: "Dimensione del lotto di esportazione", exportBatchSizeDescription: "Righe recuperate per lotto durante l'esportazione dei dati della tabella (100-100000).", exportSection: "Esportazione", @@ -2394,6 +2801,8 @@ export default { progressJreExtract: "Estrazione JRE...", progressDownloadJre: "Download JRE in corso", progressDownloadDriver: "Download driver in corso", + progressDownloadJdbcPlugin: "Download plugin JDBC in corso", + progressJdbcPluginExtract: "Installazione plugin JDBC...", usageTitle: "Utilizzo dello spazio di archiviazione", usageTotal: "Totale {size}", usageTotalLabel: "Totale", @@ -2424,6 +2833,16 @@ export default { jreUninstallSuccess: "JRE {jre} disinstallato", chooseJdbcPluginZip: "Scegli il file zip del plugin JDBC", agentDrivers: "Driver integrati", + offlineDownloadHint: "Per ambienti air-gapped, scarica i pacchetti driver offline su una macchina connessa a Internet, quindi importali qui.", + offlineDownloadLink: "Download driver offline", + searchDrivers: "Cerca nome driver, tipo, versione...", + searchJdbcDrivers: "Cerca nome o percorso driver JDBC...", + jdbcMavenCoordinatePlaceholder: "Coordinata Maven, es. org.postgresql:postgresql:42.7.7", + jdbcMavenInstall: "Installa da Maven", + jdbcMavenInstallSuccess: "Driver JDBC Maven installato", + jdbcSourceMaven: "Maven", + jdbcSourceManual: "Manuale", + noMatchingDrivers: "Nessun driver corrispondente.", jdbcDrivers: "Driver JDBC", importing: "Importazione in corso...", importOfflinePackage: "Importa pacchetto offline", @@ -2520,8 +2939,21 @@ export default { exportSuccess: "Database esportato con successo", exportError: "Esportazione non riuscita: {error}", exportCancelled: "Esportazione annullata", + runInBackground: "Esegui in background", }, nacos: { + createNamespace: "Crea Namespace", + editNamespace: "Modifica Namespace", + creatingNamespace: "Creazione...", + updatingNamespace: "Aggiornamento...", + namespaceCreated: 'Namespace "{name}" creato', + namespaceUpdated: 'Namespace "{name}" aggiornato', + namespaceId: "ID Namespace", + namespaceIdPlaceholder: "Lascia vuoto per generazione automatica Nacos", + namespaceName: "Nome Namespace", + namespaceNamePlaceholder: "Inserisci un nome namespace", + namespaceDesc: "Descrizione", + namespaceDescPlaceholder: "Predefinito al nome namespace", configs: "Configurazioni", services: "Servizi", raw: "Raw", @@ -2629,4 +3061,4 @@ export default { test: "Test", readOnly: "Sola lettura", }, -}; +}); diff --git a/apps/desktop/src/i18n/locales/ja.ts b/apps/desktop/src/i18n/locales/ja.ts index c332e8b36..41cb2fe2f 100644 --- a/apps/desktop/src/i18n/locales/ja.ts +++ b/apps/desktop/src/i18n/locales/ja.ts @@ -1,4 +1,6 @@ -export default { +import { withEnglishFallback } from "./fallback"; + +export default withEnglishFallback({ app: { name: "DBX", }, @@ -370,6 +372,12 @@ export default { colorBlue: "青", colorPurple: "紫", colorCustom: "カスタム色", + zookeeperConnectString: "接続文字列", + zookeeperConnectStringHint: "カンマまたは改行区切りの host:port エントリ。空欄の場合は上のホストとポートを使用します。", + zookeeperCreateModePersistent: "永続", + zookeeperCreateModeEphemeral: "エフェメラル", + zookeeperCreateModePersistentSequential: "永続順序", + zookeeperCreateModeEphemeralSequential: "エフェメラル順序", }, editor: { pressToExecute: "{mod}+Enter で実行", @@ -462,6 +470,7 @@ export default { currentCommand: "Current command", allCommands: "All commands", }, + selectDatabaseRequired: "先にデータベースを選択してください", }, tabs: { sql: "SQL", @@ -500,6 +509,8 @@ export default { scrollRight: "タブを右にスクロール", openTabs: "開いているタブ", openDataTabs: "開いているテーブル", + zookeeper: "ZooKeeper", + vector: "ベクター", }, executionSummary: { empty: "実行サマリーはありません", @@ -818,6 +829,11 @@ export default { }, sortUnsupported: "このSQLは完全な結果の並び替えをサポートしていません。単一のSELECTクエリで再試行してください。", truncatedHint: "結果は{count}行に切り詰められました。フッターのページネーションを使用するか、1ページあたりの行数を調整してください。", + loadingMore: "さらにデータを読み込み中...", + allLoaded: "すべて読み込み済み", + previewSqlEmpty: "プレビューする保留中のSQL変更はありません", + undoChange: "変更を元に戻す", + redoChange: "変更をやり直す", }, exportProgress: { title: "テーブルデータをエクスポート中", @@ -838,6 +854,13 @@ export default { showMore: "さらに{count}件表示", showLess: "少なく表示", delete: "削除", + failedTooltip: "{count}件のバックグラウンドタスクが失敗しました", + databaseExportTitle: "データベースバックアップ: {name}", + sqlFileTitle: "SQLファイル: {name}", + dataTransferTitle: "データ転送: {name}", + objectsCount: "{current} / {total} オブジェクト", + tablesCount: "{current} / {total} テーブル", + statementsCount: "{done}成功、{failed}失敗", }, welcome: { title: "データベースワークスペース", @@ -881,6 +904,9 @@ export default { sequence: "シーケンス", package: "パッケージ", packageBody: "パッケージ本体", + copy: "コピー", + import: "インポート", + remove: "削除", }, quickOpen: { placeholder: "接続、データベース、テーブル、その他のオブジェクトを検索...", @@ -1027,6 +1053,11 @@ export default { codexCliEnvValuePlaceholder: "http://proxy:9800", codexCliEnvInvalidName: "無効な環境変数名: {name}", codexCliEnvReservedName: "{name}はMCP Server用にDBXが管理しているため、ここでは設定できません。", + contextWindow: "コンテキストウィンドウ", + contextWindowAuto: "自動(モデル名から検出)", + contextWindowHint: "トークン数。空欄で自動検出。ローカル/カスタムモデルは手動設定してください。", + codexCliPath: "Codex CLI パス", + codexCliPathHint: "空欄の場合はPATHからcodexを使用します。codex loginで別途サインインしてください。", reasoningLevel: "推論レベル", reasoningLevelDefault: "デフォルト", reasoningLevelMinimal: "最小", @@ -1312,6 +1343,10 @@ export default { schemaCommentPlaceholder: "スキーマコメントを入力...", schemaCommentSaving: "保存中...", editSchemaCommentSuccess: "スキーマ「{name}」のコメントを更新しました", + configureVisibleObjects: "表示オブジェクトフィルター", + instanceInfo: "インスタンス情報", + viewDdlLoading: "DDLを読み込み中...", + ddlCopied: "DDLをコピーしました", }, visibleDatabases: { title: "表示するデータベース", @@ -1357,6 +1392,41 @@ export default { partitions: "パーティション", loadMore: "もっと読み込む...", objectBrowser: "オブジェクトブラウザで参照({count}件)", + linkedServers: "リンクサーバー", + materializedViews: "マテリアライズドビュー", + }, + zookeeper: { + prefixPlaceholder: "パスプレフィックス(例: /app/)", + newKey: "新しいZnode", + loadingKeys: "znodeを読み込み中...", + empty: "znodeが見つかりません", + loadMore: "さらに読み込む", + selectKey: "znodeを選択して値を表示", + loadingValue: "値を読み込み中...", + notFound: "znodeが見つかりません", + edit: "編集", + editKey: "Znodeを編集", + delete: "削除", + deleteTitle: "ZooKeeper znodeを削除", + keyPlaceholder: "/path/to/znode", + keyRequired: "Znodeパスは必須です", + saved: "Znodeを保存しました", + deleted: "Znodeを削除しました", + base64Readonly: "Base64値はこのバージョンでは読み取り専用です。", + createMode: "作成モード", + createModePersistent: "永続", + createModeEphemeral: "エフェメラル", + createModePersistentSequential: "永続順序", + createModeEphemeralSequential: "エフェメラル順序", + add: "追加", + value: "値", + metadata: "ノード情報", + prettyJson: "整形", + invalidJson: "無効なJSON", + summaryRevision: "rev", + summaryVersion: "ver", + summaryLease: "リース", + summarySize: "サイズ", }, userAdmin: { title: "ユーザーと権限", @@ -1710,6 +1780,22 @@ export default { pubsubSend: "送信", pubsubPublishFailed: "発行に失敗しました: {error}", pubsubWsConnectFailed: "WebSocket接続に失敗しました: {error}", + slowlog: "スローログ", + slowlogCount: "件数", + slowlogQuery: "クエリ", + slowlogNode: "ノード", + slowlogSelectNode: "ノードを選択", + slowlogNodeRequired: "先にノードを選択してください", + slowlogEmpty: "クエリをクリックしてスローログエントリを取得", + slowlogFetchFailed: "スローログの取得に失敗しました: {error}", + slowlogColumnId: "ID", + slowlogColumnTimestamp: "タイムスタンプ", + slowlogColumnDuration: "実行時間 (μs)", + slowlogColumnCommand: "コマンド", + slowlogColumnClientAddr: "クライアント", + slowlogColumnClientName: "クライアント名", + slowlogTotal: "{count} エントリ", + slowlogDetailTitle: "スローログエントリ #{id}", }, mongo: { documents: "{count}ドキュメント", @@ -1729,6 +1815,19 @@ export default { filterPlaceholder: "フィルター...", sortPlaceholder: "並び替え...", }, + vector: { + collectionFallback: "コレクション", + productCollection: "{product} コレクション", + browse: "参照", + upsert: "Upsert", + delete: "削除", + reset: "リセット", + refresh: "更新", + run: "実行", + apply: "適用", + requestEditor: "ベクターリクエストエディタ", + operationSuccess: "操作が完了しました。コレクションプレビューが更新されました。", + }, history: { title: "履歴", search: "履歴を検索...", @@ -1880,6 +1979,11 @@ export default { tableError: "テーブル {table} が失敗しました: {error}", overallProgress: "全体の進捗", dataTransfer: "データ転送", + runInBackground: "バックグラウンドで実行", + newTask: "新規転送", + editConfig: "設定を編集", + retry: "リトライ", + targetTableBusy: "別の転送がすでにターゲットテーブルに書き込み中です: {tables}", }, tableImport: { title: "テーブルデータをインポート", @@ -2042,6 +2146,7 @@ export default { generateDataComingSoon: "近日公開", }, sqlFile: { + runInBackground: "バックグラウンドで実行", title: "SQLファイルを実行", file: "ファイル", selectSqlFile: "SQLファイルを選択", @@ -2162,6 +2267,36 @@ export default { executedStatements: "実行された文", serverVersion: "サーバーバージョン", close: "閉じる", + configDeleted: "設定を削除しました", + sourceObject: "ソースオブジェクト", + targetObject: "ターゲットオブジェクト", + operation: "操作", + selectedCount: "{selected}/{total} 選択中", + saveConfig: "設定を保存", + loadConfig: "設定を読み込む", + options: "オプション", + ddlCompare: "DDL比較", + deployScript: "デプロイスクリプト", + deployScriptAll: "全デプロイスクリプト", + deployScriptDesc: "選択したオブジェクトのSQLスクリプト", + deployScriptAllDesc: "選択した全オブジェクトのSQLスクリプト", + copy: "コピー", + execute: "実行", + executeAll: "すべて実行", + executeSuccess: "正常に実行されました", + noDeployScript: "デプロイスクリプトがありません", + noDeployScriptAll: "選択したオブジェクトにデプロイスクリプトがありません", + prevStep: "前へ", + recompare: "再比較", + maximize: "最大化", + restore: "復元", + info: "情報", + connType: "接続タイプ", + connName: "接続名", + host: "ホスト", + port: "ポート", + copied: "クリップボードにコピーしました", + saveConfigPrompt: "設定名を入力してください:", }, schemaDiff: { optionsTitle: "比較オプション", @@ -2634,6 +2769,21 @@ export default { mcpNpmBoundary: "DBXはMCPステータスの確認と説明のみを行います。インストールとアップグレードはnpmを通じて実行されます。", mcpRefresh: "再確認", mcpGuide: "MCPガイド", + updateDownloadSource: "アップデートのダウンロード元", + updateDownloadSourceDescription: "アプリ内アップデートのインストーラーのダウンロード元を選択します。公式ソース推奨。中国本土ではCNBの方が高速な場合があります。", + updateDownloadSourceOfficial: "公式ソース(推奨)", + updateDownloadSourceCnb: "CNB", + infiniteScroll: "無限スクロール読み込み", + infiniteScrollDescription: "テーブルのスクロール時に次のページのデータを自動読み込みします。", + infiniteScrollMaxRows: "無限スクロールの最大行数", + infiniteScrollMaxRowsDescription: "無限スクロールモードで読み込む最大行数(1000〜50000)。", + exportRowLimitEnabled: "エクスポート行数を制限", + exportRowLimitEnabledDescription: "有効時、クエリ結果とテーブルデータのエクスポートは以下の行数制限で停止します。", + exportRowLimit: "データエクスポートの行数制限", + exportRowLimitDescription: "クエリ結果とテーブルデータのエクスポートの最大行数。", + exportRowLimitUnlimited: "無制限", + queryExportKeysetOptimizationEnabled: "キーセット最適化を試行", + queryExportKeysetOptimizationEnabledDescription: "安全に認識された単一テーブルクエリにのみ適用。複雑なクエリは自動的にフォールバックします。", aboutDescription: "オープンソースの軽量データベース管理ツール。", community: "コミュニティ", qqGroup: "QQグループ", @@ -2764,6 +2914,7 @@ export default { driverStoreDirSuccess: "{target}を変更しました。再起動中…", }, databaseExport: { + runInBackground: "バックグラウンドで実行", title: "データベースをエクスポート", options: "オプション", includeStructure: "テーブル構造 (DDL)", @@ -2893,5 +3044,17 @@ export default { next: "次へ", test: "テスト", readOnly: "読み取り専用", + createNamespace: "名前空間を作成", + editNamespace: "名前空間を編集", + creatingNamespace: "作成中...", + updatingNamespace: "更新中...", + namespaceCreated: "名前空間「{name}」を作成しました", + namespaceUpdated: "名前空間「{name}」を更新しました", + namespaceId: "名前空間ID", + namespaceIdPlaceholder: "空欄の場合はNacosが生成", + namespaceName: "名前空間名", + namespaceNamePlaceholder: "名前空間名を入力", + namespaceDesc: "説明", + namespaceDescPlaceholder: "デフォルトは名前空間名", }, -}; +}); diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts index c78a26ecd..a16e2336e 100644 --- a/apps/desktop/src/i18n/locales/pt-BR.ts +++ b/apps/desktop/src/i18n/locales/pt-BR.ts @@ -1,4 +1,6 @@ -export default { +import { withEnglishFallback } from "./fallback"; + +export default withEnglishFallback({ app: { name: "DBX", }, @@ -34,6 +36,8 @@ export default { formatSqlFailed: "Falha ao formatar SQL", keywordCaseLower: "Usar palavras-chave SQL em minúsculas", keywordCaseUpper: "Usar palavras-chave SQL em maiúsculas", + previewSql: "Visualizar SQL", + hidePreviewSql: "Ocultar Visualização SQL", saveSql: "Salvar na Biblioteca SQL", openSql: "Abrir arquivo SQL", theme: "Tema", @@ -179,6 +183,8 @@ export default { driverName: "Nome do Driver", driverNamePlaceholder: "Nome do fornecedor ou ambiente", urlParams: "Parâmetros da URL", + gbaseServer: "GBASEDBTSERVER", + informixServer: "INFORMIXSERVER", sslEnable: "Habilitar conexão criptografada", caCertPath: "Certificado CA", caCertPathPlaceholder: "Opcional, ex.: ~/.yandex/RootCA.crt", @@ -236,6 +242,23 @@ export default { redisSentinelTls: "TLS do Sentinel", redisSentinelTlsHint: "Usar TLS ao conectar aos nós Sentinel", redisKeySeparator: "Separador de namespace de chave", + etcdEndpoints: "Endpoints", + etcdEndpointsHint: "Um endpoint por linha. Deixe em branco para usar o host e porta acima.", + etcdCaCertPlaceholder: "/caminho/para/ca.crt", + etcdCaCertBrowse: "Escolher certificado CA", + etcdClientAuth: "Autenticação do Cliente", + etcdClientCertPlaceholder: "/caminho/para/client.crt", + etcdClientKeyPlaceholder: "/caminho/para/client.key", + etcdClientCertHint: "O certificado e a chave privada do cliente devem ser fornecidos juntos quando o etcd exige mTLS.", + etcdClientCertBrowse: "Escolher certificado do cliente", + etcdClientKeyBrowse: "Escolher chave privada do cliente", + etcdClientCertPairRequired: "O certificado e a chave privada do cliente devem ser fornecidos juntos.", + zookeeperConnectString: "String de Conexão", + zookeeperConnectStringHint: "Entradas host:porta separadas por vírgula ou linha. Deixe em branco para usar o host e porta acima.", + zookeeperCreateModePersistent: "Persistente", + zookeeperCreateModeEphemeral: "Efêmero", + zookeeperCreateModePersistentSequential: "Persistente Sequencial", + zookeeperCreateModeEphemeralSequential: "Efêmero Sequencial", nacosConsoleUrl: "URL do console", nacosConsoleUrlHint: "Use o endereço do console/admin API do Nacos. O Nacos 3 Docker geralmente expõe o console em 8085; implantações antigas podem compartilhar 8848 com a porta de serviço.", nacosConsoleUrlRequired: "A URL do console Nacos é obrigatória", @@ -320,6 +343,18 @@ export default { idleTimeout: "Timeout de Inatividade (segundos)", keepaliveInterval: "Intervalo de keepalive (segundos)", readOnly: "Somente leitura", + createNamespace: "Criar Namespace", + editNamespace: "Editar Namespace", + creatingNamespace: "Criando...", + updatingNamespace: "Atualizando...", + namespaceCreated: 'Namespace "{name}" criado', + namespaceUpdated: 'Namespace "{name}" atualizado', + namespaceId: "ID do Namespace", + namespaceIdPlaceholder: "Deixe vazio para o Nacos gerar", + namespaceName: "Nome do Namespace", + namespaceNamePlaceholder: "Digite um nome de namespace", + namespaceDesc: "Descrição", + namespaceDescPlaceholder: "Padrão é o nome do namespace", readOnlyHint: "Bloquear todas as operações de escrita (INSERT, UPDATE, DELETE, etc.)", readOnlyBadge: "Somente leitura", proxy: "Proxy", @@ -336,6 +371,8 @@ export default { jdbcDriverClassPlaceholder: "A maioria dos drivers se registra automaticamente; use com.vendor.jdbc.Driver se necessário", jdbcDriverPaths: "JARs do Driver", jdbcDriverSelectPlaceholder: "Escolher driver importado", + jdbcManualClasspath: "Classpath manual", + jdbcManualClasspathCount: "{count} caminhos", jdbcDriverPathsPlaceholder: "/caminho/para/driver.jar\n/caminho/para/outro-driver.jar", jdbcDriverBrowse: "Escolher JAR do driver JDBC", jdbcDocs: "Ver documentação JDBC", @@ -363,13 +400,18 @@ export default { showResultsPane: "Mostrar resultados", hideResultsPane: "Ocultar resultados", noDatabase: "Nenhum banco de dados selecionado", + unsavedChangesTitle: "Alterações não salvas", + unsavedChangesMessage: "Esta aba tem alterações não salvas que serão perdidas se fechada. Salvar antes de fechar?", + discardChanges: "Descartar", selectConnection: "Selecionar conexão", searchConnection: "Pesquisar conexões...", selectDatabase: "Selecionar banco de dados", + selectDatabaseRequired: "Selecione um banco de dados primeiro", searchDatabase: "Pesquisar bancos de dados...", selectSchema: "Selecionar schema", setDefaultDatabase: "Definir Padrão", defaultDatabase: "Padrão", + clearDatabase: "Limpar banco de dados", completion: { nullValue: "Valor NULL", isNull: "Verificar se é NULL", @@ -448,8 +490,13 @@ export default { table: "Tabela", tableData: "Dados da Tabela", redis: "Redis", + etcd: "etcd", + zookeeper: "ZooKeeper", mongo: "Mongo", + vector: "Vector", objects: "Objetos", + users: "Usuários e Privilégios", + executionSummary: "Resumo de Execução", tooltipTitle: "Título:", tooltipConnection: "Conexão:", tooltipDatabase: "Banco de dados:", @@ -457,11 +504,40 @@ export default { tooltipCollection: "Coleção:", tooltipSchema: "Schema:", resultN: "Resultado {n}", + runN: "Executar {n}", + resultRuns: "Execuções de resultado", + removeRun: "Remover execução {n}", + autoKeepResults: "Manter resultados automaticamente", + autoKeepResultsEnabled: "Manutenção automática de resultados ativada", + autoKeepResultsDisabled: "Manutenção automática de resultados desativada", + missingResultRun: "Este resultado não está mais disponível", + exportResultArchive: "Salvar Arquivo de Resultados", + importResultArchive: "Importar Resultados", + importedResultArchive: "Resultados importados", + resultArchiveExported: "Resultados exportados", + resultArchiveImported: "Resultados importados", + resultArchiveUnavailable: "Nenhum resultado salvo disponível para exportar", + resultArchiveImportInvalid: "Este arquivo de resultados não pôde ser aberto", + resultArchiveExportFailed: "Falha ao exportar resultados: {message}", + resultArchiveImportFailed: "Falha ao importar resultados: {message}", scrollLeft: "Rolar abas para a esquerda", scrollRight: "Rolar abas para a direita", openTabs: "Abas abertas", openDataTabs: "Tabelas abertas", }, + executionSummary: { + empty: "Nenhum resumo de execução", + executing: "Executando...", + statement: "Instrução", + type: "Tipo", + rows: "Linhas", + affected: "Afetadas", + time: "Tempo", + success: "Sucesso", + error: "Erro", + returnedTable: "Retornou uma tabela de resultado com {count} colunas", + noTable: "Nenhuma tabela de resultado retornada", + }, chart: { title: "Gráfico", type: "Tipo", @@ -533,6 +609,7 @@ export default { exportFailed: "Falha na exportação: {message}", copied: "Copiado", copyFailed: "Falha ao copiar: {message}", + previewSqlEmpty: "Nenhuma alteração SQL pendente para visualizar", domRenderMode: "DOM", canvasRenderMode: "Canvas", renderModeHint: "Alterne entre a renderização Canvas e a grade DOM alternativa.", @@ -740,7 +817,11 @@ export default { tableInfoNoResults: "Nenhum resultado", queryError: "Erro na Consulta", dataUnavailable: "Os dados da tabela precisam ser recarregados.", + dataUnavailableHintPrefix: "Pressione ", + dataUnavailableHintSuffix: " ou clique em Atualizar abaixo para recarregar.", refresh: "Atualizar", + undoChange: "Desfazer alteração", + redoChange: "Refazer alteração", commit: "Confirmar", rollback: "Reverter", transactionSaveHint: "Confirmar {count} alteração(ões) pendente(s) em uma transação.", @@ -780,12 +861,19 @@ export default { cancel: "Cancelar", close: "Fechar", tooltip: "Progresso da Exportação", + failedTooltip: "{count} tarefa em segundo plano falhou | {count} tarefas em segundo plano falharam", popoverTitle: "Exportações", noTasks: "Nenhuma exportação", clearFinished: "Limpar concluídas", showMore: "Mostrar mais {count}", showLess: "Mostrar menos", delete: "Remover", + databaseExportTitle: "Backup de banco de dados: {name}", + sqlFileTitle: "Arquivo SQL: {name}", + dataTransferTitle: "Transferência de dados: {name}", + objectsCount: "{current} / {total} objetos", + tablesCount: "{current} / {total} tabelas", + statementsCount: "{done} com sucesso, {failed} com falha", }, welcome: { title: "Área de Trabalho do Banco de Dados", @@ -819,6 +907,9 @@ export default { retry: "Tentar novamente", more: "Mais", done: "Concluído", + copy: "Copiar", + import: "Importar", + remove: "Remover", connection: "Conexão", database: "Banco de dados", table: "Tabela", @@ -967,6 +1058,8 @@ export default { modelListApiKeyRequired: "Informe uma API key antes de carregar os modelos.", codexMcpRequiredTitle: "DBX MCP Server obrigatório", codexMcpRequiredDescription: "O Codex CLI usa o DBX MCP Server para acessar o schema do banco e as ferramentas de consulta. Instale-o antes de usar o Codex no assistente de AI.", + codexCliPath: "Caminho do Codex CLI", + codexCliPathHint: "Deixe vazio para usar o codex do PATH. Faça login separadamente com codex login.", codexCliPathEnvError: "Codex CLI Path deve conter apenas o caminho do executável. Adicione variáveis de ambiente abaixo.", codexCliEnv: "Variáveis de ambiente", codexCliEnvAdd: "Adicionar variável", @@ -1055,6 +1148,9 @@ export default { proxyEnable: "Enviar requisições de AI através do proxy", proxyUrl: "URL do Proxy", anthropicMessagesHint: "APIs compatíveis com Anthropic Messages geralmente usam /v1/messages.", + contextWindow: "Janela de Contexto", + contextWindowAuto: "Automático (detectar pelo nome do modelo)", + contextWindowHint: "Tokens. Deixe vazio para detecção automática. Defina manualmente para modelos locais/personalizados.", enableThinking: "Raciocínio", enableThinkingOn: "Ativado", enableThinkingOff: "Desativado", @@ -1088,7 +1184,11 @@ export default { editConnection: "Editar Conexão", revealDatabaseFile: "Mostrar no gerenciador de arquivos", selectVisibleDatabases: "Selecionar Bancos de Dados Visíveis", + configureVisibleObjects: "Filtro de Objetos Visíveis", + userAdmin: "Usuários e Privilégios", + openUserAdmin: "Abrir Usuários e Privilégios", duplicateConnection: "Duplicar Conexão", + instanceInfo: "Informações da Instância", newQuery: "Nova Consulta", newSql: "Novo SQL", generateSql: "Gerar SQL", @@ -1290,6 +1390,9 @@ export default { }, tree: { savedSql: "Biblioteca SQL", + userAdmin: "Usuários e Privilégios", + linkedServers: "Servidores Vinculados", + materializedViews: "Visualizações Materializadas", defaultDatabase: "Banco padrão", columns: "Colunas", indexes: "Índices", @@ -1305,6 +1408,51 @@ export default { loadMore: "Carregar mais...", objectBrowser: "Navegar no Navegador de Objetos ({count})", }, + userAdmin: { + title: "Usuários e Privilégios", + unsupported: "Conexões compatíveis com MySQL e PostgreSQL são suportadas. SQL Server, Oracle e outros modelos de permissão podem ser adicionados em seguida.", + newUser: "Novo Usuário", + anonymous: "Anônimo", + roleName: "Nome da função", + allowLogin: "Permitir login", + searchUser: "Pesquisar usuário ou host", + loadingUsers: "Carregando usuários...", + loadingGrants: "Carregando permissões...", + emptyUsers: "Nenhum usuário encontrado, ou a conta atual não pode ler a lista de usuários.", + pluginUnknown: "Plugin de autenticação desconhecido", + grants: "Permissões", + noGrants: "Nenhuma permissão encontrada", + privilegeEditor: "Editor de Privilégios", + privilegeHint: "Escolha privilégios, banco de dados e tabela, então visualize o SQL antes de aplicar. * significa global ou todas as tabelas.", + database: "Banco de dados", + schema: "Schema", + table: "Tabela", + scope: "Escopo da concessão", + scopeDatabase: "Banco de dados", + scopeSchema: "Schema", + scopeTable: "Tabela", + scopeRole: "Associação de função", + memberRole: "Função membro", + privileges: "Privilégios", + grantOption: "Permitir mais concessões (WITH GRANT OPTION)", + adminOption: "Permitir gerenciamento de associação (WITH ADMIN OPTION)", + grant: "Conceder", + revoke: "Revogar", + username: "Nome de usuário", + host: "Host", + changePassword: "Alterar Senha", + newPassword: "Nova senha", + lock: "Bloquear", + unlock: "Desbloquear", + disableLogin: "Desabilitar Login", + enableLogin: "Habilitar Login", + dropUser: "Remover Usuário", + previewSql: "Visualizar SQL", + sqlPreview: "Visualização SQL", + applySql: "Aplicar SQL", + applySuccess: "Privilégios do usuário atualizados", + applyFailed: "Execução falhou: {message}", + }, objects: { all: "Todos", tables: "Tabelas", @@ -1443,6 +1591,26 @@ export default { relationshipsCount: "{count} relacionamentos", tableMode: "Visão de tabelas", engineeringMode: "ER de engenharia", + modelRelationships: "Relacionamentos Modelados", + copyJoinSql: "Copiar SQL", + customRelationshipsCount: "{count} modelados", + relationshipName: "Nome", + relationshipNamePlaceholder: "Opcional", + sourceTable: "Tabela de origem", + sourceColumn: "Coluna de origem", + targetTable: "Tabela de destino", + targetColumn: "Coluna de destino", + cardinality: "Cardinalidade", + cardinalityOneToMany: "1:N", + cardinalityManyToOne: "N:1", + cardinalityOneToOne: "1:1", + addRelationship: "Adicionar relacionamento", + removeRelationship: "Remover relacionamento", + relationshipIncomplete: "Selecione as colunas de origem e destino", + relationshipSelfInvalid: "Um relacionamento não pode ter como alvo a mesma coluna", + relationshipExists: "Este relacionamento já existe", + relationshipAdded: "Relacionamento adicionado", + noJoinSql: "Nenhum SQL de relacionamento para copiar", allTables: "Todas as tabelas", relatedTables: "Tabelas relacionadas", moreColumns: "+ {count} colunas", @@ -1453,6 +1621,58 @@ export default { zoomOut: "Diminuir zoom", resetLayout: "Redefinir layout", }, + etcd: { + prefixPlaceholder: "Prefixo, ex.: /app/", + newKey: "Nova Chave", + loadingKeys: "Carregando chaves...", + empty: "Nenhuma chave encontrada", + loadMore: "Carregar mais", + selectKey: "Selecione uma chave para ver seu valor", + loadingValue: "Carregando valor...", + notFound: "Chave não encontrada", + edit: "Editar", + editKey: "Editar Chave", + delete: "Excluir", + deleteTitle: "Excluir chave etcd", + keyPlaceholder: "/caminho/para/chave", + keyRequired: "Chave é obrigatória", + saved: "Chave salva", + deleted: "Chave excluída", + base64Readonly: "Valores Base64 são somente leitura nesta versão.", + }, + zookeeper: { + prefixPlaceholder: "Prefixo de caminho, ex.: /app/", + newKey: "Novo Znode", + loadingKeys: "Carregando znodes...", + empty: "Nenhum znode encontrado", + loadMore: "Carregar mais", + selectKey: "Selecione um znode para ver seu valor", + loadingValue: "Carregando valor...", + notFound: "Znode não encontrado", + edit: "Editar", + editKey: "Editar Znode", + delete: "Excluir", + deleteTitle: "Excluir znode do ZooKeeper", + keyPlaceholder: "/caminho/para/znode", + keyRequired: "Caminho do znode é obrigatório", + saved: "Znode salvo", + deleted: "Znode excluído", + base64Readonly: "Valores Base64 são somente leitura nesta versão.", + createMode: "Modo de Criação", + createModePersistent: "Persistente", + createModeEphemeral: "Efêmero", + createModePersistentSequential: "Persistente Sequencial", + createModeEphemeralSequential: "Efêmero Sequencial", + add: "Adicionar", + value: "Valor", + metadata: "Informações do Nó", + prettyJson: "Formatado", + invalidJson: "JSON inválido", + summaryRevision: "rev", + summaryVersion: "ver", + summaryLease: "lease", + summarySize: "tamanho", + }, redis: { selectKey: "Selecione uma chave para ver seu valor", noKeys: "Nenhuma chave encontrada", @@ -1546,9 +1766,28 @@ export default { jsonView: "Visão JSON", rawContent: "Conteúdo bruto", wordWrap: "Quebra de linha", + formatJson: "Formatar", + compressJson: "Comprimir", + jsonFormatError: "Formato JSON inválido", clearHistory: "Limpar histórico de comandos", historyCleared: "Histórico de comandos Redis limpo", blockedCommand: "O comando {command} está bloqueado por segurança. Desative o ícone de escudo na barra de ferramentas para permiti-lo.", + slowlog: "Slow Log", + slowlogCount: "Contagem", + slowlogQuery: "Consultar", + slowlogNode: "Nó", + slowlogSelectNode: "Selecione um nó", + slowlogNodeRequired: "Selecione um nó primeiro", + slowlogEmpty: "Clique em Consultar para obter entradas do slow log", + slowlogFetchFailed: "Falha ao buscar slow log: {error}", + slowlogColumnId: "ID", + slowlogColumnTimestamp: "Timestamp", + slowlogColumnDuration: "Duração (μs)", + slowlogColumnCommand: "Comando", + slowlogColumnClientAddr: "Cliente", + slowlogColumnClientName: "Nome do Cliente", + slowlogTotal: "{count} entradas", + slowlogDetailTitle: "Entrada de Slow Log #{id}", pubsub: "Pub/Sub", pubsubConnected: "Conectado", pubsubConnecting: "Conectando...", @@ -1589,6 +1828,19 @@ export default { filterPlaceholder: "Filtrar...", sortPlaceholder: "Ordenar...", }, + vector: { + collectionFallback: "coleção", + productCollection: "coleção {product}", + browse: "Navegar", + upsert: "Upsert", + delete: "Excluir", + reset: "Redefinir", + refresh: "Atualizar", + run: "Executar", + apply: "Aplicar", + requestEditor: "Editor de requisição de vetor", + operationSuccess: "Operação concluída. A pré-visualização da coleção foi atualizada.", + }, history: { title: "Histórico", search: "Pesquisar histórico...", @@ -1740,6 +1992,11 @@ export default { tableError: "Falha na tabela {table}: {error}", overallProgress: "Progresso geral", dataTransfer: "Transferência de Dados", + runInBackground: "Executar em segundo plano", + newTask: "Nova transferência", + editConfig: "Editar configuração", + retry: "Tentar novamente", + targetTableBusy: "Outra transferência já está gravando na(s) tabela(s) de destino: {tables}", }, tableImport: { title: "Importar Dados da Tabela", @@ -1916,6 +2173,7 @@ export default { databasePlaceholder: "Nome do banco de dados", options: "Opções", continueOnError: "Continuar em caso de erro", + runInBackground: "Executar em segundo plano", cancelling: "Cancelando...", cancel: "Cancelar", execute: "Executar", @@ -1965,6 +2223,142 @@ export default { swap: "Trocar origem e destino", syncProgress: "Executando: {current}/{total}", syncSummary: "{success} bem-sucedidas, {failed} com falha", + connection: "Conexão", + database: "Banco de dados", + schema: "Schema", + recentConfigs: "Configurações Recentes", + selectRecentConfig: "Selecionar configuração recente", + configSaved: "Configuração salva", + configDeleted: "Configuração excluída", + sourceObject: "Objeto de origem", + targetObject: "Objeto de destino", + operation: "Operação", + selectedCount: "{selected} selecionados de {total}", + saveConfig: "Salvar configuração", + loadConfig: "Carregar configuração", + options: "Opções", + ddlCompare: "Comparação DDL", + deployScript: "Script de implantação", + deployScriptAll: "Todos os scripts de implantação", + deployScriptDesc: "Script SQL para o objeto selecionado", + deployScriptAllDesc: "Script SQL para todos os objetos selecionados", + copy: "Copiar", + execute: "Executar", + executeAll: "Executar todos", + executeSuccess: "Executado com sucesso", + selectObjectToCompare: "Selecione um objeto para ver a comparação DDL", + noDdlAvailable: "Nenhum DDL disponível", + noDeployScript: "Nenhum script de implantação", + noDeployScriptAll: "Nenhum script de implantação para os objetos selecionados", + sourceDdl: "DDL de origem", + targetDdl: "DDL de destino", + objectNotExistsInSource: "Este objeto não existe no banco de dados de origem", + objectNotExistsInTarget: "Este objeto não existe no banco de dados de destino", + nextStepDeploy: "Próximo (Revisar Implantação)", + deployReview: "Revisão de Implantação", + backToResult: "Voltar ao Resultado", + copyScript: "Copiar Script", + exportSql: "Exportar .sql", + deployToServer: "Implantar no Servidor", + deployConfirmTitle: "Confirmação Final", + deployConfirmMessage: "Você está prestes a implantar as seguintes alterações no banco de dados de destino", + targetServer: "Servidor de Destino", + dbVersion: "Versão do Banco de Dados", + targetDatabase: "Banco de Dados de Destino", + targetSchema: "Schema de Destino", + useTransaction: "Executar em transação (rollback automático em caso de falha)", + confirmDeploy: "Confirmar Implantação", + exportSuccess: "Exportação bem-sucedida", + create: "Criar", + delete: "Excluir", + modify: "Modificar", + cancel: "Cancelar", + prevStep: "Anterior", + recompare: "Comparar novamente", + maximize: "Maximizar", + restore: "Restaurar", + operationLabel: { + modify: "Objetos a modificar", + create: "Objetos a criar", + delete: "Objetos a excluir", + none: "Nenhuma operação", + }, + objectKindLabel: { + table: "Tabela", + view: "Visão", + function: "Função", + sequence: "Sequência", + rule: "Regra", + owner: "Proprietário", + index: "Índice", + foreignKey: "Chave Estrangeira", + trigger: "Gatilho", + }, + noObjectsSelected: "Selecione objetos para implantar", + deploySuccess: "Implantação Bem-sucedida", + deployFailed: "Implantação Falhou", + deploySuccessMessage: "Script SQL executado com sucesso no banco de dados de destino", + deployFailedMessage: "Ocorreu um erro durante a execução", + affectedRows: "Linhas Afetadas", + executedStatements: "Instruções Executadas", + serverVersion: "Versão do Servidor", + info: "Informações", + connType: "Tipo de conexão", + connName: "Nome da conexão", + host: "Host", + port: "Porta", + copied: "Copiado para a área de transferência", + saveConfigPrompt: "Digite o nome da configuração:", + close: "Fechar", + }, + schemaDiff: { + optionsTitle: "Opções de Comparação", + selectConfig: "Selecionar configuração", + newConfigName: "Nova Configuração", + newConfig: "Nova Configuração", + renameConfig: "Renomear Configuração", + duplicateConfig: "Duplicar Configuração", + deleteConfig: "Excluir Configuração", + exportConfig: "Exportar Configuração", + exportAllConfigs: "Exportar Todas as Configurações", + importConfig: "Importar Configuração", + importFromFile: "Importar de Arquivo", + importFromText: "Importar de Texto", + importPlaceholder: "Cole o JSON da configuração...", + importInvalidJson: "Formato JSON inválido", + configName: "Nome da Configuração", + tableFilter: "Filtro de tabela", + tableFilterHint: "Corresponde a nomes completos de tabela com regex. Não digite /.../. ^ significa começa com, $ significa termina com, | significa ou.", + tableFilterHintShort: "Limitar comparação por regex de nome de tabela", + tableFilterHelp: "Ajuda do filtro de tabela", + tableFilterHelpRule: "Corresponde a nomes completos de tabela. Não digite /.../.", + tableFilterHelpBlank: "Incluir em branco significa todas as tabelas. Pular em branco significa sem exclusões.", + tableFilterHelpExample: "^user_ significa começa com user_; _bak$ significa termina com _bak; a|b significa a ou b.", + tableIncludePattern: "Comparar apenas tabelas correspondidas", + tableIncludePatternPlaceholder: "ex.: ^user_", + tableExcludePattern: "Pular tabelas correspondidas", + tableExcludePatternPlaceholder: "ex.: _bak$", + tableFilterPriority: "Quando ambos correspondem", + tableFilterPriorityExclude: "Exclusão vence", + tableFilterPriorityInclude: "Inclusão vence", + options: { + tables: "Comparar tabelas", + primaryKeys: "Comparar chaves primárias", + foreignKeys: "Comparar chaves estrangeiras", + uniqueKeys: "Comparar chaves únicas", + checks: "Comparar constraints CHECK", + exclusions: "Comparar constraints de exclusão", + views: "Comparar visões", + functions: "Comparar funções", + indexes: "Comparar índices", + sequences: "Comparar sequências", + triggers: "Comparar gatilhos", + rules: "Comparar regras", + owners: "Comparar proprietários", + cascadeDelete: "Usar CASCADE delete", + sequenceLastValues: "Comparar últimos valores de sequência", + compareColumnOrder: "Comparar ordem das colunas", + }, }, dataCompare: { title: "Comparar Dados", @@ -2138,6 +2532,10 @@ export default { closeActionMinimize: "Minimizar para a bandeja", updateNotificationsEnabled: "Ativar lembretes de atualização", updateNotificationsEnabledDescription: "Quando desativado, o DBX não verificará automaticamente atualizações do app ou dos drivers nem mostrará indicadores. Verificações manuais continuam disponíveis.", + updateDownloadSource: "Fonte de download de atualização", + updateDownloadSourceDescription: "Escolha de onde os instaladores de atualização no aplicativo são baixados. A fonte oficial é recomendada; a CNB pode ser mais rápida em redes da China continental.", + updateDownloadSourceOfficial: "Fonte oficial (recomendada)", + updateDownloadSourceCnb: "CNB", debugLoggingEnabled: "Ativar logs de depuração", debugLoggingEnabledDescription: "Registra logs locais de diagnóstico do lado do usuário ao investigar relatos. Desativado por padrão.", debugLogsCopy: "Copiar logs", @@ -2265,6 +2663,13 @@ export default { redisScanPageSizeOption: "{count} chaves", exportBatchSize: "Tamanho do lote de exportação", exportBatchSizeDescription: "Linhas buscadas por lote ao exportar dados da tabela (100-100000).", + exportRowLimitEnabled: "Limitar linhas exportadas", + exportRowLimitEnabledDescription: "Quando ativado, as exportações de resultados de consulta e dados de tabela param no limite de linhas abaixo.", + exportRowLimit: "Limite de linhas da exportação", + exportRowLimitDescription: "Máximo de linhas para exportações de resultados de consulta e dados de tabela.", + exportRowLimitUnlimited: "Ilimitado", + queryExportKeysetOptimizationEnabled: "Tentar otimização keyset", + queryExportKeysetOptimizationEnabledDescription: "Aplica-se apenas a consultas de tabela única reconhecidas com segurança; consultas complexas recuam automaticamente.", exportSection: "Exportar", shortcutExecuteSql: "Executar SQL", shortcutFind: "Localizar", @@ -2405,6 +2810,8 @@ export default { progressJreExtract: "Extraindo JRE...", progressDownloadJre: "Baixando JRE", progressDownloadDriver: "Baixando driver", + progressDownloadJdbcPlugin: "Baixando plugin JDBC", + progressJdbcPluginExtract: "Instalando plugin JDBC...", usageTitle: "Uso de armazenamento", usageTotal: "Total {size}", usageTotalLabel: "Total", @@ -2413,6 +2820,16 @@ export default { usageAgentDrivers: "Agentes de driver integrados", usageJdbcPlugin: "Plugin JDBC", usageJdbcDriverJars: "JARs de driver JDBC", + offlineDownloadHint: "Para ambientes sem internet, baixe pacotes de driver offline em uma máquina com acesso à internet e importe-os aqui.", + offlineDownloadLink: "Downloads de driver offline", + searchDrivers: "Pesquisar nome, tipo, versão do driver...", + searchJdbcDrivers: "Pesquisar nome ou caminho do driver JDBC...", + jdbcMavenCoordinatePlaceholder: "Coordenada Maven, ex.: org.postgresql:postgresql:42.7.7", + jdbcMavenInstall: "Instalar do Maven", + jdbcMavenInstallSuccess: "Driver JDBC Maven instalado", + jdbcSourceMaven: "Maven", + jdbcSourceManual: "Manual", + noMatchingDrivers: "Nenhum driver correspondente.", javaRuntimeSaved: "Configurações de runtime do Java salvas", javaRuntimeSaveFailed: "Falha ao salvar configurações de runtime do Java: {error}", chooseJavaExecutable: "Escolher executável do Java", @@ -2516,6 +2933,7 @@ export default { dropTableIfExists: "Adicionar DROP TABLE IF EXISTS antes do DDL", includeData: "Dados da tabela (INSERT)", includeObjects: "Views / Procedures / Funções / Sequências", + runInBackground: "Executar em segundo plano", tableSelection: "Tabelas", selectedTables: "{selected}/{total} selecionadas", selectAllTables: "Selecionar todas", @@ -2537,6 +2955,18 @@ export default { services: "Serviços", raw: "Raw", namespace: "Namespace", + createNamespace: "Criar Namespace", + editNamespace: "Editar Namespace", + creatingNamespace: "Criando...", + updatingNamespace: "Atualizando...", + namespaceCreated: 'Namespace "{name}" criado', + namespaceUpdated: 'Namespace "{name}" atualizado', + namespaceId: "ID do Namespace", + namespaceIdPlaceholder: "Deixe vazio para o Nacos gerar", + namespaceName: "Nome do Namespace", + namespaceNamePlaceholder: "Digite um nome de namespace", + namespaceDesc: "Descrição", + namespaceDescPlaceholder: "Padrão é o nome do namespace", dataId: "Data ID", group: "Grupo", format: "Formato", @@ -2640,4 +3070,4 @@ export default { test: "Testar", readOnly: "Somente leitura", }, -}; +}); diff --git a/apps/desktop/src/i18n/locales/zh-CN.ts b/apps/desktop/src/i18n/locales/zh-CN.ts index 6aeda3fa9..0a463f409 100644 --- a/apps/desktop/src/i18n/locales/zh-CN.ts +++ b/apps/desktop/src/i18n/locales/zh-CN.ts @@ -1,4 +1,6 @@ -export default { +import { withEnglishFallback } from "./fallback"; + +export default withEnglishFallback({ app: { name: "DBX", }, @@ -877,6 +879,8 @@ export default { sqlHistoryOpenCount: "打开 {count} 次", unknownConnection: "未知连接", tip: "也可以在左侧展开连接,右键数据库或表查看更多操作。", + tipSidebar: "点击左侧表名查看数据", + tipExecute: "执行查询", fileOpened: "已打开 {name}", mcpTitle: "AI 编程助手集成", mcpDescription: "除了内置 AI 助手,还可以通过 MCP 让 Claude Code、Cursor 等编程助手直接使用这里的数据库连接。", @@ -889,6 +893,9 @@ export default { close: "关闭", cancel: "取消", save: "保存", + copy: "复制", + import: "导入", + remove: "移除", retry: "重试", more: "更多", done: "完成", @@ -2219,20 +2226,28 @@ export default { options: "选项", ddlCompare: "DDL 比较", deployScript: "部署脚本", + deployScriptDesc: "所选对象的 SQL 脚本", selectObjectToCompare: "选择对象查看 DDL 对比", noDdlAvailable: "无可用的 DDL", + noDeployScript: "暂无部署脚本", objectNotExistsInSource: "此对象在源库中不存在", objectNotExistsInTarget: "此对象在目标库中不存在", sourceDdl: "源 DDL", targetDdl: "目标 DDL", deployScriptTitle: "部署脚本", deployScriptAll: "全部部署脚本", + deployScriptAllDesc: "所有选中对象的 SQL 脚本", deployScriptAllTitle: "全部部署脚本", copyScript: "复制脚本", + copy: "复制", executeScript: "执行脚本", + execute: "执行", + executeAll: "全部执行", executeSuccess: "执行成功", prevStep: "上一步", recompare: "重新比较", + maximize: "最大化", + restore: "还原", deploy: "下一步", nextStepDeploy: "下一步(审核部署)", deployReview: "部署审核", @@ -2286,6 +2301,7 @@ export default { copied: "已复制到剪贴板", configSaved: "配置已保存", configDeleted: "配置已删除", + noDeployScriptAll: "暂无所选对象的部署脚本", saveConfigPrompt: "请输入配置名称:", }, schemaDiff: { @@ -3047,4 +3063,4 @@ export default { test: "测试", readOnly: "只读", }, -}; +}); diff --git a/apps/desktop/src/i18n/locales/zh-TW.ts b/apps/desktop/src/i18n/locales/zh-TW.ts index d96432511..2a9bb33dd 100644 --- a/apps/desktop/src/i18n/locales/zh-TW.ts +++ b/apps/desktop/src/i18n/locales/zh-TW.ts @@ -1,4 +1,6 @@ -export default { +import { withEnglishFallback } from "./fallback"; + +export default withEnglishFallback({ app: { name: "DBX", }, @@ -34,6 +36,8 @@ export default { formatSqlFailed: "SQL 格式化失敗", keywordCaseLower: "使用小寫 SQL 關鍵字", keywordCaseUpper: "使用大寫 SQL 關鍵字", + previewSql: "預覽 SQL", + hidePreviewSql: "隱藏 SQL 預覽", saveSql: "儲存到 SQL 庫", openSql: "開啟 SQL 檔案", theme: "主題", @@ -179,6 +183,8 @@ export default { driverName: "驅動程式名稱", driverNamePlaceholder: "廠商或環境名稱", urlParams: "URL 參數", + gbaseServer: "GBASEDBTSERVER", + informixServer: "INFORMIXSERVER", sslEnable: "啟用加密連線", caCertPath: "CA 憑證", caCertPathPlaceholder: "可選,例如 ~/.yandex/RootCA.crt", @@ -236,6 +242,23 @@ export default { redisSentinelTls: "Sentinel TLS", redisSentinelTlsHint: "連線 Sentinel 節點時使用 TLS", redisKeySeparator: "鍵名分隔符(可選)", + etcdEndpoints: "端點", + etcdEndpointsHint: "每行一個端點。留空則使用上方的主機和連接埠。", + etcdCaCertPlaceholder: "/path/to/ca.crt", + etcdCaCertBrowse: "選擇 CA 憑證", + etcdClientAuth: "用戶端認證", + etcdClientCertPlaceholder: "/path/to/client.crt", + etcdClientKeyPlaceholder: "/path/to/client.key", + etcdClientCertHint: "etcd 要求 mTLS 時,用戶端憑證和私鑰必須一起填寫。", + etcdClientCertBrowse: "選擇用戶端憑證", + etcdClientKeyBrowse: "選擇用戶端私鑰", + etcdClientCertPairRequired: "用戶端憑證和私鑰必須一起填寫。", + zookeeperConnectString: "連線字串", + zookeeperConnectStringHint: "以逗號或換行分隔的 host:port 項目。留空則使用上方的主機和連接埠。", + zookeeperCreateModePersistent: "持久", + zookeeperCreateModeEphemeral: "臨時", + zookeeperCreateModePersistentSequential: "持久有序", + zookeeperCreateModeEphemeralSequential: "臨時有序", nacosConsoleUrl: "控制台 URL", nacosConsoleUrlHint: "填寫 Nacos 控制台/admin API 位址。Nacos 3 Docker 通常是 8085;如果舊版控制台和服務共用 8848,也可以填 8848。", nacosConsoleUrlRequired: "Nacos 控制台 URL 不能為空", @@ -336,6 +359,8 @@ export default { jdbcDriverClassPlaceholder: "多數驅動程式可自動識別;需要時填寫 com.vendor.jdbc.Driver", jdbcDriverPaths: "驅動程式 JAR", jdbcDriverSelectPlaceholder: "選擇已匯入驅動程式", + jdbcManualClasspath: "手動 classpath", + jdbcManualClasspathCount: "{count} 個路徑", jdbcDriverPathsPlaceholder: "/path/to/driver.jar\n/path/to/another-driver.jar", jdbcDriverBrowse: "選擇 JDBC 驅動程式 JAR", jdbcDocs: "檢視 JDBC 文件", @@ -363,13 +388,18 @@ export default { showResultsPane: "顯示結果", hideResultsPane: "收起結果", noDatabase: "未選擇資料庫", + unsavedChangesTitle: "未儲存的變更", + unsavedChangesMessage: "此分頁有未儲存的變更,關閉後將遺失。儲存後再關閉嗎?", + discardChanges: "捨棄", selectConnection: "選擇連線", searchConnection: "搜尋連線……", selectDatabase: "選擇資料庫", + selectDatabaseRequired: "請先選擇資料庫", searchDatabase: "搜尋資料庫……", selectSchema: "選擇 Schema", setDefaultDatabase: "設為預設", defaultDatabase: "預設資料庫", + clearDatabase: "清除資料庫", completion: { nullValue: "空值", isNull: "判斷是否為 NULL", @@ -448,9 +478,13 @@ export default { table: "資料表", tableData: "資料表", redis: "Redis", + etcd: "etcd", + zookeeper: "ZooKeeper", mongo: "Mongo", vector: "向量", objects: "物件", + users: "使用者與權限", + executionSummary: "執行摘要", tooltipTitle: "標題:", tooltipConnection: "連線:", tooltipDatabase: "資料庫:", @@ -458,11 +492,40 @@ export default { tooltipCollection: "集合:", tooltipSchema: "Schema:", resultN: "結果 {n}", + runN: "執行 {n}", + resultRuns: "執行結果", + removeRun: "移除執行 {n}", + autoKeepResults: "自動保留查詢結果", + autoKeepResultsEnabled: "自動保留結果已啟用", + autoKeepResultsDisabled: "自動保留結果已停用", + missingResultRun: "此結果已不再可用", + exportResultArchive: "儲存結果封存", + importResultArchive: "匯入結果", + importedResultArchive: "已匯入的結果", + resultArchiveExported: "結果已匯出", + resultArchiveImported: "結果已匯入", + resultArchiveUnavailable: "沒有可匯出的已儲存結果", + resultArchiveImportInvalid: "無法開啟此結果封存", + resultArchiveExportFailed: "匯出結果失敗:{message}", + resultArchiveImportFailed: "匯入結果失敗:{message}", scrollLeft: "向左捲動分頁", scrollRight: "向右捲動分頁", openTabs: "已開啟的分頁", openDataTabs: "已開啟的資料表", }, + executionSummary: { + empty: "無執行摘要", + executing: "執行中...", + statement: "語句", + type: "類型", + rows: "列數", + affected: "影響", + time: "時間", + success: "成功", + error: "錯誤", + returnedTable: "回傳 {count} 欄的結果表", + noTable: "未回傳結果表", + }, chart: { title: "圖表", type: "類型", @@ -534,6 +597,7 @@ export default { exportFailed: "匯出失敗:{message}", copied: "已複製", copyFailed: "複製失敗:{message}", + previewSqlEmpty: "沒有待預覽的 SQL 變更", domRenderMode: "DOM", canvasRenderMode: "Canvas", renderModeHint: "在 Canvas 渲染和 DOM 備援表格之間切換。", @@ -739,8 +803,13 @@ export default { tableInfoEmpty: "無", tableInfoSearch: "搜尋……", tableInfoNoResults: "沒有相符結果", + dataUnavailable: "資料表資料需要重新載入。", + dataUnavailableHintPrefix: "按 ", + dataUnavailableHintSuffix: " 或點擊下方重新整理來重新載入。", queryError: "查詢出錯", refresh: "重新整理", + undoChange: "復原變更", + redoChange: "重做變更", commit: "提交", rollback: "回溯", transactionSaveHint: "在事務中提交 {count} 項待儲存更改。", @@ -767,6 +836,33 @@ export default { sortUnsupported: "目前 SQL 不支援完整排序,請改為單條 SELECT 查詢後再嘗試。", truncatedHint: "結果已截斷,僅顯示前 {count} 行。可經由底部分頁繼續載入,或調整每頁行數。", }, + exportProgress: { + title: "匯出資料表資料", + fetching: "正在從資料庫擷取資料...", + writing: "正在寫入檔案...", + done: "匯出完成!", + error: "匯出失敗", + cancelled: "匯出已取消。", + rowsCount: "{exported} / {total} 列", + rowsExported: "已匯出 {count} 列", + rowsShort: "列", + cancel: "取消", + close: "關閉", + tooltip: "背景工作", + failedTooltip: "{count} 個背景工作失敗 | {count} 個背景工作失敗", + popoverTitle: "背景工作", + noTasks: "無背景工作", + clearFinished: "清除已完成", + showMore: "顯示 {count} 個更多", + showLess: "顯示較少", + delete: "移除", + databaseExportTitle: "資料庫備份:{name}", + sqlFileTitle: "SQL 檔案:{name}", + dataTransferTitle: "資料傳輸:{name}", + objectsCount: "{current} / {total} 個物件", + tablesCount: "{current} / {total} 張資料表", + statementsCount: "{done} 成功,{failed} 失敗", + }, welcome: { title: "資料庫工作檯", subtitle: "選擇左側連線以瀏覽結構,或直接開啟查詢分頁。", @@ -796,6 +892,9 @@ export default { close: "關閉", cancel: "取消", save: "保存", + copy: "複製", + import: "匯入", + remove: "移除", retry: "重試", more: "更多", done: "完成", @@ -1022,6 +1121,11 @@ export default { enableThinkingOff: "已停用", enableThinkingHint: "此選項僅對 /chat/completions API 且部分支援的模型生效。設為停用後可大幅節省 token,但產生結果品質可能會略微下降。", anthropicMessagesHint: "Anthropic Messages 相容 API 通常使用 /v1/messages。", + contextWindow: "Context Window", + contextWindowAuto: "自動(從模型名稱偵測)", + contextWindowHint: "Token 數。留空以自動偵測。本機/自訂模型請手動設定。", + codexCliPath: "Codex CLI 路徑", + codexCliPathHint: "留空以使用 PATH 中的 codex。請另外以 codex login 登入。", codexMcpRequiredTitle: "需要 DBX MCP Server", codexMcpRequiredDescription: "Codex CLI 會透過 DBX MCP Server 存取資料庫結構與查詢工具。請先安裝後再於 AI 助理中使用 Codex。", codexCliPathEnvError: "Codex CLI 路徑只能填寫可執行檔路徑。請在下方新增環境變數。", @@ -1068,8 +1172,12 @@ export default { editConnection: "編輯連線", revealDatabaseFile: "在檔案管理員中顯示", selectVisibleDatabases: "選擇顯示資料庫", + configureVisibleObjects: "可見物件過濾", + userAdmin: "使用者與權限", + openUserAdmin: "開啟使用者與權限", duplicateConnection: "複製連線", newQuery: "建立查詢", + instanceInfo: "實例資訊", newSql: "新增 SQL", generateSql: "產生 SQL", newInsert: "建立新增", @@ -1270,6 +1378,9 @@ export default { }, tree: { savedSql: "SQL 庫", + userAdmin: "使用者與權限", + linkedServers: "連結伺服器", + materializedViews: "具體化檢視", defaultDatabase: "預設庫", columns: "欄位", indexes: "索引", @@ -1432,6 +1543,26 @@ export default { zoomIn: "放大", zoomOut: "縮小", resetLayout: "重設布局", + modelRelationships: "模型關係", + copyJoinSql: "複製 SQL", + customRelationshipsCount: "{count} 個已建模", + relationshipName: "名稱", + relationshipNamePlaceholder: "可選", + sourceTable: "來源資料表", + sourceColumn: "來源欄位", + targetTable: "目標資料表", + targetColumn: "目標欄位", + cardinality: "基數", + cardinalityOneToMany: "1:N", + cardinalityManyToOne: "N:1", + cardinalityOneToOne: "1:1", + addRelationship: "新增關係", + removeRelationship: "移除關係", + relationshipIncomplete: "請同時選擇來源和目標欄位", + relationshipSelfInvalid: "關係不能指向同一欄位", + relationshipExists: "此關係已存在", + relationshipAdded: "關係已新增", + noJoinSql: "沒有可複製的關係 SQL", }, redis: { selectKey: "選擇一個 key 檢視值", @@ -1520,13 +1651,34 @@ export default { viewMember: "檢視完整內容", copyMember: "複製成員", copied: "已複製", + copyInsertStatement: "複製為 INSERT 語句", + copyInsertStatementBinary: "無法為二進位資料產生 INSERT 語句", editMember: "編輯", jsonView: "JSON 檢視", rawContent: "原始內容", wordWrap: "自動換行", + formatJson: "格式化", + compressJson: "壓縮", + jsonFormatError: "無效的 JSON 格式", clearHistory: "清除命令歷史", historyCleared: "Redis 命令歷史已清除", blockedCommand: "命令 {command} 因安全原因已被攔截。點擊工具列盾牌圖示可關閉攔截。", + slowlog: "慢日誌", + slowlogCount: "計數", + slowlogQuery: "查詢", + slowlogNode: "節點", + slowlogSelectNode: "選擇節點", + slowlogNodeRequired: "請先選擇節點", + slowlogEmpty: "點擊查詢以擷取慢日誌條目", + slowlogFetchFailed: "擷取慢日誌失敗:{error}", + slowlogColumnId: "ID", + slowlogColumnTimestamp: "時間戳", + slowlogColumnDuration: "耗時 (μs)", + slowlogColumnCommand: "命令", + slowlogColumnClientAddr: "用戶端", + slowlogColumnClientName: "用戶端名稱", + slowlogTotal: "{count} 條條目", + slowlogDetailTitle: "慢日誌條目 #{id}", pubsub: "發布/訂閱", pubsubConnected: "已連線", pubsubConnecting: "連線中...", @@ -1727,6 +1879,15 @@ export default { tableError: "資料表 {table} 傳輸失敗:{error}", overallProgress: "整體進度", dataTransfer: "資料傳輸", + targetTableNameCase: "目標資料表名稱大小寫", + tableNameCasePreserve: "保留", + tableNameCaseLower: "小寫", + tableNameCaseUpper: "大寫", + runInBackground: "背景執行", + newTask: "新增傳輸", + editConfig: "編輯配置", + retry: "重試", + targetTableBusy: "另一個傳輸正在寫入目標資料表:{tables}", }, tableImport: { title: "匯入資料表資料", @@ -1921,6 +2082,7 @@ export default { error: "錯誤", cancelled: "已取消", }, + runInBackground: "背景執行", }, diff: { title: "比較架構", @@ -1969,6 +2131,76 @@ export default { foreignKey: "外鍵", trigger: "觸發器", }, + recentConfigs: "最近配置", + selectRecentConfig: "選擇最近配置", + configSaved: "配置已儲存", + configDeleted: "配置已刪除", + sourceObject: "來源物件", + targetObject: "目標物件", + saveConfig: "儲存配置", + loadConfig: "載入配置", + ddlCompare: "DDL 比較", + deployScript: "部署腳本", + deployScriptAll: "全部部署腳本", + deployScriptDesc: "所選物件的 SQL 腳本", + deployScriptAllDesc: "所有已選物件的 SQL 腳本", + executeAll: "全部執行", + executeSuccess: "執行成功", + selectObjectToCompare: "選擇物件以檢視 DDL 比較", + noDdlAvailable: "無可用的 DDL", + noDeployScript: "無部署腳本", + noDeployScriptAll: "所選物件無部署腳本", + sourceDdl: "來源 DDL", + targetDdl: "目標 DDL", + objectNotExistsInSource: "此物件在來源資料庫中不存在", + objectNotExistsInTarget: "此物件在目標資料庫中不存在", + nextStepDeploy: "下一步(檢視部署)", + deployReview: "部署審查", + backToResult: "返回結果", + copyScript: "複製腳本", + deployToServer: "部署到伺服器", + deployConfirmTitle: "最終確認", + deployConfirmMessage: "您即將對目標資料庫部署以下變更", + targetServer: "目標伺服器", + dbVersion: "資料庫版本", + confirmDeploy: "確認部署", + recompare: "重新比較", + maximize: "最大化", + noObjectsSelected: "請選擇要部署的物件", + deploySuccess: "部署成功", + deployFailed: "部署失敗", + deploySuccessMessage: "SQL 腳本已在目標資料庫成功執行", + deployFailedMessage: "執行期間發生錯誤", + executedStatements: "已執行的語句", + serverVersion: "伺服器版本", + info: "資訊", + connType: "連線類型", + connName: "連線名稱", + port: "連接埠", + saveConfigPrompt: "請輸入配置名稱:", + connection: "連線", + database: "資料庫", + schema: "Schema", + operation: "操作", + selectedCount: "已選擇 {selected} 個(共 {total} 個)", + options: "選項", + copy: "複製", + execute: "執行", + exportSql: "匯出 .sql", + targetDatabase: "目標資料庫", + targetSchema: "目標 Schema", + useTransaction: "在事務中執行(失敗自動回滾)", + exportSuccess: "匯出成功", + create: "建立", + delete: "刪除", + modify: "修改", + cancel: "取消", + prevStep: "上一步", + restore: "還原", + affectedRows: "影響列數", + host: "主機", + copied: "已複製到剪貼簿", + close: "關閉", }, schemaDiff: { optionsTitle: "比較選項", @@ -2154,6 +2386,7 @@ export default { jdbcTab: "JDBC 驅動程式", securityTab: "安全", aboutTab: "關於我們", + dataTab: "資料", fontFamily: "字型", selectFont: "選擇字型……", searchFont: "搜尋字型……", @@ -2449,6 +2682,20 @@ export default { mcpNpmBoundary: "DBX 只檢測和提示 MCP 狀態;安裝與升級仍由 npm 完成。", mcpRefresh: "重新檢查", mcpGuide: "MCP 指南", + updateDownloadSource: "更新下載來源", + updateDownloadSourceDescription: "選擇應用程式內更新安裝程式的下載來源。建議使用官方來源;CNB 在中國大陸網路環境下可能更快。", + updateDownloadSourceOfficial: "官方來源(建議)", + updateDownloadSourceCnb: "CNB", + exportSection: "匯出", + exportBatchSize: "匯出批次大小", + exportBatchSizeDescription: "匯出資料時每批次擷取的列數(100-100000)。", + exportRowLimitEnabled: "限制匯出行數", + exportRowLimitEnabledDescription: "開啟後,查詢結果和資料表資料匯出將在下方設定的行數上限處停止。", + exportRowLimit: "資料匯出行數上限", + exportRowLimitDescription: "查詢結果和資料表資料匯出的最大行數。", + exportRowLimitUnlimited: "無限制", + queryExportKeysetOptimizationEnabled: "嘗試 keyset 最佳化", + queryExportKeysetOptimizationEnabledDescription: "僅適用於可安全識別的單表查詢;複雜查詢會自動回退。", }, driverStore: { progressJreExtract: "解壓縮 JRE……", @@ -2557,6 +2804,18 @@ export default { driverStoreDirMigrationFailed: "驅動儲存路徑遷移失敗:{error}", driverStoreDirDialogTitle: "選擇 {target}", driverStoreDirSuccess: "{target} 已更改,正在重啟…", + progressDownloadJdbcPlugin: "正在下載 JDBC 外掛程式", + progressJdbcPluginExtract: "正在安裝 JDBC 外掛程式...", + offlineDownloadHint: "對於離線環境,請在有網路的機器上下載離線驅動程式包,然後在此處匯入。", + offlineDownloadLink: "離線驅動程式下載", + searchDrivers: "搜尋驅動程式名稱、類型、版本...", + searchJdbcDrivers: "搜尋 JDBC 驅動程式名稱或路徑...", + jdbcMavenCoordinatePlaceholder: "Maven 座標,例如 org.postgresql:postgresql:42.7.7", + jdbcMavenInstall: "從 Maven 安裝", + jdbcMavenInstallSuccess: "JDBC Maven 驅動程式已安裝", + jdbcSourceMaven: "Maven", + jdbcSourceManual: "手動", + noMatchingDrivers: "沒有相符的驅動程式。", }, databaseExport: { title: "匯出資料庫", @@ -2580,6 +2839,7 @@ export default { exportSuccess: "資料庫匯出成功", exportError: "匯出失敗: {error}", exportCancelled: "匯出已取消", + runInBackground: "背景執行", }, nacos: { configs: "配置", @@ -2688,5 +2948,114 @@ export default { next: "下一頁", test: "測試", readOnly: "唯讀", + createNamespace: "建立命名空間", + editNamespace: "編輯命名空間", + creatingNamespace: "正在建立...", + updatingNamespace: "正在更新...", + namespaceCreated: "命名空間「{name}」已建立", + namespaceUpdated: "命名空間「{name}」已更新", + namespaceId: "命名空間 ID", + namespaceIdPlaceholder: "留空由 Nacos 自動產生", + namespaceName: "命名空間名稱", + namespaceNamePlaceholder: "輸入命名空間名稱", + namespaceDesc: "描述", + namespaceDescPlaceholder: "預設為命名空間名稱", }, -}; + userAdmin: { + title: "使用者與權限", + unsupported: "支援 MySQL 相容和 PostgreSQL 相容連線。SQL Server、Oracle 等其他權限模型將在後續版本中新增。", + newUser: "新增使用者", + anonymous: "匿名", + roleName: "角色名稱", + allowLogin: "允許登入", + searchUser: "搜尋使用者或主機", + loadingUsers: "正在載入使用者...", + loadingGrants: "正在載入授權...", + emptyUsers: "未找到使用者,或目前帳號無法讀取使用者清單。", + pluginUnknown: "認證外掛程式未知", + grants: "授權", + noGrants: "未找到授權", + privilegeEditor: "權限編輯器", + privilegeHint: "選擇權限、資料庫和資料表,然後在套用前預覽 SQL。* 表示全域或所有資料表。", + database: "資料庫", + schema: "Schema", + table: "資料表", + scope: "授權範圍", + scopeDatabase: "資料庫", + scopeSchema: "Schema", + scopeTable: "資料表", + scopeRole: "角色成員", + memberRole: "成員角色", + privileges: "權限", + grantOption: "允許進一步授權(WITH GRANT OPTION)", + adminOption: "允許成員管理(WITH ADMIN OPTION)", + grant: "授予", + revoke: "撤銷", + username: "使用者名稱", + host: "主機", + changePassword: "變更密碼", + newPassword: "新密碼", + lock: "鎖定", + unlock: "解鎖", + disableLogin: "停用登入", + enableLogin: "啟用登入", + dropUser: "刪除使用者", + previewSql: "預覽 SQL", + sqlPreview: "SQL 預覽", + applySql: "套用 SQL", + applySuccess: "使用者權限已更新", + applyFailed: "執行失敗:{message}", + }, + etcd: { + prefixPlaceholder: "前綴,例如 /app/", + newKey: "新增 Key", + loadingKeys: "正在載入 key...", + empty: "未找到 key", + loadMore: "載入更多", + selectKey: "選擇一個 key 以檢視其值", + loadingValue: "正在載入值...", + notFound: "Key 未找到", + edit: "編輯", + editKey: "編輯 Key", + delete: "刪除", + deleteTitle: "刪除 etcd key", + keyPlaceholder: "/path/to/key", + keyRequired: "Key 不能為空", + saved: "Key 已儲存", + deleted: "Key 已刪除", + base64Readonly: "Base64 值在此版本中為唯讀。", + }, + zookeeper: { + prefixPlaceholder: "路徑前綴,例如 /app/", + newKey: "新增 Znode", + loadingKeys: "正在載入 znode...", + empty: "未找到 znode", + loadMore: "載入更多", + selectKey: "選擇一個 znode 以檢視其值", + loadingValue: "正在載入值...", + notFound: "Znode 未找到", + edit: "編輯", + editKey: "編輯 Znode", + delete: "刪除", + deleteTitle: "刪除 ZooKeeper znode", + keyPlaceholder: "/path/to/znode", + keyRequired: "Znode 路徑不能為空", + saved: "Znode 已儲存", + deleted: "Znode 已刪除", + base64Readonly: "Base64 值在此版本中為唯讀。", + createMode: "建立模式", + createModePersistent: "持久", + createModeEphemeral: "臨時", + createModePersistentSequential: "持久有序", + createModeEphemeralSequential: "臨時有序", + add: "新增", + value: "值", + metadata: "節點資訊", + prettyJson: "格式化", + invalidJson: "無效的 JSON", + summaryRevision: "修訂", + summaryVersion: "版本", + summaryLease: "租約", + summarySize: "大小", + }, +});