精简版第四轮补裁(P4): 页面层摘除 + Xray更新端点下线 + 本机核心监管下线

页面层(用户真机截图发现前两轮漏裁):
- 设置: 摘除 Telegram机器人/邮件菜单与页面, 及页内残留入口(通知页/外部流量/LDAP/2FA设置页)
- Xray配置: 摘除负载均衡/DNS/高级配置菜单与页面; 基础配置(出站+路由)完好
- 总览: 摘除 Xray更新弹窗(VersionModal+GeodataSection)全部入口, 版本号改为静态展示
- 13个locale同步摘除461个已删功能专属翻译键(逐键核查前后端引用为零; i18n-dead-keys测试全绿)

Xray更新后端(经调查确认仅服务本机bin/xray, 与agent下发/订阅无关):
- 删除 getXrayVersion/installXray/updateGeofile 路由与handler(访问返回404)
- 删除 ServerService 对应实现与校验和函数; 同步api-docs/monitor白名单/openapi

本机核心监管下线(设计: 主控永不运行本机xray, 入站全在agent):
- XrayService.RestartXray 降级为no-op(一次性Warning说明日志); StopXray无进程时幂等返回
- web.go 摘除启动拉起本机核心/CheckXrayRunning看门狗(1s)/ApplyPendingRestart cron(30s)/XrayTrafficJob/CheckClientIpJob 注册
- ApplyPendingRestart 降级为消费即清, 其测试更新为新语义
- XrayMetricsService.Sample 短路: 不再每2s探本机/debug/vars, 状态优雅置为不可用
- 配置生成(纯JSON)/agent链路/订阅/入站CRUD未动; 状态读数优雅归零(stop/Unknown)

注: TestGetXrayConfig_EnabledClientsStillEmitted 在基线945b3a5同样失败(既有问题, 非本轮引入)
This commit is contained in:
Muse
2026-10-20 14:58:05 +00:00
parent 945b3a56a2
commit 4828f946b1
56 changed files with 149 additions and 11458 deletions
+4 -466
View File
@@ -67,16 +67,12 @@
"success": "Com Sucesso",
"lastOnline": "Última vez online",
"lastSubFetch": "Última busca da assinatura",
"getVersion": "Obter Versão",
"install": "Instalar",
"clients": "Clientes",
"usage": "Uso",
"twoFactorCode": "Código",
"remained": "Restante",
"security": "Segurança",
"emptyDnsDesc": "Nenhum servidor DNS adicionado.",
"emptyFakeDnsDesc": "Nenhum servidor Fake DNS adicionado.",
"emptyBalancersDesc": "Nenhum balanceador adicionado.",
"somethingWentWrong": "Algo deu errado",
"subscription": {
"title": "Informações da assinatura",
@@ -86,7 +82,6 @@
"uploaded": "Enviado",
"expiry": "Validade",
"totalQuota": "Cota total",
"individualLinks": "Links individuais",
"active": "Ativo",
"inactive": "Inativo",
"unlimited": "Ilimitado",
@@ -136,9 +131,6 @@
"xrayStatus": "Xray",
"stopXray": "Parar",
"restartXray": "Reiniciar",
"xraySwitch": "Versão",
"xrayUpdates": "Atualizações do Xray",
"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.",
"currentPanelVersion": "Versão atual do painel",
@@ -200,9 +192,6 @@
"download": "Download",
"sent": "Enviado",
"received": "Recebido",
"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.",
"panelUpdateStartedPopover": "Atualização do painel iniciada",
@@ -210,24 +199,6 @@
"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.",
"panelUpdateUnknownTitle": "Não foi possível confirmar se a atualização terminou",
"panelUpdateUnknownDesc": "O painel não retornou um resultado a tempo. Recarregue a página para verificar a versão atual, ou verifique os logs do servidor.",
"geofileUpdateDialog": "Você realmente deseja atualizar o geofile?",
"geofileUpdateDialogDesc": "Isso atualizará o arquivo #filename#.",
"geofilesUpdateDialogDesc": "Isso atualizará todos os arquivos.",
"geofilesUpdateAll": "Atualizar tudo",
"geofileUpdatePopover": "Geofile atualizado com sucesso",
"geodataTitle": "Atualização automática de Geodata",
"geodataHint": "O Xray baixa esses arquivos conforme o agendamento e os recarrega sem reiniciar. As URLs devem ser HTTPS. Cada arquivo já deve existir na pasta bin para que o Xray possa atualizá-lo.",
"geodataCron": "Agendamento (cron)",
"geodataOutbound": "Baixar através de outbound (opcional)",
"geodataFile": "Nome do arquivo",
"geodataAddFile": "Adicionar arquivo",
"geodataSaveRestart": "Salvar e reiniciar o Xray",
"geodataConfirmTitle": "Salvar configurações de geodata?",
"geodataConfirmContent": "O modelo de configuração do Xray será atualizado e o Xray será reiniciado.",
"geodataInvalidUrl": "Cada arquivo precisa de uma URL HTTPS.",
"geodataInvalidFile": "O nome do arquivo deve ser simples, ex.: geosite_custom.dat (sem caminhos).",
"geodataInvalidCron": "O cron deve ter 5 campos, ex.: 0 4 * * *",
"geodataEmpty": "Nenhum arquivo configurado. Nas regras de roteamento, referencie como ext:geosite_custom.dat:category.",
"dontRefresh": "Instalação em andamento, por favor não atualize a página",
"logs": "Logs",
"accessLogs": "Logs de acesso",
@@ -1082,7 +1053,6 @@
"warnDefaultBasePath": "O caminho base padrão \"/\" é bem conhecido — altere para um caminho aleatório.",
"warnDefaultSubPath": "O caminho de assinatura padrão \"/sub/\" é bem conhecido — altere-o.",
"warnDefaultJsonPath": "O caminho de assinatura JSON padrão \"/json/\" é bem conhecido — altere-o.",
"TGBotSettings": "Bot do Telegram",
"panelListeningIP": "IP de Escuta",
"panelListeningIPDesc": "O endereço IP para o painel web. (deixe em branco para escutar em todos os IPs)",
"panelListeningDomain": "Domínio de Escuta",
@@ -1107,43 +1077,12 @@
"currentPassword": "Senha Atual",
"newUsername": "Novo Nome de Usuário",
"newPassword": "Nova Senha",
"telegramBotEnable": "Ativar Bot do Telegram",
"telegramBotEnableDesc": "Ativa o bot do Telegram.",
"telegramToken": "Token do Telegram",
"telegramTokenDesc": "O token do bot do Telegram obtido de '{'@'}BotFather'.",
"telegramProxy": "Proxy SOCKS",
"telegramProxyDesc": "Ativa o proxy SOCKS5 para conectar ao Telegram. (ajuste as configurações conforme o guia)",
"telegramAPIServer": "Servidor API do Telegram",
"telegramAPIServerDesc": "O servidor API do Telegram a ser usado. Deixe em branco para usar o servidor padrão.",
"telegramChatId": "ID de Chat do Administrador",
"telegramChatIdDesc": "O(s) ID(s) de Chat do Administrador no Telegram. (separado por vírgulas)(obtenha aqui {'@'}userinfobot) ou (use o comando '/id' no bot)",
"telegramNotifyTime": "Hora da Notificação",
"telegramNotifyTimeDesc": "Com que frequência o bot do Telegram envia relatórios periódicos. Escolha um intervalo predefinido ou selecione Personalizado para inserir uma expressão crontab.",
"notifyTime": {
"every": "@every — repetir em um intervalo",
"hourly": "@hourly — a cada hora",
"daily": "@daily — todos os dias às 00:00",
"weekly": "@weekly — toda semana",
"monthly": "@monthly — todo mês",
"custom": "Personalizado (crontab)",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas",
"interval": "Intervalo",
"unit": "Unidade"
},
"tgNotifyBackup": "Backup do Banco de Dados",
"tgNotifyBackupDesc": "Enviar arquivo de backup do banco de dados junto com o relatório.",
"tgNotifyLogin": "Notificação de Login",
"tgNotifyLoginDesc": "Receba notificações sobre o nome de usuário, endereço IP e horário sempre que alguém tentar fazer login no seu painel web.",
"sessionMaxAge": "Duração da Sessão",
"sessionMaxAgeDesc": "A duração pela qual você pode permanecer logado. (unidade: minuto)",
"expireTimeDiff": "Notificação de Expiração",
"expireTimeDiffDesc": "Receba notificações sobre a data de expiração ao atingir esse limite. (unidade: dia)",
"trafficDiff": "Notificação de Limite de Tráfego",
"trafficDiffDesc": "Receba notificações sobre o limite de tráfego ao atingir esse limite. (unidade: GB)",
"tgNotifyCpu": "Notificação de Carga da CPU",
"tgNotifyCpuDesc": "Receba notificações se a carga da CPU ultrapassar esse limite. (unidade: %)",
"timeZone": "Fuso Horário",
"timeZoneDesc": "As tarefas agendadas serão executadas com base nesse fuso horário.",
"subSettings": "Assinatura",
@@ -1208,10 +1147,6 @@
"subEncryptDesc": "O conteúdo retornado pelo serviço de assinatura será codificado em Base64.",
"subURI": "URI de Proxy Reverso",
"subURIDesc": "A URL base completa (scheme://dominio[:porta]/caminho/) para o link de assinatura e o código QR, usada em vez de Domínio/Porta de Escuta. Configure isso sempre que a assinatura for acessada por um proxy reverso ou um domínio/porta diferente dos acima.",
"externalTrafficInformEnable": "Informações de tráfego externo",
"externalTrafficInformEnableDesc": "Informar API externa a cada atualização de tráfego.",
"externalTrafficInformURI": "URI de informação de tráfego externo",
"externalTrafficInformURIDesc": "As atualizações de tráfego são enviadas para este URI.",
"restartXrayOnClientDisable": "Reiniciar Xray Após Desativação Automática",
"restartXrayOnClientDisableDesc": "Quando um cliente for desativado automaticamente por expiração ou limite de tráfego, reinicie o Xray.",
"fragment": "Fragmentação",
@@ -1221,38 +1156,6 @@
"noisesSett": "Configurações de Noises",
"trustedProxyCidrs": "CIDRs de proxy confiável",
"trustedProxyCidrsDesc": "IPs/CIDRs separados por vírgula que podem definir os cabeçalhos host, proto e IP do cliente encaminhados.",
"ldap": {
"enable": "Habilitar sincronização LDAP",
"host": "Host LDAP",
"port": "Porta LDAP",
"useTls": "Usar TLS (LDAPS)",
"skipTlsVerify": "Pular verificação de certificado TLS",
"skipTlsVerifyDesc": "Inseguro — desativa a validação do certificado do servidor. Use apenas com CAs internos/não confiáveis.",
"bindDn": "Bind DN",
"passwordConfigured": "Configurada; deixe em branco para manter a senha atual.",
"passwordUnconfigured": "Não configurada.",
"passwordPlaceholder": "Configurada — digite um novo valor para substituir",
"baseDn": "Base DN",
"userFilter": "Filtro de usuário",
"userAttr": "Atributo de usuário (username/email)",
"vlessField": "Atributo flag VLESS",
"flagField": "Atributo flag genérico (opcional)",
"flagFieldDesc": "Se definido, sobrescreve o flag VLESS — ex. shadowInactive.",
"truthyValues": "Valores truthy",
"truthyValuesDesc": "Separados por vírgula; padrão: true,1,yes,on",
"invertFlag": "Inverter flag",
"invertFlagDesc": "Habilite quando o atributo significar «desabilitado» (ex. shadowInactive).",
"syncSchedule": "Agendamento da sincronização",
"syncScheduleDesc": "String tipo cron, ex. @every 1m",
"inboundTags": "Tags de entradas",
"inboundTagsDesc": "Entradas nas quais a sincronização LDAP pode auto-criar ou auto-excluir clientes.",
"noInbounds": "Nenhuma entrada encontrada. Crie uma em Entradas primeiro.",
"autoCreate": "Criar clientes automaticamente",
"autoDelete": "Excluir clientes automaticamente",
"defaultTotalGb": "Total padrão (GB)",
"defaultExpiryDays": "Expiração padrão (dias)",
"defaultIpLimit": "Limite de IP padrão"
},
"subFormats": {
"finalMask": "Final Mask",
"finalMaskDesc": "Injeta máscaras TCP/UDP do finalmask do Xray e parâmetros QUIC em cada perfil Xray JSON gerado. Requer um aplicativo compatível com assinaturas Xray JSON e um núcleo Xray recente.",
@@ -1276,31 +1179,15 @@
"muxSett": "Configurações de Mux",
"direct": "Conexão Direta",
"directDesc": "Estabelece conexões diretamente com domínios ou intervalos de IP de um país específico.",
"notifications": "Notificações",
"certs": "Certificados",
"externalTraffic": "Tráfego Externo",
"dateAndTime": "Data e Hora",
"proxyAndServer": "Proxy e Servidor",
"intervals": "Intervalos",
"information": "Informação",
"profile": "Perfil",
"language": "Idioma",
"telegramBotLanguage": "Idioma do Bot do Telegram",
"security": {
"admin": "Credenciais de administrador",
"twoFactor": "Autenticação de dois fatores",
"twoFactorEnable": "Ativar 2FA",
"twoFactorEnableDesc": "Adiciona uma camada extra de autenticação para mais segurança.",
"twoFactorModalSetTitle": "Ativar autenticação de dois fatores",
"twoFactorModalDeleteTitle": "Desativar autenticação de dois fatores",
"twoFactorModalSteps": "Para configurar a autenticação de dois fatores, siga alguns passos:",
"twoFactorModalFirstStep": "1. Escaneie este QR code no aplicativo de autenticação ou copie o token próximo ao QR code e cole no aplicativo",
"twoFactorModalSecondStep": "2. Digite o código do aplicativo",
"twoFactorModalRemoveStep": "Digite o código do aplicativo para remover a autenticação de dois fatores.",
"twoFactorModalChangeCredentialsTitle": "Alterar credenciais",
"twoFactorModalChangeCredentialsStep": "Insira o código do aplicativo para alterar as credenciais do administrador.",
"twoFactorModalSetSuccess": "A autenticação de dois fatores foi estabelecida com sucesso",
"twoFactorModalDeleteSuccess": "A autenticação de dois fatores foi excluída com sucesso",
"twoFactorModalError": "Código incorreto",
"show": "Mostrar",
"hide": "Ocultar",
@@ -1323,36 +1210,6 @@
"getOutboundTrafficError": "Erro ao obter tráfego de saída",
"resetOutboundTrafficError": "Erro ao redefinir tráfego de saída"
},
"smtpSettings": "Configurações SMTP",
"smtpEnable": "Ativar notificações por e-mail",
"smtpEnableDesc": "Ativar notificações por e-mail via SMTP",
"smtpHost": "Servidor SMTP",
"smtpHostDesc": "Nome do host do servidor SMTP (ex.: smtp.gmail.com)",
"smtpPort": "Porta SMTP",
"smtpPortDesc": "Porta do servidor SMTP (padrão: 587)",
"smtpUsername": "Usuário SMTP",
"smtpUsernameDesc": "Nome de usuário para autenticação SMTP",
"smtpFrom": "Endereço do remetente (From)",
"smtpFromDesc": "Endereço usado no cabeçalho From do e-mail. Deixe vazio para usar o nome de usuário.",
"smtpFromName": "Nome do remetente (From)",
"smtpFromNameDesc": "Nome de exibição opcional antes do endereço no cabeçalho From.",
"smtpPassword": "Senha SMTP",
"smtpPasswordDesc": "Senha para autenticação SMTP",
"smtpTo": "Destinatários",
"smtpToDesc": "Endereços de e-mail dos destinatários separados por vírgula",
"emailSettings": "E-mail",
"emailNotifications": "Notificações",
"smtpEventBusNotify": "Notificações de eventos por e-mail",
"smtpEventBusNotifyDesc": "Selecione quais eventos disparam notificações por e-mail",
"tgEventBusNotify": "Notificações de eventos no Telegram",
"tgEventBusNotifyDesc": "Selecione quais eventos disparam notificações no Telegram",
"testSmtp": "Enviar e-mail de teste",
"testTgBot": "Enviar mensagem de teste",
"eventGroupOutbound": "Outbound",
"eventGroupXray": "Núcleo Xray",
"eventGroupSystem": "Sistema",
"eventGroupSecurity": "Segurança",
"eventGroupNode": "Nós",
"eventOutboundDown": "Inativo",
"eventOutboundUp": "Ativo",
"eventXrayCrash": "Falha",
@@ -1360,36 +1217,7 @@
"eventNodeUp": "Ativo",
"eventCPUHigh": "CPU alta (%)",
"requestFailed": "Falha na requisição",
"smtpEncryption": "Criptografia",
"smtpEncryptionDesc": "Método de criptografia da conexão SMTP",
"smtpEncryptionNone": "Nenhuma (texto puro)",
"smtpEncryptionStartTLS": "STARTTLS",
"smtpEncryptionTLS": "TLS (implícito)",
"smtpStageConnect": "Conexão",
"smtpStageAuth": "Autenticação",
"smtpStageSend": "Envio",
"smtpTestSuccess": "E-mail de teste enviado com sucesso",
"smtpHostNotConfigured": "Servidor SMTP não configurado",
"smtpNoRecipients": "Nenhum destinatário configurado",
"smtpFromNotConfigured": "Endereço do remetente SMTP não configurado",
"eventLoginAttempt": "Tentativa de login",
"telegramTokenConfigured": "Configurado; deixe em branco para manter o token atual.",
"telegramTokenPlaceholder": "Configurado - insira um novo token para substituir",
"smtpPasswordConfigured": "Configurada; deixe em branco para manter a senha atual.",
"smtpPasswordPlaceholder": "Configurada - insira uma nova senha para substituir",
"smtpNotInitialized": "SMTP não inicializado",
"tgBotNotEnabled": "O bot do Telegram não está ativado",
"tgTestFailed": "Falha no teste do Telegram",
"tgTestSuccess": "Mensagem de teste enviada ao Telegram",
"tgBotNotRunning": "O bot do Telegram não está em execução",
"smtpErrorAuth": "Falha na autenticação — verifique o nome de usuário e a senha",
"smtpErrorStarttls": "O servidor requer STARTTLS — altere o tipo de criptografia",
"smtpErrorTls": "O servidor requer TLS — altere o tipo de criptografia",
"smtpErrorRefused": "Conexão recusada — verifique o host e a porta",
"smtpErrorTimeout": "Tempo de conexão esgotado — host inacessível",
"smtpErrorRelay": "O servidor rejeita o envio a partir deste endereço",
"smtpErrorEof": "Conexão encerrada pelo servidor",
"smtpErrorUnknown": "Erro de SMTP: {{ .Error }}",
"eventMemoryHigh": "Uso de memória alto (%)",
"remarkTemplate": "Modelo de Observação",
"remarkTemplateDesc": "Quando definido, isto substitui o modelo de observação de cada link de assinatura — escreva seu próprio formato com os tokens de variáveis (use o botão para inseri-los). Deixe vazio para usar o modelo acima.",
@@ -1483,8 +1311,6 @@
"directdomains": "Domínios Diretos",
"ipv4Routing": "Roteamento IPv4",
"ipv4RoutingDesc": "Essas opções roteam o tráfego para um destino específico via IPv4.",
"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",
"FreedomStrategyDesc": "Definir a estratégia de saída para a rede no Protocolo Freedom.",
"FreedomHappyEyeballs": "Freedom Happy Eyeballs (IPv4/IPv6)",
@@ -1500,11 +1326,6 @@
"Balancers": "Balanceadores",
"balancerTagRequired": "A tag é obrigatória",
"balancerSelectorRequired": "Selecione pelo menos uma saída",
"balancerLive": "Destino atual",
"balancerOverride": "Forçar destino",
"balancerOverridePh": "Automático (estratégia)",
"balancerLiveRefresh": "Atualizar estado do balanceador",
"balancerNotRunning": "Este balanceador não está ativo no Xray em execução — salve as alterações ou inicie o Xray primeiro",
"routeTester": "Teste de rota",
"routeTesterDesc": "Pergunte ao Xray em execução qual saída trataria uma conexão. Nenhum tráfego é enviado — a decisão vem diretamente do motor de roteamento ao vivo.",
"routeTesterDest": "Domínio ou IP",
@@ -1516,7 +1337,6 @@
"routeTesterViaBalancer": "via balanceador",
"routeTesterDefaultOutbound": "Nenhuma regra de roteamento correspondeu — o tráfego vai para a saída padrão (primeira).",
"Routings": "Regras de Roteamento",
"completeTemplate": "Tudo",
"logLevel": "Nível de Log",
"logLevelDesc": "O nível de log para erros, indicando a informação que precisa ser registrada.",
"accessLog": "Log de Acesso",
@@ -1544,7 +1364,6 @@
"source": "Fonte",
"dest": "Destino",
"inbound": "Entrada",
"balancer": "Balanceador",
"useComma": "Itens separados por vírgula"
},
"routing": {
@@ -1725,32 +1544,7 @@
"alreadyAdded": "Este servidor já está na lista de saídas. Use {reset} para renovar a chave.",
"provisionFailed": "Não foi possível criar a saída PIA. Tente novamente."
},
"tabBalancerSettings": "Configurações do balanceador",
"tabObservatory": "Observatório",
"observatory": {
"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.",
"subjectSelector": "Saídas monitoradas",
"subjectSelectorDesc": "Tags de saída que este observador sonda. Gerenciadas automaticamente a partir dos seus balanceadores.",
"probeURL": "URL de sondagem",
"probeURLDesc": "URL requisitada para medir cada saída. Deve retornar HTTP 204.",
"probeInterval": "Intervalo de sondagem",
"probeIntervalDesc": "Com que frequência sondar cada saída, ex.: 30s, 1m, 2h45m.",
"enableConcurrency": "Sondagem concorrente",
"enableConcurrencyDesc": "Sonda todas as saídas monitoradas de uma vez, em vez de uma a uma. Mais rápido, mas mais visível na rede.",
"destination": "Destino da sondagem",
"destinationDesc": "URL requisitada para medir cada saída. Deve retornar HTTP 204.",
"connectivity": "Verificação de conectividade",
"connectivityDesc": "URL opcional de verificação da rede local, testada apenas após o destino falhar. Deixe vazio para ignorar.",
"interval": "Intervalo de sondagem",
"intervalDesc": "Tempo médio entre sondagens por saída, ex.: 1m. Mínimo 10s.",
"timeout": "Tempo limite da sondagem",
"timeoutDesc": "Quanto esperar por uma sondagem antes de considerá-la falha, ex.: 5s.",
"sampling": "Número de amostras",
"samplingDesc": "Número de resultados de sondagem recentes mantidos para pontuar cada saída.",
"httpMethod": "Método HTTP",
"httpMethodDesc": "Método HTTP usado nas sondagens.",
"deleteAlsoObservatory": "Este é o último balanceador que usa o Observatório, então ele também será removido.",
"deleteAlsoBurst": "Este é o último balanceador que usa o Observatório Burst, então ele também será removido."
},
@@ -1762,25 +1556,7 @@
},
"balancer": {
"balancerStrategy": "Estratégia",
"tag": "Tag",
"tagDuplicate": "Tag já usada por outro balanceador",
"tagPlaceholder": "tag única do balanceador",
"selector": "Seletor",
"fallback": "Fallback",
"cycleTooltip": "Ciclo: {path} → (voltar para {start})",
"expected": "Esperado",
"expectedPlaceholder": "número ótimo de nós",
"maxRtt": "Máx. RTT",
"tolerance": "Tolerância",
"baselines": "Baselines",
"costs": "Costs",
"costMatch": "Padrão de tag",
"costValue": "Peso",
"costRegexp": "Correspondência por expressão regular",
"balancerDeleteInUse": "Não é possível excluir este balanceador — ele é usado como fallback para: {names}",
"balancerFallbackCycle": "Não é possível definir este balanceador como fallback — isso criaria uma dependência circular.",
"balancerFallbackInfo": "O tráfego será roteado através de: Balanceador → Loopback → Servidor → Balanceador de destino → Conexão de saída. Isso adiciona um salto extra pelo servidor, o que pode introduzir pequenos atrasos.",
"fallbackBalancerHint": "Selecione outro balanceador como fallback",
"reservedPrefix": "O prefixo _bl_ é reservado para objetos loopback internos do balanceador"
},
"wireguard": {
@@ -1883,55 +1659,8 @@
"usage": "Uso",
"addOutbound": "Adicionar saída"
},
"dns": {
"enable": "Ativar DNS",
"enableDesc": "Ativar o servidor DNS integrado",
"tag": "Tag de Entrada DNS",
"tagDesc": "Esta tag estará disponível como uma tag de Entrada nas regras de roteamento.",
"clientIp": "IP do Cliente",
"clientIpDesc": "Usado para notificar o servidor sobre a localização IP especificada durante consultas DNS",
"disableCache": "Desativar cache",
"disableCacheDesc": "Desativa o cache de DNS",
"disableFallback": "Desativar Fallback",
"disableFallbackDesc": "Desativa consultas DNS de fallback",
"disableFallbackIfMatch": "Desativar Fallback Se Corresponder",
"disableFallbackIfMatchDesc": "Desativa consultas DNS de fallback quando a lista de domínios correspondentes do servidor DNS é atingida",
"enableParallelQuery": "Habilitar Consulta Paralela",
"enableParallelQueryDesc": "Habilitar consultas DNS paralelas para múltiplos servidores para resolução mais rápida",
"strategy": "Estratégia de Consulta",
"strategyDesc": "Estratégia geral para resolver nomes de domínio",
"add": "Adicionar Servidor",
"edit": "Editar Servidor",
"domains": "Domínios",
"expectIPs": "IPs Esperadas",
"unexpectIPs": "IPs inesperados",
"useSystemHosts": "Usar Hosts do sistema",
"useSystemHostsDesc": "Usar o arquivo hosts de um sistema instalado",
"serveStale": "Servir Expirados",
"serveStaleDesc": "Retornar resultados expirados do cache enquanto atualiza em segundo plano",
"serveExpiredTTL": "TTL de Expirados",
"serveExpiredTTLDesc": "Validade (segundos) das entradas expiradas no cache; 0 = nunca expira",
"timeoutMs": "Tempo limite (ms)",
"skipFallback": "Ignorar Fallback",
"finalQuery": "Consulta Final",
"hosts": "Hosts",
"hostsAdd": "Adicionar Host",
"hostsEmpty": "Nenhum Host definido",
"hostsDomain": "Domínio (ex. domain:example.com)",
"hostsValues": "IP ou domínio — digite e pressione Enter",
"usePreset": "Usar modelo",
"dnsPresetTitle": "Modelos DNS",
"dnsPresetFamily": "Familiar",
"clearAll": "Remover Todos",
"clearAllTitle": "Remover todos os servidores DNS?",
"clearAllConfirm": "Isso remove todos os servidores DNS da lista. Não pode ser desfeito.",
"dnsLeakWarning": "DNS pode vazar por localhost, UDP/TCP sem criptografia, DoH/DoQ em modo local, consultas de fallback ou EDNS client IP. Use DoH roteado, fixe resolvedores em hosts e desative fallback quando privacidade importar."
},
"fakedns": {
"add": "Adicionar Fake DNS",
"ipPool": "Sub-rede do Pool de IP",
"poolSize": "Tamanho do Pool"
},
"dns": {},
"fakedns": {},
"defaultOutbound": "Saída padrão",
"defaultOutboundDesc": "Tráfego sem regra de roteamento usa esta saída (a primeira da lista)."
},
@@ -2055,198 +1784,7 @@
}
},
"tgbot": {
"keyboardClosed": "❌ Teclado fechado!",
"noResult": "❗ Nenhum resultado!",
"noQuery": "❌ Consulta não encontrada! Por favor, use o comando novamente!",
"wentWrong": "❌ Algo deu errado!",
"noIpRecord": "❗ Nenhum registro de IP!",
"noInbounds": "❗ Nenhum inbound encontrado!",
"unlimited": "♾ Ilimitado (Reset)",
"add": "Adicionar",
"month": "Mês",
"months": "Meses",
"days": "Dias",
"hours": "Horas",
"minutes": "Minutos",
"unknown": "Desconhecido",
"inbounds": "Entradas",
"clients": "Clientes",
"offline": "🔴 Offline",
"online": "🟢 Online",
"commands": {
"unknown": "❗ Comando desconhecido.",
"pleaseChoose": "👇 Escolha:\r\n",
"help": "🤖 Bem-vindo a este bot! Ele foi projetado para oferecer dados específicos do painel da web e permite que você faça as modificações necessárias.\r\n\r\n",
"start": "👋 Olá <i>{{ .Firstname }}</i>.\r\n",
"welcome": "🤖 Bem-vindo ao bot de gerenciamento do <b>{{ .Hostname }}</b>.\r\n",
"status": "✅ Bot está OK!",
"usage": "❗ Por favor, forneça um texto para pesquisar!",
"getID": "🆔 Seu ID: <code>{{ .ID }}</code>",
"helpAdminCommands": "Para reiniciar o Xray Core:\r\n<code>/restart</code>\r\n\r\nPara pesquisar por um email de cliente:\r\n<code>/usage [Email]</code>\r\n\r\nPara pesquisar por inbounds (com estatísticas do cliente):\r\n<code>/inbound [Remark]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>",
"helpClientCommands": "Para pesquisar por estatísticas, use o seguinte comando:\r\n\r\n<code>/usage [Email]</code>\r\n\r\nTelegram Chat ID:\r\n<code>/id</code>",
"restartUsage": "\r\n\r\n<code>/restart</code>",
"restartSuccess": "✅ Operação bem-sucedida!",
"restartFailed": "❗ Erro na operação.\r\n\r\n<code>Erro: {{ .Error }}</code>.",
"xrayNotRunning": "❗ Xray Core não está em execução.",
"startDesc": "Mostrar menu principal",
"helpDesc": "Ajuda do bot",
"statusDesc": "Verificar status do bot",
"idDesc": "Mostrar seu ID do Telegram",
"usageDesc": "Ver o uso do cliente: /usage email",
"inboundDesc": "Buscar entradas: /inbound nome (admin)",
"restartDesc": "Reiniciar o núcleo Xray (admin)",
"clearallDesc": "Zerar o tráfego de todos os clientes (admin)"
},
"messages": {
"cpuThreshold": "A carga da CPU {{ .Percent }}% excede o limite de {{ .Threshold }}%",
"selectUserFailed": "❌ Erro na seleção do usuário!",
"userSaved": "✅ Usuário do Telegram salvo.",
"loginSuccess": "✅ Conectado ao painel com sucesso.\r\n",
"loginFailed": "❗️Tentativa de login no painel falhou.\r\n",
"report": "🕰 Relatórios agendados: {{ .RunTime }}\r\n",
"datetime": "⏰ Data&Hora: {{ .DateTime }}\r\n",
"hostname": "💻 Host: {{ .Hostname }}\r\n",
"version": "🚀 Versão 3X-UI: {{ .Version }}\r\n",
"xrayVersion": "📡 Versão Xray: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
"ip": "🌐 IP: {{ .IP }}\r\n",
"ips": "🔢 IPs:\r\n{{ .IPs }}\r\n",
"serverUpTime": "⏳ Tempo de atividade: {{ .UpTime }} {{ .Unit }}\r\n",
"serverLoad": "📈 Carga do sistema: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n",
"serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n",
"tcpCount": "🔹 TCP: {{ .Count }}\r\n",
"udpCount": "🔸 UDP: {{ .Count }}\r\n",
"traffic": "🚦 Tráfego: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n",
"xrayStatus": "ℹ️ Status: {{ .State }}\r\n",
"username": "👤 Nome de usuário: {{ .Username }}\r\n",
"reason": "❗️ Motivo: {{ .Reason }}\r\n",
"time": "⏰ Hora: {{ .Time }}\r\n",
"inbound": "📍 Entrada: {{ .Remark }}\r\n",
"port": "🔌 Porta: {{ .Port }}\r\n",
"expire": "📅 Data de expiração: {{ .Time }}\r\n",
"expireIn": "📅 Expira em: {{ .Time }}\r\n",
"active": "💡 Ativo: {{ .Enable }}\r\n",
"enabled": "🚨 Ativado: {{ .Enable }}\r\n",
"online": "🌐 Status da conexão: {{ .Status }}\r\n",
"lastOnline": "🔙 Última vez online: {{ .Time }}\r\n",
"email": "📧 Email: {{ .Email }}\r\n",
"upload": "🔼 Upload: ↑{{ .Upload }}\r\n",
"download": "🔽 Download: ↓{{ .Download }}\r\n",
"total": "📊 Total: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
"TGUser": "👤 Usuário do Telegram: {{ .TelegramID }}\r\n",
"exhaustedCount": "🚨 Contagem de {{ .Type }} esgotado:\r\n",
"onlinesCount": "🌐 Clientes online: {{ .Count }}\r\n",
"disabled": "🛑 Desativado: {{ .Disabled }}\r\n",
"depleteSoon": "🔜 Esgotar em breve: {{ .Deplete }}\r\n\r\n",
"backupTime": "🗄 Hora do backup: {{ .Time }}\r\n",
"refreshedOn": "\r\n📋🔄 Atualizado em: {{ .Time }}\r\n\r\n",
"yes": "✅ Sim",
"no": "❌ Não",
"received_email": "📧📥 E-mail atualizado.",
"received_comment": "💬📥 Comentário atualizado.",
"email_prompt": "📧 E-mail Padrão: {{ .ClientEmail }}\n\nDigite seu e-mail.",
"comment_prompt": "💬 Comentário Padrão: {{ .ClientComment }}\n\nDigite seu comentário.",
"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. 😊",
"incorrect_input": "Sua entrada não é válida.\nAs frases devem ser contínuas, sem espaços.\nExemplo correto: aaaaaa\nExemplo incorreto: aaa aaa 🚫",
"AreYouSure": "Você tem certeza? 🤔",
"SuccessResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ✅ Sucesso",
"FailedResetTraffic": "📧 Email: {{ .ClientEmail }}\n🏁 Resultado: ❌ Falhou \n\n🛠️ Erro: [ {{ .ErrorMessage }} ]",
"FinishProcess": "🔚 Processo de redefinição de tráfego concluído para todos os clientes.",
"eventOutboundDown": "O outbound {{ .Tag }} está INATIVO",
"eventOutboundUp": "O outbound {{ .Tag }} está ATIVO",
"eventErrorDetail": "Erro: {{ .Error }}",
"eventDelayDetail": "Latência: {{ .Delay }}ms",
"eventXrayCrash": "O Xray FALHOU",
"eventXrayCrashError": "Erro: {{ .Error }}",
"eventNodeDown": "O nó {{ .Name }} está INATIVO",
"eventNodeUp": "O nó {{ .Name }} está ATIVO",
"eventLoginFallback": "Falha de login a partir de {{ .Source }}",
"memoryThreshold": "Uso de memória {{ .Percent }}% excede o limite de {{ .Threshold }}%"
},
"buttons": {
"closeKeyboard": "❌ Fechar teclado",
"cancel": "❌ Cancelar",
"cancelReset": "❌ Cancelar redefinição",
"cancelIpLimit": "❌ Cancelar limite de IP",
"confirmResetTraffic": "✅ Confirmar redefinição de tráfego?",
"confirmClearIps": "✅ Confirmar limpar IPs?",
"confirmRemoveTGUser": "✅ Confirmar remover usuário do Telegram?",
"confirmToggle": "✅ Confirmar ativar/desativar usuário?",
"dbBackup": "Obter backup do DB",
"serverUsage": "Uso do servidor",
"getInbounds": "Obter Inbounds",
"depleteSoon": "Esgotar em breve",
"clientUsage": "Obter uso",
"onlines": "Clientes online",
"commands": "Comandos",
"refresh": "🔄 Atualizar",
"clearIPs": "❌ Limpar IPs",
"removeTGUser": "❌ Remover usuário do Telegram",
"selectTGUser": "👤 Selecionar usuário do Telegram",
"selectOneTGUser": "👤 Selecione um usuário do Telegram:",
"resetTraffic": "📈 Redefinir tráfego",
"resetExpire": "📅 Alterar data de expiração",
"ipLog": "🔢 Log de IP",
"ipLimit": "🔢 Limite de IP",
"setTGUser": "👤 Definir usuário do Telegram",
"toggle": "🔘 Ativar / Desativar",
"custom": "🔢 Personalizado",
"confirmNumber": "✅ Confirmar: {{ .Num }}",
"confirmNumberAdd": "✅ Confirmar adicionar: {{ .Num }}",
"limitTraffic": "🚧 Limite de tráfego",
"getBanLogs": "Obter logs de banimento",
"allClients": "Todos os clientes",
"addClient": "Adicionar Cliente",
"submitDisable": "Enviar como Desativado ☑️",
"submitEnable": "Enviar como Ativado ✅",
"use_default": "🏷️ Usar padrão",
"change_email": "⚙️📧 Email",
"change_comment": "⚙️💬 Comentário",
"ResetAllTraffics": "Redefinir Todo o Tráfego",
"SortedTrafficUsageReport": "Relatório de Uso de Tráfego Ordenado"
},
"answers": {
"successfulOperation": "✅ Operação bem-sucedida!",
"errorOperation": "❗ Erro na operação.",
"getInboundsFailed": "❌ Falha ao obter inbounds.",
"getClientsFailed": "❌ Falha ao obter clientes.",
"canceled": "❌ {{ .Email }}: Operação cancelada.",
"clientRefreshSuccess": "✅ {{ .Email }}: Cliente atualizado com sucesso.",
"IpRefreshSuccess": "✅ {{ .Email }}: IPs atualizados com sucesso.",
"TGIdRefreshSuccess": "✅ {{ .Email }}: Usuário do Telegram do cliente atualizado com sucesso.",
"resetTrafficSuccess": "✅ {{ .Email }}: Tráfego redefinido com sucesso.",
"setTrafficLimitSuccess": "✅ {{ .Email }}: Limite de tráfego salvo com sucesso.",
"expireResetSuccess": "✅ {{ .Email }}: Dias de expiração redefinidos com sucesso.",
"resetIpSuccess": "✅ {{ .Email }}: Limite de IP {{ .Count }} salvo com sucesso.",
"clearIpSuccess": "✅ {{ .Email }}: IPs limpos com sucesso.",
"getIpLog": "✅ {{ .Email }}: Obter log de IP.",
"getUserInfo": "✅ {{ .Email }}: Obter informações do usuário do Telegram.",
"removedTGUserSuccess": "✅ {{ .Email }}: Usuário do Telegram removido com sucesso.",
"enableSuccess": "✅ {{ .Email }}: Ativado com sucesso.",
"disableSuccess": "✅ {{ .Email }}: Desativado com sucesso.",
"askToAddUserId": "Sua configuração não foi encontrada!\r\nPeça ao seu administrador para usar seu Telegram ChatID em suas configurações.\r\n\r\nSeu ChatID: <code>{{ .TgUserID }}</code>",
"chooseClient": "Escolha um cliente para Inbound {{ .Inbound }}",
"chooseInbound": "Escolha um Inbound"
}
"noIpRecord": "❗ Nenhum registro de IP!"
},
"email": {
"labelStatus": "Status",
"labelOutbound": "Outbound",
"labelNode": "Nó",
"labelError": "Erro",
"labelDelay": "Latência",
"labelUsername": "Nome de usuário",
"labelIP": "IP",
"labelReason": "Motivo",
"labelSource": "Origem",
"statusCrashed": "FALHOU",
"statusHigh": "ALTA",
"statusSuccess": "SUCESSO",
"statusFailed": "FALHOU",
"statusDown": "INATIVO",
"statusUp": "ATIVO"
}
"email": {}
}