mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-17 15:47:14 +00:00
chore(i18n): delete 230 dead translation keys and guard against new ones (#6132)
* chore(i18n): delete 230 dead translation keys and guard against new ones The 13 locale files carried 230 keys (11% of the set) that nothing in the frontend or Go sources references — leftovers of renamed features (the email notifier reuses tgbot.messages.* for subjects, the old email.subject*/title* set was orphaned; likewise menu.*, the clients bulk-copy strings, and the secAlert* family). Nothing detected this: a missing key falls back to en-US and an unused key fails nothing. A new test now fails the build when an en-US key has no reference in frontend/src or internal Go sources (dynamic keys are covered by harvesting concatenation and template-literal prefixes), and pins that all 13 locales carry exactly the en-US key set, so parity drift surfaces at test time instead of as a silent fallback. Each locale shrinks by the same 230 keys; net -2,900 lines across the translation set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(i18n): restore the 29 live remarkVars keys, match whole tokens, unmask 9 more From review: the template-literal harvester required the prefix to end on a dot, so pages.hosts.remarkVars.desc${token} harvested nothing and all 29 desc* tooltip keys were wrongly deleted — and the guard shared the flawed logic, so CI stayed green while the Hosts page would have shown raw key names in 13 languages. Restored from the parent commit; the harvester now requires at least one dot but not a trailing one. Also from review: references are matched as whole dotted tokens instead of substrings (a dead key can no longer hide behind a longer sibling — that unmasked 9 more genuinely dead keys, each verified by hand before deletion), and the test excludes itself from the scan so its own prose cannot whitelist a subtree. Net: -210 keys per locale instead of the previous -230. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -48,7 +48,6 @@
|
||||
"copySuccess": "Copiado com Sucesso",
|
||||
"sure": "Certo",
|
||||
"encryption": "Criptografia",
|
||||
"useIPv4ForHost": "Usar IPv4 para o host",
|
||||
"transmission": "Transmissão",
|
||||
"host": "Host",
|
||||
"path": "Caminho",
|
||||
@@ -74,18 +73,9 @@
|
||||
"twoFactorCode": "Código",
|
||||
"remained": "Restante",
|
||||
"security": "Segurança",
|
||||
"secAlertTitle": "Alerta de Segurança",
|
||||
"secAlertSsl": "Esta conexão não é segura. Evite inserir informações confidenciais até que o TLS seja ativado para proteção de dados.",
|
||||
"secAlertConf": "Algumas configurações estão vulneráveis a ataques. Recomenda-se reforçar os protocolos de segurança para evitar possíveis violações.",
|
||||
"secAlertSSL": "O painel não possui uma conexão segura. Instale o certificado TLS para proteção de dados.",
|
||||
"secAlertPanelPort": "A porta padrão do painel é vulnerável. Configure uma porta aleatória ou específica.",
|
||||
"secAlertPanelURI": "O caminho URI padrão do painel não é seguro. Configure um caminho URI complexo.",
|
||||
"secAlertSubURI": "O caminho URI padrão de inscrição não é seguro. Configure um caminho URI complexo.",
|
||||
"secAlertSubJsonURI": "O caminho URI JSON de inscrição padrão não é seguro. Configure um caminho URI complexo.",
|
||||
"emptyDnsDesc": "Nenhum servidor DNS adicionado.",
|
||||
"emptyFakeDnsDesc": "Nenhum servidor Fake DNS adicionado.",
|
||||
"emptyBalancersDesc": "Nenhum balanceador adicionado.",
|
||||
"emptyReverseDesc": "Nenhum proxy reverso adicionado.",
|
||||
"somethingWentWrong": "Algo deu errado",
|
||||
"subscription": {
|
||||
"title": "Informações da assinatura",
|
||||
@@ -106,8 +96,6 @@
|
||||
},
|
||||
"menu": {
|
||||
"theme": "Tema",
|
||||
"dark": "Escuro",
|
||||
"ultraDark": "Ultra Escuro",
|
||||
"dashboard": "Visão Geral",
|
||||
"inbounds": "Entradas",
|
||||
"clients": "Clientes",
|
||||
@@ -118,7 +106,6 @@
|
||||
"routing": "Roteamento",
|
||||
"outbounds": "Saídas",
|
||||
"apiDocs": "Documentação da API",
|
||||
"logout": "Sair",
|
||||
"link": "Gerenciar",
|
||||
"donate": "Doar",
|
||||
"hosts": "Hosts",
|
||||
@@ -139,7 +126,6 @@
|
||||
}
|
||||
},
|
||||
"index": {
|
||||
"title": "Visão Geral",
|
||||
"cpu": "CPU",
|
||||
"logicalProcessors": "Processadores lógicos",
|
||||
"frequency": "Frequência",
|
||||
@@ -152,7 +138,6 @@
|
||||
"restartXray": "Reiniciar",
|
||||
"xraySwitch": "Versão",
|
||||
"xrayUpdates": "Atualizações do Xray",
|
||||
"xraySwitchClick": "Escolha a versão para a qual deseja alternar.",
|
||||
"xraySwitchClickDesk": "Escolha com cuidado, pois versões mais antigas podem não ser compatíveis com as configurações atuais.",
|
||||
"updatePanel": "Atualizar painel",
|
||||
"panelUpdateDesc": "Isso atualizará o 3X-UI para a versão mais recente e reiniciará o serviço do painel.",
|
||||
@@ -164,12 +149,10 @@
|
||||
"currentCommit": "Commit atual",
|
||||
"latestCommit": "Último commit",
|
||||
"updateChannelChanged": "Canal de atualização alterado",
|
||||
"upToDate": "Atualizado",
|
||||
"xrayStatusUnknown": "Desconhecido",
|
||||
"xrayStatusRunning": "Em execução",
|
||||
"xrayStatusStop": "Parado",
|
||||
"xrayStatusError": "Erro",
|
||||
"xrayErrorPopoverTitle": "Ocorreu um erro ao executar o Xray",
|
||||
"operationHours": "Tempo de Atividade",
|
||||
"systemHistoryTitle": "Histórico do Sistema",
|
||||
"historyTitleCpu": "Uso da CPU",
|
||||
@@ -211,9 +194,6 @@
|
||||
"xrayObservatoryDead": "Inativo",
|
||||
"xrayObservatoryLastSeen": "Visto pela última vez",
|
||||
"xrayObservatoryLastTry": "Última tentativa",
|
||||
"trendLast2Min": "Últimos 2 minutos",
|
||||
"systemLoad": "Carga do Sistema",
|
||||
"systemLoadDesc": "Média de carga do sistema nos últimos 1, 5 e 15 minutos",
|
||||
"connectionCount": "Estatísticas de Conexão",
|
||||
"ipAddresses": "Endereços IP",
|
||||
"toggleIpVisibility": "Alternar visibilidade do IP",
|
||||
@@ -223,13 +203,11 @@
|
||||
"totalData": "Dados totais",
|
||||
"sent": "Enviado",
|
||||
"received": "Recebido",
|
||||
"documentation": "Documentação",
|
||||
"xraySwitchVersionDialog": "Você realmente deseja alterar a versão do Xray?",
|
||||
"xraySwitchVersionDialogDesc": "Isso mudará a versão do Xray para #version#.",
|
||||
"xraySwitchVersionPopover": "Xray atualizado com sucesso",
|
||||
"panelUpdateDialog": "Deseja realmente atualizar o painel?",
|
||||
"panelUpdateDialogDesc": "Isso atualizará o 3X-UI para #version# e reiniciará o serviço do painel.",
|
||||
"panelUpdateCheckPopover": "Falha na verificação de atualização do painel",
|
||||
"panelUpdateStartedPopover": "Atualização do painel iniciada",
|
||||
"panelUpdateFailedTitle": "Falha ao atualizar o painel",
|
||||
"panelUpdateFailedDesc": "A atualização não foi concluída com sucesso. Verifique os logs do servidor ou execute 'x-ui update' na linha de comando.",
|
||||
@@ -258,7 +236,6 @@
|
||||
"accessLogs": "Logs de acesso",
|
||||
"autoUpdate": "Atualização automática",
|
||||
"config": "Configuração",
|
||||
"backup": "Backup",
|
||||
"backupTitle": "Backup & Restauração",
|
||||
"exportDatabase": "Backup",
|
||||
"exportDatabaseDesc": "Clique para baixar um arquivo .db contendo um backup do seu banco de dados atual para o seu dispositivo. O mesmo arquivo também pode ser restaurado em um painel executando PostgreSQL.",
|
||||
@@ -276,7 +253,6 @@
|
||||
"migrationDownloadPgDesc": "Clique para baixar um banco de dados SQLite .db criado a partir dos seus dados do PostgreSQL, pronto para executar este painel no SQLite."
|
||||
},
|
||||
"inbounds": {
|
||||
"title": "Entradas",
|
||||
"totalDownUp": "Total Enviado/Recebido",
|
||||
"totalUsage": "Uso Total",
|
||||
"inboundCount": "Total de Inbounds",
|
||||
@@ -288,21 +264,11 @@
|
||||
"localPanel": "Painel local",
|
||||
"fallbacks": {
|
||||
"title": "Fallbacks",
|
||||
"help": "Quando uma conexão neste inbound não corresponde a nenhum cliente, redirecione-a para outro lugar. Escolha um inbound filho abaixo para preencher automaticamente os campos de roteamento (SNI / ALPN / Path / xver) a partir do transporte dele, ou deixe o seletor vazio e defina Dest diretamente (ex.: 8080 ou 127.0.0.1:8080) para rotear para um servidor externo como o Nginx. Cada inbound filho deve escutar em 127.0.0.1 com security=none.",
|
||||
"empty": "Ainda sem fallbacks",
|
||||
"add": "Adicionar fallback",
|
||||
"pickInbound": "Escolha um inbound",
|
||||
"matchAny": "qualquer",
|
||||
"destPlaceholder": "automático (listen:porta do filho)",
|
||||
"rederive": "Preencher a partir do filho",
|
||||
"rederived": "Preenchido a partir do filho",
|
||||
"editAdvanced": "Editar campos de roteamento",
|
||||
"hideAdvanced": "Ocultar avançado",
|
||||
"quickAddAll": "Adicionar todos os elegíveis",
|
||||
"quickAdded": "{n} fallback(s) adicionado(s)",
|
||||
"quickAddedNone": "Nenhum inbound novo elegível para adicionar",
|
||||
"routesWhen": "Roteia quando",
|
||||
"defaultCatchAll": "Padrão — captura qualquer outra coisa",
|
||||
"needsTls": "Os fallbacks ficam disponíveis após selecionar TLS ou Reality na aba Segurança (apenas VLESS/Trojan sobre RAW)."
|
||||
},
|
||||
"protocol": "Protocolo",
|
||||
@@ -310,8 +276,6 @@
|
||||
"portMap": "Mapeamento de portas",
|
||||
"traffic": "Tráfego",
|
||||
"speed": "Velocidade",
|
||||
"details": "Detalhes",
|
||||
"transportConfig": "Transporte",
|
||||
"expireDate": "Duração",
|
||||
"createdAt": "Criado",
|
||||
"updatedAt": "Atualizado",
|
||||
@@ -319,8 +283,6 @@
|
||||
"addInbound": "Adicionar Inbound",
|
||||
"generalActions": "Ações Gerais",
|
||||
"modifyInbound": "Modificar Inbound",
|
||||
"deleteInbound": "Excluir Inbound",
|
||||
"deleteInboundContent": "Tem certeza de que deseja excluir o inbound?",
|
||||
"deleteConfirmTitle": "Excluir o inbound \"{remark}\"?",
|
||||
"deleteConfirmContent": "Isto remove o inbound e todos os seus clientes. Não é possível desfazer.",
|
||||
"resetConfirmTitle": "Redefinir o tráfego de \"{remark}\"?",
|
||||
@@ -364,8 +326,6 @@
|
||||
"exportAllLinksFileName": "Todas-as-entradas",
|
||||
"exportAllSubsFileName": "Todas-as-entradas-Subs",
|
||||
"inboundJsonTitle": "JSON da entrada",
|
||||
"deleteClient": "Excluir Cliente",
|
||||
"deleteClientContent": "Tem certeza de que deseja excluir o cliente?",
|
||||
"resetTrafficContent": "Tem certeza de que deseja redefinir o tráfego?",
|
||||
"copyLink": "Copiar URL",
|
||||
"address": "Endereço",
|
||||
@@ -376,36 +336,19 @@
|
||||
"meansNoLimit": "= Ilimitado. (unidade: GB)",
|
||||
"totalFlow": "Fluxo Total",
|
||||
"leaveBlankToNeverExpire": "Deixe em branco para nunca expirar",
|
||||
"noRecommendKeepDefault": "Recomenda-se manter o padrão",
|
||||
"certificatePath": "Caminho",
|
||||
"certificateContent": "Conteúdo",
|
||||
"publicKey": "Chave Pública",
|
||||
"privatekey": "Chave Privada",
|
||||
"clickOnQRcode": "Clique no Código QR para Copiar",
|
||||
"client": "Cliente",
|
||||
"export": "Exportar Todos os URLs",
|
||||
"clone": "Clonar",
|
||||
"cloneInbound": "Clonar",
|
||||
"cloneInboundContent": "Todas as configurações deste inbound, exceto Porta, IP de Escuta e Clientes, serão aplicadas ao clone.",
|
||||
"cloneInboundOk": "Clonar",
|
||||
"resetAllTraffic": "Redefinir Tráfego de Todos os Inbounds",
|
||||
"resetAllTrafficTitle": "Redefinir Tráfego de Todos os Inbounds",
|
||||
"resetAllTrafficContent": "Tem certeza de que deseja redefinir o tráfego de todos os inbounds?",
|
||||
"resetInboundClientTraffics": "Redefinir Tráfego dos Clientes",
|
||||
"resetInboundClientTrafficTitle": "Redefinir Tráfego dos Clientes",
|
||||
"resetInboundClientTrafficContent": "Tem certeza de que deseja redefinir o tráfego dos clientes deste inbound?",
|
||||
"resetAllClientTraffics": "Redefinir Tráfego de Todos os Clientes",
|
||||
"resetAllClientTrafficTitle": "Redefinir Tráfego de Todos os Clientes",
|
||||
"resetAllClientTrafficContent": "Tem certeza de que deseja redefinir o tráfego de todos os clientes?",
|
||||
"delDepletedClients": "Excluir Clientes Esgotados",
|
||||
"delDepletedClientsTitle": "Excluir Clientes Esgotados",
|
||||
"delDepletedClientsContent": "Tem certeza de que deseja excluir todos os clientes esgotados?",
|
||||
"email": "Email",
|
||||
"emailDesc": "Por favor, forneça um endereço de e-mail único.",
|
||||
"IPLimit": "Limite de IP",
|
||||
"IPLimitDesc": "Desativa o inbound se o número ultrapassar o valor definido. (0 = desativar)",
|
||||
"IPLimitlog": "Log de IP",
|
||||
"IPLimitlogDesc": "O histórico de IPs. (para ativar o inbound após a desativação, limpe o log)",
|
||||
"IPLimitlogclear": "Limpar o Log",
|
||||
"setDefaultCert": "Definir Certificado pelo Painel",
|
||||
"setDefaultCertEmpty": "Nenhum certificado configurado para o painel. Configure um em Configurações primeiro.",
|
||||
@@ -438,21 +381,15 @@
|
||||
"sniffing": "Sniffing",
|
||||
"sniffingHelp": "Wrapper do bloco sniffing do Xray:",
|
||||
"stream": "Stream",
|
||||
"streamHelp": "Wrapper do bloco stream do Xray:",
|
||||
"jsonErrorPrefix": "JSON avançado"
|
||||
"streamHelp": "Wrapper do bloco stream do Xray:"
|
||||
},
|
||||
"telegramDesc": "Por favor, forneça o ID do Chat do Telegram. (use o comando '/id' no bot) ou ({'@'}userinfobot)",
|
||||
"subscriptionDesc": "Para encontrar seu URL de assinatura, navegue até 'Detalhes'. Além disso, você pode usar o mesmo nome para vários clientes.",
|
||||
"subSortIndex": "Ordem sub",
|
||||
"same": "Igual",
|
||||
"inboundInfo": "Informações do Inbound",
|
||||
"exportInbound": "Exportar Inbound",
|
||||
"import": "Importar",
|
||||
"importInbound": "Importar um Inbound",
|
||||
"periodicTrafficResetTitle": "Reset de Tráfego",
|
||||
"periodicTrafficResetDesc": "Reinicia automaticamente o contador de tráfego em intervalos especificados",
|
||||
"periodicTrafficResetDay": "Dia da redefinição mensal",
|
||||
"lastReset": "Último Reset",
|
||||
"periodicTrafficReset": {
|
||||
"never": "Nunca",
|
||||
"daily": "Diariamente",
|
||||
@@ -464,7 +401,6 @@
|
||||
"obtain": "Obter",
|
||||
"updateSuccess": "A atualização foi bem-sucedida",
|
||||
"logCleanSuccess": "O log foi limpo",
|
||||
"inboundsUpdateSuccess": "Entradas atualizadas com sucesso",
|
||||
"inboundUpdateSuccess": "Entrada atualizada com sucesso",
|
||||
"inboundCreateSuccess": "Entrada criada com sucesso",
|
||||
"bulkDeleted": "{count} inbounds excluídos",
|
||||
@@ -474,7 +410,6 @@
|
||||
"inboundClientDeleteSuccess": "Cliente de entrada excluído",
|
||||
"inboundClientUpdateSuccess": "Cliente de entrada atualizado",
|
||||
"savedNodeOfflineWillSync": "Salvo localmente. Um nó de apoio está offline ou desativado — a alteração será sincronizada assim que reconectar.",
|
||||
"delDepletedClientsSuccess": "Todos os clientes esgotados foram excluídos",
|
||||
"resetAllClientTrafficSuccess": "Todo o tráfego do cliente foi reiniciado",
|
||||
"resetAllTrafficSuccess": "Todo o tráfego foi reiniciado",
|
||||
"resetInboundClientTrafficSuccess": "O tráfego foi reiniciado",
|
||||
@@ -717,23 +652,6 @@
|
||||
"peerNumber": "Peer {n}",
|
||||
"peerNumberConfig": "Config Peer {n}"
|
||||
},
|
||||
"stream": {
|
||||
"general": {
|
||||
"request": "Requisição",
|
||||
"response": "Resposta",
|
||||
"name": "Nome",
|
||||
"value": "Valor"
|
||||
},
|
||||
"tcp": {
|
||||
"version": "Versão",
|
||||
"method": "Método",
|
||||
"path": "Caminho",
|
||||
"status": "Status",
|
||||
"statusDescription": "Descrição do Status",
|
||||
"requestHeader": "Cabeçalho da Requisição",
|
||||
"responseHeader": "Cabeçalho da Resposta"
|
||||
}
|
||||
},
|
||||
"sniffingDestOverride": "Substituição de destino"
|
||||
},
|
||||
"clients": {
|
||||
@@ -747,24 +665,9 @@
|
||||
"addExternalSubscription": "Adicionar assinatura externa",
|
||||
"noExternalLinks": "Ainda não há links externos.",
|
||||
"noExternalSubscriptions": "Ainda não há assinaturas externas.",
|
||||
"add": "Adicionar cliente",
|
||||
"edit": "Editar cliente",
|
||||
"submitAdd": "Adicionar cliente",
|
||||
"submitEdit": "Salvar alterações",
|
||||
"clientCount": "Número de clientes",
|
||||
"bulk": "Adicionar em lote",
|
||||
"copyFromInbound": "Copiar clientes do inbound",
|
||||
"copyToInbound": "Copiar clientes para",
|
||||
"copySelected": "Copiar selecionados",
|
||||
"copySource": "Origem",
|
||||
"copyEmailPreview": "Prévia do e-mail resultante",
|
||||
"copySelectSourceFirst": "Selecione primeiro um inbound de origem.",
|
||||
"copyResult": "Resultado da cópia",
|
||||
"copyResultSuccess": "Copiado com sucesso",
|
||||
"copyResultNone": "Nada a copiar: nenhum cliente selecionado ou a origem está vazia",
|
||||
"copyResultErrors": "Erros de cópia",
|
||||
"copyFlowLabel": "Flow para os novos clientes (VLESS)",
|
||||
"copyFlowHint": "Aplicado a todos os clientes copiados. Deixe em branco para ignorar.",
|
||||
"selectAll": "Selecionar tudo",
|
||||
"clearAll": "Limpar tudo",
|
||||
"method": "Método",
|
||||
@@ -775,7 +678,6 @@
|
||||
"postfix": "Sufixo",
|
||||
"delayedStart": "Iniciar após o primeiro uso",
|
||||
"expireDays": "Duração (dias)",
|
||||
"days": "Dia(s)",
|
||||
"renew": "Renovação automática",
|
||||
"renewDesc": "Renovação automática após a expiração. (0 = desativar) (unidade: dia)",
|
||||
"renewDays": "Renovação automática (dias)",
|
||||
@@ -798,7 +700,6 @@
|
||||
"sortExpiringSoonest": "Expira em breve",
|
||||
"has": "Tem",
|
||||
"hasNot": "Não tem",
|
||||
"title": "Clientes",
|
||||
"actions": "Ações",
|
||||
"totalGB": "Limite de tráfego (GB)",
|
||||
"totalGBDesc": "Cota de dados para este cliente. 0 = ilimitado.",
|
||||
@@ -826,8 +727,6 @@
|
||||
"addClient": "Adicionar cliente",
|
||||
"qrCode": "Código QR",
|
||||
"clientInfo": "Informações do cliente",
|
||||
"delete": "Excluir",
|
||||
"reset": "Redefinir tráfego",
|
||||
"editClient": "Editar cliente",
|
||||
"client": "Cliente",
|
||||
"enabled": "Habilitado",
|
||||
@@ -841,13 +740,11 @@
|
||||
"noLinks": "Sem links compartilháveis — associe primeiro este cliente a um inbound compatível com o protocolo.",
|
||||
"link": "Link",
|
||||
"resetNotPossible": "Associe primeiro este cliente a um inbound.",
|
||||
"general": "Geral",
|
||||
"resetAllTraffics": "Redefinir o tráfego de todos os clientes",
|
||||
"resetAllTrafficsTitle": "Redefinir o tráfego de todos os clientes?",
|
||||
"resetAllTrafficsContent": "Os contadores de envio/recebimento de cada cliente vão a zero. Cota e expiração não são afetadas. Não é possível desfazer.",
|
||||
"deleteConfirmTitle": "Excluir o cliente {email}?",
|
||||
"deleteConfirmContent": "Isto remove o cliente de cada inbound associado e descarta o registro de tráfego. Não é possível desfazer.",
|
||||
"deleteSelected": "Excluir ({count})",
|
||||
"adjustSelected": "Ajustar ({count})",
|
||||
"subLinksSelected": "Links sub ({count})",
|
||||
"addToGroupTitle": "Adicionar {count} cliente(s) a um grupo",
|
||||
@@ -869,12 +766,10 @@
|
||||
"bulkDisableConfirmTitle": "Desativar {count} clientes?",
|
||||
"bulkDisableConfirmContent": "Desativa cada cliente selecionado em todos os inbounds associados. Eles perdem o acesso imediatamente, mas seus registros e tráfego são mantidos.",
|
||||
"selectedCount": "{count} selecionado(s)",
|
||||
"attachSelected": "Associar ({count})",
|
||||
"attachToInboundsTitle": "Associar {count} cliente(s) a entrada(s)",
|
||||
"attachToInboundsDesc": "Associa os {count} cliente(s) selecionados (mesmo UUID/senha e tráfego compartilhado) às entradas escolhidas. Mantêm suas associações existentes.",
|
||||
"attachToInboundsTargets": "Entradas de destino",
|
||||
"attachToInboundsNoTargets": "Não há entradas multiusuário disponíveis para associação.",
|
||||
"detachSelected": "Desassociar ({count})",
|
||||
"detach": "Desassociar",
|
||||
"detachFromInboundsTitle": "Desassociar {count} cliente(s) de entrada(s)",
|
||||
"detachFromInboundsDesc": "Remove os {count} cliente(s) selecionados das entradas escolhidas. Pares onde o cliente não estava associado são ignorados silenciosamente. Os registros dos clientes são mantidos (use Delete para remover completamente).",
|
||||
@@ -928,8 +823,6 @@
|
||||
"reverseTagPlaceholder": "Reverse tag opcional",
|
||||
"telegramId": "ID de usuário do Telegram",
|
||||
"telegramIdPlaceholder": "ID numérico de usuário do Telegram (0 = nenhum)",
|
||||
"created": "Criado",
|
||||
"updated": "Atualizado",
|
||||
"ipLimit": "Limite de IP",
|
||||
"toasts": {
|
||||
"deleted": "Cliente excluído",
|
||||
@@ -952,7 +845,6 @@
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"title": "Grupos",
|
||||
"name": "Nome",
|
||||
"clientCount": "Clientes",
|
||||
"totalGroups": "Total de grupos",
|
||||
@@ -994,7 +886,6 @@
|
||||
"removeFromGroupResult": "Removidos {count} cliente(s) de {name}."
|
||||
},
|
||||
"nodes": {
|
||||
"title": "Nós",
|
||||
"addNode": "Adicionar nó",
|
||||
"editNode": "Editar nó",
|
||||
"totalNodes": "Total de nós",
|
||||
@@ -1013,8 +904,6 @@
|
||||
"apiTokenPlaceholder": "Token da página de Configurações do painel remoto",
|
||||
"apiTokenHint": "O painel remoto exibe o token da API em Autenticação → Token da API.",
|
||||
"apiTokenKeepHint": "Deixe em branco para manter o token atual",
|
||||
"regenerate": "Regenerar token",
|
||||
"regenerateConfirm": "Regenerar invalida o token atual. Qualquer painel central que o utilize perderá acesso até ser atualizado. Continuar?",
|
||||
"allowPrivateAddress": "Permitir endereço privado",
|
||||
"allowPrivateAddressHint": "Ativar apenas para nós em uma rede privada ou VPN.",
|
||||
"outboundTag": "Outbound de conexão",
|
||||
@@ -1046,7 +935,6 @@
|
||||
"updatePanel": "Atualizar painel",
|
||||
"updateSelected": "Atualizar selecionados ({count})",
|
||||
"updateAvailable": "Atualização disponível",
|
||||
"upToDate": "Atualizado",
|
||||
"updateConfirmTitle": "Atualizar {count} nó(s) para a versão mais recente?",
|
||||
"updateConfirmContent": "Cada nó selecionado baixa a versão mais recente e reinicia nela. Apenas nós ativos e online são atualizados.",
|
||||
"updateDevChannel": "Atualizar para o canal de desenvolvimento (último commit)",
|
||||
@@ -1447,7 +1335,6 @@
|
||||
"secretClearUndo": "Desfazer limpeza"
|
||||
},
|
||||
"xray": {
|
||||
"title": "Configurações Xray",
|
||||
"importRules": "Importar regras",
|
||||
"exportRules": "Exportar regras",
|
||||
"importOutbounds": "Importar saídas",
|
||||
@@ -1457,11 +1344,7 @@
|
||||
"metricsListenDesc": "Expõe as métricas no estilo Prometheus do Xray neste endereço:porta (por exemplo, 127.0.0.1:11111). Deixe vazio para desativar. Vincule ao localhost e use um proxy reverso — ele não é autenticado.",
|
||||
"metricsTag": "Tag de métricas",
|
||||
"save": "Salvar",
|
||||
"restart": "Reiniciar Xray",
|
||||
"restartSuccess": "Xray foi reiniciado com sucesso",
|
||||
"restartOutputTitle": "Saída do reinício do Xray",
|
||||
"restartConfirmTitle": "Reiniciar xray?",
|
||||
"restartConfirmContent": "Recarrega o serviço xray com a configuração salva.",
|
||||
"stopSuccess": "Xray foi interrompido com sucesso",
|
||||
"restartError": "Ocorreu um erro ao reiniciar o Xray.",
|
||||
"stopError": "Ocorreu um erro ao parar o Xray.",
|
||||
@@ -1471,7 +1354,6 @@
|
||||
"generalConfigsDesc": "Essas opções determinam ajustes gerais.",
|
||||
"logConfigs": "Log",
|
||||
"logConfigsDesc": "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário.",
|
||||
"blockConfigsDesc": "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados.",
|
||||
"basicRouting": "Roteamento Básico",
|
||||
"blockConnectionsConfigsDesc": "Essas opções bloquearão o tráfego com base no país solicitado.",
|
||||
"directConnectionsConfigsDesc": "Uma conexão direta garante que o tráfego específico não seja roteado por outro servidor.",
|
||||
@@ -1481,10 +1363,6 @@
|
||||
"directdomains": "Domínios Diretos",
|
||||
"ipv4Routing": "Roteamento IPv4",
|
||||
"ipv4RoutingDesc": "Essas opções roteam o tráfego para um destino específico via IPv4.",
|
||||
"warpRouting": "Roteamento WARP",
|
||||
"warpRoutingDesc": "Essas opções roteam o tráfego para um destino específico via WARP.",
|
||||
"nordRouting": "Roteamento NordVPN",
|
||||
"nordRoutingDesc": "Essas opções roteiam o tráfego para um destino específico via NordVPN.",
|
||||
"Template": "Modelo de Configuração Avançada do Xray",
|
||||
"TemplateDesc": "O arquivo final de configuração do Xray será gerado com base neste modelo.",
|
||||
"FreedomStrategy": "Estratégia do Protocolo Freedom",
|
||||
@@ -1498,10 +1376,7 @@
|
||||
"outboundTestUrlDesc": "URL usada ao testar conectividade do outbound",
|
||||
"Torrent": "Bloquear Protocolo BitTorrent",
|
||||
"Inbounds": "Entradas",
|
||||
"InboundsDesc": "Aceitar clientes específicos.",
|
||||
"Outbounds": "Saídas",
|
||||
"OutboundSubscriptions": "Assinaturas de Saída",
|
||||
"OutboundSubscriptionsDesc": "Importe saídas a partir de URLs de assinatura remotas (vmess/vless/trojan/ss/...). As tags são mantidas estáveis para uso em balanceadores e regras de roteamento. As atualizações são automáticas.",
|
||||
"Balancers": "Balanceadores",
|
||||
"balancerTagRequired": "A tag é obrigatória",
|
||||
"balancerSelectorRequired": "Selecione pelo menos uma saída",
|
||||
@@ -1520,9 +1395,7 @@
|
||||
"routeTesterMatchedOutbound": "Saída correspondente",
|
||||
"routeTesterViaBalancer": "via balanceador",
|
||||
"routeTesterDefaultOutbound": "Nenhuma regra de roteamento correspondeu — o tráfego vai para a saída padrão (primeira).",
|
||||
"OutboundsDesc": "Definir o caminho de saída do tráfego.",
|
||||
"Routings": "Regras de Roteamento",
|
||||
"RoutingsDesc": "A prioridade de cada regra é importante!",
|
||||
"completeTemplate": "Tudo",
|
||||
"logLevel": "Nível de Log",
|
||||
"logLevelDesc": "O nível de log para erros, indicando a informação que precisa ser registrada.",
|
||||
@@ -1536,13 +1409,9 @@
|
||||
"maskAddressDesc": "Máscara de endereço IP, quando ativado, substitui automaticamente o endereço IP que aparece no log.",
|
||||
"statistics": "Estatísticas",
|
||||
"statsInboundUplink": "Estatísticas de Upload de Entrada",
|
||||
"statsInboundUplinkDesc": "Habilita a coleta de estatísticas para o tráfego de upload de todos os proxies de entrada.",
|
||||
"statsInboundDownlink": "Estatísticas de Download de Entrada",
|
||||
"statsInboundDownlinkDesc": "Habilita a coleta de estatísticas para o tráfego de download de todos os proxies de entrada.",
|
||||
"statsOutboundUplink": "Estatísticas de Upload de Saída",
|
||||
"statsOutboundUplinkDesc": "Habilita a coleta de estatísticas para o tráfego de upload de todos os proxies de saída.",
|
||||
"statsOutboundDownlink": "Estatísticas de Download de Saída",
|
||||
"statsOutboundDownlinkDesc": "Habilita a coleta de estatísticas para o tráfego de download de todos os proxies de saída.",
|
||||
"connectionLimits": "Limites de conexão",
|
||||
"connectionLimitsDesc": "Políticas em nível de conexão para o nível de usuário 0. Deixe um campo vazio para usar o padrão do Xray.",
|
||||
"connIdle": "Tempo limite de inatividade",
|
||||
@@ -1552,18 +1421,10 @@
|
||||
"bufferSizePlaceholder": "automático",
|
||||
"seconds": "segundos",
|
||||
"rules": {
|
||||
"first": "Primeiro",
|
||||
"last": "Último",
|
||||
"up": "Cima",
|
||||
"down": "Baixo",
|
||||
"source": "Fonte",
|
||||
"dest": "Destino",
|
||||
"inbound": "Entrada",
|
||||
"outbound": "Saída",
|
||||
"balancer": "Balanceador",
|
||||
"info": "Info",
|
||||
"add": "Adicionar Regra",
|
||||
"edit": "Editar Regra",
|
||||
"useComma": "Itens separados por vírgula"
|
||||
},
|
||||
"routing": {
|
||||
@@ -1604,7 +1465,6 @@
|
||||
"ruleN": "Regra {n}",
|
||||
"action": "Ação",
|
||||
"redirect": "Redirect",
|
||||
"fragment": "Fragment",
|
||||
"finalRules": "Regras finais",
|
||||
"overrideXrayPrivateIp": "Sobrescrever o bloqueio de IP privado padrão do Xray",
|
||||
"blockDelay": "Atraso do bloqueio (ms)",
|
||||
@@ -1630,43 +1490,17 @@
|
||||
"keepAliveInterval": "Intervalo keep alive",
|
||||
"markFwmark": "Mark (fwmark)",
|
||||
"interface": "Interface",
|
||||
"ipv6Only": "Apenas IPv6",
|
||||
"acceptProxyProtocol": "Aceitar proxy protocol",
|
||||
"proxyProtocol": "Proxy protocol",
|
||||
"tcpUserTimeoutMs": "TCP user timeout (ms)",
|
||||
"tcpKeepAliveIdleS": "TCP keep-alive idle (s)"
|
||||
},
|
||||
"outbound": {
|
||||
"addOutbound": "Adicionar Saída",
|
||||
"addReverse": "Adicionar Reverso",
|
||||
"editOutbound": "Editar Saída",
|
||||
"editReverse": "Editar Reverso",
|
||||
"reverseTag": "Tag de Reverso",
|
||||
"reverseTagDesc": "Tag de saída do proxy reverso simples VLESS. Deixe vazio para desabilitar.",
|
||||
"reverseTagPlaceholder": "tag de saída (vazio para desabilitar)",
|
||||
"tag": "Tag",
|
||||
"tagDesc": "Tag Única",
|
||||
"address": "Endereço",
|
||||
"egress": "Egress",
|
||||
"egressHint": "Run an HTTP test to show egress IP and country.",
|
||||
"reverse": "Reverso",
|
||||
"domain": "Domínio",
|
||||
"type": "Tipo",
|
||||
"bridge": "Bridge",
|
||||
"portal": "Portal",
|
||||
"link": "Link",
|
||||
"intercon": "Interconexão",
|
||||
"settings": "Configurações",
|
||||
"accountInfo": "Informações da Conta",
|
||||
"outboundStatus": "Status de Saída",
|
||||
"sendThrough": "Enviar Através de",
|
||||
"targetStrategy": "Estratégia de destino",
|
||||
"test": "Testar",
|
||||
"testResult": "Resultado do teste",
|
||||
"testing": "Testando conexão...",
|
||||
"testSuccess": "Teste bem-sucedido",
|
||||
"testFailed": "Teste falhou",
|
||||
"testError": "Falha ao testar saída",
|
||||
"modeRealDelay": "Latência real",
|
||||
"testModeTooltip": "TCP: sondagem rápida apenas de dial. HTTP: requisição completa pelo xray. Latência real: tempo total incluindo o estabelecimento da conexão.",
|
||||
"testAll": "Testar todos",
|
||||
@@ -1674,14 +1508,10 @@
|
||||
"breakdownConnect": "Conexão do proxy",
|
||||
"breakdownTls": "TLS via saída",
|
||||
"breakdownTtfb": "Primeiro byte",
|
||||
"nordvpn": "NordVPN",
|
||||
"accessToken": "Token de Acesso",
|
||||
"country": "País",
|
||||
"server": "Servidor",
|
||||
"city": "Cidade",
|
||||
"allCities": "Todas as Cidades",
|
||||
"privateKey": "Chave Privada",
|
||||
"load": "Carga",
|
||||
"moveToTop": "Mover para o topo"
|
||||
},
|
||||
"outboundSub": {
|
||||
@@ -1711,16 +1541,11 @@
|
||||
"active": "Assinaturas ativas",
|
||||
"empty": "Nenhuma assinatura ainda. Adicione uma acima.",
|
||||
"colRemark": "Observação",
|
||||
"colPrefix": "Prefixo",
|
||||
"colInterval": "Intervalo",
|
||||
"colLastFetch": "Última busca",
|
||||
"colEnabled": "Ativado",
|
||||
"auto": "auto",
|
||||
"never": "nunca",
|
||||
"yes": "Sim",
|
||||
"no": "Não",
|
||||
"refreshNow": "Atualizar agora",
|
||||
"lastError": "Último erro",
|
||||
"deleteConfirm": "Excluir esta assinatura?",
|
||||
"restartHint": "Após adicionar ou atualizar, reinicie o Xray (ou aguarde o próximo recarregamento automático) para ativar as saídas.",
|
||||
"fromSubsTitle": "De assinaturas de saída (somente leitura)",
|
||||
@@ -1737,8 +1562,6 @@
|
||||
"tabBalancerSettings": "Configurações do balanceador",
|
||||
"tabObservatory": "Observatório",
|
||||
"observatory": {
|
||||
"title": "Observatório",
|
||||
"burstTitle": "Observatório Burst",
|
||||
"autoManaged": "Os observadores são gerenciados automaticamente a partir dos seus balanceadores. Ajuste abaixo como eles sondam; as saídas monitoradas seguem os seletores do balanceador.",
|
||||
"emptyHint": "Nenhum observador de conexão ativo. Um é adicionado automaticamente ao criar um balanceador Least Ping ou Least Load — ou um balanceador Random / Round-robin com fallback — para que balanceadores com observador possam verificar a saúde das saídas antes de escolher um destino.",
|
||||
"mixedLegacy": "Esta configuração contém Observatory e Burst Observatory ao mesmo tempo. O Xray usa um único observador global, então esse estado misto legado não é suportado; ao salvar os balanceadores ele será normalizado para um único observador.",
|
||||
@@ -1772,12 +1595,8 @@
|
||||
"balancerRemoved": "Balanceador {tag} — removido (sem destinos restantes)"
|
||||
},
|
||||
"balancer": {
|
||||
"addBalancer": "Adicionar Balanceador",
|
||||
"editBalancer": "Editar Balanceador",
|
||||
"balancerStrategy": "Estratégia",
|
||||
"balancerSelectors": "Seletores",
|
||||
"tag": "Tag",
|
||||
"tagDesc": "Tag Única",
|
||||
"tagDuplicate": "Tag já usada por outro balanceador",
|
||||
"tagPlaceholder": "tag única do balanceador",
|
||||
"selector": "Seletor",
|
||||
@@ -1789,7 +1608,6 @@
|
||||
"tolerance": "Tolerância",
|
||||
"baselines": "Baselines",
|
||||
"costs": "Costs",
|
||||
"balancerDesc": "Não é possível usar balancerTag e outboundTag ao mesmo tempo. Se usados simultaneamente, apenas outboundTag funcionará.",
|
||||
"costMatch": "Padrão de tag",
|
||||
"costValue": "Peso",
|
||||
"costRegexp": "Correspondência por expressão regular",
|
||||
@@ -1804,14 +1622,10 @@
|
||||
"publicKey": "Chave Pública",
|
||||
"allowedIPs": "IPs Permitidos",
|
||||
"endpoint": "Ponto Final",
|
||||
"psk": "Chave Pré-Compartilhada",
|
||||
"domainStrategy": "Estratégia de Domínio"
|
||||
},
|
||||
"tun": {
|
||||
"nameDesc": "O nome da interface TUN. O padrão é 'xray0'",
|
||||
"mtuDesc": "Unidade Máxima de Transmissão. O tamanho máximo dos pacotes de dados. O padrão é 1500",
|
||||
"userLevel": "Nível do Usuário",
|
||||
"userLevelDesc": "Todas as conexões feitas através deste inbound usarão este nível de usuário. O padrão é 0"
|
||||
"userLevel": "Nível do Usuário"
|
||||
},
|
||||
"nord": {
|
||||
"accessToken": "Access token",
|
||||
@@ -1896,7 +1710,6 @@
|
||||
},
|
||||
"fakedns": {
|
||||
"add": "Adicionar Fake DNS",
|
||||
"edit": "Editar Fake DNS",
|
||||
"ipPool": "Sub-rede do Pool de IP",
|
||||
"poolSize": "Tamanho do Pool"
|
||||
},
|
||||
@@ -2032,7 +1845,6 @@
|
||||
"add": "Adicionar",
|
||||
"month": "Mês",
|
||||
"months": "Meses",
|
||||
"day": "Dia",
|
||||
"days": "Dias",
|
||||
"hours": "Horas",
|
||||
"minutes": "Minutos",
|
||||
@@ -2071,7 +1883,6 @@
|
||||
"userSaved": "✅ Usuário do Telegram salvo.",
|
||||
"loginSuccess": "✅ Conectado ao painel com sucesso.\r\n",
|
||||
"loginFailed": "❗️Tentativa de login no painel falhou.\r\n",
|
||||
"2faFailed": "Falha no 2FA",
|
||||
"report": "🕰 Relatórios agendados: {{ .RunTime }}\r\n",
|
||||
"datetime": "⏰ Data&Hora: {{ .DateTime }}\r\n",
|
||||
"hostname": "💻 Host: {{ .Hostname }}\r\n",
|
||||
@@ -2104,7 +1915,6 @@
|
||||
"download": "🔽 Download: ↓{{ .Download }}\r\n",
|
||||
"total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
|
||||
"TGUser": "👤 Usuário do Telegram: {{ .TelegramID }}\r\n",
|
||||
"exhaustedMsg": "🚨 {{ .Type }} esgotado:\r\n",
|
||||
"exhaustedCount": "🚨 Contagem de {{ .Type }} esgotado:\r\n",
|
||||
"onlinesCount": "🌐 Clientes online: {{ .Count }}\r\n",
|
||||
"disabled": "🛑 Desativado: {{ .Disabled }}\r\n",
|
||||
@@ -2113,16 +1923,10 @@
|
||||
"refreshedOn": "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n",
|
||||
"yes": "✅ Sim",
|
||||
"no": "❌ Não",
|
||||
"received_id": "🔑📥 ID atualizado.",
|
||||
"received_password": "🔑📥 Senha atualizada.",
|
||||
"received_email": "📧📥 E-mail atualizado.",
|
||||
"received_comment": "💬📥 Comentário atualizado.",
|
||||
"id_prompt": "🔑 ID Padrão: {{ .ClientId }}\n\nDigite seu ID.",
|
||||
"pass_prompt": "🔑 Senha Padrão: {{ .ClientPassword }}\n\nDigite sua senha.",
|
||||
"email_prompt": "📧 E-mail Padrão: {{ .ClientEmail }}\n\nDigite seu e-mail.",
|
||||
"comment_prompt": "💬 Comentário Padrão: {{ .ClientComment }}\n\nDigite seu comentário.",
|
||||
"inbound_client_data_id": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Tráfego: {{ .ClientTraffic }}\n📅 Data de expiração: {{ .ClientExp }}\n🌐 Limite de IP: {{ .IpLimit }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!",
|
||||
"inbound_client_data_pass": "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Tráfego: {{ .ClientTraffic }}\n📅 Data de expiração: {{ .ClientExp }}\n🌐 Limite de IP: {{ .IpLimit }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!",
|
||||
"cancel": "❌ Processo Cancelado! \n\nVocê pode iniciar novamente a qualquer momento com /start. 🔄",
|
||||
"error_add_client": "⚠️ Erro:\n\n {{ .error }}",
|
||||
"using_default_value": "Tudo bem, vou manter o valor padrão. 😊",
|
||||
@@ -2139,8 +1943,6 @@
|
||||
"eventXrayCrashError": "Erro: {{ .Error }}",
|
||||
"eventNodeDown": "O nó {{ .Name }} está INATIVO",
|
||||
"eventNodeUp": "O nó {{ .Name }} está ATIVO",
|
||||
"eventCPUHigh": "CPU alta",
|
||||
"eventCPUHighDetail": "CPU: {{ .Detail }}",
|
||||
"eventLoginFallback": "Falha de login a partir de {{ .Source }}",
|
||||
"memoryThreshold": "Uso de memória {{ .Percent }}% excede o limite de {{ .Threshold }}%"
|
||||
},
|
||||
@@ -2181,11 +1983,8 @@
|
||||
"submitDisable": "Enviar como Desativado ☑️",
|
||||
"submitEnable": "Enviar como Ativado ✅",
|
||||
"use_default": "🏷️ Usar padrão",
|
||||
"change_id": "⚙️🔑 ID",
|
||||
"change_password": "⚙️🔑 Senha",
|
||||
"change_email": "⚙️📧 Email",
|
||||
"change_comment": "⚙️💬 Comentário",
|
||||
"change_flow": "⚙️🚦 Flow",
|
||||
"ResetAllTraffics": "Redefinir Todo o Tráfego",
|
||||
"SortedTrafficUsageReport": "Relatório de Uso de Tráfego Ordenado"
|
||||
},
|
||||
@@ -2214,31 +2013,16 @@
|
||||
}
|
||||
},
|
||||
"email": {
|
||||
"subjectOutboundDown": "O outbound {{ .Tag }} está INATIVO",
|
||||
"subjectOutboundUp": "O outbound {{ .Tag }} está ATIVO",
|
||||
"subjectXrayCrash": "O Xray FALHOU",
|
||||
"subjectCPUHigh": "CPU alta",
|
||||
"subjectLoginSuccess": "Login bem-sucedido",
|
||||
"subjectLoginFailed": "Falha de login",
|
||||
"titleOutboundDown": "Outbound INATIVO",
|
||||
"titleOutboundUp": "Outbound ATIVO",
|
||||
"titleXrayCrash": "O Xray FALHOU",
|
||||
"titleCPUHigh": "CPU alta",
|
||||
"titleLoginSuccess": "Login bem-sucedido",
|
||||
"titleLoginFailed": "Falha de login",
|
||||
"labelStatus": "Status",
|
||||
"labelOutbound": "Outbound",
|
||||
"labelNode": "Nó",
|
||||
"labelError": "Erro",
|
||||
"labelDelay": "Latência",
|
||||
"labelDetail": "Detalhe",
|
||||
"labelUsername": "Nome de usuário",
|
||||
"labelIP": "IP",
|
||||
"labelReason": "Motivo",
|
||||
"labelSource": "Origem",
|
||||
"labelTime": "Horário",
|
||||
"statusCrashed": "FALHOU",
|
||||
"statusRunning": "Em execução",
|
||||
"statusHigh": "ALTA",
|
||||
"statusSuccess": "SUCESSO",
|
||||
"statusFailed": "FALHOU",
|
||||
|
||||
Reference in New Issue
Block a user