From 11a6a59eb4b0cdc6c414b887eb41a8a4ccc8c69a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20M=C3=A1cola?= Date: Fri, 5 Jun 2026 22:15:09 -0300 Subject: [PATCH] feat: add pt-BR localization support and locale option (#797) --- apps/desktop/src/i18n/index.ts | 6 +- apps/desktop/src/i18n/locales/pt-BR.ts | 1919 ++++++++++++++++++++++++ apps/desktop/src/lib/localeOptions.ts | 1 + 3 files changed, 1924 insertions(+), 2 deletions(-) create mode 100644 apps/desktop/src/i18n/locales/pt-BR.ts diff --git a/apps/desktop/src/i18n/index.ts b/apps/desktop/src/i18n/index.ts index dc3b16ac5..00343819a 100644 --- a/apps/desktop/src/i18n/index.ts +++ b/apps/desktop/src/i18n/index.ts @@ -2,20 +2,21 @@ import { createI18n } from "vue-i18n"; import zhCN from "./locales/zh-CN"; import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage"; -export type Locale = "en" | "es" | "it" | "zh-CN" | "zh-TW"; +export type Locale = "en" | "es" | "it" | "pt-BR" | "zh-CN" | "zh-TW"; type LocaleMessages = Record; type I18nGlobal = { locale: { value: Locale }; setLocaleMessage: (locale: Locale, messages: LocaleMessages) => void; }; -const supportedLocales: Locale[] = ["en", "es", "it", "zh-CN", "zh-TW"]; +const supportedLocales: Locale[] = ["en", "es", "it", "pt-BR", "zh-CN", "zh-TW"]; const defaultLocale: Locale = "zh-CN"; const loadedLocales = new Set([defaultLocale]); const localeLoaders: Record, () => Promise<{ default: LocaleMessages }>> = { en: () => import("./locales/en"), es: () => import("./locales/es"), it: () => import("./locales/it"), + "pt-BR": () => import("./locales/pt-BR"), "zh-TW": () => import("./locales/zh-TW"), }; @@ -43,6 +44,7 @@ export function localeFromLanguageTag(value: string | null | undefined): Locale if (normalized === "en" || normalized.startsWith("en-")) return "en"; if (normalized === "es" || normalized.startsWith("es-")) return "es"; if (normalized === "it" || normalized.startsWith("it-")) return "it"; + if (normalized === "pt" || normalized.startsWith("pt-")) return "pt-BR"; return null; } diff --git a/apps/desktop/src/i18n/locales/pt-BR.ts b/apps/desktop/src/i18n/locales/pt-BR.ts new file mode 100644 index 000000000..7749787da --- /dev/null +++ b/apps/desktop/src/i18n/locales/pt-BR.ts @@ -0,0 +1,1919 @@ +export default { + app: { + name: "DBX", + }, + auth: { + setupTitle: "Configurar senha de acesso", + setupDescription: "Defina uma senha para proteger sua instância", + loginDescription: "Ferramenta de gerenciamento de banco de dados", + newPassword: "Digite a nova senha", + confirmPassword: "Confirmar senha", + enterPassword: "Digite a senha de acesso", + passwordMismatch: "As senhas não coincidem", + setPassword: "Definir Senha", + login: "Entrar", + processing: "Processando...", + loginFailed: "Senha incorreta", + connectFailed: "Falha na conexão", + changePassword: "Alterar Senha", + oldPassword: "Senha atual", + oldPasswordWrong: "A senha atual está incorreta", + passwordChanged: "Senha alterada com sucesso", + changePasswordFailed: "Falha ao alterar a senha", + changePasswordDescription: "Digite sua senha atual e escolha uma nova", + }, + toolbar: { + newConnection: "Nova Conexão", + newQuery: "Nova Consulta", + execute: "Executar", + executeShortcut: "Executar seleção/consulta (Cmd+Enter)", + stopQuery: "Parar consulta", + explainPlan: "Explicar plano", + stopExplain: "Parar explicação", + formatSql: "Formatar SQL", + formatSqlFailed: "Falha ao formatar SQL", + saveSql: "Salvar na Biblioteca SQL", + openSql: "Abrir arquivo SQL", + theme: "Tema", + themeLight: "Claro", + themeDark: "Escuro", + themeSystem: "Seguir o sistema", + sqlSaved: "SQL salvo", + sqlOpenFailed: "Falha ao abrir o arquivo: {message}", + sqlSaveFailed: "Falha ao salvar o arquivo: {message}", + driverManager: "Gerenciador de Drivers", + updatableDriverCount: "Quantidade de drivers atualizáveis", + }, + updates: { + title: "Atualizações", + check: "Verificar atualizações", + availableTitle: "Atualização disponível", + availableMessage: "DBX {latest} está disponível. Você está usando {current}.", + upToDate: "O DBX está atualizado ({version}).", + failed: "Falha ao verificar atualizações: {error}", + rateLimited: + "As verificações de atualização do GitHub estão temporariamente limitadas. Você ainda pode abrir a página de lançamento para verificar manualmente.", + openRelease: "Abrir Lançamento", + downloadAndInstall: "Baixar e Instalar", + portableManualUpdate: + "Versões portáteis não podem usar o instalador interno. Baixe o ZIP portátil da página de lançamento e extraia-o sobre a pasta atual do DBX para manter o portable.dbx e os dados.", + downloading: "Baixando {progress}%", + downloadFailed: "Falha ao baixar a atualização: {error}", + restart: "Sair e Reiniciar", + restartFailed: "Falha ao reiniciar o aplicativo: {error}", + exitAndUpdate: "Sair e Atualizar", + reopenHint: "O aplicativo será reiniciado para concluir a atualização", + dockerUsersRun: "Usuários do Docker devem executar", + toUpdate: "para atualizar", + }, + sidebar: { + connections: "CONEXÕES", + noConnections: "Nenhuma conexão ainda", + import: "Importar Conexões", + importDbx: "Importar Configuração DBX", + importNavicat: "Importar Navicat NCX", + importDbeaver: "Importar DBeaver", + export: "Exportar Conexões", + collapse: "Recolher barra lateral", + expand: "Expandir barra lateral", + showMore: "Mostrar mais {count}...", + filterByType: "Filtrar por tipo", + searchScopeConnection: "Conexão", + searchScopeDatabase: "Banco de dados", + searchScopeSchema: "Schema", + searchScopeTable: "Tabela", + searchScopeView: "Visão", + clearFilter: "Limpar filtro", + locateActiveTab: "Localizar na barra lateral", + }, + savedSql: { + saveToLibrary: "Salvar na Biblioteca SQL", + save: "Salvar", + saved: "SQL salvo", + saveFailed: "Falha ao salvar SQL: {message}", + fileName: "Nome do arquivo", + folder: "Pasta", + rootFolder: "Biblioteca SQL", + newFolder: "Nova Pasta SQL", + newFolderDefault: "Nova Pasta", + renameFolder: "Renomear Pasta", + deleteFolder: "Excluir Pasta", + deleteFolderConfirm: "Excluir “{name}” e os arquivos SQL dentro dela?", + open: "Abrir SQL", + renameFile: "Renomear SQL", + deleteFile: "Excluir SQL", + deleteFileConfirm: "Excluir “{name}”?", + }, + connection: { + title: "Nova Conexão", + name: "Nome", + namePlaceholder: "Nome da conexão, gerado automaticamente se vazio", + type: "Tipo", + host: "Host", + filePath: "Caminho do Arquivo", + createDuckDbFile: "Criar arquivo DuckDB", + memoryDatabasePathHint: "Use :memory: para criar um banco de dados SQLite ou DuckDB na memória.", + sqliteExtensions: "Extensões SQLite", + sqliteExtensionsPlaceholder: "/caminho/para/regexp.dylib\n/caminho/para/text.dylib|sqlite3_text_init", + sqliteExtensionsHint: + "Um .dylib/.so/.dll por linha. Use “caminho|ponto de entrada” quando um ponto de entrada for necessário. Carregado ao conectar, depois load_extension é desabilitado.", + sqliteExtensionBrowse: "Selecionar extensão SQLite", + user: "Usuário", + password: "Senha", + database: "Banco de dados", + databasePlaceholder: "Opcional", + databasePlaceholderWithDefault: "Opcional, padrão é {database}", + defaultDatabase: "BD padrão", + authDatabase: "BD de autenticação", + authDatabasePlaceholder: "Opcional, geralmente admin", + authMechanism: "Mecanismo de Autenticação", + authMechanismDefault: "Padrão", + serviceName: "Service/SID", + serviceNameOnly: "Service Name", + version: "Versão", + driverInstallHintPrefix: "Instale o driver necessário em ", + driverInstallHintSuffix: " na barra de ferramentas superior antes de conectar.", + driverName: "Nome do Driver", + driverNamePlaceholder: "Nome do fornecedor ou ambiente", + urlParams: "Parâmetros da URL", + sslEnable: "Habilitar conexão criptografada", + caCertPath: "Certificado CA", + caCertPathPlaceholder: "Opcional, ex.: ~/.yandex/RootCA.crt", + caCertPathBrowse: "Procurar certificado", + redisTlsInsecure: "Ignorar verificação de certificado", + redisTlsInsecureHint: "Equivalente a redis-cli --tls --insecure, para certificados autoassinados ou CAs privadas.", + mysqlTlsMode: "Modo TLS", + mysqlTlsModePreferred: "Preferencial", + mysqlTlsModeDisabled: "Desabilitado", + mysqlTlsModeRequired: "Obrigatório", + mysqlTlsModeVerifyCa: "Verificar CA", + mysqlTlsModeVerifyIdentity: "Verificar Identidade", + mysqlCaCertHint: "Necessário para Verificar CA e Verificar Identidade quando o certificado do servidor usa uma CA privada.", + mysqlClientCert: "Autenticação do Cliente", + mysqlClientCertPlaceholder: "/caminho/para/client.crt", + mysqlClientKeyPlaceholder: "/caminho/para/client.key", + mysqlClientCertHint: "O certificado e a chave privada do cliente devem ser fornecidos juntos quando o MySQL exige mTLS.", + mysqlClientCertBrowse: "Escolher certificado do cliente", + mysqlClientKeyBrowse: "Escolher chave privada do cliente", + postgresSslMode: "Modo TLS", + postgresSslModeDisable: "Desabilitar", + postgresSslModePrefer: "Preferencial", + postgresSslModeRequire: "Obrigatório", + postgresSslModeVerifyCa: "Verificar CA", + postgresSslModeVerifyFull: "Verificar Completo", + postgresServerCert: "CA do Servidor", + postgresRootCertPlaceholder: "/caminho/para/ca.crt", + postgresRootCertHint: + "Use isto para verify-ca ou verify-full quando o certificado do servidor é assinado por uma CA privada.", + postgresRootCertBrowse: "Escolher certificado CA", + postgresClientCert: "Autenticação do Cliente", + postgresClientCertPlaceholder: "/caminho/para/client.crt", + postgresClientKeyPlaceholder: "/caminho/para/client.key", + postgresClientCertHint: + "O certificado e a chave privada do cliente devem ser fornecidos juntos quando o PostgreSQL exige mTLS.", + postgresClientCertBrowse: "Escolher certificado do cliente", + postgresClientKeyBrowse: "Escolher chave privada do cliente", + connectionUrlOptional: "URL (opcional)", + connectionUrlPlaceholder: "postgresql://user:pass{'@'}host:5432/db?sslmode=require", + parseConnectionUrl: "Analisar URL de conexão", + parseConnectionUrlApplied: "URL de conexão aplicada", + parseConnectionUrlFailed: "Falha ao analisar a URL de conexão: {message}", + mode: "Modo de Conexão", + modeForm: "Formulário", + redisStandaloneMode: "Standalone", + redisSentinelMode: "Sentinel", + redisClusterMode: "Cluster", + oceanbaseMySQLMode: "Modo MySQL", + oceanbaseOracleMode: "Modo Oracle", + redisFirstSentinel: "Primeiro Sentinel", + redisFirstClusterNode: "Primeiro Nó Semente", + redisSentinelNodes: "Nós Sentinel", + redisClusterNodes: "Nós Semente do Cluster", + redisSentinelMaster: "Nome do Master", + redisSentinelUser: "Usuário do Sentinel", + redisSentinelPassword: "Senha do Sentinel", + redisSentinelTls: "TLS do Sentinel", + redisSentinelTlsHint: "Usar TLS ao conectar aos nós Sentinel", + searchDatabasePlaceholder: "Pesquisar tipos de banco de dados", + iconView: "Visualização em ícones", + listView: "Visualização em lista", + selectedDatabase: "Selecionado", + noDatabaseMatches: "Nenhum banco de dados correspondente", + next: "Próximo", + back: "Anterior", + basicTab: "Conexão", + tlsTab: "TLS/SSL", + test: "Testar", + testing: "Testando...", + copyTestResult: "Copiar resultado do teste", + saveAndConnect: "Salvar e Conectar", + save: "Salvar", + editTitle: "Editar Conexão", + testSuccess: "Conexão bem-sucedida", + connecting: "Conectando a {name}...", + connectSuccess: "Conectado a {name}", + connectFailed: "Falha na conexão: {message}", + driverNotInstalled: "O driver {driver} não está instalado. Instale-o pelo Gerenciador de Drivers.", + jreNotInstalled: "O runtime JRE {jre} não está instalado. Instale-o pelo Gerenciador de Drivers.", + systemJavaNotFound: + "O runtime Java do sistema não foi encontrado no PATH. Instale o Java ou escolha um executável Java personalizado.", + customJavaPathEmpty: "O caminho do runtime Java personalizado está vazio. Escolha um executável Java.", + jdbcPluginNotInstalled: "O plugin JDBC não está instalado. Instale o plugin JDBC opcional para usar esta conexão.", + lastError: "Erro de conexão", + clearError: "Limpar erro de conexão", + saveFailed: "Falha ao salvar a conexão: {message}", + deleted: "Conexão excluída", + copied: "Copiado", + disconnected: "Desconectado", + databaseConnectionClosed: "Conexão de banco de dados fechada: {name}", + duplicated: "Conexão duplicada", + groupDeleted: "Grupo excluído", + loadFailed: "Falha ao carregar as conexões salvas: {message}", + sshTunnel: "Túnel SSH", + advancedTab: "Avançado", + sshEnable: "Conectar via túnel SSH", + sshHost: "Host SSH", + sshUser: "Usuário SSH", + sshPassword: "Senha SSH", + sshPasswordPlaceholder: "Deixe vazio para usar a chave", + sshKeyPath: "Caminho da Chave", + sshKeyPassphrase: "Frase-senha da Chave", + sshKeyPassphrasePlaceholder: "Deixe vazio se a chave não estiver criptografada", + sshKeyPathBrowse: "Procurar", + sshExposeLan: "Expor túnel à LAN", + sshConnectTimeout: "Timeout SSH (segundos)", + sshHops: "Saltos SSH", + sshHopAdd: "Adicionar salto", + sshHopDuplicate: "Duplicar", + sshHopDelete: "Excluir", + sshHopMoveUp: "Mover para cima", + sshHopMoveDown: "Mover para baixo", + sshHopName: "Nome do Salto", + sshHopNamePlaceholder: "Bastion, host de salto, gateway de produção", + sshHopDefaultName: "Salto {index}", + sshHopInvalidHost: "{hop}: o host SSH é obrigatório", + sshHopInvalidUser: "{hop}: o usuário SSH é obrigatório", + sshHopInvalidPort: "{hop}: a porta SSH deve estar entre 1 e 65535", + sshHopInvalidAuth: "{hop}: senha ou caminho da chave é obrigatório", + sshHopInvalidTimeout: "{hop}: o timeout SSH deve estar entre 1 e 300 segundos", + connectTimeout: "Timeout de Conexão (segundos)", + queryTimeout: "Timeout de Consulta (segundos)", + proxy: "Proxy", + proxyEnable: "Conectar ao banco de dados via proxy", + proxyType: "Tipo de Proxy", + proxyHost: "Host do Proxy", + proxyUsername: "Usuário do Proxy", + proxyUsernamePlaceholder: "Opcional", + proxyPassword: "Senha do Proxy", + proxyPasswordPlaceholder: "Opcional", + jdbcUrl: "URL JDBC", + jdbcUrlPlaceholder: "jdbc:postgresql://localhost:5432/database", + jdbcDriverClass: "Classe do Driver (opcional)", + jdbcDriverClassPlaceholder: "A maioria dos drivers se registra automaticamente; use com.vendor.jdbc.Driver se necessário", + jdbcDriverPaths: "JARs do Driver", + jdbcDriverSelectPlaceholder: "Escolher driver importado", + jdbcDriverPathsPlaceholder: "/caminho/para/driver.jar\n/caminho/para/outro-driver.jar", + jdbcDriverBrowse: "Escolher JAR do driver JDBC", + jdbcDocs: "Ver documentação JDBC", + jdbcPluginHint: "Instale primeiro o plugin JDBC do DBX e depois importe o JAR do driver JDBC do fornecedor do banco de dados.", + dmCompatHint: "Requer o driver ODBC DM8 instalado no seu sistema.", + dmDownload: "Baixar da Dameng", + mongoLegacyHint: + "MongoDB abaixo de 4.2 requer o driver MongoDB (Legacy). Se a autenticação falhar e o usuário foi criado em admin, defina o BD de autenticação como admin.", + compatible: "Compatível", + mainstream: "Popular", + color: "Cor", + colorNone: "Sem cor", + colorGreen: "Verde", + colorYellow: "Amarelo", + colorOrange: "Laranja", + colorRed: "Vermelho", + colorBlue: "Azul", + colorPurple: "Roxo", + }, + editor: { + pressToExecute: "Pressione {mod}+Enter para executar", + pressToSaveSql: "Pressione {mod}+S para salvar o SQL", + queryTimeoutError: "A consulta expirou ({seconds}s). Verifique se a conexão com o banco de dados está saudável.", + connectionMayBeLost: "A conexão pode ter sido perdida. Atualize os dados e tente novamente.", + showResultsPane: "Mostrar resultados", + hideResultsPane: "Ocultar resultados", + noDatabase: "Nenhum banco de dados selecionado", + selectConnection: "Selecionar conexão", + searchConnection: "Pesquisar conexões...", + selectDatabase: "Selecionar banco de dados", + searchDatabase: "Pesquisar bancos de dados...", + selectSchema: "Selecionar schema", + setDefaultDatabase: "Definir Padrão", + defaultDatabase: "Padrão", + completion: { + nullValue: "Valor NULL", + isNull: "Verificar se é NULL", + isNotNull: "Verificar se não é NULL", + stringLiteral: "Literal de string", + numericLiteral: "Literal numérico", + booleanValue: "Valor booleano", + starExpansionColumns: "{count} colunas", + functionDescriptions: { + COUNT: "Retorna o número de linhas", + SUM: "Retorna a soma de uma coluna numérica", + AVG: "Retorna a média de uma coluna numérica", + MIN: "Retorna o valor mínimo", + MAX: "Retorna o valor máximo", + GROUP_CONCAT: "Concatena valores de grupo em uma string", + STRING_AGG: "Concatena strings de grupo", + CONCAT: "Concatena múltiplas strings", + CONCAT_WS: "Concatena strings com separador", + SUBSTRING: "Extrai uma substring", + REPLACE: "Substitui conteúdo em uma string", + TRIM: "Remove espaços no início e no fim", + UPPER: "Converte para maiúsculas", + LOWER: "Converte para minúsculas", + LENGTH: "Retorna o comprimento da string", + REGEXP_REPLACE: "Substitui usando uma expressão regular", + DATE_FORMAT: "Formata uma data com o formato informado", + DATEDIFF: "Calcula a diferença entre duas datas", + DATE_ADD: "Adiciona um intervalo a uma data", + DATE_SUB: "Subtrai um intervalo de uma data", + EXTRACT: "Extrai uma parte da data", + NOW: "Retorna a data e hora atuais", + ROUND: "Arredonda para o número de casas decimais especificado", + FLOOR: "Arredonda para baixo", + CEIL: "Arredonda para cima", + ABS: "Retorna o valor absoluto", + MOD: "Retorna o resto da divisão", + COALESCE: "Retorna o primeiro argumento não NULL", + IFNULL: "Retorna um valor de substituição se for NULL", + NULLIF: "Retorna NULL se os argumentos forem iguais", + CAST: "Converte uma expressão para um tipo de destino", + JSON_EXTRACT: "Extrai um valor de um JSON", + JSON_VALUE: "Extrai um valor escalar de um JSON", + JSON_OBJECT: "Cria um objeto JSON", + JSON_ARRAY: "Cria um array JSON", + }, + }, + contextMenu: { + executeSelection: "Executar seleção", + executeCurrent: "Executar SQL", + copySelection: "Copiar seleção", + selectAll: "Selecionar tudo", + }, + search: { + find: "Localizar", + replace: "Substituir", + replaceAll: "Substituir Tudo", + caseSensitive: "Diferenciar maiúsculas/minúsculas", + regex: "Expressão regular", + collapseReplace: "Recolher substituição", + expandReplace: "Expandir substituição", + prevMatch: "Anterior (Shift+Enter)", + nextMatch: "Próximo (Enter)", + close: "Fechar (Esc)", + noResults: "Nenhum resultado", + }, + }, + tabs: { + sql: "SQL", + table: "Tabela", + tableData: "Dados da Tabela", + redis: "Redis", + mongo: "Mongo", + objects: "Objetos", + tooltipTitle: "Título:", + tooltipConnection: "Conexão:", + tooltipDatabase: "Banco de dados:", + tooltipTable: "Tabela:", + tooltipCollection: "Coleção:", + tooltipSchema: "Schema:", + resultN: "Resultado {n}", + scrollLeft: "Rolar abas para a esquerda", + scrollRight: "Rolar abas para a direita", + openTabs: "Abas abertas", + openDataTabs: "Tabelas abertas", + }, + chart: { + title: "Gráfico", + type: "Tipo", + line: "Linha", + bar: "Barra", + pie: "Pizza", + noNumericData: "Nenhum dado numérico disponível para gerar o gráfico", + }, + grid: { + rows: "{count} linhas", + totalRows: "Total de {count} linhas", + totalRowCount: "({count} no total)", + rowsAffected: "{count} linhas afetadas", + querySuccess: "Consulta executada com sucesso", + noRows: "Sem dados", + noRowsDescription: "Este conjunto de resultados não possui registros.", + noSearchResults: "Nenhuma correspondência", + noSearchResultsDescription: "Tente uma palavra-chave diferente.", + noFilteredRows: "Nenhuma linha corresponde ao filtro", + noFilteredRowsDescription: "Ajuste o texto de pesquisa ou o filtro de status das linhas.", + copy: "Copiar", + copyDdl: "Copiar DDL", + copyCell: "Copiar Célula", + copyRow: "Copiar Linha (JSON)", + copyColumnJson: "Copiar Coluna (JSON)", + copyRowInsert: "Copiar como INSERT", + copyRowInsertWithoutPrimaryKeys: "Copiar como INSERT sem Chaves Primárias", + copyRowUpdate: "Copiar como UPDATE", + copyAll: "Copiar Tudo (TSV)", + selection: "Seleção", + copySelectionTsv: "Copiar Seleção (TSV)", + copySelectionCsv: "Copiar Seleção (CSV)", + copySelectionJson: "Copiar Seleção (JSON)", + copySelectionSql: "Copiar Seleção como Lista IN do SQL", + clearSelection: "Limpar Seleção", + export: "Exportar", + exportCsv: "Exportar CSV", + exportXlsx: "Exportar XLSX", + exportJson: "Exportar JSON", + exportMarkdown: "Exportar Markdown", + exportSql: "Exportar SQL INSERT", + exportSelectedRowsCsv: "Exportar Linhas Selecionadas como CSV", + exportSelectedRowsXlsx: "Exportar Linhas Selecionadas como XLSX", + exportSelectedRowsJson: "Exportar Linhas Selecionadas como JSON", + exportSelectedRowsMarkdown: "Exportar Linhas Selecionadas como Markdown", + exportSelectedRowsSql: "Exportar Linhas Selecionadas como SQL INSERT", + exported: "Exportado", + exportFailed: "Falha na exportação: {message}", + copied: "Copiado", + copyFailed: "Falha ao copiar: {message}", + domRenderMode: "DOM", + canvasRenderMode: "Canvas", + renderModeHint: "Alterne entre a renderização Canvas e a grade DOM alternativa.", + filter: "Filtrar", + filterBuilder: "Filtros", + filterBuilderTitle: "Filtros", + filterBuilderHint: "Crie condições com cliques e combine-as com a entrada WHERE.", + filterBuilderSummary: "{count} regras", + filterBuilderAddRule: "Adicionar regra", + filterBuilderColumn: "Coluna", + filterBuilderValue: "Valor", + filterBuilderNoValue: "Nenhum valor necessário", + filterBuilderEmpty: "Adicione uma regra para começar a filtrar linhas.", + resetFilterBuilder: "Redefinir regras", + filterBuilderEquals: "Igual a", + filterBuilderNotEquals: "Diferente de", + filterBuilderContains: "Contém", + filterBuilderNotContains: "Não contém", + filterBuilderGreaterThan: "Maior que", + filterBuilderLessThan: "Menor que", + filterBuilderIsNull: "É NULL", + filterBuilderIsNotNull: "Não é NULL", + columnActions: "Ações da coluna", + localFilter: "Filtro local de coluna", + localFilterFor: "Filtro Local Para '{column}'", + columnFormatter: "Formatador de coluna", + columnFormatterFor: "Formatador para '{column}'", + columnFormatterHint: "Formata apenas a exibição; os valores brutos permanecem inalterados.", + formatterType: "Tipo", + formatterDatetime: "Timestamp Unix", + formatterJsonPath: "Caminho JSON", + formatterMask: "Mascarar texto", + formatterCustomTemplate: "Template personalizado", + formatterTimestampUnit: "Unidade do timestamp", + formatterUnitAuto: "Automático", + formatterUnitSeconds: "Segundos", + formatterUnitMilliseconds: "Milissegundos", + formatterJsonPathInput: "Caminho JSON", + formatterMaskPrefix: "Prefixo visível", + formatterMaskSuffix: "Sufixo visível", + formatterSavedCustom: "Templates salvos", + formatterNewCustom: "Novo template", + formatterCustomName: "Nome do template", + formatterCustomNamePlaceholder: "Exemplo: Rótulo do usuário", + formatterCustomTemplateInput: "Template", + formatterCustomTemplateHint: + "Variáveis disponíveis: ${value}, ${upper}, ${lower}, ${length}. Dê um nome para salvá-lo na lista.", + formatterPreview: "Visualização", + saveFormatter: "Salvar", + clearFormatter: "Limpar", + searchValues: "Pesquisar valores...", + filterTypedValue: "Usar '{value}'", + value: "Valor", + count: "Contagem", + applyFilter: "Aplicar Filtro", + clearLocalFilters: "Limpar filtros locais de coluna", + columnVisibility: "Colunas", + columnVisibilityHint: "Pelo menos uma coluna permanece visível.", + searchColumns: "Pesquisar colunas...", + invertColumnVisibility: "Inverter", + showAllColumns: "Mostrar todas", + viewOptions: "Opções de visualização", + hideNullColumns: "Ocultar NULL", + hideNullColumnsHint: "Alterna colunas cujos valores são todos NULL no resultado atual.", + moreValues: "Mais {count} valores, continue digitando para refinar os resultados", + filterByValue: "Filtrar Por Este Valor", + filterExcludeValue: "Excluir Este Valor", + filterLike: "Contém o Valor", + filterNotLike: "Não Contém", + filterLessThan: "Menor Que o Valor", + filterGreaterThan: "Maior Que o Valor", + filterIsNull: "Mostrar Valores NULL", + filterIsNotNull: "Mostrar Valores Não NULL", + clearFilter: "Limpar Filtro", + sort: "Ordenar", + sortAscending: "Ordenar de Forma Crescente", + sortDescending: "Ordenar de Forma Decrescente", + clearSort: "Limpar Ordenação", + pasted: "Colado!", + search: "Pesquisar...", + searchOrWhere: "Pesquise, ou insira uma cláusula WHERE...", + applyWhere: "Aplicar WHERE", + filterRows: "Filtrar linhas", + filterAllRows: "Todas as linhas", + filterChangedRows: "Alteradas", + page: "Página {page}", + rowsPerPage: "Linhas por página", + customRowsPerPage: "Linhas personalizadas", + applyPageSize: "Aplicar", + save: "Salvar", + discard: "Descartar", + dismiss: "Dispensar", + addRow: "Adicionar Linha", + cloneRow: "Clonar como Nova Linha", + deleteRow: "Excluir Linha", + deleteRows: "Excluir {count} Linhas", + cloneRows: "Clonar {count} como Novas Linhas", + restoreRows: "Restaurar {count} Linhas", + copyRows: "Copiar {count} Linhas (JSON)", + copyColumnsJson: "Copiar {count} Colunas (JSON)", + copyRowsInsert: "Copiar {count} Linhas como INSERT", + copyRowsInsertWithoutPrimaryKeys: "Copiar {count} Linhas como INSERT sem Chaves Primárias", + copyRowsUpdate: "Copiar {count} Linhas como UPDATE", + selectedRows: "{count} linhas selecionadas", + restoreRow: "Restaurar Linha", + statusClean: "Sem alterações", + statusNew: "Itens Novos", + statusEdited: "Itens Atualizados", + statusDeleted: "Itens Excluídos", + pendingChanges: "{count} pendentes", + selectedCells: "{count} selecionadas", + bulkEditSelection: "Edição em Massa da Seleção", + bulkEditTitle: "Edição em Massa da Seleção", + bulkEditDescription: "Definir {count} célula(s) selecionada(s) para este valor.", + bulkEditValuePlaceholder: "Valor, ou NULL", + applyBulkEdit: "Aplicar", + cellDetails: "Detalhes da Célula", + cellDetailLayoutBottom: "Mover para Baixo", + cellDetailLayoutRight: "Mover para a Direita", + openCellDetailsDialog: "Abrir Detalhes da Célula", + rowDetails: "Detalhes da Linha", + rowDetailsFor: "Detalhes da Linha {row}", + openRowDetailsDialog: "Abrir Detalhes da Linha", + openColumnDetailsDialog: "Abrir Detalhes da Coluna", + columnDetailsFor: "Detalhes da Coluna {column}", + columnsCount: "{count} colunas", + rowCount: "Linhas", + rowsCount: "{count} linhas", + fieldIndex: "Nº", + cellValue: "Valor", + valueEditor: "Editor de Valor", + imagePreview: "Visualização de Imagem", + imageLoadFailed: "Falha ao carregar a imagem", + geometryPreview: "Visualização de Geometria", + zoomIn: "Aproximar", + zoomOut: "Afastar", + fitImage: "Ajustar à Janela", + openImage: "Abrir Imagem", + columnName: "Coluna", + columnType: "Tipo", + columnComment: "Comentário", + rowNumber: "Linha", + valueLength: "Comprimento", + nullValue: "NULL", + noComment: "Sem comentário", + formattedJson: "JSON Formatado", + formattedValue: "Valor Formatado", + rawValue: "Valor Bruto", + largeValuePreviewHint: "Visualizando os primeiros {count} caracteres. A cópia ainda usa o valor completo.", + copyValue: "Copiar Valor", + downloadBinaryValue: "Baixar Valor", + downloadSaved: "Salvo em {path}", + downloadStarted: "Download iniciado: {fileName}", + binaryDownload: { + binary: "Binário bruto", + utf8: "Texto decodificado (UTF-8)", + gbk: "Texto decodificado (GBK)", + }, + copyRowTsv: "Copiar Linha (TSV)", + copyColumnValues: "Copiar Coluna (JSON)", + copyColumnTsv: "Copiar Coluna (TSV)", + editValue: "Editar Valor", + formatJson: "Formatar JSON", + setNull: "Definir NULL", + restoreOriginalValue: "Restaurar Original", + copyColumnName: "Copiar Nome da Coluna", + copyAlterColumnSql: "Copiar como SQL ALTER", + alterSqlCopied: "SQL ALTER copiado para a área de transferência", + alterSqlCopiedWithWarnings: "SQL ALTER copiado para a área de transferência ({count} aviso(s))", + noAlterSqlAvailable: "Nenhum SQL ALTER disponível para esta coluna", + copyAlterSqlFailed: "Falha ao copiar: {message}", + copySqlCondition: "Copiar Condição SQL", + transpose: "Transpor Linha", + rowsPerPageShort: " linhas", + columnDetails: "Detalhes da Coluna", + tableInfo: "Informações da Tabela", + tableInfoColumns: "Colunas", + tableInfoIndexes: "Índices", + tableInfoForeignKeys: "Chaves Estrangeiras", + tableInfoTriggers: "Gatilhos", + tableInfoNullable: "Permite Nulo", + tableInfoEmpty: "Sem metadados", + tableInfoSearch: "Pesquisar...", + tableInfoNoResults: "Nenhum resultado", + queryError: "Erro na Consulta", + dataUnavailable: "Os dados da tabela precisam ser recarregados.", + refresh: "Atualizar", + commit: "Confirmar", + rollback: "Reverter", + transactionSaveHint: "Confirmar {count} alteração(ões) pendente(s) em uma transação.", + nonTransactionalSaveHint: + "Salvar {count} alteração(ões) pendente(s) uma a uma. Se uma falhar, as alterações bem-sucedidas anteriores não serão revertidas.", + keylessEditWarning: "Sem chave primária", + keylessEditWarningHint: + "Esta tabela não possui chave primária. Atualizações e exclusões usam todos os valores originais da linha na cláusula WHERE; linhas exatamente duplicadas podem ser afetadas juntas.", + queryEditReady: "Editável", + queryEditReadyHint: + "Este resultado de tabela única vem de “{table}”. Você pode editar, excluir ou adicionar linhas e, em seguida, usar a ação de alterações pendentes para salvar.", + queryEditReadOnly: "Resultado somente leitura", + queryEditUnsupported: { + "not-select": "Apenas resultados de consultas SELECT podem ser editados diretamente.", + cte: "Consultas com WITH/CTE ainda não são editáveis. Use um SELECT simples de tabela única.", + "set-operation": "Resultados de UNION, INTERSECT ou EXCEPT não podem ser mapeados com segurança de volta às linhas de origem.", + aggregation: "Resultados de DISTINCT, GROUP BY, HAVING e agregações não podem ser editados diretamente.", + "external-source": + "Arquivos externos e resultados de funções de tabela não podem ser gravados de volta diretamente. Importe-os para uma tabela do banco de dados antes de editar.", + "complex-source": "JOINs, múltiplas tabelas e subconsultas não podem ser mapeados com segurança para uma única linha de origem.", + "computed-columns": + "Expressões computadas ou resultados de funções não podem ser gravados de volta. Selecione os nomes brutos das colunas em vez disso.", + "no-table": "Nenhuma tabela de origem editável foi detectada.", + "no-primary-key": "A tabela de destino não possui chave primária, portanto as linhas não podem ser atualizadas ou excluídas com segurança.", + "primary-key-not-returned": + "O resultado está sem a coluna bruta da chave primária. Inclua-a pelo seu nome de coluna original.", + "aliased-columns": "As colunas do resultado usam aliases ou expressões. Selecione colunas editáveis pelos seus nomes originais.", + "metadata-unavailable": "O DBX não conseguiu carregar os metadados da tabela, portanto a edição do resultado está desabilitada.", + }, + sortUnsupported: "Este SQL não suporta a ordenação do resultado completo. Tente novamente com uma única consulta SELECT.", + truncatedHint: "Resultados truncados em {count} linhas. Use a paginação no rodapé ou ajuste as linhas por página.", + }, + exportProgress: { + title: "Exportando Dados da Tabela", + fetching: "Buscando dados do banco de dados...", + writing: "Gravando no arquivo...", + done: "Exportação concluída!", + error: "Falha na exportação", + cancelled: "Exportação cancelada.", + rowsCount: "{exported} / {total} linhas", + rowsExported: "{count} linhas exportadas", + rowsShort: "linhas", + cancel: "Cancelar", + close: "Fechar", + tooltip: "Progresso da Exportação", + popoverTitle: "Exportações", + noTasks: "Nenhuma exportação", + clearFinished: "Limpar concluídas", + showMore: "Mostrar mais {count}", + showLess: "Mostrar menos", + delete: "Remover", + }, + welcome: { + title: "Área de Trabalho do Banco de Dados", + subtitle: "Escolha uma conexão à esquerda para navegar pelo schema ou abra uma aba de consulta diretamente.", + connections: "Conexões", + connected: "Conectado", + databaseTypes: "Tipos de Banco de Dados", + quickConnections: "Início Rápido", + quickConnectionsHint: "Clique em uma conexão para abrir uma aba de consulta.", + shortcuts: "Atalhos", + shortcutsHint: "Inicie a próxima ação a partir daqui.", + tip: "Você também pode expandir as conexões à esquerda e clicar com o botão direito em bancos de dados ou tabelas para mais ações.", + tipSidebar: "Clique em uma tabela à esquerda para visualizar os dados", + tipExecute: "para executar a consulta", + fileOpened: "{name} aberto", + mcpTitle: "Integração com Agente de IA", + mcpDescription: + "Além do assistente de IA integrado, você também pode usar Claude Code, Cursor e outros agentes de codificação para consultar seus bancos de dados via MCP.", + mcpLearnMore: "Saiba mais", + }, + common: { + language: "Idioma", + loading: "Carregando...", + stopping: "Parando...", + close: "Fechar", + }, + explain: { + title: "Plano de Execução", + tree: "Árvore", + summary: "Resumo", + running: "Lendo plano de execução...", + empty: "Nenhum plano de execução", + nodeCount: "{count} nós", + node: "Nó", + relation: "Tabela", + index: "Índice", + cost: "Custo", + rows: "Linhas", + details: "Detalhes", + unsupported: "O plano de execução ainda não é suportado para este banco de dados", + emptySql: "Nenhum SQL para explicar", + unsafe: "Esta primeira versão explica apenas instruções SELECT / WITH / TABLE / VALUES", + }, + lineage: { + title: "Linhagem de Campo", + open: "Visualizar Linhagem de Campo", + loading: "Lendo metadados {done}/{total}", + empty: "Nenhuma linhagem relacionada encontrada", + noFiltered: "Nenhum resultado corresponde aos filtros atuais", + targetField: "Campo Atual", + searchPlaceholder: "Pesquisar tabelas, campos, visões ou trechos de SQL...", + showing: "Mostrando {shown}/{total} resultados", + all: "Todos", + certain: "Certo", + likely: "Provável", + possible: "Possível", + queryHistory: "Histórico de Consultas", + openTable: "Abrir tabela", + copy: "Copiar nome", + copied: "Copiado", + kind: { + foreignKey: "Chave Estrangeira", + viewReference: "Visão", + historyReference: "Histórico de SQL", + sameName: "Mesmo Nome", + }, + description: { + foreignKeyIncoming: "{target} aponta para o campo atual através de uma chave estrangeira. Esta é uma dependência verificada.", + foreignKeyOutgoing: "O campo atual referencia {target} através de uma chave estrangeira. Esta é uma dependência verificada.", + viewLikely: "A definição da visão menciona tanto a tabela quanto o campo de destino, geralmente indicando dependência de consulta.", + viewPossible: + "A definição da visão menciona um campo de mesmo nome, mas não a tabela de destino, então precisa de confirmação.", + historyLikely: + "Uma instrução SQL histórica menciona tanto a tabela quanto o campo de destino. Use-a como contexto de análise de impacto.", + historyPossible: "Uma instrução SQL histórica menciona um campo de mesmo nome. Pode estar relacionado, mas precisa de contexto.", + sameName: + "Outra tabela possui um campo de mesmo nome. Isso pode compartilhar significado de negócio, mas não é uma dependência verificada do banco de dados.", + }, + cancel: "Cancelar", + refresh: "Analisar Novamente", + }, + connectionGroup: { + createGroup: "Novo Grupo", + groupNamePlaceholder: "Nome do grupo", + renameGroup: "Renomear Grupo", + deleteGroup: "Excluir Grupo", + moveToGroup: "Mover para Grupo", + moveToNewGroup: "Mover para Novo Grupo", + ungrouped: "Sem grupo", + newGroup: "Novo Grupo...", + newGroupDefault: "Novo Grupo", + deleteGroupConfirmTitle: "Excluir Grupo", + deleteGroupConfirmMessage: 'Excluir o grupo "{name}"? As conexões dentro dele serão movidas para o nível superior.', + }, + databaseSearch: { + title: "Pesquisar no Banco de Dados", + open: "Pesquisar no Banco de Dados", + keyword: "Palavra-chave", + keywordPlaceholder: "Digite um ID de usuário, e-mail, número de pedido...", + limitPerTable: "Por tabela", + search: "Pesquisar", + searching: "Pesquisando", + stop: "Parar", + hint: "Verifica tabelas comuns no banco de dados ou schema atual. Colunas binárias são ignoradas e cada tabela é limitada para evitar carregar dados em excesso de uma só vez.", + loadingTables: "Lendo lista de tabelas...", + progress: "{done}/{total} tabelas verificadas", + resultCount: "{count} correspondências", + limitedTables: "Schema grande detectado; apenas as primeiras {count} tabelas são verificadas", + results: "Resultados", + openResult: "Abrir", + waiting: "Aguardando correspondências...", + noResults: "Nenhuma correspondência ainda", + errors: "Algumas tabelas falharam", + }, + configExport: { + passphraseTitle: "Criptografar e Exportar", + passphraseImportTitle: "Descriptografar e Importar", + passphraseExportHint: + "Para incluir as senhas de conexão na exportação, defina uma frase secreta para a criptografia. Você precisará da mesma frase secreta para importar.", + passphraseImportHint: "Este arquivo está criptografado. Digite a frase secreta para descriptografar e importar.", + passphrase: "Frase secreta", + passphraseConfirm: "Confirmar Frase Secreta", + passphrasePlaceholder: "Digite a frase secreta", + passphraseConfirmPlaceholder: "Digite novamente a frase secreta", + passphraseRequired: "A frase secreta é obrigatória", + passphraseMismatch: "As frases secretas não coincidem", + passphraseTooShort: "A frase secreta deve ter pelo menos 4 caracteres", + exportEncrypted: "Exportar", + decryptImport: "Descriptografar e Importar", + wrongPassphrase: "Frase secreta incorreta ou arquivo corrompido", + exportSuccess: "Conexões exportadas com sucesso", + importSuccess: "{count} conexão(ões) importada(s)", + importNavicatSuccess: + "{count} conexão(ões) do Navicat importada(s). Preencha qualquer conexão cuja senha ainda esteja vazia antes de testar.", + importDbeaverSuccess: + "{count} conexão(ões) do DBeaver importada(s). Preencha qualquer conexão cuja senha ainda esteja vazia antes de testar.", + importNone: "Nenhuma conexão nova para importar", + importLayoutConfirm: "O arquivo importado contém grupos de conexões. Aplicá-los?", + importLayoutTitle: "Importar Grupos", + importLayoutApply: "Aplicar", + }, + ai: { + placeholder: "Descreva sua consulta em linguagem natural...", + settings: "Configurações de AI", + noConfig: "A AI não está configurada. Configure seu provedor de AI em Configurações > AI.", + provider: "Provedor", + model: "Modelo", + browseModels: "Explorar modelos", + refreshModels: "Atualizar modelos", + loadingModels: "Carregando modelos...", + searchModels: "Pesquisar modelos", + noModels: "Nenhum modelo carregado", + modelListHint: "Clique em atualizar para carregar os modelos do provedor.", + modelListUnsupported: "Este provedor não oferece suporte à obtenção de uma lista de modelos.", + modelListEndpointRequired: "Informe um endpoint antes de carregar os modelos.", + modelListApiKeyRequired: "Informe uma API key antes de carregar os modelos.", + run: "Executar", + readingSchema: "Lendo schema", + noConnection: "Nenhuma conexão disponível para esta aba", + noSql: "Nenhum SQL para processar", + sqlPreview: "Pré-visualização do SQL", + copySql: "Copiar SQL", + copyCode: "Copiar Código", + executeSql: "Executar SQL", + copyAll: "Copiar Tudo", + copied: "Copiado", + replace: "Substituir Editor", + append: "Anexar ao Editor", + apply: "Aplicar ao Editor", + clear: "Limpar Conversa", + welcome: "Diga o que você gostaria de consultar e eu escreverei o SQL", + newChat: "Nova Conversa", + thinking: "Pensando...", + reasoningProcess: "Processo de raciocínio", + stopGenerating: "Parar geração", + tableMentionEmpty: "Nenhuma tabela correspondente", + tableMentionPlaceholderHint: "Digite {'@'} para mencionar tabelas como contexto", + tableMentionTypes: { + table: "Tabela", + view: "Visão", + systemTable: "Tabela do sistema", + temporaryTable: "Tabela temporária", + }, + modes: { + ask: "Perguntar", + agent: "Agente", + }, + modeHints: { + ask: "Gera SQL e explicações sem executá-los automaticamente", + agent: "Executa automaticamente consultas seguras quando possível", + }, + fixWithAi: "Corrigir com AI", + truncated: "Contexto truncado", + contextSummary: "{database} · {tables} tabelas", + autoSqlBlocked: "O SQL gerado pela AI pareceu arriscado demais para execução automática. Revise-o manualmente antes de executar.", + agentSteps: { + generated: "SQL gerado", + noSql: "Nenhum SQL encontrado", + safe: "Verificação de segurança aprovada", + needsConfirm: "Requer confirmação", + blocked: "Bloqueado", + autoExecute: "Pronto para executar", + notRequested: "Execução não solicitada", + skipped: "Não executado", + }, + agentStepTitles: { + riskCheck: "Verificação de risco: {action} · {category} · {environment} · {reasons}", + blocked: "A execução foi bloqueada pela política de risco. Revise o SQL manualmente.", + requiresConfirmation: "Este SQL requer confirmação antes da execução.", + askMode: "O modo Perguntar não executa SQL automaticamente.", + unsupportedAction: "A ação atual de AI não executa SQL automaticamente.", + noSql: "A resposta não incluiu um bloco de código SQL executável.", + notRequested: "O usuário não solicitou a execução do SQL.", + skipped: "Esta etapa não foi executada.", + }, + proxy: "Proxy", + proxyEnable: "Enviar requisições de AI através do proxy", + proxyUrl: "URL do Proxy", + settingsHint: + "A configuração é armazenada no diretório local de dados do aplicativo. As requisições são enviadas pelo backend do Tauri em vez de diretamente pelo frontend.", + enableThinking: "Raciocínio", + enableThinkingOn: "Ativado", + enableThinkingOff: "Desativado", + enableThinkingHint: + "Esta opção só tem efeito em APIs /chat/completions e modelos compatíveis. Quando desativada, pode reduzir significativamente o uso de tokens, mas a qualidade dos resultados gerados pode diminuir ligeiramente.", + actions: { + generate: "Gerar SQL", + explain: "Explicar SQL", + optimize: "Otimizar SQL", + fix: "Corrigir Erro", + convert: "Converter Dialeto", + sampleData: "Dados de Exemplo", + }, + placeholders: { + generate: "Descreva o que você quer consultar, por exemplo, pedidos por usuário nos últimos 7 dias", + explain: "Opcional: adicione o que você quer entender", + optimize: "Opcional: adicione um objetivo, por exemplo, reduzir varreduras completas de tabela", + fix: "Cole o erro ou descreva o resultado esperado", + convert: "por exemplo, converter para PostgreSQL / MySQL / SQL Server", + sampleData: "Descreva os dados de exemplo ou instruções de teste a gerar", + }, + }, + contextMenu: { + openConnection: "Abrir Conexão", + closeConnection: "Fechar Conexão", + closeDatabaseConnection: "Fechar Conexão do Banco de Dados", + deleteConnection: "Excluir Conexão", + confirmDeleteTitle: "Excluir Conexão", + confirmDeleteMessage: 'Tem certeza de que deseja excluir "{name}"? Esta ação não pode ser desfeita.', + editConnection: "Editar Conexão", + selectVisibleDatabases: "Selecionar Bancos de Dados Visíveis", + duplicateConnection: "Duplicar Conexão", + newQuery: "Nova Consulta", + openObjectBrowser: "Explorar Objetos", + viewData: "Ver Dados", + editStructure: "Editar Estrutura", + refreshChildren: "Atualizar", + pin: "Fixar", + unpin: "Desafixar", + refreshTab: "Atualizar Dados", + renameTab: "Renomear Aba", + compactTabTitle: "Encurtar Títulos das Abas", + closeTab: "Fechar Aba", + closeOtherTabs: "Fechar Outras Abas", + closeAllTabs: "Fechar Todas as Abas", + copyName: "Copiar Nome", + setDefaultDatabase: "Definir como Banco de Dados Padrão", + clearDefaultDatabase: "Limpar Banco de Dados Padrão", + exportDatabase: "Exportar Banco de Dados", + exportDatabaseSuccess: "{count} tabelas exportadas, até {limit} linhas cada", + exportDatabaseFailed: "Falha ao exportar banco de dados: {message}", + importData: "Importar Dados", + exportData: "Exportar Dados", + exportStructure: "Exportar Estrutura", + exportStructurePreviewTitle: "Estrutura - {name}", + exportStructurePreviewTitleMultiple: "Estrutura - {count} objetos", + exportStructureLoading: "Carregando estrutura...", + copyStructure: "Copiar Estrutura", + copyStructureAs: "Copiar Estrutura Como", + copyStructureAsTsv: "TSV (para Excel)", + copyStructureAsMarkdown: "Tabela Markdown", + structureDocTable: "Tabela", + structureDocColumn: "Coluna", + structureDocType: "Tipo", + structureDocPrimaryKey: "Chave Primária", + structureDocNullable: "Anulável", + structureDocDefault: "Padrão", + structureDocComment: "Comentário", + structureDocYes: "Sim", + structureDocNo: "Não", + structureDocCopied: "Estrutura copiada", + structureDocCopyFallbackHint: "A cópia automática foi bloqueada. Clique em Copiar novamente ou selecione o conteúdo abaixo.", + saveStructure: "Salvar SQL", + exportStructureCopied: "Estrutura copiada", + createTable: "Criar Tabela", + createView: "Criar Visão", + dropTable: "Remover Tabela", + emptyTable: "Esvaziar Tabela", + truncateTable: "Truncar Tabela", + duplicateStructure: "Clonar como Nova Tabela", + renameObject: "Renomear", + renameObjectTitle: "Renomear Objeto", + renameObjectNamePlaceholder: "Novo nome", + renameObjectSuccess: '"{oldName}" renomeado para "{newName}"', + confirmDropTableTitle: "Remover Tabela", + confirmDropTableMessage: + 'Tem certeza de que deseja remover "{name}"? Isso excluirá permanentemente a tabela e todos os seus dados.', + confirmEmptyTableTitle: "Esvaziar Tabela", + confirmEmptyTableMessage: 'Tem certeza de que deseja excluir todos os dados de "{name}"?', + confirmTruncateTableTitle: "Truncar Tabela", + confirmTruncateTableMessage: 'Tem certeza de que deseja truncar "{name}"? Isso removerá todas as linhas.', + dropTableSuccess: 'Tabela "{name}" removida', + editView: "Editar Visão", + viewSource: "Ver Código-fonte", + viewDdl: "Ver DDL", + dropObject: "Remover Objeto", + dropView: "Remover Visão", + dropColumn: "Remover Coluna", + dropIndex: "Remover Índice", + dropForeignKey: "Remover Chave Estrangeira", + dropTrigger: "Remover Gatilho", + batchDrop: "Remover selecionados ({count})", + executeProcedure: "Executar Procedimento", + confirmExecuteProcedureTitle: "Executar Procedimento", + confirmExecuteProcedureMessage: 'Executar o procedimento "{name}"? Você pode preencher ou ajustar os valores dos parâmetros primeiro.', + loadingProcedureParameters: "Carregando parâmetros...", + procedureParametersUnavailable: + "Não foi possível carregar os metadados dos parâmetros. Você ainda pode editar o SQL abaixo e executá-lo.", + noProcedureParameters: "Nenhum parâmetro foi encontrado. O SQL atual será executado como exibido.", + inputParameters: "{count} parâmetros de entrada", + outputParameters: "{count} parâmetros de saída", + parameterName: "Nome", + parameterType: "Tipo", + parameterMode: "Modo", + parameterValue: "Valor", + parameterNull: "NULL", + parameterDefault: "DEFAULT", + parameterDefaultHint: + "Quando DEFAULT está marcado, o DBX omite esse argumento para que o banco de dados use o padrão do procedimento.", + parameterValuePlaceholder: "Digite o valor", + outputOnly: "Apenas saída", + sqlPreview: "Pré-visualização do SQL", + resetSqlPreview: "Redefinir SQL", + openInSqlEditor: "Abrir no Editor", + dropProcedure: "Remover Procedimento", + dropFunction: "Remover Função", + confirmDropViewTitle: "Remover Visão", + confirmDropViewMessage: 'Tem certeza de que deseja remover a visão "{name}"?', + confirmDropObjectTitle: "Remover Objeto", + confirmDropObjectMessage: 'Tem certeza de que deseja remover "{name}"?', + confirmDropColumnTitle: "Remover Coluna", + confirmDropIndexTitle: "Remover Índice", + confirmDropForeignKeyTitle: "Remover Chave Estrangeira", + confirmDropTriggerTitle: "Remover Gatilho", + confirmDropTableChildObjectMessage: 'Tem certeza de que deseja remover "{name}" de "{table}"?', + confirmBatchDropTitle: "Remover Objetos Selecionados", + confirmBatchDropMessage: "Tem certeza de que deseja remover {count} objetos selecionados? Esta ação não pode ser desfeita.", + confirmDropProcedureTitle: "Remover Procedimento", + confirmDropProcedureMessage: 'Tem certeza de que deseja remover o procedimento "{name}"?', + confirmDropFunctionTitle: "Remover Função", + confirmDropFunctionMessage: 'Tem certeza de que deseja remover a função "{name}"?', + dropViewSuccess: 'Visão "{name}" removida', + dropProcedureSuccess: 'Procedimento "{name}" removido', + dropFunctionSuccess: 'Função "{name}" removida', + dropTableChildObjectSuccess: '"{name}" removido', + batchDropSuccess: "{count} objetos removidos", + emptyTableSuccess: 'Todos os dados excluídos de "{name}"', + truncateTableSuccess: 'Tabela "{name}" truncada', + duplicateStructureSuccess: 'Tabela clonada como "{name}"', + tableOperationFailed: "Falha na operação: {message}", + duplicateNameTitle: "Clonar como Nova Tabela", + duplicateNamePlaceholder: "Nome da nova tabela", + createDatabase: "Criar Banco de Dados", + createDuckDbFile: "Criar Arquivo de Banco de Dados", + dropDatabase: "Remover Banco de Dados", + confirmDropDatabaseTitle: "Remover Banco de Dados", + confirmDropDatabaseMessage: + 'Tem certeza de que deseja remover o banco de dados "{name}"? Isso excluirá permanentemente o banco de dados e todos os seus dados.', + createDatabaseSuccess: 'Banco de dados "{name}" criado', + createDuckDbFileSuccess: 'Arquivo de banco de dados DuckDB "{name}" criado e anexado', + createDuckDbFileDesktopOnly: "A criação de arquivos de banco de dados DuckDB só está disponível no aplicativo desktop", + dropDatabaseSuccess: 'Banco de dados "{name}" removido', + createDatabaseNamePlaceholder: "Nome do banco de dados", + createDatabaseCharset: "Conjunto de caracteres", + createDatabaseCharsetPlaceholder: "por exemplo, utf8mb4", + createDatabaseCollation: "Collation", + createDatabaseCollationPlaceholder: "por exemplo, utf8mb4_unicode_ci", + createSchema: "Criar Schema", + dropSchema: "Remover Schema", + confirmDropSchemaTitle: "Remover Schema", + confirmDropSchemaMessage: + 'Tem certeza de que deseja remover o schema "{name}"? Isso excluirá permanentemente o schema e todos os seus objetos.', + createSchemaSuccess: 'Schema "{name}" criado', + dropSchemaSuccess: 'Schema "{name}" removido', + createSchemaNamePlaceholder: "Nome do schema", + }, + visibleDatabases: { + title: "Bancos de dados visíveis", + description: 'Escolha quais bancos de dados são exibidos em "{connection}".', + searchPlaceholder: "Pesquisar bancos de dados...", + selectedCount: "{selected}/{total} selecionados", + selectAll: "Selecionar todos", + clear: "Limpar", + showAll: "Mostrar todos", + showSystemDatabases: "Mostrar bancos de dados do sistema", + save: "Salvar", + loadFailed: "Falha ao carregar bancos de dados: {message}", + }, + tree: { + savedSql: "Biblioteca SQL", + defaultDatabase: "Banco padrão", + columns: "Colunas", + indexes: "Índices", + foreignKeys: "Chaves estrangeiras", + triggers: "Triggers", + tables: "Tabelas", + views: "Visões", + procedures: "Procedimentos", + functions: "Funções", + packages: "Pacotes", + partitions: "Partições", + objectBrowser: "Navegar no Navegador de Objetos ({count})", + }, + objects: { + all: "Todos", + tables: "Tabelas", + views: "Visões", + procedures: "Procedimentos", + functions: "Funções", + packages: "Pacotes", + table: "Tabela", + partitions: "{count} partições", + view: "Visão", + procedure: "Procedimento", + function: "Função", + package: "Pacote", + packageBody: "Corpo do pacote", + name: "Nome", + type: "Tipo", + createdAt: "Criado em", + updatedAt: "Atualizado em", + source: "Código-fonte", + saveSource: "Salvar", + cancelEdit: "Cancelar", + sourceSaved: "Código-fonte salvo", + sourceSaveFailed: "Falha ao salvar código-fonte: {message}", + schemaColumn: "Schema", + comment: "Comentário", + loadingSchemas: "Carregando schemas...", + schema: "Schema", + search: "Pesquisar tabelas, visões, funções ou procedimentos...", + loading: "Carregando objetos...", + empty: "Nenhum objeto encontrado", + selectedTables: "{count} tabelas selecionadas", + exportSelected: "Exportar selecionados", + dropSelected: "Remover selecionados", + clearSelection: "Limpar seleção", + confirmBatchDropTitle: "Remover tabelas selecionadas", + confirmBatchDropMessage: "Tem certeza de que deseja remover {count} tabelas selecionadas? Esta ação não pode ser desfeita.", + batchDropSuccess: "{count} tabelas removidas", + }, + structureEditor: { + title: "Editar estrutura da tabela", + createTitle: "Criar tabela", + editTabTitle: "Editar: {tableName}", + tableName: "Nome da tabela", + refresh: "Atualizar estrutura", + density: "Densidade", + densityCompact: "Compacta", + densityStandard: "Padrão", + densityComfortable: "Confortável", + columns: "Colunas", + indexes: "Índices", + foreignKeys: "Chaves estrangeiras", + triggers: "Triggers", + addColumn: "Adicionar coluna", + addIndex: "Adicionar índice", + columnName: "Coluna", + dataType: "Tipo", + typePlaceholder: "Selecione ou digite...", + noMatchingType: "Nenhum tipo correspondente", + length: "Comprimento", + nullable: "Permite nulo", + primaryKey: "Chave primária", + defaultValue: "Padrão", + comment: "Comentário", + editComment: "Editar comentário", + commentPlaceholder: "Insira o comentário da coluna...", + tableCommentPlaceholder: "Insira o comentário da tabela...", + tableCommentUnsupported: "Comentários de tabela não são suportados por este banco de dados", + actions: "Ações", + indexName: "Índice", + indexColumns: "Colunas", + indexColumnsPlaceholder: "Selecione as colunas...", + unique: "Único", + indexType: "Tipo", + includedColumns: "Incluídas", + includedColumnsPlaceholder: "Selecione as colunas...", + filter: "Filtro", + primary: "Primária", + drop: "Remover", + restore: "Restaurar", + remove: "Remover", + moveColumnUp: "Mover coluna para cima", + moveColumnDown: "Mover coluna para baixo", + yes: "Sim", + no: "Não", + emptyReadonly: "Nenhum registro", + sqlPreview: "Pré-visualização do SQL", + noChanges: "Nenhuma alteração", + apply: "Aplicar alterações", + ready: "Pronto", + saved: "Estrutura da tabela atualizada", + copySql: "Copiar SQL", + extendedProperties: "Estendidas", + autoIncrement: "Auto incremento", + onUpdateCurrentTimestamp: "Atualizar hora automaticamente", + identity: "Identidade", + identityGeneration: "Geração", + identitySeed: "Valor inicial", + identityIncrement: "Incremento", + }, + diagram: { + title: "Diagrama de relacionamentos", + open: "Ver diagrama", + selectConnection: "Selecionar conexão", + selectDatabase: "Selecionar banco de dados", + selectSchema: "Selecionar schema", + searchTables: "Pesquisar tabelas, colunas, chaves...", + refresh: "Atualizar diagrama", + loading: "Lendo relacionamentos...", + loadingProgress: "Lendo relacionamentos... {loaded}/{total}", + partialError: "Metadados ignorados para {count} tabelas que falharam ao carregar", + selectTarget: "Selecione uma conexão e um banco de dados", + empty: "Nenhuma tabela para exibir", + noMatches: "Nenhuma tabela correspondente", + tablesCount: "{count} tabelas", + relationshipsCount: "{count} relacionamentos", + tableMode: "Visão de tabelas", + engineeringMode: "ER de engenharia", + allTables: "Todas as tabelas", + relatedTables: "Tabelas relacionadas", + moreColumns: "+ {count} colunas", + exportSvg: "Exportar SVG", + exportedSvg: "SVG exportado", + exportSvgFailed: "Falha ao exportar SVG: {message}", + zoomIn: "Aumentar zoom", + zoomOut: "Diminuir zoom", + resetLayout: "Redefinir layout", + }, + redis: { + selectKey: "Selecione uma chave para ver seu valor", + noKeys: "Nenhuma chave encontrada", + pattern: "padrão (ex.: user:*)", + fuzzyPattern: "a chave contém...", + fuzzyMatch: "Aproximado", + fuzzyMatchTitle: "Correspondência aproximada: pesquisa chaves por texto contido", + valueSearchPlaceholder: "o valor contém...", + searchByKey: "Chave", + searchByValue: "Valor", + keys: "{count} chaves", + loadingKeys: "Carregando chaves...", + searchingValues: "Pesquisando valores...", + loadMoreKeys: "Carregar mais chaves", + fetchAllKeys: "Buscar todas", + stopFetchAll: "Parar", + fetchAllProgress: "{loaded} de {total} chaves carregadas", + fetchAllProgressUnknown: "{loaded} chaves carregadas", + items: "{count} itens", + fields: "{count} campos", + members: "{count} membros", + loadedItems: "{loaded} de {total} itens carregados", + loadedFields: "{loaded} de {total} campos carregados", + loadedMembers: "{loaded} de {total} membros carregados", + entries: "{count} entradas", + noExpiry: "sem expiração", + columnType: "Tipo", + columnKey: "Chave", + columnValue: "Valor", + columnSize: "Tamanho", + columnTTL: "TTL", + binaryStringReadonlyHint: + "Valores de string binária são exibidos como texto escapado no modo somente leitura; a edição de bytes brutos não é suportada.", + selectedKeys: "Chaves selecionadas", + deleteGroup: "Excluir grupo", + deleteGroupDetails: "{target}\n{count} chaves", + flushDb: "Limpar DB atual", + flushDbMessage: "Isto excluirá todas as chaves do banco de dados Redis atual e não pode ser desfeito. Continuar?", + flushDbDetails: "Alvo: Redis db{db}\nEscopo: todas as chaves do DB atual", + flushDbConfirm: "Limpar DB", + flushDbSuccess: "Redis db{db} limpo", + keyDetail: "Detalhe da chave", + commandLine: "Linha de comando", + selectKeyForDetail: "Selecione uma chave para ver os detalhes", + commandWelcome: "Bem-vindo ao console de comandos do Redis", + commandPlaceholder: "Comando Redis, ex.: GET user:1", + commandPrefix: "CMD", + commandHint: "Insira um comando Redis, ex.: SMEMBERS feature:flags", + executeCommand: "Executar comando", + commandEmpty: "Insira um comando Redis", + commandEmptyResult: "Execute um comando Redis para ver o resultado", + commandBlocked: "Este comando Redis está bloqueado por segurança", + createKey: "Criar chave", + createKeyName: "Chave", + createKeyNamePlaceholder: "user:1", + createKeyType: "Tipo", + createValue: "Valor", + createMember: "Membro", + createField: "Campo", + createFieldPlaceholder: "nome", + createScore: "Pontuação", + createValuePlaceholder: "valor", + createKeySubmit: "Criar", + createKeyNameRequired: "Insira um nome de chave", + createFieldRequired: "Insira um campo de hash", + createScoreInvalid: "Insira uma pontuação válida", + fieldRequired: "Insira um nome de campo", + valueRequired: "Insira um valor", + memberRequired: "Insira um membro", + ttlInvalid: "Insira um TTL válido em segundos (-1 para sem expiração)", + member: "Membro", + memberDetail: "Detalhe do membro", + viewMember: "Ver valor completo", + copyMember: "Copiar membro", + copied: "Copiado", + copyInsertStatement: "Copiar instrução de inserção", + copyInsertStatementBinary: "Não é possível gerar instrução de inserção para dados binários", + editMember: "Editar", + jsonView: "Visão JSON", + rawContent: "Conteúdo bruto", + wordWrap: "Quebra de linha", + }, + mongo: { + documents: "{count} documentos", + addField: "Adicionar campo", + deleteField: "Excluir campo", + field: "Campo", + value: "Valor", + fieldPlaceholder: "Nome do campo", + emptyCollection: "Coleção vazia", + selectDocument: "Selecione um documento", + readonlyId: "_id é somente leitura", + invalidJsonValue: "Esta célula não é um valor JSON válido", + duplicateField: "Nome de campo duplicado: {field}", + edit: "Editar", + documentView: "Visão de documento", + tableView: "Visão de tabela", + filterPlaceholder: "Filtrar...", + sortPlaceholder: "Ordenar...", + }, + history: { + title: "Histórico", + search: "Pesquisar histórico...", + empty: "Nenhum histórico ainda", + failed: "Falhou", + success: "Concluído", + restore: "Restaurar no editor", + copy: "Copiar SQL", + delete: "Excluir", + clear: "Limpar histórico", + viewDetails: "Ver detalhes", + analyzeWithAi: "Analisar com IA", + aiAnalyzeNoConnection: "Não é possível analisar esta entrada de histórico porque sua conexão não existe mais.", + aiAnalysisTab: "Análise do histórico", + rollback: "Reverter", + rollbackSql: "SQL de reversão", + rollbackAvailable: "Disponível", + rollbackUnavailable: "Sem SQL de reversão", + rollbackConfirm: "Executar o SQL de reversão gerado para esta entrada de histórico?", + rollbackSuccess: "Reversão executada", + rollbackFailed: "Falha na reversão: {message}", + confirmDelete: "Excluir esta entrada de histórico?", + confirmClear: "Limpar todo o histórico?", + filters: { + all: "Todos", + query: "Consultas", + data_change: "Alterações de dados", + schema_change: "Alterações de schema", + failed: "Falhou", + }, + kinds: { + query: "Consulta", + data_change: "Alteração de dados", + schema_change: "Alteração de schema", + import: "Importação", + transfer: "Transferência", + }, + kindShort: { + query: "SQL", + data_change: "Dados", + schema_change: "DDL", + import: "Importar", + transfer: "Mover", + }, + detail: { + kind: "Tipo", + operation: "Operação", + connection: "Conexão", + database: "Banco de dados", + target: "Alvo", + time: "Hora", + duration: "Duração", + affectedRows: "Linhas afetadas", + rollback: "Reversão", + status: "Status", + error: "Erro", + }, + }, + dangerDialog: { + title: "Operação perigosa", + message: "Esta instrução SQL pode modificar ou excluir dados de forma irreversível. Tem certeza de que deseja executá-la?", + suppressFuturePrompts: "Não perguntar novamente para SQL perigoso", + deleteMessage: "Esta operação de exclusão pode ser irreversível. Continuar?", + deleteConfirm: "Confirmar exclusão", + deleteRowMessage: "Esta linha será marcada para exclusão e removida do banco de dados após salvar. Continuar?", + deleteRowsMessage: + "Estas {count} linhas serão marcadas para exclusão e removidas do banco de dados após salvar. Continuar?", + deleteRowDetails: "Tabela: {table}", + deleteRowDetailsNoTable: "Linha de resultado atual", + redisKeyDetails: "Chave Redis: {key}", + redisHashFieldDetails: "Hash Redis: {key}\nCampo: {field}", + redisListItemDetails: "Lista Redis: {key}\nÍndice: {index}", + redisSetMemberDetails: "Set Redis: {key}\nMembro: {member}", + mongoDocumentDetails: "Coleção MongoDB: {collection}\nDocumento _id: {id}", + mongoFieldDetails: "Campo: {field}", + mongoArrayItemDetails: "Índice do item do array: {index}", + cancel: "Cancelar", + confirm: "Executar", + }, + transfer: { + title: "Transferência de Dados", + source: "Origem", + target: "Destino", + sourceConnection: "Conexão de origem", + sourceDatabase: "Banco de dados de origem", + sourceSchema: "Schema de origem", + targetConnection: "Conexão de destino", + targetDatabase: "Banco de dados de destino", + targetSchema: "Schema de destino", + tables: "Tabelas", + selectAll: "Selecionar tudo", + deselectAll: "Desmarcar tudo", + createTable: "Criar tabela se não existir", + transferMode: "Modo de transferência", + modeAppend: "Anexar (INSERT)", + modeOverwrite: "Sobrescrever (TRUNCATE + INSERT)", + modeUpsert: "Upsert (INSERT ou UPDATE por PK)", + batchSize: "Tamanho do lote", + start: "Iniciar transferência", + cancel: "Cancelar", + progress: "Transferindo...", + transferring: "Transferindo {table}...", + completed: "Transferência concluída", + completedWithErrors: "Concluído com {count} tabela com falha | Concluído com {count} tabelas com falha", + failed: "Falha na transferência", + cancelled: "Transferência cancelada", + rowsTransferred: "{count} linhas transferidas", + tableProgress: "{current} / {total} tabelas", + noSqlConnections: "Nenhuma conexão SQL disponível", + selectTables: "Selecione as tabelas para transferir", + searchTables: "Pesquisar tabelas...", + noTables: "Nenhuma tabela", + selectSourceFirst: "Selecione primeiro a conexão e o banco de dados de origem", + tableError: "Falha na tabela {table}: {error}", + overallProgress: "Progresso geral", + dataTransfer: "Transferência de Dados", + }, + tableImport: { + title: "Importar Dados da Tabela", + target: "Tabela de destino", + selectFile: "Selecionar arquivo", + file: "Arquivo", + rows: "Linhas", + mapped: "Mapeado", + mapping: "Mapeamento de Colunas", + skipColumn: "Pular", + preview: "Pré-visualização", + mode: "Modo de importação", + append: "Anexar dados", + truncate: "Truncar e depois importar", + progress: "Progresso", + start: "Iniciar importação", + success: "{count} linhas importadas", + }, + sqlFile: { + title: "Executar Arquivo SQL", + file: "Arquivo", + selectSqlFile: "Selecionar arquivo SQL", + browse: "Procurar", + previewingLines: "Pré-visualizando {count} linhas", + previewingFirstLines: "Pré-visualizando as primeiras {count} linhas", + target: "Destino", + connection: "Conexão", + selectConnection: "Selecionar conexão", + database: "Banco de dados", + selectDatabase: "Selecionar banco de dados", + databasePlaceholder: "Nome do banco de dados", + options: "Opções", + continueOnError: "Continuar em caso de erro", + cancelling: "Cancelando...", + cancel: "Cancelar", + execute: "Executar", + statement: "Instrução", + succeeded: "Bem-sucedido", + failed: "Falhou", + affectedRows: "Linhas afetadas", + currentStatement: "Instrução atual", + status: { + idle: "Ocioso", + started: "Iniciado", + running: "Em execução", + statementDone: "Instrução concluída", + statementFailed: "Instrução falhou", + done: "Concluído", + error: "Erro", + cancelled: "Cancelado", + }, + }, + diff: { + title: "Comparar Bancos de Dados", + source: "Origem", + target: "Destino", + selectConnection: "Selecionar conexão", + selectDatabase: "Selecionar banco de dados", + selectSchema: "Selecionar schema", + ignoreComments: "Ignorar diferenças de comentários", + compare: "Comparar", + comparing: "Comparando schemas...", + noDifferences: "Nenhuma diferença encontrada", + table: "Tabela", + status: "Status", + details: "Detalhes", + added: "Adicionado", + removed: "Removido", + modified: "Modificado", + indexes: "Índices", + foreignKeys: "Chaves estrangeiras", + triggers: "Gatilhos", + comments: "Comentários", + newTable: "Nova tabela", + dropTable: "Excluir tabela", + generatedSql: "Sincronizar SQL", + copySql: "Copiar SQL", + executeSync: "Executar sincronização", + syncSuccess: "Sincronização executada com sucesso", + swap: "Trocar origem e destino", + syncProgress: "Executando: {current}/{total}", + syncSummary: "{success} bem-sucedidas, {failed} com falha", + }, + dataCompare: { + title: "Comparar Dados", + selectTable: "Selecionar tabela", + sourceTables: "Tabelas de origem", + targetTable: "Tabela de destino", + searchTables: "Pesquisar tabelas...", + selectedTables: "{selected}/{total} selecionadas", + selectAllTables: "Selecionar tudo", + deselectAllTables: "Desmarcar tudo", + selectSourceTables: "Selecione primeiro a conexão e o banco de dados de origem, depois escolha as tabelas para comparar", + noTables: "Nenhuma tabela disponível para comparação", + autoMatchHint: "O modo em lote corresponde automaticamente as tabelas de destino pelo mesmo nome", + matchedTables: "{matched}/{total} tabelas correspondidas", + missingTargetTables: "Tabelas de destino de mesmo nome ausentes: {tables}", + keyColumns: "Colunas-Chave", + keyColumnsPlaceholder: "Colunas primárias ou únicas separadas por vírgula", + keyColumnsAutoHint: + "Deixe em branco para detectar automaticamente as chaves primárias na comparação de tabela única, ou por tabela na comparação em lote.", + rowCounts: "Origem com {source} linhas, destino com {target} linhas; comparação completa concluída", + previewLimitOption: "Pré-visualizar {count}", + compare: "Comparar Dados", + summary: "{added} adicionados, {removed} removidos, {modified} modificados", + batchSummary: + "{tables} tabelas comparadas: {different} diferentes, {same} idênticas, {failed} com falha; {added} adicionados, {removed} removidos, {modified} modificados", + comparingTable: "Comparando {current}/{total}: {table}", + keyColumnsInline: "Colunas-chave: {columns}", + selectedInline: "Selecionados {selected}/{total}", + selectedSummary: "Selecionados: {added} adicionados, {removed} removidos, {modified} modificados", + selectAllKind: "Selecionar todos {kind}", + clearKind: "Limpar {kind}", + clearSelection: "Limpar todas as seleções", + showAllRows: "Mostrar todas as {count}", + showLessRows: "Mostrar menos", + remainingRows: "{count} linhas a mais ocultas na pré-visualização", + planningSync: "Atualizando plano de sincronização...", + noSelectedDifferences: "Nenhuma diferença foi selecionada para execução", + planSummary: "Plano: {inserts} inserções, {updates} atualizações, {deletes} exclusões, {statements} instruções", + statusDifferent: "Diferente", + statusSame: "Igual", + statusError: "Falhou", + noKeyColumns: "Selecione pelo menos uma coluna-chave", + missingKeyColumns: "As colunas-chave devem existir nas tabelas de origem e de destino: {columns}", + noCommonColumns: "As tabelas de origem e de destino não têm colunas em comum para comparar", + targetTableMissing: "Tabela de destino não encontrada: {table}", + noComparableTables: "Nenhuma tabela comparável encontrada. Verifique se existem tabelas de destino de mesmo nome.", + noDifferences: "Os dados são idênticos, nenhum SQL de sincronização é necessário", + syncSuccess: "Sincronização de dados executada com sucesso", + }, + settings: { + title: "Configurações", + editorTab: "Editor", + appearanceTab: "Aparência", + navigationTab: "Navegação", + dataTab: "Dados", + redisTab: "Redis", + shortcutsTab: "Atalhos", + snippetsTab: "Snippets", + syncTab: "Sincronização", + aiTab: "IA", + mcpTab: "MCP", + jdbcTab: "Drivers JDBC", + securityTab: "Segurança", + aboutTab: "Sobre", + fontFamily: "Família da fonte", + selectFont: "Selecionar fonte...", + searchFont: "Pesquisar fontes...", + loadingFonts: "Carregando fontes...", + noFontsFound: "Nenhuma fonte encontrada", + useCustomFont: "Usar “{font}”", + languageTitle: "Idioma / 语言", + fontSize: "Tamanho da fonte", + uiScale: "Escala da UI", + uiScaleDescription: + "Dimensione toda a UI do desktop para telas de alta resolução (high-DPI). As alterações são aplicadas imediatamente e restauradas na próxima inicialização.", + theme: "Tema", + selectTheme: "Selecionar tema...", + followAppTheme: "Seguir o tema do app", + appLayout: "Layout da interface", + appLayoutSeparated: "Separado moderno", + appLayoutSeparatedDescription: "Separação clara de painéis com abas em estilo de bloco.", + appLayoutClassic: "Clássico compacto", + appLayoutClassicDescription: "Barra de abas contínua com cabeçalhos de painel compactos.", + iconTheme: "Estilo do ícone e do logo", + iconThemeDefault: "Padrão", + iconThemeDefaultDescription: "Usar o ícone colorido do app DBX.", + iconThemeBlack: "Preto", + iconThemeBlackDescription: "Usar a marca DBX em preto na janela, na bandeja e no logo.", + showTrayIcon: "Mostrar ícone na bandeja/barra de menus", + showTrayIconDescription: + "Quando desativado, nenhum ícone é exibido, mas fechar a janela ainda oculta o DBX em segundo plano como antes.", + dataGridDisplay: "Exibição da grade de dados", + showColumnCommentsInHeader: "Mostrar comentários de coluna sob os nomes", + showColumnCommentsInHeaderDescription: "Exibir comentários de colunas da tabela diretamente abaixo dos nomes das colunas da grade.", + compactColumnHeaderActions: "Ferramentas compactas no cabeçalho da coluna", + compactColumnHeaderActionsDescription: + "Mover as ferramentas de formatação e filtro local para um menu de mais opções para que os nomes das colunas tenham prioridade.", + sidebarActivation: "Ativação da barra lateral", + sidebarActivationSingle: "Clique único", + sidebarActivationSingleDescription: "Abrir itens acionáveis da barra lateral com um clique.", + sidebarActivationDouble: "Clique duplo", + sidebarActivationDoubleDescription: "Clique único seleciona linhas; clique duplo abre itens.", + sidebarObjectDisplay: "Layout de objetos da barra lateral", + sidebarObjectDisplayGrouped: "Visualização avançada", + sidebarObjectDisplayGroupedDescription: + "Agrupar objetos por tabelas, views, procedures e funções para bancos de dados com mais tipos de objetos.", + sidebarObjectDisplaySimple: "Visualização simples", + sidebarObjectDisplaySimpleDescription: + "Listar tabelas e views diretamente sob cada banco de dados ou schema para reduzir os níveis intermediários.", + autoSelectActiveSidebarNode: "Sempre selecionar o item aberto", + autoSelectActiveSidebarNodeDescription: + "Ao alternar abas, selecionar a tabela, coleção ou arquivo SQL correspondente visível na barra lateral.", + disconnectTabHandlingMode: "Abas após desconectar", + disconnectTabHandlingModeDescription: + "Escolha como as abas relacionadas devem ser tratadas após fechar uma conexão ou banco de dados.", + disconnectTabHandlingModeCloseTabs: "Fechar todas as abas", + disconnectTabHandlingModeCloseTabsDescription: "Fechar todas as abas relacionadas à conexão ou ao banco de dados.", + disconnectTabHandlingModeKeepTabsClearResults: "Fechar abas de objetos, manter abas SQL", + disconnectTabHandlingModeKeepTabsClearResultsDescription: + "Fechar abas de dados de tabela, navegador de objetos e estrutura, mantendo as abas de consultas SQL e o texto SQL, e também limpar o estado de execução e as sessões de resultados.", + disconnectTabHandlingModeKeepTabsKeepResults: "Não fechar abas relacionadas", + disconnectTabHandlingModeKeepTabsKeepResultsDescription: + "Manter abas relacionadas, texto SQL e resultados atuais sem limpeza adicional.", + reuseDataTab: "Reutilizar aba de dados", + reuseDataTabDescription: + "Ao clicar em uma tabela na barra lateral, reutilizar a aba de dados existente em vez de criar uma nova a cada vez.", + sidebarHiddenTablePrefixes: "Prefixos de nome de tabela ocultos", + sidebarHiddenTablePrefixesDescription: + "Um prefixo por linha. Apenas os rótulos de tabela, view e coleção da barra lateral são encurtados; tooltips e ações ainda usam o nome completo.", + sidebarHiddenTablePrefixesPlaceholder: "Exemplo:\nODS_\nT8Y2_LONG_", + sidebarHideTableComments: "Ocultar comentários de tabela na barra lateral", + sidebarHideTableCommentsDescription: + "Ocultar os comentários inline de tabela/view exibidos ao lado dos nomes na árvore da barra lateral para economizar espaço horizontal.", + sidebarAllowHorizontalScroll: "Permitir rolagem horizontal da barra lateral", + sidebarAllowHorizontalScrollDescription: + "Mostrar nomes longos de tabelas, views e coleções por completo, permitindo a rolagem horizontal da barra lateral.", + snippetsDescription: "Personalize os modelos de snippets SQL acionados no editor.", + snippetsAdd: "Adicionar snippet", + snippetsLabel: "Rótulo", + snippetsPrefix: "Prefixo", + snippetsBody: "Corpo SQL", + snippetsLabelPlaceholder: "ex.: select *", + snippetsPrefixPlaceholder: "ex.: sel", + snippetsBodyPlaceholder: "SELECT *\nFROM table\nLIMIT 100;", + snippetsRestoreDefaults: "Restaurar padrões", + snippetsAddTitle: "Adicionar snippet", + snippetsEditTitle: "Editar snippet", + syncWebDavTitle: "Sincronização WebDAV", + syncWebDavDescription: "Envie ou restaure um snapshot do DBX a partir de um serviço de armazenamento compatível com WebDAV.", + syncEndpoint: "URL do WebDAV", + syncUsername: "Nome de usuário", + syncPassword: "Senha", + syncPasswordPlaceholder: "Digite a senha", + syncClearSavedPassword: "Limpar senha salva", + syncRememberWebDavPassword: "Lembrar senha do app WebDAV", + syncSavedPassword: "(salva)", + syncRememberWebDavPasswordDescription: + "A senha é criptografada e armazenada apenas neste dispositivo. Ela não é sincronizada para o WebDAV e não substitui a senha de sincronização.", + syncRemotePath: "Caminho remoto do snapshot", + syncRemotePathDescription: "O DBX criará as pastas pai ausentes ao enviar.", + syncSecretNotice: + "Por padrão, o DBX sincroniza apenas detalhes de conexão e configurações. Senhas de banco de dados, senhas SSH, senhas de proxy, strings de conexão e chaves de API de IA permanecem locais.", + syncSecrets: "Sincronizar segredos criptografados", + syncSecretsDescription: + "Quando ativado, o DBX criptografa senhas de banco de dados, senhas SSH e chaves de API de IA antes de enviá-las para o WebDAV.", + syncSecretsPassphrase: "Senha de sincronização", + syncSecretsPassphraseDescription: + "Esta senha é usada apenas para criptografar e restaurar dados sensíveis. O DBX não a salva; digite-a novamente em cada dispositivo.", + syncTest: "Testar", + syncUpload: "Enviar", + syncDownload: "Baixar", + syncTestSuccess: "O destino WebDAV está acessível.", + syncUploadSuccess: "Enviados {bytes} bytes para {path}.", + syncDownloadSuccess: "Baixados e aplicados {bytes} bytes de {path}.", + syncSecretsApplied: "Os segredos criptografados foram restaurados.", + syncSecretsSkipped: "Havia segredos criptografados, mas não foram restaurados.", + syncDownloadConfirm: "Baixar e aplicar o snapshot remoto do DBX? Os metadados locais e os SQL salvos serão substituídos.", + apply: "Aplicar", + applyAndClose: "Aplicar e fechar", + reset: "Redefinir", + resetDefaults: "Redefinir padrões", + save: "Salvar", + cancel: "Cancelar", + executeMode: "Modo de execução (Cmd+Enter)", + executeModeAll: "Executar todo o SQL", + executeModeCurrent: "Executar instrução no cursor", + wordWrap: "Quebra de linha", + wordWrapDescription: "Quebrar linhas SQL longas dentro da largura do editor", + confirmDangerousSqlExecution: "Confirmar antes de SQL perigoso", + confirmDangerousSqlExecutionDescription: + "Quando desativado, ALTER, DROP, DELETE, TRUNCATE e outros SQL perigosos são executados sem a caixa de diálogo de aviso.", + redisScanPageSize: "Contagem de scan do Redis", + redisScanPageSizeDescription: "Chaves solicitadas por página do Redis SCAN ao navegar pelas chaves.", + redisScanPageSizeOption: "{count} chaves", + exportBatchSize: "Tamanho do lote de exportação", + exportBatchSizeDescription: "Linhas buscadas por lote ao exportar dados da tabela (100-100000).", + exportSection: "Exportar", + shortcutExecuteSql: "Executar SQL", + shortcutFind: "Localizar", + shortcutReplace: "Substituir", + shortcutSaveSql: "Salvar SQL", + shortcutAcceptCompletion: "Aceitar autocompletar", + shortcutCopyCurrentRow: "Copiar linha de dados atual", + shortcutDeleteCurrentRow: "Excluir linha de dados atual", + shortcutNewQuery: "Nova consulta", + shortcutCloseTab: "Fechar aba", + shortcutFocusSearch: "Focar na pesquisa", + shortcutZoomInUi: "Aumentar zoom da UI", + shortcutZoomOutUi: "Diminuir zoom da UI", + shortcutResetUiZoom: "Redefinir zoom da UI", + shortcutRefreshData: "Atualizar dados", + shortcutToggleTranspose: "Alternar visualização transposta", + shortcutCancelSearch: "Cancelar pesquisa", + shortcutScopeGlobal: "Global", + shortcutScopeEditor: "Editor SQL", + shortcutScopeGrid: "Grade de dados", + shortcutScopeSearch: "Campos de pesquisa", + shortcutPressShortcut: "Pressione o atalho", + shortcutConflict: "Este atalho conflita com outra ação no mesmo escopo.", + preview: "Pré-visualização ao vivo", + jdbcPlugin: "Plugin JDBC do DBX", + jdbcPluginInstall: "Instalar plugin JDBC", + jdbcPluginInstallSuccess: "Plugin JDBC instalado", + jdbcPluginUpdate: "Atualizar", + jdbcPluginUninstall: "Desinstalar", + jdbcPluginUninstallSuccess: "Plugin JDBC desinstalado", + jdbcPluginInstalled: "Instalado: v{version}", + jdbcPluginIncompatible: "Protocolo incompatível", + jdbcPluginNotInstalled: "Não instalado", + jdbcDrivers: "JARs de driver JDBC", + jdbcImport: "Importar JAR", + jdbcImportPath: "Caminho de importação", + jdbcDriverPathPlaceholder: "/caminho/para/driver.jar", + jdbcImportSuccess: "{count} arquivo(s) de driver importado(s)", + jdbcDeleteSuccess: "Driver removido", + jdbcNoDrivers: "Nenhum driver JDBC importado ainda.", + mcpTitle: "Servidor MCP", + mcpDescription: "Verifique a instalação e a versão do Servidor MCP do DBX usado pelo Claude Code, Cursor e outros agentes.", + mcpChecking: "Verificando", + mcpStatusUnknown: "Não verificado", + mcpStatusError: "Falha na verificação", + mcpReady: "Pronto", + mcpNotInstalled: "Não instalado", + mcpUpdateAvailable: "Atualização disponível", + mcpCurrent: "Versão atual", + mcpLatest: "Versão mais recente", + mcpVersionMissing: "Nenhuma instalação global detectada", + mcpVersionUnknown: "Desconhecida", + mcpAvailable: "Disponível", + mcpUnavailable: "Indisponível", + mcpBinPath: "Caminho do comando", + mcpInstallCommand: "Comando de instalação", + mcpUpdateCommand: "Comando de atualização", + mcpConfig: "Configuração do MCP", + mcpCodexConfig: "Configuração do Codex", + mcpCodexConfigPath: "O Codex pode usar ~/.codex/config.toml ou um .codex/config.toml no nível do projeto.", + mcpReadonlyMode: "Modo somente leitura", + mcpReadonlyModeDescription: "Adiciona DBX_MCP_ALLOW_WRITES=0 à configuração de exemplo para que a sessão MCP permaneça apenas para consultas.", + mcpAllowDangerous: "Permitir SQL perigoso", + mcpAllowDangerousDescription: + "Adiciona DBX_MCP_ALLOW_DANGEROUS_SQL=1 à configuração de exemplo para que instruções como DROP, TRUNCATE, ALTER e similares sejam permitidas.", + mcpDetectionTiming: "O DBX verifica automaticamente quando esta página é aberta; use Verificar novamente para atualizar.", + mcpNpmBoundary: "O DBX apenas verifica e explica o status do MCP; a instalação e as atualizações ainda são feitas pelo npm.", + mcpRefresh: "Verificar novamente", + mcpGuide: "Guia do MCP", + aboutDescription: "Uma ferramenta de gerenciamento de banco de dados leve e de código aberto.", + community: "Comunidade", + qqGroup: "Grupo do QQ", + wechatGroup: "Grupo do WeChat", + wechatGroupInvite: "Convite do Tencent Docs", + project: "Projeto", + openSource: "Repositório de código aberto", + officialDocs: "Documentação oficial", + }, + driverStore: { + progressJreExtract: "Extraindo JRE...", + progressDownloadJre: "Baixando JRE", + progressDownloadDriver: "Baixando driver", + usageTitle: "Uso de armazenamento", + usageTotal: "Total {size}", + usageTotalLabel: "Total", + calculating: "Calculando...", + usageManagedJre: "JRE gerenciada", + usageAgentDrivers: "Agentes de driver integrados", + usageJdbcPlugin: "Plugin JDBC", + usageJdbcDriverJars: "JARs de driver JDBC", + 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", + driverInstallSuccess: "Driver {label} instalado", + driverInstallFailed: "Falha ao instalar o driver {label}: {error}", + driverUpdateBlocked: "Feche estas conexões de banco de dados antes de atualizar os drivers: {labels}", + upgradeAllSuccess: "{count} driver(s) atualizado(s)", + upgradeAllPartial: "{count} driver(s) atualizado(s). Ignorados: {failed}", + upgradeAllFailed: "Falha na atualização em lote: {error}", + driverUninstallSuccess: "Driver {label} desinstalado", + driverUninstallFailed: "Falha ao desinstalar o driver {label}: {error}", + chooseOfflineDriverPackage: "Escolher pacote de driver offline", + offlineImportSuccess: "Importação offline concluída. {count} driver(s) instalado(s).", + offlineImportFailed: "Falha na importação offline: {error}", + driverImportSuccess: "Driver {label} importado", + driverImportFailed: "Falha ao importar o driver {label}: {error}", + chooseDriverJar: "Escolher arquivo JAR do driver", + jreReinstallSuccess: "JRE {jre} reinstalada", + jreReinstallFailed: "Falha ao reinstalar a JRE {jre}: {error}", + jreUninstallSuccess: "JRE {jre} desinstalada", + chooseJdbcPluginZip: "Escolher arquivo zip do plugin JDBC", + agentDrivers: "Drivers integrados", + jdbcDrivers: "Drivers JDBC", + importing: "Importando...", + importOfflinePackage: "Importar pacote offline", + refresh: "Atualizar", + javaRuntime: "Runtime do Java", + javaRuntimeManaged: "JRE gerenciada pelo DBX", + javaRuntimeSystem: "Java do sistema", + javaRuntimeCustom: "Caminho personalizado", + saving: "Salvando...", + customJavaPathPlaceholder: "/caminho/para/java ou /caminho/para/jdk", + choose: "Escolher", + systemJavaHint: "Usar o java do PATH atual.", + jreRuntimeTitle: "Runtime da JRE {jre}", + notInstalled: "Não instalado", + reinstalling: "Reinstalando", + installing: "Instalando", + install: "Instalar", + reinstall: "Reinstalar", + uninstall: "Desinstalar", + jreRuntime: "Runtime da JRE", + jreRuntimeAutoDownloadHint: "Baixada automaticamente ao instalar um driver pela primeira vez", + driversUpdatable: "{count} driver(s) pode(m) ser atualizado(s)", + upgradingProgress: "Atualizando ({current}/{total})", + upgradeAll: "Atualizar todos", + queued: "Na fila", + importLocalJar: "Importar JAR local", + updating: "Atualizando", + update: "Atualizar", + localInstall: "Instalação local", + runtimeDrivers: "Runtime", + runtimeTitle: "Runtime do driver", + runtimeHint: "As métricas de runtime são coletadas apenas enquanto este painel está aberto.", + runtimeRunning: "Em execução", + runtimeMemory: "Memória", + runtimeHealth: "Integridade", + runtimeHealth_healthy: "Saudável", + runtimeHealth_warning: "Aviso", + runtimeHealth_error: "Erro", + runtimeLastError: "Último erro", + runtimeEmpty: "Nenhum runtime de driver ainda. Abra uma conexão baseada em agente para iniciar um.", + runtimeKindAgent: "Agente", + runtimeKindPlugin: "Plugin", + runtimeSourceDaemon: "Daemon", + runtimeSourceConnection: "Conexão", + runtimeStatus_running: "Em execução", + runtimeStatus_stopped: "Parado", + runtimeStatus_error: "Erro", + runtimeStatus_unknown: "Desconhecido", + runtimePid: "PID", + runtimeUptime: "Tempo ativo", + runtimeActions: "Ações", + runtimeStop: "Parar", + runtimeRestart: "Reiniciar", + runtimeControlConnectionOwned: "Feche a conexão de banco de dados para parar este runtime.", + runtimeStopSuccess: "Runtime {label} parado", + runtimeStopFailed: "Falha ao parar {label}: {error}", + runtimeRestartSuccess: "Runtime {label} reiniciado", + runtimeRestartFailed: "Falha ao reiniciar {label}: {error}", + }, + databaseExport: { + title: "Exportar banco de dados", + includeStructure: "Estrutura da tabela (DDL)", + dropTableIfExists: "Adicionar DROP TABLE IF EXISTS antes do DDL", + includeData: "Dados da tabela (INSERT)", + includeObjects: "Views / Procedures / Funções", + tableSelection: "Tabelas", + selectedTables: "{selected}/{total} selecionadas", + selectAllTables: "Selecionar todas", + filterTables: "Pesquisar tabelas...", + clearTables: "Limpar", + loadingTables: "Carregando tabelas...", + tableLoadError: "Falha ao carregar tabelas: {error}", + noTables: "Nenhuma tabela encontrada", + export: "Exportar", + exporting: "Exportando...", + currentTable: "Atual: {table} ({current}/{total})", + rowsExported: "{count} linhas exportadas", + exportSuccess: "Banco de dados exportado com sucesso", + exportError: "Falha na exportação: {error}", + exportCancelled: "Exportação cancelada", + }, +}; diff --git a/apps/desktop/src/lib/localeOptions.ts b/apps/desktop/src/lib/localeOptions.ts index 0fa2d084e..4017f63c6 100644 --- a/apps/desktop/src/lib/localeOptions.ts +++ b/apps/desktop/src/lib/localeOptions.ts @@ -4,6 +4,7 @@ export const LOCALE_OPTIONS: { value: Locale; flag: string; label: string }[] = { value: "en", flag: "🇺🇸", label: "English" }, { value: "es", flag: "🇪🇸", label: "Español" }, { value: "it", flag: "🇮🇹", label: "Italiano" }, + { value: "pt-BR", flag: "🇧🇷", label: "Português" }, { value: "zh-CN", flag: "🇨🇳", label: "简体中文" }, { value: "zh-TW", flag: "繁", label: "繁體中文" }, ];