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 @@ +

+ Clash +
+ 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 | +| -------------------------------------- | -------------------------------------- | +| ![Visual escuro](./preview_dark.png) | ![Visual claro](./preview_light.png) | + +## 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'