diff --git a/README.md b/README.md
index 2a65c2e6b..551997718 100644
--- a/README.md
+++ b/README.md
@@ -11,13 +11,14 @@ A Clash Meta GUI based on Tauri
Languages:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## Preview
diff --git a/crates/clash-verge-i18n/locales/pt.yml b/crates/clash-verge-i18n/locales/pt.yml
new file mode 100644
index 000000000..1f0a31682
--- /dev/null
+++ b/crates/clash-verge-i18n/locales/pt.yml
@@ -0,0 +1,90 @@
+_version: 1
+notifications:
+ dashboardToggled:
+ title: Painel
+ body: A visibilidade do painel foi atualizada.
+ clashModeChanged:
+ title: Troca de modo
+ body: Alterado para {mode}.
+ systemProxyToggled:
+ title: Proxy do sistema
+ 'on': O proxy do sistema foi ativado.
+ 'off': O proxy do sistema foi desativado.
+ systemProxyFailed:
+ title: Proxy do sistema
+ body: Não foi possível definir o proxy do sistema. Abra o Clash Verge para ver o motivo.
+ systemProxyGuardStopped:
+ title: Proteção do proxy do sistema
+ body: A proteção parou após várias falhas de execução. Abra o Clash Verge para ver o motivo.
+ tunModeToggled:
+ title: Modo TUN
+ 'on': O modo TUN foi ativado.
+ 'off': O modo TUN foi desativado.
+ lightweightModeEntered:
+ title: Modo leve
+ body: Modo leve ativado.
+ profilesReactivated:
+ title: Perfis
+ body: Perfil reativado.
+ appQuit:
+ title: Prestes a sair
+ body: O Clash Verge está prestes a sair.
+ updateReady:
+ title: Atualização do Clash Verge
+ body: Uma nova versão (v{version}) foi baixada e está pronta para instalar.
+ installNow: Instalar agora
+ later: Depois
+service:
+ adminInstallPrompt: A instalação do serviço do Clash Verge requer privilégios de administrador.
+ adminUninstallPrompt: A desinstalação do serviço do Clash Verge requer privilégios de administrador.
+launchGuard:
+ currentExeError: 'Não foi possível determinar a localização do aplicativo: {error}'
+ homeDirError: 'Não foi possível determinar o diretório pessoal do usuário atual. O aplicativo será encerrado: {error}'
+ translocated: O macOS está executando este aplicativo a partir de um caminho temporário de App Translocation. No Finder, mova-o manualmente para /Applications ou ~/Applications e abra-o novamente.
+ rejected: |-
+ Este aplicativo deve ser iniciado a partir de um diretório de Aplicativos.
+
+ {reason}
+ notInBundle: O executável não está dentro de um pacote de aplicativo.
+ canonicalizeBundleError: 'Não foi possível resolver o caminho do pacote do aplicativo: {error}'
+ bundleNameError: Não foi possível determinar o nome do pacote do aplicativo. O aplicativo será encerrado.
+ replacePrompt: Já existe um aplicativo em {destination}. Substituí-lo e reabrir a partir de Aplicativos?
+ movePrompt: Para iniciar o serviço em segundo plano com segurança, o aplicativo precisa ser movido para {destination}. Mover e reabrir agora?
+ createApplicationsDirError: 'Não foi possível criar o diretório de Aplicativos: {error}'
+ moveFailed: Falha ao mover o aplicativo. Mova-o manualmente no Finder e tente novamente.
+ replaceFailed: 'Não foi possível substituir o aplicativo existente com segurança: {error}'
+ relaunchFailed: O aplicativo foi copiado, mas não pôde ser reaberto automaticamente. Abra-o manualmente a partir de Aplicativos.
+ cancel: Cancelar
+ move: Mover
+ ok: OK
+tray:
+ dashboard: Painel
+ ruleMode: Modo regra
+ globalMode: Modo global
+ directMode: Modo direto
+ outboundModes: Modos de saída
+ rule: Regra
+ direct: Direto
+ global: Global
+ profiles: Perfis
+ proxies: Proxies
+ systemProxy: Proxy do sistema
+ tunMode: Modo TUN
+ closeAllConnections: Fechar todas as conexões
+ lightweightMode: Modo leve
+ copyEnv: Copiar variáveis de ambiente
+ confDir: Diretório de configuração
+ coreDir: Diretório do núcleo
+ logsDir: Diretório de logs
+ openDir: Abrir diretório
+ appLog: Log do aplicativo
+ coreLog: Log do núcleo
+ restartClash: Reiniciar o núcleo do Clash
+ restartApp: Reiniciar o aplicativo
+ vergeVersion: Versão do Verge
+ more: Mais
+ exit: Sair
+ tooltip:
+ systemProxy: Proxy do sistema
+ tun: TUN
+ profile: Perfil
diff --git a/docs/README_en.md b/docs/README_en.md
index 414a75366..6652cc35b 100644
--- a/docs/README_en.md
+++ b/docs/README_en.md
@@ -11,13 +11,14 @@ A Clash Meta GUI built with Tauri<
Languages:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## Preview
diff --git a/docs/README_es.md b/docs/README_es.md
index 2df191696..de797c82e 100644
--- a/docs/README_es.md
+++ b/docs/README_es.md
@@ -11,13 +11,14 @@ Una interfaz gráfica para Clash Meta construida con
Idiomas:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## Vista previa
diff --git a/docs/README_fa.md b/docs/README_fa.md
index 0c94631b8..b8ee7383f 100644
--- a/docs/README_fa.md
+++ b/docs/README_fa.md
@@ -11,13 +11,14 @@
زبانها:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## پیشنمایش
diff --git a/docs/README_ja.md b/docs/README_ja.md
index 6a06023ca..186a5f8d3 100644
--- a/docs/README_ja.md
+++ b/docs/README_ja.md
@@ -11,13 +11,14 @@
言語:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## プレビュー
diff --git a/docs/README_ko.md b/docs/README_ko.md
index a0dee6abb..d0ffbb3a5 100644
--- a/docs/README_ko.md
+++ b/docs/README_ko.md
@@ -11,13 +11,14 @@
언어:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## 미리보기
diff --git a/docs/README_pt.md b/docs/README_pt.md
new file mode 100644
index 000000000..2b8b7bb50
--- /dev/null
+++ b/docs/README_pt.md
@@ -0,0 +1,125 @@
+
+
+
+ Continuação do Clash Verge
+
+
+
+
+Uma interface gráfica para o Clash Meta construída com Tauri.
+
+
+
+ Idiomas:
+ English ·
+ Español ·
+ فارسی ·
+ 日本語 ·
+ 한국어 ·
+ Português ·
+ Русский ·
+ 简体中文
+
+
+## Pré-visualização
+
+| Escuro | Claro |
+| -------------------------------------- | -------------------------------------- |
+|  |  |
+
+## Instalação
+
+Acesse a [página de lançamentos](https://github.com/clash-verge-rev/clash-verge-rev/releases) e baixe o instalador correspondente à sua plataforma.
+Oferecemos pacotes para Windows (x64/x86), Linux (x64/arm64) e macOS 10.15+ (Intel/Apple).
+
+#### Como escolher o canal de lançamento
+
+| Canal | Descrição | Link |
+| :---------- | :--------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- |
+| Stable | Versões oficiais de alta confiabilidade, ideais para o uso diário. | [Release](https://github.com/clash-verge-rev/clash-verge-rev/releases) |
+| Alpha (EOL) | Versões antigas usadas para validar o fluxo de publicação. | [Alpha](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/alpha) |
+| AutoBuild | Versões contínuas para testes e feedback. Espere mudanças típicas de beta. | [AutoBuild](https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/autobuild) |
+
+#### Guias de instalação e perguntas frequentes
+
+Consulte a [documentação do projeto](https://clash-verge-rev.github.io/) para ver os passos de instalação, a solução de problemas e as perguntas frequentes.
+
+### Canal do Telegram
+
+Entre em [@clash_verge_rev](https://t.me/clash_verge_re) para acompanhar as novidades.
+
+---
+
+## Promoções
+
+#### [Doggygo VPN — Acelerador global focado em desempenho](https://cvr.dginv.click/#/register?code=oaxsAGo6)
+
+- Serviço internacional de alto desempenho com teste gratuito, planos com desconto, desbloqueio de streaming e suporte de primeira linha ao protocolo Hysteria.
+- Cadastre-se pelo link exclusivo do Clash Verge e ganhe um teste de 3 dias com 1 GB de tráfego diário: [Cadastre-se](https://cvr.dginv.click/#/register?code=oaxsAGo6)
+- Cupom exclusivo de 20% de desconto para usuários do Clash Verge: `verge20` (limitado a 500 usos)
+- Plano promocional a partir de ¥15,8 por mês com 160 GB, mais 20% de desconto adicional no pagamento anual
+- Equipe sediada no exterior para um serviço confiável, com até 50% de comissão compartilhada
+- Clusters balanceados com rotas dedicadas de alta velocidade (compatíveis com clientes antigos), latência extremamente baixa, reprodução 4K sem travamentos
+- Primeiro provedor global com **protocolo QUIC**, agora com protocolos da família QUIC mais rápidos (ideal para o cliente Clash Verge)
+- Desbloqueia serviços de streaming e acesso ao ChatGPT
+- Site oficial: [https://狗狗加速.com](https://cvr.dginv.click/#/register?code=oaxsAGo6)
+
+### 🤖 [GPTKefu — Plataforma de atendimento ao cliente com IA integrada ao Crisp](https://gptkefu.com)
+
+- 🧠 Compreensão profunda de todo o contexto da conversa + reconhecimento de imagens, com respostas profissionais e precisas de forma automática, sem respostas robóticas.
+- ♾️ **Respostas ilimitadas**, sem preocupação com cotas — ao contrário de outros produtos de IA que cobram por mensagem.
+- 💬 Consultas de pré-venda, suporte pós-venda, resolução de problemas complexos — cobre todos os cenários com facilidade, com casos reais comprovados.
+- ⚡ Configuração em 3 minutos, sem curva de aprendizado — melhora na hora a eficiência e a satisfação do cliente.
+- 🎁 Teste gratuito de 14 dias do plano Premium — experimente antes de pagar: 👉 [Testar grátis](https://gptkefu.com)
+- 📢 Canal do Telegram do atendimento com IA: [@crisp_ai](https://t.me/crisp_ai)
+
+---
+
+## Funcionalidades
+
+- Baseado em Rust de alto desempenho e no framework Tauri 2
+- Inclui o núcleo integrado [Clash.Meta (mihomo)](https://github.com/MetaCubeX/mihomo) e permite trocar para o canal `Alpha`
+- Interface limpa e elegante, com controles de cor do tema, ícones de grupos de proxy/bandeja e `CSS Injection`
+- Gerenciamento avançado de perfis (ferramentas Merge e Script) com sugestões de sintaxe para as configurações
+- Controle do proxy do sistema, modo guardião e suporte a `TUN` (adaptador de rede virtual)
+- Editores visuais para nós e regras
+- Backup e sincronização via WebDAV
+
+### Perguntas frequentes
+
+Acesse a [página de FAQ](https://clash-verge-rev.github.io/faq/windows.html) para ver instruções específicas por plataforma.
+
+### Doações
+
+[Apoie o desenvolvimento do Clash Verge Rev](https://github.com/sponsors/clash-verge-rev)
+
+## Desenvolvimento
+
+Consulte o [CONTRIBUTING.md](../CONTRIBUTING.md) para ver as diretrizes de contribuição.
+
+Depois de instalar todos os pré-requisitos do **Tauri**, execute o ambiente de desenvolvimento com:
+
+```shell
+pnpm i
+pnpm run prebuild
+pnpm dev
+```
+
+## Contribuições
+
+Issues e pull requests são bem-vindos.
+
+## Agradecimentos
+
+O Clash Verge Rev é baseado nos projetos a seguir, ou se inspira neles:
+
+- [zzzgydi/clash-verge](https://github.com/zzzgydi/clash-verge): Interface gráfica para o Clash baseada em Tauri. Compatível com Windows, macOS e Linux.
+- [tauri-apps/tauri](https://github.com/tauri-apps/tauri): Crie aplicativos de desktop menores, mais rápidos e mais seguros com um frontend web.
+- [Dreamacro/clash](https://github.com/Dreamacro/clash): Túnel baseado em regras escrito em Go.
+- [MetaCubeX/mihomo](https://github.com/MetaCubeX/mihomo): Túnel baseado em regras escrito em Go.
+- [Fndroid/clash_for_windows_pkg](https://github.com/Fndroid/clash_for_windows_pkg): Interface do Clash para Windows e macOS.
+- [vitejs/vite](https://github.com/vitejs/vite): Ferramentas de frontend de nova geração com uma experiência ultrarrápida.
+
+## Licença
+
+Licença GPL-3.0. Consulte o [arquivo de licença](../LICENSE) para mais detalhes.
diff --git a/docs/README_ru.md b/docs/README_ru.md
index 81fd112bb..e0de81b24 100644
--- a/docs/README_ru.md
+++ b/docs/README_ru.md
@@ -11,13 +11,14 @@ Clash Meta GUI базируется на
Языки:
- 简体中文 ·
English ·
Español ·
- Русский ·
+ فارسی ·
日本語 ·
한국어 ·
- فارسی
+ Português ·
+ Русский ·
+ 简体中文
## Предпросмотр
diff --git a/src/components/setting/setting-verge-basic.tsx b/src/components/setting/setting-verge-basic.tsx
index f1e4082ac..913e9859e 100644
--- a/src/components/setting/setting-verge-basic.tsx
+++ b/src/components/setting/setting-verge-basic.tsx
@@ -44,6 +44,7 @@ const languageOptions = supportedLanguages.map((code) => {
es: 'Español',
jp: '日本語',
zhtw: '繁體中文',
+ pt: 'Português',
}
const label = labels[code] || code
return { code, label }
diff --git a/src/locales/pt/connections.json b/src/locales/pt/connections.json
new file mode 100644
index 000000000..8034e7599
--- /dev/null
+++ b/src/locales/pt/connections.json
@@ -0,0 +1,34 @@
+{
+ "page": {
+ "title": "Conexões"
+ },
+ "components": {
+ "fields": {
+ "host": "Host",
+ "dlSpeed": "Vel. de download",
+ "ulSpeed": "Vel. de upload",
+ "chains": "Cadeias",
+ "rule": "Regra",
+ "process": "Processo",
+ "time": "Hora",
+ "source": "Origem",
+ "destination": "Destino",
+ "destinationPort": "Porta de destino",
+ "type": "Tipo"
+ },
+ "order": {
+ "default": "Padrão",
+ "uploadSpeed": "Velocidade de upload",
+ "downloadSpeed": "Velocidade de download"
+ },
+ "actions": {
+ "active": "Ativas",
+ "closed": "Fechadas",
+ "closeConnection": "Fechar conexão"
+ },
+ "columnManager": {
+ "title": "Colunas",
+ "dragHandle": "Alça de arrastar"
+ }
+ }
+}
diff --git a/src/locales/pt/home.json b/src/locales/pt/home.json
new file mode 100644
index 000000000..8df3dcc77
--- /dev/null
+++ b/src/locales/pt/home.json
@@ -0,0 +1,156 @@
+{
+ "page": {
+ "tooltips": {
+ "lightweightMode": "Modo leve",
+ "manual": "Manual",
+ "settings": "Configurações do início"
+ },
+ "cards": {
+ "trafficStats": "Estatísticas de tráfego",
+ "networkSettings": "Configurações de rede",
+ "proxyMode": "Modo de proxy"
+ },
+ "settings": {
+ "cards": {
+ "profile": "Cartão de perfil",
+ "currentProxy": "Cartão do proxy atual",
+ "network": "Cartão de configurações de rede",
+ "proxyMode": "Cartão do modo de proxy",
+ "traffic": "Cartão de estatísticas de tráfego",
+ "tests": "Cartão de testes de sites",
+ "ip": "Cartão de informações de IP",
+ "clashInfo": "Cartões de informações do Clash",
+ "systemInfo": "Cartões de informações do sistema"
+ },
+ "title": "Configurações do início"
+ },
+ "title": "Início"
+ },
+ "components": {
+ "proxyTun": {
+ "status": {
+ "systemProxyEnabled": "Proxy do sistema ativado",
+ "systemProxyDisabled": "Proxy do sistema desativado",
+ "tunModeServiceRequired": "Modo TUN requer o serviço",
+ "tunModeEnabled": "Modo TUN ativado",
+ "tunModeDisabled": "Modo TUN desativado"
+ },
+ "tooltips": {
+ "systemProxy": "Informações do proxy do sistema",
+ "tunMode": "Informações de interceptação do modo TUN"
+ }
+ },
+ "clashInfo": {
+ "title": "Informações do Clash",
+ "fields": {
+ "coreVersion": "Versão do núcleo",
+ "systemProxyAddress": "Endereço do proxy do sistema",
+ "mixedPort": "Porta mista",
+ "uptime": "Tempo ativo",
+ "rulesCount": "Quantidade de regras"
+ }
+ },
+ "systemInfo": {
+ "title": "Informações do sistema",
+ "fields": {
+ "osInfo": "Informações do SO",
+ "autoLaunch": "Início automático",
+ "runningMode": "Modo de execução",
+ "lastCheckUpdate": "Última verificação de atualização",
+ "vergeVersion": "Versão do Verge"
+ },
+ "actions": {
+ "settings": "Configurações"
+ },
+ "badges": {
+ "notRunning": "Núcleo não está em execução",
+ "adminMode": "Modo administrador",
+ "serviceMode": "Modo serviço",
+ "sidecarMode": "Modo usuário",
+ "adminServiceMode": "Modo admin + serviço"
+ }
+ },
+ "ipInfo": {
+ "title": "Informações de IP",
+ "labels": {
+ "ip": "IP",
+ "asn": "ASN",
+ "isp": "ISP",
+ "org": "ORG",
+ "location": "Localização",
+ "timezone": "Fuso horário",
+ "autoRefresh": "Atualização automática",
+ "unknown": "Desconhecido"
+ },
+ "errors": {
+ "load": "Falha ao obter informações de IP",
+ "loadWithDetails": "Falha ao obter informações de IP: {{message}}",
+ "noServices": "Nenhum serviço de detecção de IP disponível"
+ }
+ },
+ "currentProxy": {
+ "title": "Nó atual",
+ "actions": {
+ "refreshDelay": "Teste de latência"
+ },
+ "labels": {
+ "globalMode": "Modo global",
+ "directMode": "Modo direto",
+ "group": "Grupo",
+ "proxy": "Proxy",
+ "noActiveNode": "Nenhum nó de proxy ativo"
+ },
+ "status": {
+ "testing": "Testando",
+ "untested": "Não testado",
+ "error": "Erro",
+ "timeout": "Tempo esgotado",
+ "latencyHigh": "Latência alta",
+ "latencyMedium": "Latência moderada",
+ "latencyGood": "Latência boa",
+ "latencyExcellent": "Latência excelente",
+ "uninitialized": "Não inicializado",
+ "noProxyNode": "Nenhum nó de proxy"
+ }
+ },
+ "tests": {
+ "title": "Testes de sites"
+ },
+ "traffic": {
+ "metrics": {
+ "uploadSpeed": "Velocidade de upload",
+ "downloadSpeed": "Velocidade de download",
+ "activeConnections": "Conexões ativas",
+ "memoryUsage": "Uso do núcleo"
+ },
+ "legends": {
+ "upload": "Envio",
+ "download": "Recebimento"
+ },
+ "patterns": {
+ "minutes": "{{time}} minutos"
+ },
+ "unknownTime": "Horário desconhecido",
+ "chartStyles": {
+ "smooth": "Suave",
+ "linear": "Linear"
+ },
+ "diagnostics": "Pontos: {{points}} | Agrupados: {{compressed}} | FPS: {{fps}}"
+ },
+ "clashMode": {
+ "errors": {
+ "communication": "Erro de comunicação com o núcleo, reinicie o computador e tente novamente"
+ },
+ "labels": {
+ "rule": "Regra",
+ "global": "Global",
+ "direct": "Direto"
+ },
+ "descriptions": {
+ "rule": "Escolhe proxies automaticamente de acordo com o conjunto de regras.",
+ "global": "Encaminha todas as requisições de rede pelo proxy selecionado.",
+ "direct": "Ignora o proxy e conecta diretamente à internet."
+ }
+ }
+ }
+}
diff --git a/src/locales/pt/layout.json b/src/locales/pt/layout.json
new file mode 100644
index 000000000..6c1a2142b
--- /dev/null
+++ b/src/locales/pt/layout.json
@@ -0,0 +1,61 @@
+{
+ "components": {
+ "navigation": {
+ "tabs": {
+ "home": "Início",
+ "proxies": "Proxies",
+ "profiles": "Perfis",
+ "connections": "Conexões",
+ "rules": "Regras",
+ "logs": "Logs",
+ "unlock": "Teste",
+ "settings": "Ajustes"
+ },
+ "menu": {
+ "reorderMode": "Modo de reordenação do menu",
+ "restoreDefaultOrder": "Restaurar ordem padrão",
+ "unlock": "Desbloquear ordem do menu",
+ "lock": "Bloquear ordem do menu",
+ "collapseNavBar": "Recolher barra de navegação",
+ "expandNavBar": "Expandir barra de navegação"
+ }
+ },
+ "serviceMigration": {
+ "locationRefusedMessage": "O serviço não pode iniciar o núcleo porque o caminho de instalação ou as permissões do diretório falharam em uma verificação de segurança. Reinstale o serviço para restaurar seus arquivos e permissões e tente novamente. O Windows pode solicitar aprovação de administrador.",
+ "notAutoStartedMessage": "O tipo de inicialização do serviço Clash Verge foi alterado para Manual ou Desativado (geralmente por ferramentas de otimização do sistema), então ele não inicia mais com o Windows; esta sessão está usando Sidecar. Reinstale o serviço para restaurar a inicialização automática. O Windows pode solicitar aprovação de administrador.",
+ "title": "Atualização do serviço necessária",
+ "message": "A versão do serviço Clash Verge não corresponde à versão exigida por este app. Escolha Reinstalar serviço para desinstalar o serviço existente e instalar a versão exigida, ou continue com o Sidecar nesta sessão.",
+ "checkingMessage": "Verificando o status do serviço do sistema e o modo de execução atual. Aguarde…",
+ "unavailableMessage": "O serviço Clash Verge necessário não está disponível. Instale ou repare-o, ou continue com o Sidecar nesta sessão.",
+ "reinstall": "Reinstalar serviço",
+ "repair": "Reparar serviço",
+ "continueSidecar": "Continuar com Sidecar",
+ "success": "O serviço Clash Verge foi atualizado com sucesso",
+ "errors": {
+ "actionFailed": "A operação do serviço falhou",
+ "stateRefreshFailed": "Falha ao atualizar o estado do serviço",
+ "restartFailed": "Falha ao reiniciar o núcleo",
+ "revalidationFailed": "Falha ao atualizar o estado de execução",
+ "sidecarFailed": "Falha ao continuar com o Sidecar"
+ }
+ },
+ "sysproxyPrivilege": {
+ "title": "Não foi possível definir o proxy do sistema",
+ "message": "O macOS recusou a alteração por falta de privilégios. Instalar o serviço Clash Verge permite que ele faça alterações de proxy como administrador, e este aviso não voltará.",
+ "serviceReadyMessage": "O serviço Clash Verge está pronto, mas o núcleo ainda está em execução como sidecar, por isso a definição do proxy do sistema foi recusada. Mudar para o modo serviço resolve — sem precisar reinstalar.",
+ "alternative": "Como alternativa, desative “exigir senha de administrador para acessar as configurações do sistema” em Ajustes do Sistema → Privacidade e Segurança → Avançado.",
+ "later": "Depois",
+ "installing": "Instalando o serviço do sistema. Pode ser solicitada a senha de administrador.",
+ "restarting": "Serviço instalado. Reiniciando o núcleo por meio dele…",
+ "applying": "Aplicando a alteração do proxy do sistema…",
+ "tunTitle": "O modo TUN precisa do serviço do sistema",
+ "tunMessage": "O modo TUN precisa do serviço do sistema Clash Verge para assumir o tráfego de rede. Depois de instalado, o modo TUN será ativado para você."
+ }
+ },
+ "feedback": {
+ "errors": {
+ "restartCoreStopFailed": "Não foi possível parar o núcleo com segurança, então a reinicialização foi cancelada",
+ "quitCoreStopFailed": "Não foi possível parar o núcleo com segurança, então a saída foi cancelada"
+ }
+ }
+}
diff --git a/src/locales/pt/logs.json b/src/locales/pt/logs.json
new file mode 100644
index 000000000..0a73fd4bb
--- /dev/null
+++ b/src/locales/pt/logs.json
@@ -0,0 +1,9 @@
+{
+ "page": {
+ "title": "Logs"
+ },
+ "actions": {
+ "showDescending": "Mais recentes primeiro",
+ "showAscending": "Mais antigos primeiro"
+ }
+}
diff --git a/src/locales/pt/profiles.json b/src/locales/pt/profiles.json
new file mode 100644
index 000000000..0fa7fe50d
--- /dev/null
+++ b/src/locales/pt/profiles.json
@@ -0,0 +1,221 @@
+{
+ "page": {
+ "actions": {
+ "updateAll": "Atualizar todos os perfis",
+ "viewRuntimeConfig": "Ver configuração em execução",
+ "reactivate": "Reativar perfis",
+ "import": "Importar"
+ },
+ "batch": {
+ "actions": {
+ "delete": "Excluir perfis selecionados",
+ "selectAll": "Selecionar tudo",
+ "deselectAll": "Desmarcar tudo",
+ "done": "Concluído"
+ },
+ "summary": {
+ "selected": "Selecionados",
+ "items": "itens"
+ },
+ "title": "Operações em lote"
+ },
+ "importForm": {
+ "placeholder": "URL do perfil",
+ "actions": {
+ "paste": "Colar"
+ }
+ },
+ "feedback": {
+ "errors": {
+ "invalidUrl": "URL de perfil inválida. Insira uma URL começando com http:// ou https://",
+ "onlyYaml": "Somente arquivos YAML são suportados",
+ "createFailed": "Falha ao criar o perfil",
+ "deleteFailed": "Falha ao excluir o perfil",
+ "enhanceFailed": "Falha ao reativar os perfis",
+ "importFailed": "Falha ao importar o perfil",
+ "openFailed": "Falha ao abrir o perfil",
+ "readFailed": "Falha ao ler o perfil",
+ "reorderFailed": "Falha ao reordenar os perfis",
+ "switchFailed": "Falha ao trocar de perfil",
+ "updateFailed": "Falha ao atualizar o perfil"
+ },
+ "notifications": {
+ "importRetry": "Falha na importação, tentando novamente com o proxy Clash...",
+ "importFail": "Falha na importação mesmo com o proxy Clash",
+ "importNeedsRefresh": "Perfil importado, mas pode precisar de atualização manual",
+ "importSuccess": "Perfil importado com sucesso, reinicie se não aparecer",
+ "profileSwitched": "Perfil trocado",
+ "profileReactivated": "Perfil reativado",
+ "switchBusy": "A troca de perfil já está em andamento",
+ "batchDeleted": "Perfis selecionados excluídos com sucesso"
+ },
+ "notices": {
+ "forceRefreshCompleted": "Atualização forçada concluída",
+ "discardedKeys": "As extensões gravaram {{keys}}, que são gerenciados pelas Configurações, então esses valores foram descartados",
+ "emergencyRefreshFailed": "Falha na atualização de emergência: {{message}}"
+ },
+ "tooltips": {
+ "forceRefreshStaleData": "Os dados do perfil estão indisponíveis; clique para forçar a atualização"
+ }
+ },
+ "title": "Perfis"
+ },
+ "components": {
+ "card": {
+ "labels": {
+ "clickToImport": "Clique para importar a assinatura"
+ }
+ },
+ "fileInput": {
+ "chooseFile": "Escolher arquivo"
+ },
+ "menu": {
+ "home": "Início",
+ "select": "Selecionar",
+ "shareQrCode": "Compartilhar QR Code",
+ "editInfo": "Editar informações",
+ "editFile": "Editar arquivo",
+ "editRules": "Editar regras",
+ "editProxies": "Editar proxies",
+ "editGroups": "Editar grupos de proxy",
+ "extendConfig": "Configuração de extensão",
+ "extendScript": "Script de extensão",
+ "openFile": "Abrir arquivo",
+ "update": "Atualizar",
+ "updateViaProxy": "Atualizar via proxy"
+ },
+ "more": {
+ "global": {
+ "merge": "Extensão global",
+ "script": "Script de extensão global"
+ },
+ "chips": {
+ "merge": "Mesclar",
+ "script": "Script"
+ }
+ },
+ "profileItem": {
+ "tooltips": {
+ "showLast": "Clique para mostrar a última atualização",
+ "showNext": "Clique para mostrar a próxima atualização"
+ },
+ "status": {
+ "lastUpdateFailed": "Falha na última atualização",
+ "nextUp": "Próxima",
+ "noSchedule": "Sem agendamento",
+ "unknown": "Desconhecido",
+ "autoUpdateDisabled": "Atualização automática desativada"
+ }
+ }
+ },
+ "modals": {
+ "profileForm": {
+ "title": {
+ "create": "Criar perfil",
+ "edit": "Editar perfil"
+ },
+ "fields": {
+ "type": "Tipo",
+ "description": "Descrição",
+ "subscriptionUrl": "URL da assinatura",
+ "userAgent": "User Agent",
+ "httpTimeout": "Tempo limite HTTP",
+ "updateInterval": "Intervalo de atualização",
+ "useSystemProxy": "Usar proxy do sistema",
+ "useClashProxy": "Usar proxy Clash",
+ "acceptInvalidCerts": "Permitir certificados inválidos (perigoso)",
+ "allowAutoUpdate": "Permitir atualização automática"
+ },
+ "types": {
+ "remote": "Remoto",
+ "local": "Local"
+ },
+ "errors": {
+ "typeRequired": "Selecione um tipo de perfil",
+ "urlRequired": "Insira a URL da assinatura",
+ "uidMissing": "O identificador do perfil está ausente",
+ "saveFailed": "Falha ao salvar o perfil"
+ },
+ "warnings": {
+ "frequentUpdate": "Um intervalo curto recarrega o núcleo com essa frequência e derruba as conexões existentes. Recomendados: {{minutes}} minutos (24 horas)."
+ },
+ "feedback": {
+ "notifications": {
+ "creationRetry": "Falha ao criar o perfil, tentando novamente com o proxy Clash...",
+ "creationSuccess": "Perfil criado com sucesso com o proxy Clash"
+ }
+ }
+ },
+ "proxiesEditor": {
+ "title": "Editar proxies",
+ "placeholders": {
+ "multiUri": "Use quebras de linha para várias URIs (Base64 suportado)"
+ },
+ "actions": {
+ "prepend": "Adicionar proxy no início",
+ "append": "Adicionar proxy no fim"
+ }
+ },
+ "groupsEditor": {
+ "title": "Editar grupos de proxy",
+ "errors": {
+ "nameRequired": "Nome do grupo obrigatório",
+ "nameExists": "O nome do grupo já existe"
+ },
+ "fields": {
+ "type": "Tipo de grupo",
+ "name": "Nome do grupo",
+ "icon": "Ícone do grupo de proxy",
+ "proxies": "Usar proxies",
+ "provider": "Usar provedor",
+ "healthCheckUrl": "URL de verificação de saúde",
+ "expectedStatus": "Status esperado",
+ "interval": "Intervalo",
+ "maxFailedTimes": "Máximo de falhas",
+ "interfaceName": "Nome da interface",
+ "routingMark": "Marca de roteamento",
+ "filter": "Filtro",
+ "excludeFilter": "Filtro de exclusão",
+ "excludeType": "Tipo de exclusão",
+ "includeAll": "Incluir todos os proxies e provedores",
+ "includeAllProxies": "Incluir todos os proxies",
+ "includeAllProviders": "Incluir todos os provedores"
+ },
+ "toggles": {
+ "lazy": "Lazy",
+ "disableUdp": "Desativar UDP",
+ "hidden": "Oculto"
+ },
+ "actions": {
+ "prepend": "Adicionar grupo no início",
+ "append": "Adicionar grupo no fim"
+ }
+ },
+ "editor": {
+ "actions": {
+ "format": "Formatar documento"
+ },
+ "messages": {
+ "readOnly": "Não é possível editar em um editor somente leitura"
+ },
+ "enhance": {
+ "globalMerge": "Aplica-se a todos os perfis, após as configurações do app. O script global, a configuração do perfil e o script do perfil ainda podem alterar o resultado.",
+ "globalScript": "Aplica-se a todos os perfis, usando o resultado da mesclagem da configuração global. A configuração do perfil e o script do perfil ainda podem alterar o resultado.",
+ "profileMerge": "Aplica-se somente a este perfil, após a configuração global e o script global. O script do perfil ainda pode alterar o resultado.",
+ "profileScript": "Aplica-se somente a este perfil, usando o resultado da mesclagem da configuração do perfil. Esta é a última etapa de extensão antes de as configurações do app serem reaplicadas.",
+ "order": "Ordem: Perfil original → Configurações do app → Configuração de extensão global → Script de extensão global → Configuração de extensão do perfil → Script de extensão do perfil → Configurações do app reaplicadas",
+ "settingsPriority": "Nota: os campos gerenciados pelas configurações do app sempre usam essas configurações na configuração final. Alterar esses campos nas extensões não tem efeito."
+ }
+ },
+ "confirmDelete": {
+ "title": "Confirmar exclusão",
+ "message": "Esta operação não é reversível"
+ },
+ "logViewer": {
+ "title": "Console de scripts"
+ },
+ "qrViewer": {
+ "title": "QR Code da assinatura"
+ }
+ }
+}
diff --git a/src/locales/pt/proxies.json b/src/locales/pt/proxies.json
new file mode 100644
index 000000000..1740f6043
--- /dev/null
+++ b/src/locales/pt/proxies.json
@@ -0,0 +1,122 @@
+{
+ "page": {
+ "modes": {
+ "rule": "Regra",
+ "global": "Global",
+ "direct": "Direto"
+ },
+ "actions": {
+ "toggleChain": "Proxy em cadeia",
+ "connect": "Conectar",
+ "disconnect": "Desconectar",
+ "connecting": "Conectando...",
+ "clearChainConfig": "Excluir configuração da cadeia"
+ },
+ "provider": {
+ "title": "Provedor de proxy",
+ "actions": {
+ "updateAll": "Atualizar tudo",
+ "update": "Atualizar"
+ }
+ },
+ "rules": {
+ "title": "Regras de proxy",
+ "select": "Selecionar regras"
+ },
+ "labels": {
+ "proxyCount": "Quantidade de proxies",
+ "delayCheckReset": "Teste de latência para cancelar a fixação",
+ "nodeCount": "{{count}} nós"
+ },
+ "tooltips": {
+ "locate": "localizar",
+ "delayCheck": "Teste de latência",
+ "sortDefault": "Ordenar por padrão",
+ "sortDelay": "Ordenar por latência",
+ "sortName": "Ordenar por nome",
+ "delayCheckUrl": "URL do teste de latência",
+ "showBasic": "Proxy básico",
+ "showDetail": "Proxy detalhado",
+ "filter": "Filtro"
+ },
+ "placeholders": {
+ "delayCheckUrl": "URL do teste de latência"
+ },
+ "empty": {
+ "noAvailableGroups": "Nenhum grupo de proxy disponível",
+ "noProxies": "Nenhum proxy",
+ "noSubscriptions": {
+ "title": "Nenhuma assinatura importada",
+ "description": "Não há nada para exibir na página Proxies. Vá para Perfis para importar e ativar uma assinatura."
+ },
+ "inactiveSubscription": {
+ "title": "Nenhuma assinatura ativa",
+ "description": "Foram encontradas assinaturas, mas nenhuma está ativa. Vá para Perfis e selecione uma para ativar."
+ },
+ "coreUnavailable": {
+ "title": "Núcleo temporariamente indisponível",
+ "description": "Não foi possível obter as informações de proxy do núcleo. Tente reiniciá-lo. Se o problema persistir, abra a pasta de logs e verifique os logs do núcleo."
+ },
+ "noProxyInfo": {
+ "title": "Nenhuma informação de proxy disponível",
+ "description": "Não há grupos de proxy nem nós para exibir. Verifique se a assinatura ativa contém grupos e nós de proxy válidos, ou reinicie o núcleo e revise os logs."
+ },
+ "actions": {
+ "openProfiles": "Ir para Perfis",
+ "restartCore": "Reiniciar núcleo",
+ "openLogs": "Abrir pasta de logs"
+ }
+ },
+ "chain": {
+ "header": "Configuração do proxy em cadeia",
+ "warning": "O proxy em cadeia reduz significativamente a velocidade da rede. Se você não tem uma necessidade clara ou não entende esta configuração, mantenha-o desativado.",
+ "empty": "O proxy em cadeia reduz significativamente a velocidade da rede. Se você não tem uma necessidade clara ou não entende esta configuração, mantenha-o desativado.",
+ "instruction": "Clique nos nós em ordem para adicioná-los à cadeia de proxy",
+ "minimumNodes": "O proxy em cadeia requer pelo menos 2 nós",
+ "minimumNodesHint": "O proxy em cadeia requer pelo menos 2 nós. Adicione mais um nó.",
+ "connectFailed": "Falha ao conectar à cadeia de proxy",
+ "disconnectFailed": "Falha ao desconectar da cadeia de proxy",
+ "duplicateNode": "O nó de proxy já existe na cadeia",
+ "entryNode": "Entrada",
+ "exitNode": "Saída"
+ },
+ "messages": {
+ "directMode": "Modo direto"
+ },
+ "title": {
+ "default": "Grupos de proxy",
+ "chainMode": "Modo de proxy em cadeia"
+ }
+ },
+ "feedback": {
+ "warnings": {
+ "invalidTestUrl": "A URL de teste deve começar com http:// ou https://"
+ },
+ "notifications": {
+ "provider": {
+ "updateSuccess": "{{name}} atualizado com sucesso",
+ "updateFailed": "Falha ao atualizar {{name}}: {{message}}",
+ "genericError": "Falha na atualização: {{message}}",
+ "none": "Nenhum provedor disponível para atualizar",
+ "allUpdated": "Todos os provedores atualizados com sucesso"
+ }
+ }
+ },
+ "components": {
+ "enums": {
+ "strategies": {
+ "select": "Selecionar proxy manualmente",
+ "url-test": "Selecionar proxy com base na latência do teste de URL",
+ "fallback": "Alternar para outro proxy em caso de erro",
+ "load-balance": "Distribuir proxies com balanceamento de carga",
+ "relay": "Passar pela cadeia de proxy definida"
+ },
+ "policies": {
+ "DIRECT": "Os dados saem diretamente (DIRECT)",
+ "REJECT": "Intercepta as requisições (REJECT)",
+ "REJECT-DROP": "Descarta as requisições (REJECT-DROP)",
+ "PASS": "Ignora esta regra quando houver correspondência (PASS)"
+ }
+ }
+ }
+}
diff --git a/src/locales/pt/rules.json b/src/locales/pt/rules.json
new file mode 100644
index 000000000..b335b527b
--- /dev/null
+++ b/src/locales/pt/rules.json
@@ -0,0 +1,82 @@
+{
+ "page": {
+ "provider": {
+ "trigger": "Provedor de regras",
+ "dialogTitle": "Provedores de regras",
+ "actions": {
+ "updateAll": "Atualizar tudo",
+ "update": "Atualizar"
+ }
+ },
+ "title": "Regras"
+ },
+ "feedback": {
+ "notifications": {
+ "provider": {
+ "updateSuccess": "{{name}} atualizado com sucesso",
+ "updateFailed": "Falha ao atualizar {{name}}: {{message}}",
+ "genericError": "Falha na atualização: {{message}}",
+ "none": "Nenhum provedor disponível para atualizar",
+ "allUpdated": "Todos os provedores foram atualizados com sucesso"
+ }
+ }
+ },
+ "modals": {
+ "editor": {
+ "form": {
+ "labels": {
+ "type": "Tipo de regra",
+ "content": "Conteúdo da regra",
+ "proxyPolicy": "Política de proxy"
+ },
+ "toggles": {
+ "noResolve": "Sem resolução"
+ },
+ "actions": {
+ "prependRule": "Adicionar regra no início",
+ "appendRule": "Adicionar regra no fim"
+ },
+ "validation": {
+ "conditionRequired": "Condição da regra obrigatória",
+ "invalidRule": "Regra inválida"
+ }
+ },
+ "ruleTypes": {
+ "DOMAIN": "Corresponder ao domínio completo (DOMAIN)",
+ "DOMAIN-SUFFIX": "Corresponder ao sufixo de domínio (DOMAIN-SUFFIX)",
+ "DOMAIN-KEYWORD": "Corresponder à palavra-chave do domínio (DOMAIN-KEYWORD)",
+ "DOMAIN-REGEX": "Corresponder ao domínio por regex (DOMAIN-REGEX)",
+ "GEOSITE": "Corresponder a domínios do GeoSite (GEOSITE)",
+ "GEOIP": "Corresponder ao código de país do IP (GEOIP)",
+ "SRC-GEOIP": "Corresponder ao código de país do IP de origem (SRC-GEOIP)",
+ "IP-ASN": "Corresponder ao ASN do IP (IP-ASN)",
+ "SRC-IP-ASN": "Corresponder ao ASN do IP de origem (SRC-IP-ASN)",
+ "IP-CIDR": "Corresponder à faixa de endereços IP (IP-CIDR)",
+ "IP-CIDR6": "Corresponder à faixa de endereços IPv6 (IP-CIDR6)",
+ "SRC-IP-CIDR": "Corresponder à faixa de endereços IP de origem (SRC-IP-CIDR)",
+ "IP-SUFFIX": "Corresponder à faixa de sufixo de IP (IP-SUFFIX)",
+ "SRC-IP-SUFFIX": "Corresponder à faixa de sufixo de IP de origem (SRC-IP-SUFFIX)",
+ "SRC-PORT": "Corresponder à faixa de portas de origem (SRC-PORT)",
+ "DST-PORT": "Corresponder à faixa de portas de destino (DST-PORT)",
+ "IN-PORT": "Corresponder à porta de entrada (IN-PORT)",
+ "DSCP": "Tag DSCP (apenas entrada TPROXY UDP) (DSCP)",
+ "PROCESS-NAME": "Corresponder ao nome do processo (PROCESS-NAME)",
+ "PROCESS-PATH": "Corresponder ao caminho completo do processo (PROCESS-PATH)",
+ "PROCESS-NAME-REGEX": "Corresponder ao nome do processo por regex (PROCESS-NAME-REGEX)",
+ "PROCESS-PATH-REGEX": "Corresponder ao caminho completo do processo por regex (PROCESS-PATH-REGEX)",
+ "NETWORK": "Corresponder ao protocolo de rede (TCP/UDP) (NETWORK)",
+ "UID": "Corresponder ao ID de usuário Linux (UID)",
+ "IN-TYPE": "Corresponder ao tipo de entrada (IN-TYPE)",
+ "IN-USER": "Corresponder ao usuário de entrada (IN-USER)",
+ "IN-NAME": "Corresponder ao nome da entrada (IN-NAME)",
+ "SUB-RULE": "Sub-regra (SUB-RULE)",
+ "RULE-SET": "Corresponder ao conjunto de regras (RULE-SET)",
+ "AND": "E lógico (AND)",
+ "OR": "OU lógico (OR)",
+ "NOT": "NÃO lógico (NOT)",
+ "MATCH": "Corresponder a todas as requisições (MATCH)"
+ },
+ "title": "Editar regras"
+ }
+ }
+}
diff --git a/src/locales/pt/settings.json b/src/locales/pt/settings.json
new file mode 100644
index 000000000..8e2aac51e
--- /dev/null
+++ b/src/locales/pt/settings.json
@@ -0,0 +1,716 @@
+{
+ "page": {
+ "actions": {
+ "manual": "Manual",
+ "telegram": "Canal do Telegram",
+ "github": "Repositório do Github"
+ },
+ "actionsGroupLabel": "Links das configurações",
+ "title": "Configurações"
+ },
+ "sections": {
+ "system": {
+ "title": "Configurações do Sistema",
+ "toggles": {
+ "tunMode": "Modo Tun",
+ "systemProxy": "Proxy do Sistema"
+ },
+ "tooltips": {
+ "silentStart": "Inicia o programa em segundo plano sem exibir o painel"
+ },
+ "fields": {
+ "autoLaunch": "Iniciar com o Sistema",
+ "silentStart": "Início Silencioso"
+ },
+ "notifications": {
+ "tunMode": {
+ "autoDisabled": "Modo TUN desativado automaticamente porque o serviço está indisponível",
+ "autoDisableFailed": "Falha ao desativar o Modo TUN automaticamente"
+ }
+ }
+ },
+ "proxyControl": {
+ "tooltips": {
+ "systemProxy": "Ative para modificar as configurações de proxy do sistema operacional. Se a ativação falhar, modifique as configurações de proxy do sistema operacional manualmente",
+ "tunMode": "Modo Tun (placa de rede virtual): captura todo o tráfego do sistema. Quando ativado, não é necessário ativar o proxy do sistema.",
+ "tunUnavailable": "O TUN requer o Modo Serviço ou o Modo Administrador"
+ },
+ "actions": {
+ "installService": "Instalar Serviço",
+ "uninstallService": "Desinstalar Serviço",
+ "switchToServiceMode": "Mudar para o modo serviço"
+ },
+ "fields": {
+ "systemProxy": "Proxy do Sistema",
+ "tunMode": "Modo Tun"
+ },
+ "messages": {
+ "installedCheckProxy": "O serviço está instalado e o núcleo está em execução por meio dele. Verifique o interruptor do proxy do sistema e refaça a alteração se ela não tiver sido aplicada.",
+ "installedCoreNotOnService": "O serviço está instalado, mas o núcleo não está em execução por meio dele. Verifique o núcleo e tente novamente.",
+ "installedProxyRestored": "O serviço está instalado, o núcleo está em execução por meio dele e a alteração do proxy do sistema foi aplicada."
+ }
+ },
+ "externalController": {
+ "title": "Controlador Externo",
+ "fields": {
+ "enable": "Ativar Controlador Externo",
+ "address": "Controlador Externo",
+ "secret": "Segredo do Núcleo"
+ },
+ "placeholders": {
+ "address": "Obrigatório",
+ "secret": "Recomendado"
+ },
+ "tooltips": {
+ "copy": "Copiar para a área de transferência"
+ },
+ "messages": {
+ "addressRequired": "O endereço do controlador não pode estar vazio",
+ "secretRequired": "O segredo não pode estar vazio",
+ "copyFailed": "Falha ao copiar",
+ "controllerCopied": "Endereço do controlador copiado para a área de transferência",
+ "secretCopied": "Segredo copiado para a área de transferência"
+ }
+ },
+ "externalCors": {
+ "title": "Configuração de CORS Externo",
+ "fields": {
+ "allowPrivateNetwork": "Permitir acesso à rede privada",
+ "allowedOrigins": "Origens Permitidas"
+ },
+ "placeholders": {
+ "origin": "Insira uma URL válida"
+ },
+ "actions": {
+ "add": "Adicionar"
+ },
+ "messages": {
+ "alwaysIncluded": "Origens sempre incluídas: {{urls}}"
+ },
+ "tooltips": {
+ "open": "Configurações de CORS Externo"
+ }
+ },
+ "appearance": {
+ "light": "Claro",
+ "dark": "Escuro",
+ "system": "Sistema"
+ },
+ "clash": {
+ "title": "Configurações do Clash",
+ "form": {
+ "fields": {
+ "allowLan": "Permitir LAN",
+ "dnsOverwrite": "Sobrescrever DNS",
+ "ipv6": "IPv6",
+ "unifiedDelay": "Atraso Unificado",
+ "logLevel": "Nível de Log",
+ "portConfig": "Configuração de Portas",
+ "external": "Externo",
+ "webUI": "Web UI",
+ "clashCore": "Núcleo do Clash",
+ "openUwpTool": "Abrir ferramenta UWP",
+ "updateGeoData": "Atualizar GeoData",
+ "tunnels": {
+ "title": "Gerenciamento de Túneis",
+ "localAddr": "Endereço de Escuta Local",
+ "localPort": "Porta de Escuta Local",
+ "targetAddr": "Endereço de Destino",
+ "targetPort": "Porta de Destino",
+ "proxyGroup": "Grupo de Proxy",
+ "proxyNode": "Nó de Proxy",
+ "protocols": "Protocolo",
+ "existing": "Túneis Existentes",
+ "default": "Seguir a Configuração Atual",
+ "optional": "Opcional",
+ "messages": {
+ "incomplete": "Preencha todos os campos obrigatórios do túnel",
+ "invalidLocalAddr": "Endereço de escuta local inválido",
+ "invalidLocalPort": "Porta de escuta local inválida",
+ "invalidTargetAddr": "Endereço de destino inválido",
+ "invalidTargetPort": "Porta de destino inválida"
+ },
+ "actions": {
+ "add": "Adicionar",
+ "addNew": "Adicionar Novo Túnel"
+ }
+ }
+ },
+ "tooltips": {
+ "networkInterface": "Interface de Rede",
+ "unifiedDelay": "Com o atraso unificado ativado, dois testes de atraso são realizados para eliminar as diferenças de atraso entre diferentes tipos de nós causadas por handshakes de conexão, etc.",
+ "logLevel": "Este parâmetro é válido apenas para os arquivos de log do núcleo na pasta Service do diretório de logs",
+ "openUwpTool": "Desde o Windows 8, os aplicativos UWP (como a Microsoft Store) são impedidos de acessar diretamente os serviços de rede do host local, e esta ferramenta pode ser usada para contornar essa restrição"
+ },
+ "options": {
+ "logLevel": {
+ "debug": "Debug",
+ "info": "Info",
+ "warning": "Aviso",
+ "error": "Erro",
+ "silent": "Silencioso"
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "verge": {
+ "basic": {
+ "title": "Configurações Básicas do Verge",
+ "actions": {
+ "browse": "Procurar"
+ },
+ "trayOptions": {
+ "showMainWindow": "Abrir Janela",
+ "showTrayMenu": "Abrir Menu",
+ "disable": "Desativar"
+ },
+ "fields": {
+ "language": "Idioma",
+ "themeMode": "Modo do Tema",
+ "trayClickEvent": "Ação de Clique na Bandeja",
+ "copyEnvType": "Tipo de Env ao Copiar",
+ "startPage": "Página Inicial",
+ "startupScript": "Script de Inicialização",
+ "themeSetting": "Configurações do Tema",
+ "layoutSetting": "Configurações de Layout",
+ "misc": "Diversos",
+ "hotkeySetting": "Configurações de Atalhos"
+ }
+ },
+ "advanced": {
+ "title": "Configurações Avançadas do Verge",
+ "tooltips": {
+ "backupInfo": "Suporta backup local ou via WebDAV dos arquivos de configuração",
+ "openConfDir": "Se o software funcionar de forma anormal, FAÇA BACKUP e exclua todos os arquivos desta pasta e reinicie o software",
+ "liteMode": "Fecha a interface gráfica e mantém apenas o núcleo em execução"
+ },
+ "actions": {
+ "copyVersion": "Copiar Versão"
+ },
+ "notifications": {
+ "latestVersion": "Você já está na versão mais recente",
+ "versionCopied": "Versão copiada para a área de transferência"
+ },
+ "fields": {
+ "backupSetting": "Configurações de Backup",
+ "runtimeConfig": "Configuração em Execução",
+ "openConfDir": "Abrir Pasta de Configuração",
+ "openCoreDir": "Abrir Pasta do Núcleo",
+ "openLogsDir": "Abrir Pasta de Logs",
+ "checkUpdates": "Verificar Atualizações",
+ "openDevTools": "Ferramentas de Desenvolvedor",
+ "liteModeSettings": "Configurações do Modo Leve",
+ "exit": "Sair",
+ "exportDiagnostics": "Exportar Informações de Diagnóstico",
+ "vergeVersion": "Versão do Verge"
+ }
+ },
+ "theme": {
+ "title": "Configurações do Tema",
+ "fields": {
+ "primaryColor": "Cor Primária",
+ "secondaryColor": "Cor Secundária",
+ "primaryText": "Texto Primário",
+ "secondaryText": "Texto Secundário",
+ "infoColor": "Cor de Informação",
+ "warningColor": "Cor de Aviso",
+ "errorColor": "Cor de Erro",
+ "successColor": "Cor de Sucesso",
+ "fontFamily": "Família da Fonte",
+ "cssInjection": "Injeção de CSS"
+ },
+ "actions": {
+ "editCss": "Editar CSS"
+ },
+ "dialogs": {
+ "editCssTitle": "Editar CSS"
+ }
+ },
+ "layout": {
+ "title": "Configurações de Layout",
+ "fields": {
+ "preferSystemTitlebar": "Preferir Barra de Título do Sistema",
+ "trafficGraph": "Gráfico de Tráfego",
+ "memoryUsage": "Uso do Núcleo",
+ "proxyGroupIcon": "Ícone do Grupo de Proxy",
+ "toastPosition": "Posição das Notificações",
+ "hoverNavigator": "Navegador de Salto ao Passar o Mouse",
+ "hoverNavigatorDelay": "Atraso do Navegador de Salto ao Passar o Mouse",
+ "navIcon": "Ícone de Navegação",
+ "collapseNavBar": "Recolher Barra de Navegação",
+ "trayIcon": "Ícone da Bandeja",
+ "proxyGroupsDisplayMode": "Modo de Exibição dos Grupos de Proxy",
+ "showOutboundModesInline": "Mostrar Modos de Saída em Linha",
+ "commonTrayIcon": "Ícone Comum da Bandeja",
+ "systemProxyTrayIcon": "Ícone da Bandeja do Proxy do Sistema",
+ "tunTrayIcon": "Ícone da Bandeja do Tun",
+ "enableTrayIcon": "Ativar Ícone da Bandeja",
+ "enableTraySpeed": "Ativar Velocidade na Bandeja",
+ "pauseRenderTrafficStatsOnBlur": "Pausar a renderização das estatísticas de tráfego quando sem foco"
+ },
+ "tooltips": {
+ "hoverNavigator": "Rola automaticamente até o grupo de proxy correspondente ao passar o mouse sobre as letras do alfabeto",
+ "hoverNavigatorDelay": "Atraso antes da rolagem automática ao passar o mouse, em milissegundos"
+ },
+ "options": {
+ "icon": {
+ "monochrome": "Monocromático",
+ "colorful": "Colorido",
+ "disable": "Desativar"
+ },
+ "toastPosition": {
+ "topLeft": "Superior Esquerdo",
+ "topRight": "Superior Direito",
+ "bottomLeft": "Inferior Esquerdo",
+ "bottomRight": "Inferior Direito"
+ },
+ "proxyGroupsDisplayMode": {
+ "default": "Padrão",
+ "inline": "Em Linha",
+ "disable": "Desativar"
+ }
+ }
+ }
+ }
+ },
+ "modals": {
+ "clashPort": {
+ "title": "Configuração de Portas",
+ "fields": {
+ "mixed": "Porta Mista",
+ "socks": "Porta Socks",
+ "http": "Porta Http(s)",
+ "redir": "Porta Redir",
+ "tproxy": "Porta Tproxy"
+ },
+ "actions": {
+ "random": "Porta Aleatória"
+ },
+ "messages": {
+ "portInUse": "A porta {{port}} já está em uso",
+ "runningPort": "Usando atualmente a porta {{port}}",
+ "duplicatePort": "Os listeners ativados devem usar portas diferentes",
+ "invalidPort": "Insira uma porta entre 1 e 65535",
+ "saved": "Configurações de porta salvas",
+ "saveFailed": "Falha ao salvar as configurações de porta",
+ "automaticFallback": "A porta {{oldPort}} estava em uso, então esta sessão é executada em {{newPort}}. Sua configuração não foi alterada e {{oldPort}} será tentada novamente na próxima inicialização.",
+ "automaticFallbackFailed": "Falha no fallback automático da porta mista do proxy: {{error}}",
+ "portTooLow": "A porta deve ser 1000 ou maior",
+ "portTooHigh": "A porta deve ser 65535 ou menor"
+ }
+ },
+ "clashCore": {
+ "variants": {
+ "release": "Versão Release",
+ "alpha": "Versão Alpha"
+ }
+ },
+ "liteMode": {
+ "title": "Configurações do Modo Leve",
+ "actions": {
+ "enterNow": "Entrar no Modo Leve Agora"
+ },
+ "toggles": {
+ "autoEnter": "Entrar Automaticamente no Modo Leve"
+ },
+ "tooltips": {
+ "autoEnter": "Ative para acionar automaticamente o Modo Leve depois que a janela ficar fechada por um período"
+ },
+ "fields": {
+ "delay": "Atraso para Entrar Automaticamente no Modo Leve"
+ },
+ "messages": {
+ "autoEnterHint": "Ao fechar a janela, o Modo Leve será ativado automaticamente após {{n}} minutos"
+ }
+ },
+ "backup": {
+ "title": "Configurações de Backup",
+ "tabs": {
+ "local": "Backup local",
+ "webdav": "Backup WebDAV"
+ },
+ "actions": {
+ "selectTarget": "Selecionar destino do backup",
+ "backup": "Backup",
+ "export": "Exportar",
+ "exportBackup": "Exportar Backup",
+ "importBackup": "Importar Backup",
+ "deleteBackup": "Excluir Backup",
+ "restore": "Restaurar",
+ "restoreBackup": "Restaurar Backup",
+ "viewHistory": "Ver histórico"
+ },
+ "fields": {
+ "webdavUrl": "URL do Servidor WebDAV",
+ "username": "Usuário",
+ "info": "Os backups são armazenados localmente no diretório de dados do aplicativo. Use a lista abaixo para restaurar ou excluir backups."
+ },
+ "messages": {
+ "webdavUrlRequired": "A URL do WebDAV não pode estar vazia",
+ "invalidWebdavUrl": "Formato de URL do WebDAV inválido",
+ "usernameRequired": "O usuário não pode estar vazio",
+ "passwordRequired": "A senha não pode estar vazia",
+ "webdavConfigSaved": "Configuração do WebDAV salva com sucesso",
+ "webdavConfigSaveFailed": "Falha ao salvar a configuração do WebDAV: {{error}}",
+ "backupCreated": "Backup criado com sucesso",
+ "backupFailed": "Falha no backup: {{error}}",
+ "localBackupCreated": "Backup local criado com sucesso",
+ "localBackupFailed": "Falha no backup local",
+ "restoreSuccess": "Restauração concluída, o aplicativo será reiniciado em 1s",
+ "localBackupExported": "Backup local exportado com sucesso",
+ "localBackupExportFailed": "Falha ao exportar o backup local",
+ "localBackupImported": "Backup local importado com sucesso",
+ "localBackupImportFailed": "Falha ao importar o backup local: {{error}}",
+ "webdavRefreshSuccess": "Atualização do WebDAV concluída com sucesso",
+ "webdavRefreshFailed": "Falha na atualização do WebDAV: {{error}}",
+ "confirmDelete": "Confirmar a exclusão deste arquivo de backup?",
+ "confirmRestore": "Confirmar a restauração deste arquivo de backup?"
+ },
+ "auto": {
+ "title": "Backup automático",
+ "scheduleLabel": "Ativar backup agendado",
+ "scheduleHelper": "Cria backups locais em segundo plano no intervalo configurado.",
+ "intervalLabel": "Frequência do backup",
+ "changeLabel": "Backup em alterações críticas",
+ "changeHelper": "Faz backup automaticamente quando a Configuração/Script Global Estendido é alterado.",
+ "options": {
+ "hours": "A cada {{n}} horas",
+ "days": "A cada {{n}} dias"
+ }
+ },
+ "manual": {
+ "title": "Backup manual",
+ "local": "Cria um snapshot neste dispositivo, armazenado no diretório de dados do aplicativo.",
+ "webdav": "Envia um snapshot para o seu servidor WebDAV assim que as credenciais forem definidas.",
+ "configureWebdav": "Configurar WebDAV"
+ },
+ "history": {
+ "title": "Histórico de backups",
+ "summary": "{{count}} backups • mais recente {{recent}}",
+ "empty": "Nenhum backup disponível",
+ "unknownPlatform": "desconhecida",
+ "unknownTime": "Hora desconhecida"
+ },
+ "webdav": {
+ "title": "Configurações do WebDAV"
+ },
+ "table": {
+ "filename": "Nome do Arquivo",
+ "backupTime": "Hora do Backup",
+ "actions": "Ações",
+ "noBackups": "Nenhum backup disponível",
+ "rowsPerPage": "Linhas por página"
+ }
+ },
+ "misc": {
+ "title": "Diversos",
+ "fields": {
+ "appLogLevel": "Nível de Log do Aplicativo",
+ "appLogMaxSize": "Tamanho Máximo do Log do Aplicativo",
+ "appLogMaxCount": "Quantidade Máxima de Logs do Aplicativo",
+ "autoCloseConnections": "Fechar Conexões Automaticamente",
+ "autoCheckUpdate": "Verificar Atualizações Automaticamente",
+ "enableBuiltinEnhanced": "Ativar Aprimoramento Integrado",
+ "proxyLayoutColumns": "Colunas do Layout de Proxy",
+ "autoLogClean": "Limpeza Automática de Logs",
+ "autoDelayDetection": "Detecção Automática de Atraso",
+ "autoDelayDetectionInterval": "Intervalo da Detecção Automática de Atraso",
+ "defaultLatencyTest": "Teste de Latência Padrão",
+ "defaultLatencyTimeout": "Tempo Limite de Latência Padrão"
+ },
+ "tooltips": {
+ "autoCloseConnections": "Encerra as conexões estabelecidas quando a seleção do grupo de proxy ou o modo de proxy muda",
+ "enableBuiltinEnhanced": "Tratamento de compatibilidade para o arquivo de configuração",
+ "autoDelayDetection": "Testa periodicamente a latência do nó atual em segundo plano",
+ "defaultLatencyTest": "Usado apenas para testes de requisição do cliente HTTP e não afeta o arquivo de configuração"
+ },
+ "options": {
+ "proxyLayoutColumns": {
+ "auto": "Colunas Automáticas"
+ },
+ "autoLogClean": {
+ "never": "Nunca Limpar",
+ "retainDays": "Manter {{n}} Dias"
+ }
+ }
+ },
+ "update": {
+ "title": "Nova Versão v{{version}}",
+ "actions": {
+ "goToRelease": "Ir para a Página da Release",
+ "update": "Atualizar"
+ },
+ "messages": {
+ "breakChangeError": "Esta versão é uma atualização importante e não oferece suporte a atualizações dentro do aplicativo. Desinstale-a e baixe e instale a nova versão manualmente",
+ "available": "Uma nova versão está disponível"
+ },
+ "alerts": {
+ "note": "Nota",
+ "tip": "Dica",
+ "important": "Importante",
+ "warning": "Aviso",
+ "caution": "Cuidado"
+ }
+ },
+ "sysproxy": {
+ "title": "Configurações do Proxy do Sistema",
+ "fieldsets": {
+ "currentStatus": "Proxy do Sistema Atual"
+ },
+ "fields": {
+ "enableStatus": "Status de Ativação:",
+ "serverAddr": "Endereço do Servidor: ",
+ "pacUrl": "URL do PAC: ",
+ "proxyHost": "Host do Proxy",
+ "usePacMode": "Usar Modo PAC",
+ "proxyGuard": "Proteção do Proxy",
+ "guardDuration": "Duração da Proteção",
+ "alwaysUseDefaultBypass": "Sempre usar o Bypass Padrão",
+ "enableBypassCheck": "Validar Formato do Bypass do Proxy",
+ "proxyBypass": "Configurações de Bypass do Proxy: ",
+ "bypass": "Bypass: ",
+ "pacScriptContent": "Conteúdo do Script PAC"
+ },
+ "tooltips": {
+ "proxyGuard": "Ative para impedir que outros softwares modifiquem as configurações de proxy do sistema operacional"
+ },
+ "messages": {
+ "durationTooShort": "A duração do daemon do proxy não pode ser menor que 1 segundo",
+ "invalidBypass": "Formato de Bypass inválido",
+ "invalidProxyHost": "Formato de host do proxy inválido"
+ },
+ "actions": {
+ "editPac": "Editar PAC"
+ }
+ },
+ "tun": {
+ "title": "Modo Tun",
+ "fields": {
+ "stack": "Stack do Tun",
+ "device": "Nome do Dispositivo",
+ "autoRoute": "Rota Automática",
+ "routeExcludeAddress": "Endereços Excluídos da Rota",
+ "strictRoute": "Rota Estrita",
+ "autoDetectInterface": "Detectar Interface Automaticamente",
+ "dnsHijack": "Sequestro de DNS",
+ "mtu": "Unidade Máxima de Transmissão",
+ "autoRedirect": "Redirecionamento Automático"
+ },
+ "tooltips": {
+ "dnsHijack": "Use , para separar vários servidores DNS",
+ "autoRedirect": "Configura automaticamente os redirecionamentos TCP do nftables/iptables"
+ },
+ "messages": {
+ "applied": "Configurações Aplicadas",
+ "invalidRouteExcludeAddress": "Insira um bloco CIDR válido",
+ "routeExcludeAddressHint": "Somente CIDR IPv4/IPv6 é suportado, como 192.168.0.0/16 ou fd00::/8"
+ }
+ },
+ "dns": {
+ "dialog": {
+ "title": "Sobrescrever DNS",
+ "profileScope": "A opção de sobrescrever DNS é salva separadamente para cada perfil e se aplica somente a esse perfil.",
+ "warning": "Se você não está familiarizado com estas configurações, não as modifique e mantenha a Sobrescrita de DNS desativada"
+ },
+ "protection": {
+ "title": "Ativar Sobrescrita de DNS?",
+ "message": "Esta assinatura contém configurações de DNS personalizadas. A Sobrescrita de DNS pode substituí-las, impedindo que os nós se conectem ou que alguns sites sejam carregados. Ativar mesmo assim?",
+ "enableAnyway": "Ativar mesmo assim",
+ "keepDisabled": "Manter desativada",
+ "autoDisabled": "A Sobrescrita de DNS foi desativada para preservar as configurações de DNS personalizadas da assinatura atual."
+ },
+ "sections": {
+ "general": "Configurações de DNS",
+ "fallbackFilter": "Configurações do Filtro de Fallback",
+ "hosts": "Configurações de Hosts"
+ },
+ "fields": {
+ "enable": "Ativar DNS",
+ "listen": "Escuta do DNS",
+ "enhancedMode": "Modo Aprimorado",
+ "fakeIpRange": "Intervalo de Fake IP",
+ "fakeIpRange6": "Intervalo de Fake IP (IPv6)",
+ "fakeIpFilterMode": "Modo do Filtro de Fake IP",
+ "ipv6": {
+ "label": "IPv6",
+ "description": "Ativar resolução DNS IPv6"
+ },
+ "preferH3": {
+ "label": "Preferir H3",
+ "description": "O DNS DOH usa HTTP/3"
+ },
+ "respectRules": {
+ "label": "Respeitar Regras",
+ "description": "As conexões DNS seguem as regras de roteamento"
+ },
+ "useHosts": {
+ "label": "Usar Hosts",
+ "description": "Ative para resolver hosts por meio do arquivo hosts"
+ },
+ "useSystemHosts": {
+ "label": "Usar Hosts do Sistema",
+ "description": "Ative para resolver hosts por meio do arquivo hosts do sistema"
+ },
+ "directPolicy": {
+ "label": "Nameserver Direto Segue a Política",
+ "description": "Define se deve seguir a política de nameserver"
+ },
+ "defaultNameserver": {
+ "label": "Nameserver Padrão",
+ "description": "Servidores DNS padrão usados para resolver servidores DNS"
+ },
+ "nameserver": {
+ "label": "Nameserver",
+ "description": "Lista de servidores DNS, separados por vírgula"
+ },
+ "fallback": {
+ "label": "Fallback",
+ "description": "Lista de servidores DNS de fallback, separados por vírgula"
+ },
+ "proxy": {
+ "label": "Nameserver do Servidor Proxy",
+ "description": "Servidores DNS para resolução de domínios dos nós de proxy"
+ },
+ "directNameserver": {
+ "label": "Nameserver Direto",
+ "description": "Servidores DNS para resolução de domínios de saída direta, suporta a palavra-chave 'system', separados por vírgula"
+ },
+ "fakeIpFilter": {
+ "label": "Filtro de Fake IP",
+ "description": "Domínios que ignoram a resolução de fake IP, separados por vírgula"
+ },
+ "nameserverPolicy": {
+ "label": "Política de Nameserver",
+ "description": "Servidor DNS específico por domínio, vários servidores separados por ponto e vírgula, formato: domínio=servidor1;servidor2"
+ },
+ "geoipFiltering": {
+ "label": "Filtragem GeoIP",
+ "description": "Ativar filtragem GeoIP para o fallback"
+ },
+ "geoipCode": "Código GeoIP",
+ "fallbackIpCidr": {
+ "label": "CIDR de IP do Fallback",
+ "description": "CIDRs de IP que não usam servidores de fallback, separados por vírgula"
+ },
+ "fallbackDomain": {
+ "label": "Domínio do Fallback",
+ "description": "Domínios que usam servidores de fallback, separados por vírgula"
+ },
+ "hosts": {
+ "label": "Hosts",
+ "description": "Mapeamento personalizado de domínio para IP ou domínio"
+ }
+ },
+ "messages": {
+ "saved": "Configurações de DNS salvas",
+ "configError": "Erro na configuração de DNS:"
+ },
+ "errors": {
+ "invalid": "Configuração inválida",
+ "invalidYaml": "Formato YAML inválido"
+ }
+ },
+ "webUI": {
+ "actions": {
+ "openUrl": "Abrir URL"
+ },
+ "title": "Web UI",
+ "messages": {
+ "supportedPlaceholders": "Suporta %host, %port, %secret",
+ "placeholderInstruction": "Substitua host, port, secret por %host, %port, %secret"
+ },
+ "errors": {
+ "clashInfoUnavailable": "As informações de conexão do núcleo não estão disponíveis",
+ "invalidServer": "O endereço do servidor do núcleo \"{{server}}\" é inválido",
+ "openFailed": "Falha ao abrir a Web UI"
+ }
+ },
+ "hotkey": {
+ "toggles": {
+ "enableGlobal": "Ativar Atalho Global"
+ },
+ "title": "Configurações de Atalhos",
+ "functions": {
+ "rule": "Modo Regra",
+ "global": "Modo Global",
+ "openOrCloseDashboard": "Abrir/Fechar Painel",
+ "toggleSystemProxy": "Ativar/Desativar Proxy do Sistema",
+ "toggleTunMode": "Ativar/Desativar Modo Tun",
+ "entryLightweightMode": "Entrar no Modo Leve",
+ "direct": "Modo Direto",
+ "reactivateProfiles": "Reativar Perfis"
+ }
+ },
+ "networkInterface": {
+ "title": "Interface de Rede",
+ "fields": {
+ "ipAddress": "Endereço IP",
+ "macAddress": "Endereço MAC"
+ }
+ }
+ },
+ "feedback": {
+ "errors": {
+ "clash": {
+ "configUpdateFailed": "Falha ao atualizar a configuração do núcleo",
+ "modeUpdateFailed": "Falha ao alterar o modo de proxy",
+ "restartFailed": "Falha ao reiniciar o núcleo",
+ "startFailed": "Falha ao iniciar o núcleo",
+ "serviceCoreStopped": "O núcleo do serviço parou inesperadamente",
+ "stopFailed": "Falha ao parar o núcleo"
+ },
+ "clashService": {
+ "installFailed": "Falha ao instalar o serviço",
+ "uninstallFailed": "Falha ao desinstalar o serviço",
+ "reinstallFailed": "Falha ao reinstalar o serviço",
+ "repairFailed": "Falha ao reparar o serviço",
+ "sidecarFailed": "Falha ao continuar com o Sidecar",
+ "coreAlreadyRunning": "Não foi possível iniciar o modo normal (Sidecar): outro núcleo ainda está em execução (PID {{pid}}). Saia das outras instâncias do Clash Verge ou do aplicativo que usa este núcleo e tente novamente."
+ },
+ "sysproxy": {
+ "privilegeRequired": "Não é possível definir o proxy do sistema: o macOS recusou a alteração por falta de privilégios. Instale o serviço do Clash Verge; um administrador também pode desativar a exigência de senha de administrador para configurações do sistema, nas opções avançadas em Ajustes do Sistema → Privacidade e Segurança.",
+ "directFallback": "Falha ao definir o proxy do sistema; o tráfego foi revertido para conexão direta.",
+ "guardStopped": "A proteção do proxy do sistema parou após falhar várias vezes ao executar. O proxy do sistema não está mais sendo mantido.",
+ "sidecarWhileServiceReady": "Não foi possível definir o proxy do sistema porque o núcleo ainda está em execução como Sidecar, embora o serviço do Clash Verge esteja pronto. Reinicie o núcleo para mudar para o modo serviço.",
+ "coreNotReady": "Não foi possível ativar o proxy do sistema porque o núcleo não está em execução. Inicie o núcleo (ou instale/repare o serviço do Clash Verge) e tente novamente.",
+ "systemCallFailed": "Não foi possível gravar o proxy do sistema porque uma chamada de sistema do Windows falhou. Geralmente é temporário, então tente novamente."
+ }
+ },
+ "notifications": {
+ "clash": {
+ "restartSuccess": "Núcleo do Clash Reiniciado",
+ "versionUpdated": "Versão do Núcleo Atualizada",
+ "alreadyLatestVersion": "Já Está Usando a Versão Mais Recente do Núcleo",
+ "changeSuccess": "Núcleo alterado com sucesso",
+ "changeFailed": "Falha ao alterar o núcleo",
+ "geoDataUpdated": "GeoData Atualizado"
+ },
+ "clashService": {
+ "appDataNotOwned": "O serviço se recusou a iniciar o núcleo porque, no disco, a pasta de dados do aplicativo não pertence à sua conta (comum quando a pasta pessoal está em um disco externo). Reparar o serviço não resolverá isso. Execute este comando em um terminal e reinicie o aplicativo:",
+ "installSuccess": "Serviço Instalado com Sucesso",
+ "permissionFallback": "{{reason}} Mudou para o modo normal (Sidecar); o TUN requer privilégios de administrador. Siga o guia para corrigir e reinstalar o serviço. Se preferir não corrigir ou não souber como, execute o aplicativo como administrador sem instalar o serviço.",
+ "permissionWritableReason": "Contas comuns podem modificar os arquivos do núcleo ou uma pasta superior, então o serviço se recusou a executar o núcleo com privilégios elevados.",
+ "permissionRejectedReason": "O serviço não conseguiu confirmar que os arquivos e pastas do núcleo são seguros para execução com privilégios elevados.",
+ "permissionRepairGuide": "Ver instruções de reparo",
+ "sidecarFallback": "O serviço não conseguiu iniciar o núcleo. Mudou para o modo Sidecar; o serviço continua indisponível.",
+ "uninstallSuccess": "Serviço Desinstalado com Sucesso"
+ },
+ "updater": {
+ "withClashProxySuccess": "Atualização com o proxy do Clash concluída com sucesso",
+ "withClashProxyFailed": "A atualização falhou mesmo com o proxy do Clash"
+ }
+ }
+ },
+ "statuses": {
+ "clash": {
+ "stopping": "Parando o Núcleo...",
+ "restarting": "Reiniciando o Núcleo..."
+ },
+ "clashService": {
+ "installing": "Instalando o Serviço...",
+ "uninstalling": "Desinstalando o Serviço..."
+ }
+ }
+}
diff --git a/src/locales/pt/shared.json b/src/locales/pt/shared.json
new file mode 100644
index 000000000..c6840b87e
--- /dev/null
+++ b/src/locales/pt/shared.json
@@ -0,0 +1,139 @@
+{
+ "actions": {
+ "cancel": "Cancelar",
+ "close": "Fechar",
+ "confirm": "Confirmar",
+ "save": "Salvar",
+ "delete": "Excluir",
+ "edit": "Editar",
+ "new": "Novo",
+ "enable": "Ativar",
+ "upgrade": "Atualizar versão",
+ "restart": "Reiniciar",
+ "resetToDefault": "Restaurar padrão",
+ "refresh": "Atualizar",
+ "retry": "Tentar novamente",
+ "refreshPage": "Recarregar página",
+ "showDetails": "Mostrar detalhes",
+ "hideDetails": "Ocultar detalhes",
+ "listView": "Visualização em lista",
+ "tableView": "Visualização em tabela",
+ "pause": "Pausar",
+ "resume": "Retomar",
+ "closeAll": "Fechar tudo",
+ "clear": "Limpar",
+ "previous": "Anterior",
+ "next": "Próximo",
+ "check": "Verificar"
+ },
+ "labels": {
+ "updateAt": "Atualizado em",
+ "timeout": "Tempo limite",
+ "icon": "Ícone",
+ "name": "Nome",
+ "readOnly": "Somente leitura",
+ "expireTime": "Expira em",
+ "updateTime": "Hora da atualização",
+ "usedTotal": "Usado / Total",
+ "from": "De",
+ "password": "Senha",
+ "retryAttempts": "Tentativas",
+ "downloaded": "Baixado",
+ "uploaded": "Enviado"
+ },
+ "statuses": {
+ "enabled": "Ativado",
+ "disabled": "Desativado",
+ "saving": "Salvando...",
+ "empty": "Vazio",
+ "loading": "Carregando..."
+ },
+ "units": {
+ "milliseconds": "ms",
+ "seconds": "segundos",
+ "minutes": "min",
+ "hours": "h",
+ "kilobytes": "KB",
+ "files": "Arquivos"
+ },
+ "placeholders": {
+ "resetInput": "Limpar entrada",
+ "filter": "Condições do filtro",
+ "matchCase": "Diferenciar maiúsculas",
+ "matchWholeWord": "Palavra inteira",
+ "useRegex": "Usar expressão regular"
+ },
+ "validation": {
+ "invalidRegex": "Expressão regular inválida"
+ },
+ "window": {
+ "maximize": "Maximizar",
+ "minimize": "Minimizar"
+ },
+ "editorModes": {
+ "visualization": "Visualização",
+ "advanced": "Avançado"
+ },
+ "feedback": {
+ "errors": {
+ "unexpected": "Algo deu errado",
+ "label": "Erro",
+ "unknown": "Erro desconhecido",
+ "details": "Detalhes do erro",
+ "stack": "Pilha de erros",
+ "componentStack": "Pilha de componentes",
+ "trafficUnavailable": "Dados de tráfego indisponíveis",
+ "operationFailed": "A operação falhou",
+ "trafficStats": "Erro nas estatísticas de tráfego",
+ "trafficStatsDescription": "O componente de estatísticas de tráfego encontrou um erro e foi desativado para evitar falhas."
+ },
+ "notices": {
+ "raw": "{{message}}",
+ "prefixedRaw": "{{prefix}} {{message}}"
+ },
+ "notifications": {
+ "importSuccess": "Perfil importado com sucesso",
+ "importSubscriptionSuccess": "Assinatura importada com sucesso",
+ "importWithClashProxy": "Perfil importado com o proxy do Clash",
+ "updateAvailable": "Atualização disponível",
+ "saved": "Salvo com sucesso",
+ "common": {
+ "copySuccess": "Copiado com sucesso",
+ "saveSuccess": "Configuração salva com sucesso",
+ "saveFailed": "Falha ao salvar a configuração",
+ "refreshFailed": "Falha ao atualizar; exibindo o último valor carregado"
+ }
+ },
+ "validation": {
+ "config": {
+ "failed": "A validação da configuração da assinatura falhou. Verifique o arquivo de configuração da assinatura; as modificações foram revertidas.",
+ "bootFailed": "A validação da configuração da assinatura na inicialização falhou. Iniciado com a configuração padrão; verifique o arquivo de configuração da assinatura.",
+ "processTerminated": "O processo de validação foi encerrado. Verifique se algum software de segurança está impedindo a execução do núcleo ou se a CPU e o ambiente de execução do seu computador são compatíveis com o executável do núcleo."
+ },
+ "script": {
+ "syntaxError": "Erro de sintaxe no script, alterações revertidas",
+ "missingMain": "Erro no script, alterações revertidas",
+ "fileNotFound": "Arquivo ausente, alterações revertidas",
+ "fileError": "Erro no arquivo de script, alterações revertidas"
+ },
+ "yaml": {
+ "syntaxError": "Erro de sintaxe YAML, alterações revertidas",
+ "readError": "Erro de leitura YAML, alterações revertidas",
+ "mappingError": "Erro de mapeamento YAML, alterações revertidas"
+ },
+ "merge": {
+ "syntaxError": "Erro de sintaxe no arquivo de mesclagem, alterações revertidas",
+ "mappingError": "Erro de mapeamento no arquivo de mesclagem, alterações revertidas"
+ }
+ }
+ },
+ "filters": {
+ "logLevels": {
+ "all": "ALL",
+ "debug": "DEBUG",
+ "info": "INFO",
+ "warn": "WARN",
+ "error": "ERROR"
+ }
+ }
+}
diff --git a/src/locales/pt/tests.json b/src/locales/pt/tests.json
new file mode 100644
index 000000000..20c04d542
--- /dev/null
+++ b/src/locales/pt/tests.json
@@ -0,0 +1,60 @@
+{
+ "page": {
+ "actions": {
+ "testAll": "Testar tudo"
+ },
+ "title": "Testar"
+ },
+ "components": {
+ "item": {
+ "actions": {
+ "test": "Testar"
+ }
+ }
+ },
+ "modals": {
+ "test": {
+ "title": {
+ "create": "Criar teste",
+ "edit": "Editar teste"
+ },
+ "fields": {
+ "url": "URL de teste"
+ },
+ "errors": {
+ "nameRequired": "Informe um nome",
+ "urlRequired": "Informe uma URL de teste",
+ "invalidSvg": "O ícone não é um SVG válido",
+ "uidMissing": "O identificador do item de teste está ausente",
+ "saveFailed": "Falha ao salvar o item de teste"
+ }
+ }
+ },
+ "statuses": {
+ "test": {
+ "pending": "Pendente",
+ "yes": "Sim",
+ "no": "Não",
+ "failed": "Falhou",
+ "completed": "Concluído",
+ "disallowedIsp": "ISP não permitido",
+ "originalsOnly": "Somente originais",
+ "noDisney": "Não (IP banido pelo Disney+)",
+ "unsupportedRegion": "País/região não suportado",
+ "failedNetwork": "Falhou (conexão de rede)"
+ }
+ },
+ "unlock": {
+ "page": {
+ "actions": {
+ "testing": "Testando..."
+ },
+ "empty": "Nenhum item de teste de desbloqueio",
+ "messages": {
+ "detectionFailedWithName": "Falha na detecção de {{name}}",
+ "detectionTimeout": "Tempo limite da detecção esgotado ou falhou"
+ },
+ "title": "Teste de desbloqueio"
+ }
+ }
+}
diff --git a/src/services/i18n.ts b/src/services/i18n.ts
index d614c5e90..588de9ea5 100644
--- a/src/services/i18n.ts
+++ b/src/services/i18n.ts
@@ -15,6 +15,7 @@ export const supportedLanguages = [
'es',
'jp',
'zhtw',
+ 'pt',
]
export const FALLBACK_LANGUAGE = 'zh'