diff --git a/ui/src/lib/i18n.ts b/ui/src/lib/i18n.ts index f75f9118..bc2eaef2 100644 --- a/ui/src/lib/i18n.ts +++ b/ui/src/lib/i18n.ts @@ -2746,6 +2746,2808 @@ const resources = { }, }, }, + 'pt-BR': { + translation: { + locale: { + en: 'Inglês', + 'zh-CN': 'Chinês Simplificado', + vi: 'Vietnamita', + ja: 'Japonês', + ko: 'Coreano', + 'pt-BR': 'Português (Brasil)', + }, + layout: { + languageSwitcher: 'Idioma', + }, + nav: { + general: 'Geral', + home: 'Início', + analytics: 'Análises', + identityAccess: 'Identidade e Acesso', + apiProfiles: 'Perfis', + cliproxyPlus: 'CLIProxy Plus', + cliproxyOverview: 'Visão Geral', + controlPanel: 'Painel de Controle', + githubCopilot: 'GitHub Copilot', + cursorIde: 'Cursor IDE', + claudeExtension: 'Extensão Claude', + accounts: 'Contas', + allAccounts: 'Todas as Contas', + sharedData: 'Recursos Compartilhados', + compatibleClis: 'Compatíveis', + deprecated: 'Descontinuado', + factoryDroid: 'Factory Droid', + system: 'Sistema', + health: 'Saúde', + logs: 'Logs', + settings: 'Configurações', + openrouterTooltip: 'Destaque: OpenRouter + Alibaba Coding Plan + Ollama', + }, + home: { + profiles: 'Perfis', + cliproxy: 'CLIProxy', + accounts: 'Contas', + health: 'Saúde', + configurationRequired: 'Configuração Necessária', + }, + auth: { + dashboardTitle: 'Painel CCS', + protectedAccessLabel: 'Acesso protegido', + remoteGuardLabel: 'Proteção de acesso remoto', + loading: 'Verificando acesso ao painel…', + loginDescription: + 'Use o nome de usuário e a senha configurados para esta instância do CCS para acessar o painel.', + username: 'Nome de usuário', + password: 'Senha', + usernamePlaceholder: 'Digite o nome de usuário', + passwordPlaceholder: 'Digite a senha', + signIn: 'Entrar', + signingIn: 'Entrando...', + loginFailed: 'Falha no login', + lightMode: 'Claro', + darkMode: 'Escuro', + noDefaultCredentials: 'O CCS não vem com credenciais padrão.', + credentialsHint: + 'As credenciais são criadas com `ccs config auth setup` no host do CCS. Implantações Docker devem executar esse comando dentro do container.', + remoteSetupTitle: 'O acesso remoto precisa de configuração de autenticação', + remoteSetupDescription: + 'Este painel foi aberto a partir de um endereço não local, mas a autenticação do painel ainda não está habilitada para esta instância do CCS.', + incompleteSetupDescription: + 'A autenticação do painel está ativada, mas a configuração está incompleta. Finalize a configuração desta instância do CCS antes de entrar.', + safetyNoteRemote: + 'O gerenciamento remoto permanece bloqueado até que o proprietário do host CCS habilite a autenticação do painel.', + safetyNoteLocal: + 'Se você estiver na mesma máquina, a URL localhost continua sendo o caminho mais simples para entrar.', + safetyNoteSession: + 'Logins bem-sucedidos criam uma sessão somente HTTP que fica restrita a este host do painel.', + hostStepTitle: 'No host do CCS', + hostStepDescription: + 'Crie ou reative as credenciais do painel e, em seguida, reabra esta página a partir do dispositivo remoto.', + dockerStepDescription: + 'Implantação Docker? Execute a configuração dentro do container em execução:', + localStepTitle: 'Se esta for a sua máquina', + localStepDescription: + 'Abra a URL localhost exibida por `ccs config` em vez do endereço da LAN ou do Tailscale.', + showPassword: 'Mostrar senha', + hidePassword: 'Ocultar senha', + }, + commonToast: { + apiKeyRequired: 'A chave de API é obrigatória', + accountAddedPresetFailed: 'Conta adicionada, mas falha ao aplicar o preset padrão', + settingsCopied: 'Configurações copiadas para a área de transferência', + enterPresetName: 'Digite um nome de preset para salvar', + codeCopied: 'Código copiado para a área de transferência', + copyCodeFailed: 'Falha ao copiar o código', + appliedModelAllTiers: 'Modelo aplicado a todos os níveis', + settingsSaved: 'Configurações salvas', + defaultTargetUpdated: 'Destino padrão atualizado', + failedUpdateDefaultTarget: 'Falha ao atualizar o destino padrão para {{target}}{{suffix}}', + resourcesUpdated: 'Recursos compartilhados atualizados', + }, + profileDialog: { + editTitle: 'Editar Perfil', + createTitle: 'Criar Perfil de API', + name: 'Nome', + namePlaceholder: 'minha-api', + baseUrl: 'URL Base', + baseUrlPlaceholder: 'https://api.example.com', + apiKey: 'Chave de API', + defaultModel: 'Modelo Padrão (ANTHROPIC_MODEL)', + defaultModelHint: 'Deixe em branco para usar: {{model}}', + modelMappingTitle: 'Mapeamento de Modelos (Opus/Sonnet/Haiku)', + modelMappingDesc: + 'Configure IDs de modelo diferentes para cada nível. Útil para proxies de API que roteiam diferentes tipos de modelo para back-ends diferentes.', + opusModel: 'Modelo Opus (ANTHROPIC_DEFAULT_OPUS_MODEL)', + sonnetModel: 'Modelo Sonnet (ANTHROPIC_DEFAULT_SONNET_MODEL)', + haikuModel: 'Modelo Haiku (ANTHROPIC_DEFAULT_HAIKU_MODEL)', + cancel: 'Cancelar', + saving: 'Salvando...', + update: 'Atualizar', + create: 'Criar', + }, + modelTierMapping: { + title: 'Mapeamento de Nível de Modelo', + advanced: 'Avançado', + description: + 'Configure modelos diferentes para os níveis opus/sonnet/haiku do Claude Code.', + autoSuggest: 'Sugestão automática baseada em {{provider}}', + opusPlaceholder: 'ex.: anthropic/claude-opus-4', + sonnetPlaceholder: 'ex.: anthropic/claude-sonnet-4', + haikuPlaceholder: 'ex.: anthropic/claude-3.5-haiku', + footer: + 'Isso define ANTHROPIC_DEFAULT_OPUS_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL, ANTHROPIC_DEFAULT_HAIKU_MODEL.', + }, + envEditor: { + sensitive: 'sensível', + none: 'Nenhuma variável de ambiente configurada.', + noneHint: 'Adicione variáveis usando o campo abaixo ou edite o JSON diretamente.', + addVariable: 'Adicionar Variável de Ambiente', + keyPlaceholder: 'NOME_DA_VARIAVEL', + valuePlaceholder: 'valor', + }, + setupVariant: { + using: 'Usando:', + variantNameRequired: 'Nome da Variante de Execução *', + variantNamePlaceholder: 'ex.: my-gemini, g3, flash', + invokeHintPrefix: 'Execute com esta variante:', + model: 'Modelo', + modelPlaceholder: 'ex.: gemini-2.5-pro, claude-opus-4-6-thinking', + choosePresetInstead: 'Escolher entre presets', + selectModel: 'Selecione um modelo', + customModelName: 'Nome de modelo personalizado...', + enterAnyModel: 'Digite qualquer nome de modelo suportado pelo CLIProxy', + defaultModel: 'Padrão: {{model}}', + providerDefault: 'padrão do provedor', + back: 'Voltar', + skip: 'Pular', + creating: 'Criando...', + createVariant: 'Criar Variante', + skipHint: + 'Pule se a configuração da conta já for suficiente e você não precisar de uma variante de execução separada', + }, + customPresetDialog: { + title: 'Preset Personalizado', + presetNameOptional: 'Nome do Preset (opcional)', + presetNamePlaceholder: 'ex.: Minha Configuração Personalizada', + codexTipPrefix: 'Dica do Codex: sufixos', + codexTipSuffix: 'fixam o esforço. Modelos sem sufixo usam as configurações de Pensamento.', + defaultModel: 'Modelo Padrão', + defaultModelDesc: 'Usado quando nenhum nível específico é solicitado', + opusModel: 'Opus (Mais capaz)', + opusModelDesc: 'Para tarefas de raciocínio complexas', + sonnetModel: 'Sonnet (Equilibrado)', + sonnetModelDesc: 'Equilíbrio entre velocidade e capacidade', + haikuModel: 'Haiku (Rápido)', + haikuModelDesc: 'Respostas rápidas para tarefas simples', + cancel: 'Cancelar', + savePreset: 'Salvar Preset', + applyPreset: 'Aplicar Preset', + deletePreset: 'Excluir Preset', + }, + componentModelSelector: { + selectModel: 'Selecionar modelo', + availableModelsCount: 'Modelos Disponíveis ({{count}})', + preview: 'Pré-visualização', + }, + searchableSelect: { + searchModels: 'Buscar modelos...', + noResults: 'Nenhum resultado encontrado.', + }, + copilotSettings: { + enableCopilot: 'Habilitar Copilot', + enableCopilotDesc: 'Permitir o uso da assinatura do GitHub Copilot', + basicSettings: 'Configurações Básicas', + accountType: 'Tipo de Conta', + accountTypeIndividual: 'Individual', + accountTypeBusiness: 'Empresarial', + accountTypeEnterprise: 'Corporativo', + rateLimiting: 'Limitação de Taxa', + rateLimitSeconds: 'Limite de Taxa (segundos)', + noLimit: 'Sem limite', + waitOnRateLimit: 'Aguardar no Limite de Taxa', + waitOnRateLimitDesc: 'Aguardar em vez de gerar erro ao atingir o limite', + daemonSettings: 'Configurações do Daemon', + autoStartDaemon: 'Iniciar Daemon Automaticamente', + autoStartDaemonDesc: 'Iniciar o copilot-api ao usar o perfil', + }, + providerModelSelector: { + selectModel: 'Selecionar modelo', + noModelsForProvider: 'Nenhum modelo disponível para este provedor', + broken: 'QUEBRADO', + deprecated: 'DESCONTINUADO', + paid: 'PAGO', + freeTier: 'Nível Gratuito', + paidTier: 'Nível Pago', + modelKnownIssues: 'Este modelo tem problemas conhecidos', + viewIssueDetails: 'Ver detalhes do problema', + modelDeprecated: 'Este modelo está descontinuado', + recommended: 'Recomendado', + allModelsCount: 'Todos os Modelos ({{count}})', + noModelsAvailable: 'Nenhum modelo disponível', + shadowed: 'Sombreado', + prefixOnly: 'Somente prefixo', + current: 'Atual', + currentValue: 'Valor atual', + customModel: 'Modelo personalizado', + preferredPinnedModel: 'Modelo fixado preferido:', + pinnedRouteStatus: 'Status da rota fixada:', + pinnedModelNotAdvertised: + 'O modelo fixado não está sendo anunciado atualmente pelo proxy: {{model}}', + codexReasoningVariants: 'Variantes de raciocínio', + codexFastVariants: 'Variantes rápidas', + }, + createAuthProfileDialog: { + title: 'Criar Nova Conta', + description: + 'Perfis de autenticação exigem login pela CLI do Claude. Execute o comando abaixo no seu terminal. Você pode editar o modo de sincronização, o grupo e a profundidade de continuidade depois, na tabela de Contas.', + profileName: 'Nome do Perfil', + profileNamePlaceholder: 'ex.: trabalho, pessoal, cliente', + invalidProfileName: + 'O nome deve começar com uma letra e conter apenas letras, números, hifens ou sublinhados.', + enableSharedHistory: + 'Habilitar sincronização de histórico compartilhado com outras contas ccs auth', + historySyncGroupOptional: 'Grupo de Sincronização de Histórico (opcional)', + historySyncGroupPlaceholder: 'default, sprint-a, cliente-x', + historySyncGroupHint: + 'Deixe em branco para usar o grupo compartilhado padrão. Espaços são normalizados para hifens.', + deeperContinuity: 'Avançado: modo de continuidade mais profunda', + deeperContinuityHint: + 'Adiciona sincronização de session-env, file-history, shell-snapshots e todos. As credenciais permanecem isoladas.', + invalidContextGroup: + 'O grupo deve começar com uma letra e usar apenas letras, números, hifens ou sublinhados (máx. {{max}} caracteres).', + command: 'Comando', + commandFallback: 'ccs auth create ', + afterRunPrefix: 'Depois de executar o comando:', + afterRunStep1: 'Complete o login do Claude no seu navegador', + afterRunStep2: 'Volte aqui e atualize para ver a nova conta', + poolingHint: + 'Prefere o roteamento agrupado de OAuth do Claude? Use o pool Claude do CLIProxy no botão de ação da página de Contas.', + close: 'Fechar', + copied: 'Copiado!', + copyCommand: 'Copiar Comando', + }, + accountRouteGuide: { + title: 'Rota recomendada de duas contas', + description: + 'Use perfis de conta separados para isolamento de tokens. Ative a sincronização de histórico somente quando as duas contas devem compartilhar a mesma continuidade local.', + status: { + empty: 'criar contas', + isolated: 'isolado pronto', + shared: 'contexto de projeto compartilhado', + deeper: 'sincronização profunda pronta', + mixed: 'configuração mista', + }, + cards: { + isolated: { + title: 'Os tokens permanecem separados', + desc: 'Cada conta ccs auth possui sua própria configuração, login e credenciais do Claude. As configurações de sincronização nunca copiam tokens.', + }, + select: { + title: 'Você escolhe a conta', + desc: 'Execute ccs work ou ccs personal para uso explícito. Defina Padrão apenas quando o ccs simples deve seguir uma conta.', + }, + settings: { + title: 'As configurações seguem a raiz', + desc: 'Contas não-padrão vinculam o settings.json através do estado compartilhado do CCS ao ~/.claude/settings.json. O ccs auth show confirma isso.', + }, + sync: { + title: 'A sincronização de histórico é opcional', + desc: 'As duas contas precisam do modo Compartilhado e do mesmo grupo. A sincronização profunda adiciona artefatos extras de continuidade local.', + }, + }, + commands: { + isolated: 'Uso de conta isolada', + sync: 'Histórico compartilhado opcional', + syncDesc: + 'Use o mesmo grupo, como "{{group}}", nas duas contas quando quiser que compartilhem histórico local.', + }, + }, + cliproxyModelCategory: { + google: 'Google (Gemini)', + openai: 'OpenAI (GPT)', + anthropic: 'Anthropic (Claude)', + antigravity: 'Antigravity', + other: 'Outro', + }, + cliproxyOverviewComponents: { + availableModels: 'Modelos Disponíveis', + noModelsAvailable: 'Nenhum modelo disponível', + startSessionHint: 'Inicie uma sessão do CLIProxy para buscar os modelos disponíveis', + totalCount: '{{count}} no total', + availableThroughGroupedByProvider: + 'Modelos disponíveis via {{backendLabel}}, agrupados por provedor', + moreCount: '+{{count}} mais', + }, + categorizedModelSelector: { + selectModel: 'Selecione um modelo', + noModelsAvailable: 'Nenhum modelo disponível', + modelPlaceholder: 'Modelo...', + }, + openrouterQuickStart: { + recommended: 'Recomendado', + title: 'Comece com o OpenRouter', + description: + 'Acesse {{modelCountLabel}} modelos da OpenAI, Anthropic, Google, Meta e mais - tudo por meio de uma única API.', + featureOneApi: 'Uma API, todos os provedores', + profileSummaryCount: '{{count}} perfil', + profileSummaryCount_other: '{{count}} perfis', + profileSummaryEmpty: 'Qualidade premium + controle local', + summaryBadgeDefaultQuality: 'Melhor qualidade por padrão', + summaryBadgeLocalLane: 'Faixa local quando a adequação à tarefa vence', + summaryExistingTitle: 'Escolha um perfil ou adicione outra faixa', + summaryEmptyTitle: 'Escolha sua primeira faixa de perfil', + summaryExistingDescription: + 'Você já tem {{count}} perfil neste workspace. Mantenha provedores de qualidade premium para codificação séria e adicione runtimes locais quando privacidade, custo ou trabalho offline importarem.', + summaryExistingDescription_other: + 'Você já tem {{count}} perfis neste workspace. Mantenha provedores de qualidade premium para codificação séria e adicione runtimes locais quando privacidade, custo ou trabalho offline importarem.', + summaryEmptyDescription: + 'Escolha a faixa que combina com o trabalho. Provedores premium continuam sendo o padrão para codificação confiável. Runtimes locais são melhores para privacidade, transformações mais baratas e experimentação.', + qualityLanesTitle: 'Melhores faixas de qualidade', + qualityLaneHighlightDefaultQuality: + 'Melhor faixa padrão para qualidade de codificação de alto risco', + alibabaLaneDescription: + 'Perfil de codificação direto e forte quando você quer uma faixa premium dedicada fora do catálogo do OpenRouter.', + alibabaLaneHighlightQuality: + 'Bom quando você quer qualidade premium com um endpoint dedicado', + localRuntimesTitle: 'Runtimes locais', + localOllamaTitle: 'Ollama + Gemma 4', + localOllamaLabel: 'Ollama', + localOllamaHighlight: + 'Ideal para prompts privados, limpeza local e transformações em lote baratas', + localLlamacppTitle: 'llama.cpp', + localLlamacppLabel: 'llama.cpp', + localLlamacppHighlight: + 'Ideal para configurações GGUF personalizadas e fluxos de trabalho locais avançados auto-hospedados', + localDetectedModels: '{{count}} modelo local detectado', + localDetectedModels_other: '{{count}} modelos locais detectados', + localNoModelsDetected: 'Nenhum modelo local detectado ainda', + localWaitingServer: 'Aguardando um servidor local e a lista de modelos', + localRuntimeCheckingBadge: 'Verificando', + localRuntimeReadyBadge: 'Pronto', + localRuntimeNeedsModelBadge: 'Precisa de modelo', + localRuntimeOfflineBadge: 'Offline', + localRuntimeCheckingDescription: + 'Verificando o status do runtime local antes de mostrar orientações de configuração.', + localRuntimeReadyDescription: + 'Ideal para prompts privados, fluxos de trabalho offline e transformações em lote mais baratas.', + localRuntimeNeedsModelDescription: + 'O runtime está ativo, mas o modelo local recomendado ainda precisa ser baixado ou carregado.', + localRuntimeOfflineDescription: + 'Use esta faixa para trabalhos sensíveis à privacidade, transformações locais baratas e sessões offline.', + localRuntimeCheckingFooter: 'Verificando o runtime local...', + localRuntimeReadyFooter: 'Endpoint pronto em {{endpoint}}', + localRuntimeMissingModelFooter: 'Execute `{{command}}` para concluir a configuração local.', + localRuntimeOfflineFooter: 'Execute `{{command}}` para colocar o endpoint local online.', + localRuntimeSetupAction: 'Configurar {{label}}', + localRuntimeUseAction: 'Usar {{label}}', + localRuntimeFinishAction: 'Concluir configuração de {{label}}', + runtimeProviderBadge: 'Configuração de provedor de runtime', + runtimeProviderTitle: 'Abrir Provedores de IA', + runtimeProviderManagedDescription: + 'Use isto quando precisar de conectores gerenciados pelo CLIProxy, segredos de provedor e controles avançados de roteamento.', + runtimeProviderFeatureConnectors: + 'Conectores Gemini, Codex, Claude, Vertex e compatíveis com OpenAI', + runtimeProviderFeatureSecrets: + 'Segredos compartilhados ficam fora dos perfis de API individuais', + runtimeProviderFooter: + 'Ideal quando vários perfis devem compartilhar uma única configuração de provedor.', + createOpenRouterProfile: 'Criar Perfil OpenRouter', + getApiKeyAt: 'Obtenha sua chave de API em', + createCustomProfile: 'Criar Perfil de API Personalizado', + }, + alibabaCodingPlanQuickStart: { + recommended: 'Recomendado', + title: 'Experimente o Alibaba Coding Plan', + description: + 'Use o Alibaba Cloud Coding Plan por meio de um endpoint compatível com Anthropic para cargas de trabalho de codificação.', + featureEndpoint: 'Endpoint compatível com Anthropic', + featureKeyFormat: 'Chaves de API sk-sp dedicadas', + createAlibabaProfile: 'Criar Perfil do Alibaba Coding Plan', + readGuideAt: 'Leia o guia de configuração em', + }, + alibabaCodingPlanPromo: { + title: 'Alibaba Coding Plan', + subtitle: 'Model Studio Coding Plan via endpoint Anthropic', + add: 'Adicionar', + }, + credentialHealth: { + title: 'Saúde das Credenciais', + ready: 'Pronto', + noCredentialsConfigured: + 'Nenhuma credencial configurada. Use os botões de login acima para autenticar.', + neverUsed: 'Nunca usado', + justNow: 'Agora mesmo', + unknown: 'Desconhecido', + daysAgo: 'há {{count}}d', + hoursAgo: 'há {{count}}h', + minutesAgo: 'há {{count}}min', + }, + proxyStatusWidget: { + justNow: 'agora mesmo', + minutesAgo: 'há {{count}}min', + hoursAgo: 'há {{count}}h', + syncReady: 'Sincronização Pronta', + noConfig: 'Sem Configuração', + remoteProxy: 'Proxy Remoto', + active: 'Ativo', + trafficAutoRouted: 'Tráfego roteado automaticamente para o servidor remoto', + tooltipSync: 'Sincronizar perfis com o CLIProxy', + tooltipRestart: 'Reiniciar', + tooltipStop: 'Parar', + tooltipClose: 'Fechar', + tooltipVersionSettings: 'Configurações de versão', + versionManagement: 'Gerenciamento de Versão', + selectVersionPlaceholder: 'Selecione a versão a instalar...', + stable: '(estável)', + install: 'Instalar', + versionsAboveUnstable: 'Versões acima de {{version}} têm problemas conhecidos', + versionsKnownIssues: 'A versão {{version}} tem problemas conhecidos', + lastChecked: 'Última verificação {{time}}', + notRunning: 'Não está em execução', + start: 'Iniciar', + port: 'Porta {{port}}', + sessionCount: '{{count}} sessão', + sessionCount_other: '{{count}} sessões', + installFaultyTitle: 'Instalar Versão com Problemas Conhecidos?', + installFaultyDesc: + 'Você está prestes a instalar a v{{version}}, que está dentro do intervalo defeituoso conhecido {{range}}.', + installFaultyWarning: + 'Esta versão tem bugs conhecidos e pode falhar ou deixar o proxy em um estado inválido.', + installUnstableTitle: 'Instalar Versão Instável?', + installUnstableDesc: + 'Você está prestes a instalar a v{{version}}, que está acima da versão estável máxima v{{maxStable}}.', + installUnstableWarning: + 'Esta versão tem problemas de estabilidade conhecidos e pode causar comportamento inesperado.', + installUnstableConfirm: 'Tem certeza de que deseja continuar?', + cancel: 'Cancelar', + installAnyway: 'Instalar Mesmo Assim', + clickToDowngrade: 'Clique para fazer downgrade', + clickToUpdate: 'Clique para atualizar', + }, + syncStatusCard: { + profileSync: 'Sincronização de Perfil', + ready: 'Pronto', + noConfig: 'Sem Configuração', + syncsProfilesDesc: 'Sincroniza perfis de API com a configuração local do CLIProxy', + runDoctorHint: 'Execute ccs doctor --fix para gerar a configuração.', + details: 'Detalhes', + syncNow: 'Sincronizar Agora', + }, + syncDialog: { + title: 'Sincronizar Perfis com o CLIProxy Local', + description: 'Sincronize seus perfis de API do CCS com o config.yaml local do CLIProxy.', + noProfiles: 'Nenhum perfil configurado para sincronizar.', + createProfilesFirst: 'Crie perfis de API primeiro usando a aba Perfis.', + modelLabel: 'Modelo:', + ready: 'Pronto', + profilesToSync_one: '{{count}} perfil para sincronizar', + profilesToSync_other: '{{count}} perfis para sincronizar', + cancel: 'Cancelar', + syncing: 'Sincronizando...', + synced: 'Sincronizado!', + syncNow: 'Sincronizar Agora', + }, + errorLogs: { + title: 'Logs de Erro', + failedRequests_one: '{{count}} solicitação com falha', + failedRequests_other: '{{count}} solicitações com falha', + cliproxyDiagnostics: 'Diagnósticos do CLIProxy', + showingCount: 'Mostrando 50 de {{total}} logs', + selectLog: 'Selecione um log para ver os detalhes', + failedLoadContent: 'Falha ao carregar o conteúdo do log', + copyAbsolutePath: 'Copiar caminho absoluto', + copyRawContent: 'Copiar conteúdo bruto do log', + tabOverview: 'Visão Geral', + tabHeaders: 'Cabeçalhos', + tabRequest: 'Solicitação', + tabResponse: 'Resposta', + tabRaw: 'Bruto', + modelLabel: 'Modelo:', + quotaResetsIn: 'A cota é reiniciada em ', + method: 'Método', + provider: 'Provedor', + version: 'Versão', + endpoint: 'Endpoint', + url: 'URL', + timestamp: 'Registro de Data/Hora', + na: 'N/D', + noHeaders: 'Nenhum cabeçalho disponível', + noRequestBody: 'Nenhum corpo de solicitação', + noResponseBody: 'Nenhum corpo de resposta', + rateLimitedMsg: + 'Limite de taxa atingido. Troque para outra conta ou aguarde a redefinição da cota. O modelo {{model}} esgotou a cota.', + rateLimitedMsgNoModel: + 'Limite de taxa atingido. Troque para outra conta ou aguarde a redefinição da cota.', + authFailedMsg: + 'Falha na autenticação. Reautentique nas Configurações do CLIProxy ou verifique a chave de API.', + notFoundMsg: 'Endpoint não encontrado. Este endpoint pode não existir neste provedor.', + serverErrorMsg: + 'Erro de servidor upstream. Tente novamente mais tarde ou verifique a página de status do provedor.', + timeoutMsg: + 'A solicitação expirou. Verifique a conexão de rede ou aumente as configurações de tempo limite.', + unknown: 'desconhecido', + }, + editAccountContext: { + title: 'Editar Sincronização de Histórico', + description: + 'Configure como "{{name}}" compartilha histórico e continuidade com outras contas ccs auth.', + syncMode: 'Modo de Sincronização', + selectContextMode: 'Selecione o modo de contexto', + isolatedOption: 'Isolado', + sharedOption: 'Compartilhado', + sharedModeHint: + 'Reutiliza o contexto do workspace entre contas no mesmo grupo de histórico.', + isolatedModeHint: 'Mantém esta conta totalmente separada de outras contas ccs auth.', + historySyncGroup: 'Grupo de Sincronização de Histórico', + groupPlaceholder: 'default', + groupHint: + 'Normalizado para minúsculas (espaços viram hifens). Permitido: letras, números, _ , - (máx. {{max}} caracteres).', + invalidGroup: 'Digite um nome de grupo válido que comece com uma letra.', + continuityDepth: 'Profundidade de Continuidade', + selectContinuityDepth: 'Selecione a profundidade de continuidade', + standardOption: 'Padrão', + deeperOption: 'Profunda', + deeperHint: + 'Sincroniza session-env, file-history, shell-snapshots e todos de forma abrangente.', + standardHint: 'O modo padrão sincroniza apenas o contexto do workspace do projeto.', + credentialsIsolated: + 'As credenciais e o .anthropic permanecem isolados por conta em todos os modos.', + implicationTitle: 'O que isso significa após salvar', + isolatedImplication: + 'Esta conta permanece separada. Outras contas não poderão retomar o estado de continuidade dela.', + sameGroupRule: + 'As contas devem usar o mesmo grupo "{{group}}" antes de poder compartilhar continuidade entre si.', + noSameGroupPeer: 'Nenhuma outra conta compartilha este grupo no momento.', + sameGroupPeerCount_one: '{{count}} outra conta já compartilha este grupo.', + sameGroupPeerCount_other: '{{count}} outras contas já compartilham este grupo.', + deeperReady_one: + '{{count}} conta do mesmo grupo já usa continuidade profunda. Esta é a configuração de handoff mais forte disponível.', + deeperReady_other: + '{{count}} contas do mesmo grupo já usam continuidade profunda. Esta é a configuração de handoff mais forte disponível.', + deeperNeedsPeers: + 'A continuidade profunda está habilitada aqui, mas outra conta neste grupo ainda precisa de continuidade profunda para expectativas mais fortes de retomada entre contas.', + standardWarning: + 'O modo compartilhado padrão é bom apenas para o contexto do projeto. As expectativas de retomada entre contas são mais fortes quando ambas as contas usam continuidade profunda.', + resumeOriginalWarning: + 'Se a conversa antiga for importante, retome-a a partir da conta original antes de alterar a configuração.', + cancel: 'Cancelar', + save: 'Salvar', + saving: 'Salvando...', + }, + historySyncLearningMap: { + title: 'Como Funciona a Sincronização de Histórico', + description: + 'Isolado -> Compartilhado -> Profundo. A retomada entre contas precisa do mesmo grupo nas duas contas.', + learningMap: 'Mapa de Aprendizado', + isolated: 'Isolado', + shared: 'Compartilhado', + deeper: 'Profundo', + cliproxyManaged_one: + '{{count}} conta do pool Claude do CLIProxy é gerenciada na Central de Ações / página do CLIProxy.', + cliproxyManaged_other: + '{{count}} contas do pool Claude do CLIProxy são gerenciadas na Central de Ações / página do CLIProxy.', + showDetails: 'Mostrar detalhes: grupos, troca e política legada', + modeSwitch: 'Troca de Modo', + modeSwitchDesc: + 'Use Sincronizar em cada conta para alternar entre isolado/compartilhado e escolher a continuidade profunda.', + historySyncGroup: 'Grupo de Sincronização de Histórico', + historySyncGroupDesc: + 'O mesmo grupo é necessário antes que as contas possam compartilhar continuidade. O padrão de reserva é default.', + sameGroupRule: + 'No momento, as contas só compartilham continuidade quando ambas estão no modo compartilhado no mesmo grupo.', + deeperRecommendation: + 'O grupo "{{group}}" está compartilhado, mas a continuidade profunda ainda é a escolha mais segura se os usuários esperam retomada entre contas.', + partialGroup: + 'O grupo "{{group}}" está em boa forma, mas outras contas ou grupos ainda precisam da configuração do mesmo grupo ou de continuidade profunda.', + readyGroup: + 'O grupo "{{group}}" já tem continuidade profunda em várias contas. Esta é a configuração de handoff mais forte disponível.', + legacyConfirmation_one: '{{count}} conta legada ainda precisa de confirmação explícita.', + legacyConfirmation_other: + '{{count}} contas legadas ainda precisam de confirmação explícita.', + }, + continuityReadiness: { + title: 'Verificação de Retomada entre Contas', + description: + 'Use este cartão para ver o que está faltando antes que os usuários troquem de conta.', + state: { + single: 'conta única', + isolated: 'retomada desativada', + 'shared-alone': 'compartilhado mas incompleto', + 'shared-standard': 'apenas projetos', + partial: 'parcialmente pronto', + ready: 'handoff mais forte pronto', + }, + metrics: { + isolated: 'Isolado', + sharedPeers: 'Compartilhado com Par', + deeperReady: 'Profundo Pronto', + }, + messages: { + single: { + title: 'Apenas uma conta de autenticação está configurada.', + description: + 'O handoff entre contas ainda não se aplica. Adicione outra conta de autenticação antes de configurar a continuidade compartilhada.', + }, + isolated: { + title: 'A retomada entre contas está desativada no momento.', + description: + 'Todas as contas visíveis estão isoladas, portanto uma sessão criada em uma conta permanecerá nessa conta.', + }, + 'shared-alone': { + title: 'O modo compartilhado existe, mas nenhum grupo tem um par ainda.', + description_one: + '{{count}} conta compartilhada ainda está esperando por outra conta no mesmo grupo.', + description_other: + '{{count}} contas compartilhadas ainda estão esperando por outra conta no mesmo grupo.', + }, + 'shared-standard': { + title: + 'O grupo "{{group}}" compartilha o contexto do projeto, mas a continuidade profunda ainda não está pareada.', + description: + 'Os usuários ainda podem esperar mais do que o compartilhamento de projeto. Ative a continuidade profunda nas duas contas deste grupo para expectativas de handoff mais fortes.', + }, + partial: { + title: 'Um grupo está pronto, mas a configuração geral ainda está mista.', + description: + 'Pelo menos um grupo já usa continuidade profunda, mas outras contas ainda estão isoladas, sozinhas em um grupo compartilhado ou sem continuidade profunda.', + }, + ready: { + title: 'O grupo "{{group}}" tem a configuração de continuidade mais forte disponível.', + description: + 'Várias contas neste grupo já usam continuidade profunda. O comportamento de retomada ainda depende do que o Claude armazena upstream.', + }, + }, + stepsTitle: 'O que os usuários devem fazer a seguir', + steps: { + syncBoth: 'Abra Sincronizar nas duas contas, não apenas na que você está trocando.', + sameGroup: + 'Use o mesmo Grupo de Sincronização de Histórico nas duas contas. "{{group}}" é o grupo recomendado atualmente.', + enableDeeper: + 'Se os usuários esperam retomada entre contas em vez de compartilhamento apenas de projeto, ative a continuidade profunda nas duas contas.', + resumeOriginal: + 'Se a conversa original for importante, retome-a a partir da conta original antes de alterar as configurações de continuidade.', + }, + singleSteps: { + addAccount: + 'Crie uma segunda conta ccs auth antes de planejar qualquer handoff entre contas.', + sameGroupLater: + 'Quando essa segunda conta existir, coloque as duas contas no mesmo Grupo de Sincronização de Histórico.', + enableDeeperLater: + 'Se os usuários esperarem retomada entre contas em vez de compartilhamento apenas de projeto, ative a continuidade profunda nas duas contas.', + resumeOriginal: + 'Se a conversa original for importante, continue retomando-a a partir da conta original até que a segunda conta esteja pronta.', + }, + }, + continuityOverview: { + plainLaneTitle: 'O ccs simples está usando uma faixa de retomada diferente', + plainLaneDescription: + 'O ccs simples atualmente retoma a partir de {{lane}}, não desta faixa de conta. Recupere a faixa original antes de alterar as configurações de sincronização.', + setDefaultHint: + 'Use a ação Definir Padrão na conta que você quer que o ccs simples siga em sessões futuras.', + recommendBadge: 'Recomendar {{group}}', + partialBadge: 'Sincronização parcial {{group}}', + lane: { + native: 'Claude nativo (~/.claude)', + accountDefault: 'conta {{name}}', + accountInherited: 'conta {{name}} via herança de continuidade', + profileDefault: 'perfil padrão {{name}} via faixa nativa do Claude', + }, + }, + accountsTable: { + name: 'Nome', + type: 'Tipo', + defaultBadge: 'padrão', + created: 'Criado', + lastUsed: 'Último Uso', + historySync: 'Sincronização de Histórico', + sharedResources: 'Recursos', + actions: 'Ações', + syncTitle: 'Editar modo de sincronização, grupo e profundidade de continuidade', + resourcesTitle: 'Editar herança de recursos compartilhados', + confirmLegacyTitle: 'Confirmar o modo atual desta conta legada como explícito', + sync: 'Sincronizar', + confirm: 'Confirmar', + active: 'Ativo', + setDefault: 'Definir Padrão', + deleteAccount: 'Excluir conta', + cannotDeleteDefault: 'Não é possível excluir a conta padrão', + noAccounts: 'Nenhuma conta ccs auth encontrada. Use ccs auth create para adicionar contas.', + resetToDefault: 'Redefinir para o Padrão do CCS', + deleteDialogTitle: 'Excluir Conta', + deleteDialogDesc: + 'Tem certeza de que deseja excluir a conta "{{name}}"? Isso removerá o perfil e todos os dados de sessão dele. Esta ação não pode ser desfeita.', + cancel: 'Cancelar', + delete: 'Excluir', + sharedGroupStandard: 'compartilhado ({{group}}, apenas projetos)', + sharedGroupDeeper: 'compartilhado ({{group}}, continuidade profunda)', + sharedGroupLegacy: 'compartilhado ({{group}}, apenas projetos, legado)', + isolatedLegacy: 'isolado (padrão legado)', + isolated: 'isolado', + resourcesShared: 'compartilhado', + resourcesProfileLocal: 'local do perfil', + noSameGroupPeer: 'Ainda sem par no mesmo grupo', + sameGroupPeerCount_one: '{{count}} par no mesmo grupo', + sameGroupPeerCount_other: '{{count}} pares no mesmo grupo', + legacyReview: 'Revise e confirme este padrão inferido.', + noHandoff: 'A retomada entre contas permanece na conta original.', + badges: { + shared: 'Compartilhado', + deeper: 'Profundo', + legacy: 'Legado', + isolated: 'Isolado', + profileLocal: 'Local', + }, + }, + addAccountDialog: { + title: 'Adicionar Conta {{displayName}}', + descKiro: + 'Escolha um método de autenticação Kiro e depois autentique via navegador ou importe da IDE Kiro.', + descDeviceCode: + 'Clique em Autenticar. Um código de verificação aparecerá para você digitar no site do provedor.', + descOauth: + 'Clique em Autenticar para obter uma URL OAuth. Abra-a em qualquer navegador para entrar.', + powerUserEnabled: 'Modo usuário avançado habilitado', + powerUserSkipped: + 'Configurações > modo usuário avançado do Proxy está ignorando a checklist de responsabilidade do AGY e a frase de risco do painel Gemini. Você aceita total responsabilidade pelo risco de OAuth/conta.', + powerUserLoadFailed: + 'Falha ao carregar as configurações do modo usuário avançado. Verifique Configurações > Proxy e tente novamente.', + powerUserLoading: + 'Carregando configurações de segurança do modo usuário avançado. Aguarde um momento e tente novamente.', + powerUserUnavailableRetry: + 'O modo usuário avançado está indisponível. Complete a etapa de segurança do provedor exigida e tente novamente.', + authMethod: 'Método de Autenticação', + selectKiroAuthMethod: 'Selecione o método de autenticação Kiro', + gitlabAuthMethod: 'Método de autenticação do GitLab', + selectGitlabAuthMethod: 'Selecione o método de autenticação do GitLab', + gitlabAuthOAuth: 'OAuth pelo Navegador', + gitlabAuthPat: 'Token de Acesso Pessoal', + gitlabAuthHint: + 'Use OAuth pelo Navegador para gitlab.com, ou PAT para instalações auto-hospedadas e gerenciadas por administrador.', + gitlabUrl: 'URL do GitLab', + gitlabUrlPlaceholder: 'https://gitlab.com', + gitlabUrlHint: + 'Opcional. Deixe em branco para gitlab.com, ou defina a URL base do seu GitLab auto-hospedado.', + gitlabPat: 'Token de Acesso Pessoal', + gitlabPatPlaceholder: 'glpat-...', + gitlabPatHint: 'O token deve incluir pelo menos', + gitlabPatRequired: 'O Token de Acesso Pessoal do GitLab é obrigatório para login via PAT.', + nicknameRequired: 'Apelido (obrigatório)', + nicknameOptional: 'Apelido (opcional)', + nicknamePlaceholder: 'ex.: trabalho, pessoal', + nicknameRequiredHint: + 'Obrigatório para este provedor. Use um nome amigável exclusivo (ex.: trabalho, pessoal).', + nicknameOptionalHint: + 'Um nome amigável para identificar esta conta. Deixe em branco para usar um identificador gerado com segurança.', + waitingForAuth: 'Aguardando autenticação...', + deviceCodeHint: + 'Uma caixa de diálogo com o código de verificação aparecerá em breve. Digite o código no site do provedor.', + browserHint: + 'Complete a autenticação no seu navegador. Esta caixa de diálogo fecha automaticamente.', + openUrlLabel: 'Abra esta URL em qualquer navegador para entrar:', + copied: 'Copiado', + copy: 'Copiar', + open: 'Abrir', + popupBlocked: 'Pop-up bloqueado. Copie a URL acima e abra-a manualmente no seu navegador.', + redirectPasteLabel: 'O redirecionamento não funcionou? Cole a URL de callback:', + callbackPlaceholder: 'Cole a URL de redirecionamento aqui...', + submitCallback: 'Enviar Callback', + submitting: 'Enviando...', + preparingUrl: 'Preparando URL de login...', + cancel: 'Cancelar', + importingToken: 'Importando token da IDE Kiro...', + authenticate: 'Autenticar', + importFromIde: 'Importar da IDE', + importing: 'Importando...', + }, + flowViz: { + backToProviders: 'Voltar para provedores', + showDetails: 'Mostrar Detalhes', + hideDetails: 'Ocultar Detalhes', + showPausedAccounts: 'Mostrar Pausadas ({{count}})', + hidePausedAccounts: 'Ocultar Pausadas ({{count}})', + visibleTotalRequests: 'Solicitações Visíveis', + visibleAccounts: 'Contas Visíveis', + excludingPausedAccounts: 'Excluindo {{count}} pausadas', + resetLayout: 'Redefinir layout', + provider: 'Provedor', + totalRequests: 'Total de Solicitações', + accounts: 'Contas', + connectionTimeline: 'Linha do Tempo de Conexões', + noRecentConnections: 'Nenhuma conexão recente', + }, + quickStats: { + totalRequests: 'Total de Solicitações', + successRate: 'Taxa de Sucesso', + totalTokens: 'Total de Tokens', + activeModels: 'Modelos Ativos', + }, + authMonitor: { + accounts: 'Contas', + accountsCount: '{{count}} contas', + success: 'Sucesso', + failed: 'Falha', + successRate: 'Taxa de Sucesso', + }, + accountCard: { + resumeAccount: 'Retomar conta', + pauseAccount: 'Pausar conta', + quotaLoading: 'Cota...', + quota: 'Cota', + quotaUnavailable: 'Limites de cota indisponíveis', + reauthNeeded: 'Reautenticação necessária', + failureLabelReauth: 'Reautenticar', + failureLabelWorkspace: 'Workspace', + failureLabelNoAccess: 'Sem Acesso', + failureLabelRetry: 'Tentar Novamente', + failureLabelReconnect: 'Reconectar', + failureLabelTemporary: 'Temporário', + failureLabelUnavailable: 'Indisponível', + failureHintReauth: 'Atualize esta conta executando o fluxo de autenticação novamente.', + failureHintWorkspace: + 'Mova esta conta de volta para um workspace ativo e depois remova e adicione-a novamente.', + failureHintNoAccess: 'Esta conta não pode acessar o endpoint de cota do provedor.', + failureHintRetry: 'Aguarde um pouco e tente a solicitação de cota novamente.', + failureHintReconnect: 'Remova a conta obsoleta e autentique-a novamente.', + failureHintTemporary: 'Tente novamente mais tarde. Isso parece temporário.', + removeAndReadd: 'Remover e readicionar conta', + autoRefreshFailed: 'Falha na atualização automática', + }, + antigravityChecklist: { + title: 'Responsabilidade OAuth do Antigravity', + subtitle: 'Complete todas as 4 etapas antes de poder autenticar.', + mandatory: 'Obrigatório', + completion: 'Conclusão', + stepsCount: '{{current}}/4 etapas', + }, + accountSafetyWarning: { + title: 'Aviso de Segurança da Conta OAuth', + subtitle: 'Issue #509 · Risco OAuth Gemini + AGY', + firstLine: + 'A issue #509 documenta relatos de suspensão/banimento vinculados ao uso do ccs agy e ao uso de conta compartilhada entre ccs gemini e ccs agy.', + secondLine: + 'Continue somente se você aceitar total responsabilidade pelo risco de OAuth e de acesso à conta.', + issueLabel: 'Ler a issue #509', + proxySettingsLabel: 'Controles Gemini + AGY: Configurações > Proxy', + }, + cliproxyDialog: { + name: 'Nome', + provider: 'Provedor', + account: 'Conta', + accountOptional: 'Conta (opcional)', + model: 'Modelo', + modelOptional: 'Modelo (opcional)', + defaultTarget: 'Destino Padrão', + defaultTier: 'Nível Padrão', + tierConfig: 'Configuração de Nível', + selectProvider: 'Selecione o provedor...', + useDefaultAccount: 'Usar conta padrão', + defaultSuffix: '(padrão)', + opus: 'Opus', + sonnet: 'Sonnet', + haiku: 'Haiku', + claudeCode: 'Claude Code', + factoryDroid: 'Factory Droid', + cancel: 'Cancelar', + create: 'Criar', + creating: 'Criando...', + saveChanges: 'Salvar Alterações', + saving: 'Salvando...', + placeholderName: 'my-gemini', + placeholderModel: 'gemini-2.5-pro', + placeholderComposite: 'my-composite', + placeholderModelId: 'model-id', + placeholderAccountId: 'account-id', + editCompositeTitle: 'Editar Variante Composta: {{name}}', + editSingleTitle: 'Editar Variante Única: {{name}}', + }, + profileEditor: { + profileInfo: 'Informações do Perfil', + profileName: 'Nome do Perfil', + filePath: 'Caminho do Arquivo', + lastModified: 'Última Modificação', + defaultTarget: 'Destino Padrão', + quickUsage: 'Uso Rápido', + runWithProfile: 'Executar com o perfil', + runOnDroid: 'Executar no Droid', + runOnDroidWithFlag: 'Executar no Droid (--target)', + droidAliasExplicit: 'Alias do Droid (explícito)', + overrideToClaude: 'Substituir por Claude', + overrideToClaudeExplicit: 'Substituir por Claude (explícito)', + targetHintPreferredAlias: 'Alias explícito preferido:', + targetHintClaudeDefault: 'Comando padrão:', + targetHintLegacyAlias: 'O atalho legado ainda funciona:', + targetHintOverride: 'Você ainda pode substituir cada execução com', + setAsDefault: 'Definir como padrão', + provider: 'Provedor', + custom: 'Personalizado', + providerChooserHint: + 'Comece com um preset e depois ajuste a URL, a chave de API ou o mapeamento de modelo conforme necessário.', + featuredProviders: 'Provedores em Destaque', + scrollHint: 'Role se sua tela for estreita', + customEndpoint: 'Endpoint Personalizado', + morePresets: 'Mais Presets', + customEndpointDescription: + 'Comece com uma URL compatível com Anthropic em branco e configure tudo manualmente.', + }, + settings: { + sectionLoadFailed: 'Falha ao carregar a seção', + unknownError: 'Ocorreu um erro desconhecido', + reloadPage: 'Recarregar página', + refresh: 'Atualizar', + copy: 'Copiar', + copied: 'Copiado', + saved: 'Salvo', + loading: 'Carregando...', + configFileNotFound: 'Arquivo de configuração não encontrado', + }, + settingsTabs: { + browser: 'Navegador', + web: 'Web', + image: 'Imagem', + channels: 'Canais', + env: 'Ambiente', + think: 'Pensamento', + proxy: 'Proxy', + auth: 'Autenticação', + backup: 'Backup', + }, + settingsAuth: { + failedFetchTokens: 'Falha ao buscar tokens de autenticação', + failedSaveTokens: 'Falha ao salvar tokens', + tokensUpdated: 'Tokens atualizados. Reinicie o CLIProxy para aplicar.', + failedRegenerate: 'Falha ao regenerar o segredo', + secretRegenerated: + 'Novo segredo de gerenciamento gerado. Reinicie o CLIProxy para aplicar.', + failedReset: 'Falha ao redefinir os tokens', + tokensReset: 'Tokens redefinidos para os padrões. Reinicie o CLIProxy para aplicar.', + description: + 'Configure os tokens de autenticação do CLIProxy. As alterações exigem reinicialização do CLIProxy.', + apiKey: 'Chave de API', + custom: 'Personalizado', + apiKeyDesc: 'Usado pelo Claude Code para se autenticar com o CLIProxy', + apiKeyPlaceholder: 'Chave de API', + managementSecret: 'Segredo de Gerenciamento', + managementSecretDesc: + 'Usado pelo painel do CCS para acessar as APIs de gerenciamento do CLIProxy', + managementSecretPlaceholder: 'Segredo de gerenciamento', + generateSecret: 'Gerar novo segredo seguro', + resetDefaults: 'Redefinir para os Padrões', + resetDesc: 'Redefine a chave de API e o segredo de gerenciamento para seus valores padrão.', + saving: 'Salvando...', + save: 'Salvar', + }, + settingsGlobalEnv: { + description: + 'Variáveis de ambiente injetadas em todos os perfis de assinatura não-Claude (gemini, codex, agy, ghcp, etc.)', + enabled: 'Ambiente Global habilitado', + disabled: 'Ambiente Global desabilitado', + enabledDesc: 'As variáveis de ambiente serão injetadas em perfis de terceiros', + disabledDesc: 'As variáveis de ambiente não serão injetadas', + envVars: 'Variáveis de Ambiente', + noneConfigured: 'Nenhuma variável de ambiente configurada', + addNew: 'Adicionar Nova Variável', + keyName: 'NOME_DA_CHAVE', + value: 'valor', + add: 'Adicionar', + quickAdd: 'Adicionar Rapidamente Variáveis Comuns', + allConfigured: 'Todas as variáveis comuns estão configuradas', + }, + settingsBackups: { + failedFetch: 'Falha ao buscar backups', + failedRestore: 'Falha ao restaurar o backup', + restoreSuccess: 'Backup restaurado com sucesso', + title: 'Backups de Configurações', + description: + 'Restaure versões anteriores do seu arquivo settings.json. Os backups são criados automaticamente quando as configurações são modificadas.', + none: 'Nenhum backup disponível', + noneHint: 'Os backups aparecerão aqui quando você modificar as configurações', + latest: 'Mais recente', + restoring: 'Restaurando...', + restore: 'Restaurar', + restoreConfirmTitle: 'Restaurar Backup?', + restoreConfirmPrefix: 'Isso substituirá suas configurações atuais pelo backup de', + restoreConfirmSuffix: 'Esta ação não pode ser desfeita.', + cancel: 'Cancelar', + }, + settingsWebsearch: { + description: + 'Busca na web baseada em CLI para perfis de terceiros (gemini, codex, agy, etc.)', + enabled: 'Busca na Web habilitada', + disabled: 'Busca na Web desabilitada', + checking: 'Verificando status...', + providers: 'Provedores', + noneConfigured: 'Nenhum provedor configurado', + noneConfiguredHint: 'Instale ferramentas de CLI para habilitar provedores de busca na web', + checkProviders: 'Verificar provedores', + installed: 'instalado', + notInstalled: 'não instalado', + model: 'Modelo:', + howInstall: 'Como instalar a CLI do {{name}}', + installGlobally: 'Instalar globalmente', + requiresKey: '(requer chave de API xAI)', + freeTier: '(nível GRATUITO disponível)', + viewDocs: 'Ver documentação', + }, + settingsProxy: { + failedLoadAgyMode: 'Falha ao carregar o modo usuário avançado', + failedUpdateAgyMode: 'Falha ao atualizar o modo usuário avançado', + failedVerifyAgyMode: 'Falha ao verificar a persistência do modo usuário avançado', + notPersistedAgyMode: + 'O modo usuário avançado não foi persistido. A configuração pode ter sido modificada por outro processo.', + agyModeEnabled: 'Modo usuário avançado habilitado.', + agyModeDisabled: 'Modo usuário avançado desabilitado.', + typePhraseToContinue: 'Digite "{{value}}" para continuar.', + description: + 'Configure a conexão local ou remota do {{backend}} para perfis baseados em proxy', + backendPlus: 'CLIProxy Plus', + backend: 'CLIProxy', + instanceStatus: 'Status da Instância', + connectionMode: 'Modo de Conexão', + local: 'Local', + remote: 'Remoto', + localDesc: 'Executar o binário do {{backend}} nesta máquina', + remoteDesc: 'Conectar a um servidor {{backend}} remoto', + backendBinary: 'Binário do Backend', + stopProxyToSwitch: 'Pare o proxy em execução em Status da Instância para trocar o backend.', + default: 'Padrão', + plusDesc: + 'Faixa opcional para provedores extras. Ainda suportada, mas atualmente mantida pela comunidade em vez de mantida upstream.', + originalDesc: 'Backend padrão, sempre disponível, para a faixa de provedores principal.', + plusFallbackNotice: + 'A faixa de provedores Plus não está descontinuada, mas o CLIProxy local ainda recorre ao backend original enquanto o caminho do fork mantido está sendo restabelecido.', + variantsIncompatible: + 'As variantes plus-extra existentes ({{providers}}) não funcionarão no backend original. Mantenha-as visíveis para referência, mas mude para o Plus antes de usá-las.', + safety: 'Segurança', + agyModeTitle: 'Modo Usuário Avançado do Antigravity + Gemini', + agyModeDesc: + 'Pula a checklist de responsabilidade do AGY e a confirmação digitada do painel Gemini.', + agyWarning: + 'Use apenas se você entender totalmente o padrão de risco de suspensão/banimento de OAuth (#509). O CCS não pode assumir responsabilidade pela perda da conta.', + finalConfirm: 'Confirmação final necessária', + finalConfirmDesc: + 'Habilitar isso pulará os pontos de verificação de segurança do AGY e a barreira da frase de risco do painel Gemini. Revise a issue #509 e digite a frase exata para prosseguir.', + step1: 'Etapa 1', + readIssue: 'Ler a issue #509', + step2: 'Etapa 2', + typePrefix: 'Digite', + typeSuffix: 'para habilitar.', + typePhraseAria: + 'Digite I ACCEPT RISK para habilitar o modo usuário avançado do Antigravity + Gemini', + exactPhrase: 'A frase exata é obrigatória.', + enableAgyMode: 'Habilitar Modo Usuário Avançado do Antigravity + Gemini', + toggleAgyMode: 'Alternar o modo usuário avançado do Antigravity + Gemini', + fallbackSettings: 'Configurações de Fallback', + enableFallback: 'Habilitar fallback para local', + enableFallbackDesc: 'Usar proxy local se o remoto estiver inacessível', + autoStartLocal: 'Iniciar proxy local automaticamente', + autoStartLocalDesc: 'Iniciar automaticamente o proxy local no fallback', + advanced: 'Avançado', + debugMode: 'Modo de Depuração', + debugModeDesc: 'Habilitar diagnósticos de desenvolvedor no console do navegador', + debugModeEnabled: + 'Modo de depuração habilitado. Verifique o console do navegador para logs detalhados.', + localProxy: 'Proxy Local', + port: 'Porta', + autoStart: 'Início automático', + localAutoStartDesc: 'Iniciar o proxy local automaticamente quando necessário', + remoteConfigTitle: 'Configuração do Servidor Remoto', + host: 'Host', + hostPlaceholder: '192.168.1.100 ou proxy.example.com', + defaultPort: 'padrão: {{value}}', + portPlaceholder: 'Deixe vazio para {{value}}', + protocol: 'Protocolo', + http: 'HTTP', + https: 'HTTPS', + apiKeyOptional: 'Chave de API (opcional)', + apiKeyPlaceholder: 'Para endpoints de API /v1/*', + apiKeyDesc: 'Usado para solicitações de API para /v1/chat/completions', + managementKeyOptional: 'Chave de Gerenciamento (opcional)', + managementKeyPlaceholder: 'Para endpoints /v0/management/*', + managementKeyDesc: + 'Usado para APIs de gerenciamento do painel. Recorre à Chave de API se não estiver definida.', + testing: 'Testando...', + testConnection: 'Testar Conexão', + connectedLatency: 'Conectado ({{value}}ms)', + connectionFailed: 'Falha na conexão', + invalidPortOrEmpty: + 'A porta deve ser um número inteiro entre 1 e 65535, ou vazia para o padrão', + invalidLocalPort: 'A porta local deve ser um número inteiro entre 1 e 65535', + backendPlusApi: 'CLIProxyAPIPlus', + backendApi: 'CLIProxyAPI', + }, + settingsThinking: { + description: 'Configure o pensamento estendido/raciocínio para modelos suportados.', + supportedProviders: 'Provedores Suportados', + modeTitle: 'Modo de Pensamento', + modeAutoDesc: 'Define o pensamento automaticamente com base no nível do modelo', + modeOffDesc: 'Desabilitar pensamento estendido', + modeManualDesc: + 'Defina um nível de substituição persistente ou use flags de CLI por execução', + tierDefaults: 'Padrões de Nível', + tierDefaultsDesc: + 'Nível de pensamento padrão para cada nível de modelo no modo automático.', + persistentOverride: 'Substituição Persistente', + persistentOverrideDesc: + 'Aplicado a todas as sessões. As flags de CLI ainda têm prioridade.', + enterCustomBudget: 'Digite um orçamento personalizado', + apply: 'Aplicar', + providerOverrides: 'Substituições de Provedor ({{count}})', + providerOverridesDesc: + 'Substitua os padrões de nível para provedores específicos. Adicione chaves de provedor personalizadas conforme necessário.', + addProviderPlaceholder: 'Adicionar chave de provedor (ex.: qwen)', + showWarnings: 'Mostrar Avisos', + showWarningsDesc: + 'Exibir avisos quando os valores de pensamento forem limitados ou ajustados', + cliEnvOverride: 'Substituição por CLI e Ambiente', + supportLine1Prefix: 'Orçamento de pensamento:', + supportLine1Suffix: '(baseado em tokens)', + supportLine2Prefix: 'Esforço de raciocínio:', + supportLine2SuffixPrefix: '(sufixo ou ', + supportLine2SuffixPostfix: ': minimal/low/medium/high/xhigh)', + supportLine3Prefix: 'Os sufixos do Codex fixam o esforço (por exemplo ', + supportLine3Suffix: '); modelos sem sufixo usam o modo Pensamento.', + }, + analytics: { + title: 'Análises', + noDailyUsage: 'Nenhum dado de uso para hoje', + noUsageData: 'Nenhum dado de uso disponível', + subtitle: 'Acompanhe uso e insights', + month: 'Mês', + allTime: 'Todo o Período', + updated: 'Atualizado {{value}}', + }, + analyticsSummary: { + totalTokens: 'Total de Tokens', + totalTokensSubtitle: '{{input}} entrada / {{output}} saída', + totalCost: 'Custo Total', + totalCostSubtitle: 'média de ${{value}}/dia', + cacheTokens: 'Tokens de Cache', + cacheTokensSubtitle: '${{cost}} ({{percent}}% do custo)', + inputCost: 'Custo de Entrada', + outputCost: 'Custo de Saída', + tokensSubtitle: '{{value}} tokens', + }, + apiProfiles: { + title: 'Perfis', + sidebarTitle: 'Perfis de API', + sidebarSubtitle: 'APIs premium, runtimes locais, endpoints personalizados', + new: 'Novo', + searchPlaceholder: 'Buscar perfis...', + loadingProfiles: 'Carregando perfis...', + failedLoadTitle: 'Falha ao carregar perfis', + failedLoadDesc: 'Não foi possível buscar os perfis de API. Tente novamente.', + retry: 'Tentar Novamente', + noProfilesYet: 'Ainda não há perfis de API', + noProfilesDesc: + 'Crie seu primeiro perfil para se conectar a endpoints de API personalizados', + createProfile: 'Criar Perfil', + noProfileMatch: 'Nenhum perfil corresponde a "{{query}}"', + profileCount: '{{count}} perfil', + profileCount_other: '{{count}} perfis', + configuredCount: '{{count}} configurado(s)', + deleteProfileTitle: 'Excluir Perfil', + deleteProfileDesc: + 'Tem certeza de que deseja excluir "{{name}}"? Isso removerá o arquivo de configurações e não pode ser desfeito.', + delete: 'Excluir', + unsavedChangesTitle: 'Alterações Não Salvas', + unsavedChangesDesc: + 'Você tem alterações não salvas em "{{current}}". Descartar e trocar para "{{next}}"?', + discardSwitch: 'Descartar e Trocar', + noOrphansFound: 'Nenhuma configuração de perfil órfã encontrada', + confirmRegisterOrphans: + 'Encontrado(s) {{total}} arquivo(s) de configuração de perfil órfão(s), com {{valid}} pronto(s) para registrar. Registrar agora?', + registeredWithSkipped: ' ({{count}} ignorado(s))', + registeredProfiles: '{{count}} perfil(is) registrado(s)', + copyPrompt: 'Copiar "{{name}}" para qual novo nome de perfil?', + destinationEmpty: 'O nome do perfil de destino não pode estar vazio', + exportRedacted: + 'Exportação criada com o token oculto. Use o fluxo include-secrets na CLI se necessário.', + exportDownloaded: 'Exportação do perfil baixada', + importFailed: 'Falha ao importar o pacote de perfil', + discoverOrphans: 'Descobrir perfis órfãos', + importProfileBundle: 'Importar pacote de perfil', + }, + accountsPage: { + title: 'Contas', + managePrefix: 'Gerencie', + manageSuffix: 'contas e integração de pool a partir de um único painel.', + mobileManageSuffix: 'continuidade por conta.', + primaryActions: 'Ações Principais', + createAccount: 'Criar Conta', + authClaudeInPool: 'Autenticar Claude no Pool', + openClaudePoolSettings: 'Abrir Configurações do Pool Claude', + openCliProxyClaudePool: 'Abrir Pool Claude do CLIProxy', + migrationFollowup: 'Acompanhamento de Migração', + legacyContextPending: + '{{count}} conta ainda precisa de confirmação de modo pela primeira vez.', + legacyContextPending_other: + '{{count}} contas ainda precisam de confirmação de modo pela primeira vez.', + legacyContinuityPending: + '{{count}} conta compartilhada permanece na profundidade de continuidade legada padrão.', + legacyContinuityPending_other: + '{{count}} contas compartilhadas permanecem na profundidade de continuidade legada padrão.', + confirmingLegacy: 'Confirmando Políticas Legadas...', + confirmLegacy: 'Confirmar Políticas Legadas ({{count}})', + noLegacyFollowup: 'Nenhum acompanhamento legado pendente.', + continuityGuide: 'Guia de Continuidade', + expandWhenNeeded: 'Expanda apenas quando necessário.', + sharedStandard: 'Compartilhado Padrão', + sharedStandardDesc: + 'Apenas workspace compartilhado. Coloque as duas contas no mesmo grupo antes de esperar qualquer handoff.', + sharedDeeper: 'Compartilhado Profundo', + sharedDeeperPrefix: 'Adiciona', + sharedDeeperDesc: + 'Adiciona session-env, file-history, shell-snapshots e todos. Recomendado quando os usuários esperam retomada entre contas.', + isolated: 'Isolado', + isolatedDesc: 'Sem vínculo. As conversas permanecem com a conta original.', + quickCommands: 'Comandos Rápidos', + quickCommandsDesc: 'Copie e execute no terminal.', + workspaceBadge: 'Workspace ccs auth', + historySyncBadge: 'Controles de Histórico e Retomada', + resourcesBadge: 'Controles de Recursos Compartilhados', + resourcesShared: 'Compartilhado', + resourcesProfileLocal: 'Local do Perfil', + authAccounts: 'Contas de Autenticação', + tableScopePrefix: 'Esta tabela é intencionalmente restrita a', + tableScopeMiddle: 'contas. Use', + tableScopeSuffix: 'para alterações de modo/grupo/profundidade.', + accountMatrix: 'Matriz de Contas', + sharedTotalDesc: + 'Total compartilhado: {{count}}. As ações incluem configurações de Sincronização e confirmação legada.', + loadingAccounts: 'Carregando contas...', + }, + health: { + justNow: 'agora mesmo', + secondsAgo: 'há {{count}}s', + minutesAgo: 'há {{count}}min', + hoursAgo: 'há {{count}}h', + systemHealth: 'Saúde do Sistema', + build: 'build {{version}}', + lastScan: 'Última verificação:', + autoRefresh: 'Atualização automática:', + refresh: 'Atualizar', + checks: 'Verificações', + version: 'Versão', + platform: 'Plataforma', + liveMonitoring: 'Monitoramento ao vivo ativo', + copied: 'Copiado para a área de transferência', + refreshing: 'Atualizando verificações de saúde...', + fix: 'Corrigir', + applyFix: 'Aplicar Correção', + healthLabel: 'saúde', + }, + updates: { + actionRequired: 'Ação Necessária', + done: 'Concluído', + all: 'Todos', + inboxTitle: 'Central de Atualizações', + inboxSubtitle: + 'Concentre-se nas ações e depois marque as atualizações como concluídas ou dispensadas.', + needsAction: 'Precisa de Ação', + doneCount: 'Concluído', + searchPlaceholder: 'Buscar ações ou comandos', + noNotices: 'Nenhum aviso corresponde a esta visualização.', + noUpdates: 'Nenhuma atualização disponível.', + published: 'Publicado em {{date}}', + markDone: 'Marcar como concluído', + dismiss: 'Dispensar', + reopen: 'Reabrir', + doNext: 'Fazer a Seguir', + impactedIntegrations: 'Integrações Impactadas', + impactedDesc: 'Áreas relacionadas com base no escopo e no roteamento da atualização.', + whyMatters: 'Por Que Importa', + whyMattersDesc: 'Apenas contexto curto, sem notas de lançamento extensas.', + open: 'Abrir', + progressNeedsAction: 'Precisa de Ação', + progressInReview: 'Em Revisão', + progressDone: 'Concluído', + progressDismissed: 'Dispensado', + statusNew: 'Novo', + statusStable: 'Estável', + statusPlanned: 'Planejado', + dashboard: 'Painel', + cliUsage: 'Uso via CLI', + }, + cliproxyPage: { + connected: 'Conectado', + notConnected: 'Não conectado', + variant: 'variante', + parentNotConnected: 'Pai não conectado', + viaProvider: 'via {{provider}}', + emptyTitle: 'Gerenciador de Perfis CCS', + emptyDesc: + 'Gerencie autenticação OAuth, preferências de conta e seleção de modelo para provedores do CLIProxy. Configure como o CCS roteia solicitações para diferentes back-ends de IA.', + emptyControlPanelPrefix: + 'Para estatísticas de uso ao vivo e monitoramento em tempo real, visite o', + controlPanel: 'Painel de Controle', + quickSetup: 'Configuração Rápida', + addAccount: 'Adicionar Conta', + advancedVariant: 'Variante Avançada', + setupActionsHint: + 'Adicione contas aqui. Crie variantes apenas quando precisar de um runtime/perfil separado.', + accountManagement: 'Gerenciamento de contas em nível de CCS', + providers: 'Provedores', + variants: 'Variantes', + providerCount: '{{count}} provedor', + providerCount_other: '{{count}} provedores', + connectedCount: '{{count}} conectado(s)', + variantDisplay: '{{name}} (variante de {{provider}})', + }, + copilotPage: { + title: 'Copilot', + subtitle: 'Ponte de compatibilidade descontinuada do GitHub Copilot', + deprecatedBadge: 'Descontinuado', + deprecationTitle: 'Ponte de compatibilidade descontinuada', + deprecationItem1: 'A cobrança do Copilot por uso do GitHub começa em 1º de junho de 2026', + deprecationItem2: + 'As configurações locais existentes continuam disponíveis para compatibilidade', + deprecationItem3: 'Prefira o Codex ou outro provedor ativo para trabalhos novos', + setup: 'Configuração', + auth: 'Autenticação', + daemon: 'Daemon', + unofficialTitle: 'API Não Oficial - Use por Sua Conta e Risco', + unofficialItem1: 'API de engenharia reversa - pode quebrar a qualquer momento', + unofficialItem2: 'O uso excessivo pode acionar restrições na conta', + unofficialItem3: 'Sem garantia, sem responsabilidade do CCS', + yes: 'Sim', + no: 'Não', + installed: 'Instalado', + missing: 'Ausente', + integration: 'Integração', + enabled: 'Habilitado', + disabled: 'Desabilitado', + github: 'GitHub', + connected: 'Conectado', + notConnected: 'Não Conectado', + authenticate: 'Autenticar', + authenticating: 'Autenticando...', + status: 'Status', + running: 'Em execução', + stopped: 'Parado', + port: 'Porta', + stopping: 'Parando...', + stop: 'Parar', + starting: 'Iniciando...', + start: 'Iniciar', + installing: 'Instalando...', + installCopilotApi: 'Instalar copilot-api', + proxy: 'Proxy', + active: 'Ativo', + inactive: 'Inativo', + }, + cursorPage: { + title: 'Cursor', + beta: 'Beta', + deprecated: 'Descontinuado', + subtitle: 'Ponte local descontinuada para configurações legadas do Cursor', + unofficialTitle: 'Ponte legada descontinuada - prefira o Cursor com suporte do CLIProxy', + unofficialItem1: + 'Caminho suportado: autenticação e gerenciamento de conta do Cursor com suporte do CLIProxy', + unofficialItem2: + 'Esta ponte local de engenharia reversa permanece apenas para configurações existentes', + unofficialItem3: 'O CCS não oferece garantia para este caminho legado', + supportedPathTitle: 'Caminho suportado', + supportedPathDesc: + 'Use a autenticação e o gerenciamento de conta do Cursor com suporte do CLIProxy para novas configurações. Mantenha a ponte legada abaixo apenas se você ainda depender do fluxo antigo do daemon local.', + startCliproxyAuth: 'Iniciar Autenticação do Cursor via CLIProxy', + openCliproxyCursor: 'Abrir Cursor via CLIProxy', + integration: 'Integração', + authentication: 'Autenticação', + daemon: 'Daemon', + enabled: 'Habilitado', + disabled: 'Desabilitado', + expired: 'Expirado', + connected: 'Conectado', + notConnected: 'Não conectado', + running: 'Em execução', + stopped: 'Parado', + actions: 'Ações Legadas', + disableIntegration: 'Desabilitar Integração', + enableIntegration: 'Habilitar Integração', + autoDetectAuth: 'Detecção Automática Legada da IDE', + manualAuthImport: 'Importação Manual Legada', + stopDaemon: 'Parar Daemon', + startDaemon: 'Iniciar Daemon', + port: 'Porta', + configuration: 'Configuração do Cursor', + lastModified: 'Última modificação:', + neverSaved: 'Nunca salvo', + saving: 'Salvando...', + save: 'Salvar', + modelConfig: 'Configuração de Modelo', + settings: 'Configurações', + info: 'Informações', + presets: 'Presets', + presetsDesc: 'Aplicar mapeamentos de modelo pré-configurados', + modelMapping: 'Mapeamento de Modelo', + modelMappingDesc: 'Configure quais modelos usar para cada nível', + defaultModel: 'Modelo Padrão', + defaultModelDesc: 'Usado quando nenhum nível específico é solicitado.', + opusModel: 'Opus (Mais capaz)', + opusModelDesc: 'Raciocínio complexo e respostas da mais alta qualidade.', + sonnetModel: 'Sonnet (Equilibrado)', + sonnetModelDesc: 'Codificação geral e cargas de trabalho de chat do dia a dia.', + haikuModel: 'Haiku (Rápido)', + haikuModelDesc: 'Caminhos de solicitação de baixa latência e leves.', + runtimeSettings: 'Configurações de Runtime', + autoStartDaemon: 'Iniciar Daemon Automaticamente', + autoStartDesc: 'Iniciar o daemon do Cursor automaticamente quando a integração for usada.', + ghostMode: 'Modo Fantasma', + ghostModeDesc: 'Solicitar x-ghost-mode para reduzir a telemetria.', + provider: 'Provedor', + filePath: 'Caminho do Arquivo', + availableModels: 'Modelos Disponíveis', + loadingModels: 'Carregando modelos...', + noModels: 'Nenhum metadado de modelo disponível ainda. Inicie o daemon e atualize.', + default: 'Padrão', + rawConfiguration: 'Configuração Bruta (JSON)', + manualImportTitle: 'Importação Manual de Autenticação do Cursor', + manualImportDesc: + 'Forneça o token de acesso e o ID da máquina do Cursor se a detecção automática estiver indisponível.', + accessToken: 'Token de Acesso', + accessTokenPlaceholder: 'Cole o token de acesso do Cursor', + machineId: 'ID da Máquina', + machineIdPlaceholder: 'hex de 32 caracteres (UUID sem hifens)', + cancel: 'Cancelar', + import: 'Importar', + selectModel: 'Selecionar modelo', + useDefaultModel: 'Usar Modelo Padrão', + availableModelCount: 'Modelos Disponíveis ({{count}})', + invalidPort: 'A porta deve ser um número inteiro entre 1 e 65535', + defaultModelRequired: 'O modelo padrão é obrigatório', + savedConfig: 'Configuração do Cursor e mapeamento de modelo salvos', + failedSaveConfig: 'Falha ao salvar a configuração', + modelsLoadingWait: 'Os modelos ainda estão carregando. Aguarde antes de aplicar um preset.', + noModelsAvailable: 'Nenhum modelo disponível ainda. Inicie o daemon e atualize primeiro.', + appliedCodexPreset: 'Preset GPT-5.3 Codex aplicado', + appliedClaudePreset: 'Preset Claude 4.6 aplicado', + appliedGeminiPreset: 'Preset Gemini 3 aplicado', + integrationEnabled: 'Integração do Cursor habilitada', + integrationDisabled: 'Integração do Cursor desabilitada', + failedUpdateIntegration: 'Falha ao atualizar o estado da integração', + credentialsImported: 'Credenciais do Cursor importadas', + autoDetectFailed: 'Falha na detecção automática', + manualRequired: 'Token e ID da máquina são obrigatórios', + manualImportFailed: 'Falha na importação manual', + failedStartDaemon: 'Falha ao iniciar o daemon', + daemonStarted: 'Daemon iniciado', + daemonStartedWithPid: 'Daemon iniciado (PID: {{pid}})', + failedStopDaemon: 'Falha ao parar o daemon', + daemonStopped: 'Daemon parado', + rawLoading: 'As configurações brutas ainda estão carregando. Aguarde e tente novamente.', + invalidJson: 'JSON inválido', + rawSaved: 'Configurações brutas salvas', + rawChanged: + 'As configurações brutas foram alteradas externamente. Atualize e tente novamente.', + failedSaveRaw: 'Falha ao salvar as configurações brutas', + savedAll: 'Configuração do Cursor salva', + liveProbe: 'Teste ao Vivo', + runLiveProbe: 'Executar Teste ao Vivo', + rerunLiveProbe: 'Executar Teste ao Vivo Novamente', + probing: 'Executando teste...', + probeNotRun: 'Teste ainda não executado', + probeLocalReadinessHint: + 'As verificações de prontidão local podem passar mesmo com o acesso ao runtime ao vivo ainda falhando. Use o teste ao vivo para verificar o caminho completo do Cursor.', + probeStage: 'Estágio', + probeHttpStatus: 'Status HTTP', + probeDuration: 'Duração', + probeModel: 'Modelo', + probeMessage: 'Mensagem', + probeSucceeded: 'Teste bem-sucedido', + probeFailed: 'Teste falhou', + probeSaveFirst: + 'Salve ou descarte as alterações do Cursor antes de executar o teste ao vivo', + refreshStatus: 'Atualizar status do Cursor', + refreshConfiguration: 'Atualizar configuração do Cursor', + }, + droidPage: { + loadingDiagnostics: 'Carregando diagnósticos do Droid...', + failedDiagnostics: 'Falha ao carregar os diagnósticos do Droid.', + overview: 'Visão Geral', + byok: 'BYOK', + docs: 'Docs', + runtimeInstall: 'Runtime e Instalação', + status: 'Status', + detected: 'Detectado', + notFound: 'Não Encontrado', + detectionSource: 'Origem da detecção', + binaryPath: 'Caminho do binário', + installDirectory: 'Diretório de instalação', + version: 'Versão', + overridePath: 'Substituição (CCS_DROID_PATH)', + configFiles: 'Arquivos de Configuração', + path: 'Caminho', + resolved: 'Resolvido', + size: 'Tamanho', + lastModified: 'Última modificação', + parseWarning: 'Aviso de análise: {{value}}', + readWarning: 'Aviso de leitura: {{value}}', + warnings: 'Avisos', + byokSummary: 'Resumo BYOK', + activeModelSelector: 'Seletor de modelo ativo', + customModels: 'Modelos personalizados', + ccsManaged: 'Gerenciado pelo CCS', + userManaged: 'Gerenciado pelo usuário', + malformedEntries: 'Entradas malformadas', + providers: 'Provedores', + none: 'nenhum', + customModelsTitle: 'Modelos Personalizados', + modelName: 'Nome / Modelo', + provider: 'Provedor', + baseUrl: 'URL Base', + noCustomModels: 'Nenhum modelo personalizado', + docsAlignedNotes: 'Notas Alinhadas à Documentação', + factoryDocs: 'Documentação da Factory', + providerFactCheckDocs: 'Documentação de Verificação de Provedores', + providerValues: 'Valores do provedor: {{value}}', + settingsHierarchy: 'Hierarquia de configurações: {{value}}', + settingsTitle: 'Configurações BYOK do Droid', + fixJsonBeforeQuickSettings: + 'Corrija a sintaxe JSON antes de usar os controles de configuração rápida.', + fixJsonBeforeReasoning: + 'Corrija a sintaxe JSON antes de atualizar as configurações de raciocínio BYOK.', + unableUpdateReasoning: + 'Não foi possível atualizar a configuração de raciocínio do modelo BYOK selecionado.', + fixJsonBeforeBudget: 'Corrija a sintaxe JSON antes de atualizar o orçamento de pensamento.', + anthropicOnlyBudget: + 'O orçamento de pensamento está disponível apenas para modelos Anthropic BYOK.', + invalidJson: 'JSON inválido: {{value}}', + saved: 'Configurações do Droid salvas', + changedExternally: + 'As configurações do Droid foram alteradas externamente. Atualize e tente novamente.', + failedSave: 'Falha ao salvar as configurações do Droid', + }, + sharedPage: { + commands: 'Comandos', + skills: 'Habilidades', + agents: 'Agentes', + plugins: 'Plugins', + settings: 'Configurações', + title: 'Recursos Compartilhados', + subtitle: + 'Comandos, habilidades, agentes, plugins e configurações compartilhados entre contas', + totalShared: 'Total de Recursos', + visible: 'Visível', + markdownDetail: 'Visualização detalhada em markdown', + registryDetail: 'Visualização detalhada do registro', + maskedSettingsDetail: 'Visualização de configurações mascaradas', + filterPrefix: 'Filtro:', + configurationRequired: 'Configuração Necessária', + countsUnavailable: 'Contagens indisponíveis', + retryCounts: 'Tentar contagens novamente', + filterPlaceholder: 'Filtrar {{tab}} por nome, descrição ou caminho', + showing: 'Mostrando {{visible}} de {{total}} {{tab}}', + showingQuery: ' para "{{query}}"', + refreshing: ' (atualizando...)', + loadingShared: 'Carregando {{tab}} compartilhados...', + failedLoadShared: 'Falha ao carregar {{tab}} compartilhados', + retry: 'Tentar Novamente', + noSharedFound: + 'Nenhum {{tab}} compartilhado encontrado. Execute `ccs sync` ou adicione itens no seu diretório compartilhado.', + noPluginsFound: + 'Nenhum plugin compartilhado está instalado. Os arquivos de registro de plugins e as pastas de cache ficam ocultos até que um plugin real esteja presente.', + noMatch: 'Nenhum {{tab}} corresponde a "{{query}}".', + selectOne: 'Selecione um {{tab}} para ver o conteúdo completo.', + pathLabel: 'Caminho', + resolvedSource: 'Origem Resolvida', + loadingMarkdown: 'Carregando conteúdo markdown...', + loadingSettings: 'Carregando conteúdo de configurações...', + failedLoadContent: 'Falha ao carregar o conteúdo', + retryContent: 'Tentar conteúdo novamente', + noMarkdown: 'Nenhum conteúdo markdown disponível.', + settingsTitle: 'settings.json', + settingsDescription: + 'Este arquivo contém configurações compartilhadas vinculadas entre todas as contas no modo compartilhado.', + settingsPath: 'Caminho das Configurações Compartilhadas', + settingsActive: 'Ativo', + settingsInactive: 'Não Encontrado', + resourcePolicies: 'Políticas de recursos', + resourcePoliciesDescription: + 'Contas marcadas como compartilhadas herdam este hub. Contas locais de perfil mantêm comandos, habilidades, agentes, plugins e configurações separados.', + sharedAccounts: '{{count}} compartilhada(s)', + profileLocalAccounts: '{{count}} local(is) de perfil', + moreProfileLocalAccounts: '+{{count}} mais', + }, + editAccountSharedResources: { + title: 'Editar Recursos Compartilhados', + description: + 'Configure como "{{name}}" herda comandos, habilidades e configurações do diretório compartilhado do CCS.', + resourceMode: 'Modo de Recurso', + selectResourceMode: 'Selecione o modo de recurso', + sharedOption: 'Compartilhado', + sharedHint: 'Herda comandos, habilidades e agentes do diretório compartilhado.', + profileLocalOption: 'Local do Perfil', + profileLocalHint: 'Usa recursos isolados no diretório privado da conta.', + implicationTitle: 'O que isso significa', + sharedImplication: + 'Esta conta verá todas as ferramentas e configurações no hub de recursos compartilhados.', + profileLocalImplication: + 'Esta conta não verá ferramentas compartilhadas. Ela permanece totalmente isolada por segurança ou testes.', + cancel: 'Cancelar', + save: 'Salvar', + saving: 'Salvando...', + }, + + // ======================================== + // Domain 1: Navigation / Layout / Shared + // ======================================== + heroSection: { + title: 'CCS Config', + subtitle: 'Painel do Claude Code Switch', + }, + hubFooter: { + logs: 'Logs', + settings: 'Configurações', + github: 'GitHub', + copyright: '© {{year}} kaitranntt', + }, + themeToggle: { + srLabel: 'Alternar tema', + }, + ccsLogo: { + alt: 'Logo do CCS', + text: 'CCS Config', + }, + claudekitBadge: { + title: 'Desenvolvido com o Framework ClaudeKit', + alt: 'ClaudeKit', + poweredBy: 'Desenvolvido com', + claudekit: 'ClaudeKit', + }, + codeEditor: { + revealSensitive: 'Revelar valores sensíveis', + maskSensitive: 'Ocultar valores sensíveis', + valid: '{{language}} válido', + readOnly: '(Somente leitura)', + }, + commandBuilder: { + title: 'Construtor de Comandos', + searchPlaceholder: 'Digite ou selecione um comando...', + copy: 'Copiar', + run: 'Executar', + cmdConfig: 'Abrir interface de configuração', + cmdCreateProfile: 'Criar um novo perfil', + cmdSwitchProfile: 'Trocar para um perfil', + cmdDoctor: 'Verificar a saúde do sistema', + cmdListProviders: 'Listar provedores do CLIProxy disponíveis', + cmdAddProvider: 'Adicionar provedor do CLIProxy', + }, + confirmDialog: { + confirm: 'Confirmar', + cancel: 'Cancelar', + }, + connectionIndicator: { + connected: 'Conectado', + connecting: 'Conectando...', + disconnected: 'Desconectado', + reconnecting: 'Reconectando...', + }, + docsLink: { + title: 'Ver documentação', + }, + githubLink: { + title: 'Reportar um problema no GitHub', + }, + ccsBarButton: { + title: 'Abrir documentação do CCS Bar', + label: 'CCS Bar', + tooltip: 'Controles nativos de cota, custo e conta na barra de menu do macOS', + }, + globalEnvIndicator: { + injectedCount_one: + '{{count}} variável de ambiente global será injetada em tempo de execução', + injectedCount_other: + '{{count}} variáveis de ambiente globais serão injetadas em tempo de execução', + overriddenCount: '({{count}} substituída(s) pelo perfil)', + skippedLabel: 'Ignorada (o perfil já define):', + configureInSettings: 'Configurar em Configurações', + }, + localhostDisclaimer: { + remoteReadonlyAuthDisabledLong: + 'O acesso remoto ao painel é somente leitura porque a autenticação do painel está desabilitada no momento para esta instância do CCS. Reative-a no host do CCS. Implantações Docker devem fazer isso dentro do container em execução.', + remoteReadonlyAuthDisabledShort: + 'O painel remoto é somente leitura até que a autenticação do painel seja reativada para esta instância do CCS.', + remoteReadonlySetupLong: + 'O acesso remoto ao painel é somente leitura até que você execute ccs config auth setup para esta instância do CCS. Implantações Docker devem executá-lo dentro do container.', + remoteReadonlySetupShort: + 'O painel remoto é somente leitura até que a autenticação seja configurada para esta instância do CCS.', + localLong: 'Este painel roda localmente. Todos os dados permanecem na sua máquina.', + localShort: 'Painel local - os dados permanecem no seu dispositivo.', + dismiss: 'Dispensar aviso', + }, + privacyToggle: { + modeOn: 'Modo de privacidade ATIVADO - Clique para mostrar os dados', + modeOff: 'Modo de privacidade DESATIVADO - Clique para ocultar os dados', + }, + projectSelectionDialog: { + title: 'Selecionar Projeto do Google Cloud', + description: 'Escolha qual projeto usar para a autenticação do {{provider}}.', + autoSelectCountdown: '(Selecionando o padrão automaticamente em {{count}}s)', + default: 'Padrão', + allProjects: 'Todos os Projetos', + allProjectsDescription: 'Integrar todos os {{count}} projetos listados', + useDefault: 'Usar Padrão', + selecting: 'Selecionando...', + confirmSelection: 'Confirmar Seleção', + codeCopied: 'Código copiado', + copyVerificationCode: 'Copiar código de verificação', + }, + quickCommands: { + title: 'Comandos Rápidos', + startDefault: 'Iniciar Padrão', + startDefaultDesc: 'Iniciar o Claude com o perfil padrão', + glmProfile: 'Perfil GLM', + glmProfileDesc: 'Trocar para o modelo GLM', + healthCheck: 'Verificação de Saúde', + healthCheckDesc: 'Executar diagnósticos do sistema', + delegateTask: 'Delegar Tarefa', + delegateTaskDesc: 'Delegar para o perfil GLM', + }, + quotaTooltip: { + loadingQuota: 'Carregando cota...', + failedLoadQuota: 'Falha ao carregar a cota', + modelQuotas: 'Cotas de Modelo:', + rateLimits: 'Limites de Taxa:', + plan: 'Plano: {{plan}}', + quotaSnapshots: 'Instantâneos de Cota:', + unlimited: 'Ilimitado', + remaining: '{{remaining}}/{{entitlement}} restante(s)', + tier: 'Nível', + tierId: 'ID do Nível', + state: 'Estado', + credits: 'Créditos', + modelQuotasLower: 'Cotas de modelo:', + allBucketsReport: 'Todos os buckets reportam {{tokenType}}', + requestsRemaining: '{{count}} solicitações restantes', + inputTokensRemaining: '{{count}} tokens de entrada restantes', + outputTokensRemaining: '{{count}} tokens de saída restantes', + amountRemaining: '{{count}} restante(s)', + fiveHourLimit: 'Limite de uso de 5h', + weeklyLimit: 'Limite de uso semanal', + weeklyOpus: 'Uso semanal (Opus)', + weeklySonnet: 'Uso semanal (Sonnet)', + weeklyOAuthApps: 'Uso semanal (apps OAuth)', + weeklyCowork: 'Uso semanal (Cowork)', + extraUsage: 'Uso extra', + premiumInteractions: 'Interações Premium', + chat: 'Chat', + completions: 'Completions', + resets: 'Reinicia {{time}}', + fiveHourResets: 'Reinício de 5h {{time}}', + weeklyResets: 'Reinício semanal {{time}}', + }, + utils: { + codeReview5h: 'Revisão de código (5h)', + codeReviewWeekly: 'Revisão de código (semanal)', + codeReview: 'Revisão de código', + codexAdditional5h: '{{name}} (5h)', + codexAdditionalWeekly: '{{name}} (semanal)', + codexAdditional: '{{name}}', + }, + sponsorButton: { + title: 'Patrocinar este projeto no GitHub', + sponsor: 'Patrocinar', + }, + valueMetrics: { + apiCostSaved: 'Custo de API Economizado', + tokensSaved: 'Tokens Economizados', + queriesFaster: 'Consultas Mais Rápidas', + errorsReduced: 'Erros Reduzidos', + vsLastMonth: 'em relação ao mês passado', + throughCaching: 'através de cache', + averageSpeedup: 'aceleração média', + withRetryLogic: 'com lógica de nova tentativa', + performanceMetrics: 'Métricas de Desempenho', + monthlySummary: 'Resumo Mensal', + totalSaved: 'Total Economizado', + tokensProcessed: 'Tokens Processados', + queriesHandled: 'Consultas Atendidas', + uptime: 'Tempo de Atividade', + }, + updatesSpotlight: { + openUpdatesCenter: 'Abrir Central de Atualizações', + }, + deviceCodeDialog: { + authorize: 'Autorizar {{provider}}', + enterCodeAtPage: 'Digite o código abaixo na página de autorização.', + expiresIn: '(Expira em {{time}})', + codeExpired: '(Código expirado)', + copied: 'Copiado!', + copyCode: 'Copiar Código', + waitingForAuth: 'Aguardando autorização...', + openVerificationPage: 'Abrir página de verificação', + openProviderPage: 'Abrir {{provider}}', + copyCodeAria: 'Copiar código de verificação', + codeCopiedAria: 'Código copiado', + }, + settingsDialog: { + editProfile: 'Editar Perfil: {{name}}', + description: 'Configure variáveis de ambiente e configurações para este perfil.', + loadingSettings: 'Carregando configurações...', + envTab: 'Ambiente', + rawJsonTab: 'JSON Bruto', + generalTab: 'Geral', + noEnvVars: 'Nenhuma variável de ambiente configurada.', + noEnvVarsHint: 'Adicione variáveis no seu arquivo settings.json.', + loadingEditor: 'Carregando editor...', + profileInfo: 'Informações do Perfil', + profileInfoDesc: 'Detalhes sobre este arquivo de configuração.', + path: 'Caminho', + lastModified: 'Última Modificação', + cancel: 'Cancelar', + saving: 'Salvando...', + saveChanges: 'Salvar Alterações', + conflictTitle: 'Arquivo Modificado Externamente', + conflictDesc: + 'Este arquivo de configurações foi modificado por outro processo. Sobrescrever com suas alterações ou descartar?', + overwrite: 'Sobrescrever', + invalidJson: 'JSON inválido', + failedSave: 'Falha ao salvar', + }, + + // ======================================== + // Domain 2: Accounts / Auth + // ======================================== + setupWizard: { + title: 'Configuração de Variante Avançada', + stepProviderDesc: 'Selecione um provedor para a variante de execução', + stepAuthDesc: 'Autentique-se com seu provedor', + stepAccountDesc: 'Selecione qual conta usar', + stepVariantDesc: 'Opcional: criar uma variante de execução personalizada', + stepSuccessDesc: 'Configuração concluída!', + authStep: { + authenticateWith: 'Autentique-se com {{provider}} para adicionar uma conta', + authenticating: 'Autenticando...', + authenticateInBrowser: 'Autenticar no Navegador', + completeOAuth: 'Complete o fluxo OAuth no seu navegador...', + orUseTerminal: 'Ou use o terminal', + runCommandHint: 'Execute este comando no seu terminal:', + back: 'Voltar', + checking: 'Verificando...', + refreshStatus: 'Atualizar Status', + }, + accountStep: { + selectAccount: 'Selecione uma conta ({{count}})', + defaultAccount: 'Conta padrão', + or: 'Ou', + addNewAccount: 'Adicionar nova conta', + addNewAccountDesc: 'Autentique-se com uma conta diferente', + back: 'Voltar', + }, + variantStep: { + back: 'Voltar', + skip: 'Pular', + }, + successStep: { + title: 'Variante Criada!', + subtitle: 'Sua variante personalizada está pronta para uso', + usage: 'Uso:', + done: 'Concluído', + }, + }, + accountSurfaceCard: { + business: 'Emp', + free: 'Grátis', + personal: 'Pess', + variant: 'Variante', + }, + accountIdentity: { + business: 'Empresarial', + personal: 'Pessoal', + free: 'Gratuito', + team: 'Equipe', + plus: 'Plus', + pro: 'Pro', + workspace: 'Workspace {{id}}', + }, + accountCardStats: { + notUsedYet: 'Ainda não usado', + }, + accountQuotaPanel: { + weekly: 'Semanal', + loadingQuota: 'Carregando cota...', + }, + userMenu: { + signedInAs: 'Conectado como {{username}}', + }, + authMonitorLive: { + live: 'AO VIVO', + accountMonitor: 'Monitor de Contas', + updated: 'Atualizado {{time}}', + updatedNow: 'Atualizado agora', + requestsLabel: 'req', + stats: 'Estatísticas', + successRate: 'Taxa de Sucesso', + missingProjectId: 'ID do Projeto Ausente', + noActivity: 'sem atividade', + }, + providerCard: { + missingProjectIdAria: 'ID do Projeto Ausente', + }, + loginPage: { + showPassword: 'Mostrar senha', + hidePassword: 'Ocultar senha', + }, + + // ======================================== + // Domain 3: CLIProxy / Provider Editor + // ======================================== + cliproxyStatsOverview: { + sessionStatistics: 'Estatísticas da Sessão', + realTimeMetrics: 'Métricas de uso em tempo real do {{backend}}', + offline: 'Offline', + running: 'Em execução', + noActiveSession: 'Nenhuma Sessão Ativa', + noActiveSessionHint: + 'Inicie uma sessão do CLIProxy usando ccs gemini, ccs codex ou ccs agy para ver estatísticas em tempo real.', + failedLoadStats: 'Falha ao Carregar Estatísticas', + totalRequests: 'Total de Solicitações', + successCount: '{{count}} com sucesso', + successRate: 'Taxa de Sucesso', + totalTokens: 'Total de Tokens', + estimatedCost: '~${{cost}} estimado', + modelsUsed: 'Modelos Usados', + modelUsageDistribution: 'Distribuição de Uso de Modelos', + requestCount: '{{count}} solicitações', + }, + cliproxyTable: { + name: 'Nome', + provider: 'Provedor', + model: 'Modelo', + account: 'Conta', + status: 'Status', + default: 'Padrão', + actions: 'Ações', + }, + cliproxyTabs: { + overview: 'Visão Geral', + variants: 'Variantes', + aiProviders: 'Provedores de IA', + controlPanel: 'Painel de Controle', + }, + cliproxyHeader: { + ccsLevelAccountManagement: 'Gerenciamento de contas em nível de CCS', + cliproxyNotAvailable: 'CLIProxy Não Disponível', + cliproxyControlPanel: 'Painel de Controle do CLIProxy', + noVariants: 'Nenhuma variante do CLIProxy encontrada.', + addAccountToStart: 'Adicione uma conta para começar', + }, + routingGuidance: { + roundRobin: 'Round robin distribui o uso.', + fillFirst: 'Fill first mantém as contas de backup inativas até que sejam necessárias.', + routingStrategy: 'Estratégia de roteamento', + poolRouting: 'Roteamento de pool', + poolRoutingOn: 'Ligado', + poolRoutingOff: 'Desligado', + poolRoutingManaged: + 'O roteamento de pool está ligado: o CCS gerencia a estratégia (fill-first), a afinidade de sessão e o resfriamento para todo o proxy.', + poolRoutingOffHint: + 'O roteamento de pool está desligado. Ative-o pela CLI (ccs cliproxy pool --enable) para drenagem fill-first com resfriamento.', + poolRoutingApplyWarning: + 'O roteamento de pool está ligado. As alterações de estratégia e afinidade de sessão não terão efeito até que você o desative: ccs cliproxy pool --disable', + poolRoutingLocalOnly: + 'O roteamento de pool é gerenciado localmente; este proxy remoto pode não refletir isso.', + poolMaxRetry: 'Máximo de tentativas {{count}}', + drainOrderHint: + 'Ordem de drenagem por conta e estado de resfriamento: execute ccs cliproxy quota ou ccs cliproxy accounts order .', + optionalRouting: 'Roteamento opcional', + sessionAffinity: 'Afinidade de sessão', + sessionAffinityOn: 'Ligada', + sessionAffinityOff: 'Desligada', + sessionAffinityEnabled: 'Habilitada', + sessionAffinityDisabled: 'Desabilitada', + enableSessionAffinity: 'Habilitar afinidade de sessão', + disableSessionAffinity: 'Desabilitar afinidade de sessão', + sessionAffinityUnavailable: 'Afinidade de sessão indisponível', + localOnly: 'Somente local', + localOnlySetting: 'Configuração somente local', + ttlBadge: 'TTL {{ttl}}', + sessionAffinityDescription: + 'Mantenha uma conversa fixada na mesma conta quando possível. O CLIProxy prefere identificadores explícitos de sessão ou thread quando os clientes os enviam, depois recorre a metadados da solicitação ou ao histórico do prompt inicial quando precisa inferir uma chave estável.', + sessionRecognitionTitle: 'Reconhecimento de sessão', + sessionRecognitionDescription: + 'O CCS não promete uma ordem de precedência universal aqui. Na prática, os back-ends upstream preferem IDs explícitos de sessão ou thread primeiro, depois recorrem a campos de metadados e, por fim, a um hash baseado no histórico do prompt inicial.', + }, + extendedContext: { + extendedContext: 'Contexto Estendido', + }, + cliproxyConfig: { + unsavedChanges: 'Alterações não salvas', + original: 'Original', + modified: 'Modificado', + reviewChanges: 'Revisar Alterações', + loadingEditor: 'Carregando editor...', + }, + providerEditor: { + provider: 'Provedor', + filePath: 'Caminho do Arquivo', + lastModified: 'Última Modificação', + defaultTarget: 'Destino Padrão', + quickUsage: 'Uso Rápido', + modelMapping: 'Mapeamento de Modelo', + status: 'Status', + loadingSettings: 'Carregando configurações...', + loadingEditor: 'Carregando editor...', + accounts: 'Contas', + addAccount: 'Adicionar Conta', + noAccountsConnected: 'Nenhuma conta conectada', + addAccountToStart: 'Adicione uma conta para começar', + gcpProjectIdReadonly: 'ID do Projeto GCP (somente leitura)', + projectIdNA: 'ID do Projeto: N/D', + missingProjectId: 'ID do Projeto Ausente', + missingProjectIdHint: + 'Isso pode causar erros. Remova a conta e adicione-a novamente para buscar o ID do projeto.', + useIncognito: 'Usar modo anônimo', + aliases: 'Aliases', + current: 'Atual', + currentValue: 'Valor atual', + composite: 'composto', + defaultLabel: 'padrão', + requiredSetup: 'Configuração necessária', + connectorName: 'Nome do Conector', + proxyUrl: 'URL do Proxy', + proxyUrlSet: 'URL do proxy definida', + excludedModels: 'Modelos Excluídos', + headers: 'Cabeçalhos', + secret: 'Segredo', + prefix: 'Prefixo', + modelMappings: 'Mapeamentos de Modelo', + baseUri: 'URL Base', + apiKeys: 'Chaves de API', + presets: 'Aplicar mapeamentos de modelo pré-configurados', + createVariant: 'Criar Variante do CLIProxy', + agyDenylist: + 'Lista de bloqueio do Antigravity: Claude Opus 4.5 e Claude Sonnet 4.5 estão descontinuados.', + }, + providerEditorAccountItem: { + modelsUsed: 'Modelos Usados', + }, + bulkActionBar: { + applyPreset: 'Aplicar preset', + }, + modelConfigSection: { + defaultModel: 'Modelo Padrão', + }, + rawEditorSection: { + rawConfig: 'Configuração Bruta', + }, + providerEditorHeader: { + connectorName: 'Nome do Conector', + }, + aiProvidersFamilyRail: { + current: 'Atual', + }, + aiProvidersEntryCard: { + apiKeys: 'Chaves de API', + }, + aiProvidersEntryDialog: { + connectorName: 'Nome do Conector', + baseUri: 'URL Base', + proxyUrl: 'URL do Proxy', + secret: 'Segredo', + prefix: 'Prefixo', + excludedModels: 'Modelos Excluídos', + headers: 'Cabeçalhos', + modelMappings: 'Mapeamentos de Modelo', + requiredSetup: 'Configuração necessária', + optionalRouting: 'Roteamento opcional', + }, + + // ======================================== + // Domain 4: Compatible CLI Tabs + // ======================================== + codex: { + controlCenter: 'Central de Controle', + overview: 'Visão Geral', + docs: 'Docs', + nativeCodexRuntime: 'Runtime Nativo do Codex', + ccsCodexProvider: 'Atalho do Cliproxy / ponte gerenciada', + codexDocs: 'Documentação do Codex', + howCodexWorks: 'Como o Codex funciona no CCS', + supportedFlows: 'Fluxos suportados', + twoSupportedPaths: 'Dois caminhos suportados:', + nativeLabel: 'Nativo:', + nativeDesc: 'O Codex é um destino de primeira classe, somente runtime, no CCS v1.', + nativeConfigLabel: 'Configuração nativa:', + nativeConfigDesc: 'ccs-codex e ccsx iniciam o Codex nativo usando seus padrões salvos.', + transientOverridesLabel: 'Substituições transitórias:', + transientOverridesDesc: + 'ccsxp permanece no Codex nativo e adiciona a substituição do provedor cliproxy; ccs codex --target codex continua sendo a ponte gerenciada pelo CCS explícita.', + cliproxyDefaultLabel: 'Padrão do CLIProxy:', + cliproxyDefaultDesc: + 'Para fazer com que o codex simples use o CLIProxy, defina model_provider = "cliproxy" e adicione a receita abaixo.', + ccsBridge: 'Ponte CCS', + apiProfilesDefault: 'Os perfis de API continuam usando Claude ou Droid por padrão.', + runtimeInstall: 'Instalação do runtime', + detected: 'Detectado', + notFound: 'Não encontrado', + detectionSource: 'Origem da detecção', + binaryPath: 'Caminho do binário', + installDirectory: 'Diretório de instalação', + versionLabel: 'Versão', + nativeAliases: 'Aliases nativos', + ccsProviderShortcut: 'Atalho do Cliproxy', + configOverrideSupport: 'Suporte à substituição --config', + available: 'Disponível', + missing: 'Ausente', + cliproxyNativeCodex: 'Codex nativo com suporte do CLIProxy', + builtInLabel: 'Integrado:', + builtInCcsxpDesc: 'Use ccsxp para o Codex nativo com o atalho do provedor cliproxy.', + managedBridgeLabel: 'Ponte gerenciada:', + managedBridgeDesc: + 'Use ccs codex --target codex quando quiser explicitamente a rota mais rígida gerenciada pelo CCS.', + nativeRecipeLabel: 'Nativo:', + nativeRecipeDesc: + 'Configure a receita abaixo para usar o CLIProxy diretamente com o codex.', + saveProviderNamedCliproxy: + 'Salve um provedor chamado cliproxy com a URL base e a chave de ambiente acima.', + inTopLevelSetDefault: + 'Nas configurações de nível superior, defina o provedor Padrão como cliproxy.', + exportCliproxyApiKey: + 'Exporte CLIPROXY_API_KEY no seu shell antes de iniciar o Codex nativo.', + noConfigOverrides: + 'Este build do Codex ainda pode usar o caminho nativo simples, mas o ccsxp e a ponte explícita do Codex gerenciada pelo CCS permanecem indisponíveis até que o binário detectado do Codex exponha substituições --config.', + configFile: 'Arquivo de configuração', + path: 'Caminho', + resolved: 'Resolvido', + size: 'Tamanho', + lastModified: 'Última modificação', + tomlWarning: 'Aviso de TOML', + readWarning: 'Aviso de leitura', + currentUserLayerSummary: 'Resumo da camada de usuário atual', + activeProfile: 'Perfil ativo', + notSet: 'Não definido', + providersCount: 'provedores: {{count}}', + profilesCount: 'perfis: {{count}}', + enabledFeaturesCount: 'recursos habilitados: {{count}}', + mcpServersCount: 'servidores mcp: {{count}}', + userLayerKeysPresent: 'Chaves da camada de usuário presentes', + recommendedSetupFlow: 'Fluxo de configuração recomendado', + fastestPath: 'Caminho mais rápido', + officialChannels: 'Canais Oficiais', + codexCli: 'CLI do Codex', + openNativeCodex: 'Abrir Codex nativo', + runBuiltInCodex: 'Executar Codex nativo com o atalho do cliproxy', + runBuiltInCodexExplicit: 'Executar a ponte do Codex gerenciada pelo CCS explicitamente', + openCodexDashboard: 'Abrir painel do Codex', + nativeShortAlias: 'Alias curto nativo', + ccsCodexShortcut: 'Atalho do Cliproxy', + explicitProviderRoute: 'Rota da ponte gerenciada', + status: 'Status', + profiles: 'Perfis', + createNewProfile: 'Criar novo perfil', + createNewProvider: 'Criar novo provedor', + createNewMcpServer: 'Criar novo servidor MCP', + defaultProvider: 'Provedor padrão', + useDefault: 'Usar padrão', + useGlobalProvider: 'Usar provedor global', + useProviderDefault: 'Usar padrão do provedor', + quickFillWarning: 'Somente preenchimento rápido. Revise antes de salvar.', + thisFileUpstreamOwned: 'Este arquivo é de propriedade upstream da CLI do Codex.', + notes: 'Notas', + approvalPolicy: 'Política de aprovação', + sandboxMode: 'Modo sandbox', + reasoningEffort: 'Esforço de raciocínio', + useGlobalEffort: 'Usar esforço global', + reasoningEffortCapitalized: 'Esforço de Raciocínio', + thinkingBudgetTokens: 'Tokens de Orçamento de Pensamento', + modelContextWindow: 'Janela de contexto do modelo', + autoCompactTokenLimit: 'Limite de tokens de compactação automática', + toolOutputTokenLimit: 'Limite de tokens de saída de ferramenta', + webSearch: 'Busca na web', + personality: 'Personalidade', + model: 'Modelo', + rawOnly: 'Somente bruto', + trusted: 'confiável', + untrusted: 'não confiável', + noProjectTrustEntries: 'Nenhuma entrada explícita de confiança de projeto salva.', + codexNativeRecipe: 'Receita nativa do Codex salva', + runtimeVsProvider: 'Runtime vs provedor', + honorsSavedNativeConfig: 'Respeita a configuração nativa de usuário salva', + usesTransientOverrides: 'Usa substituições transitórias', + unavailableNoConfig: 'Indisponível (o build do Codex não tem suporte a --config).', + gptContextCap: 'Limite de contexto do GPT-5.4', + usageLimitCost: 'Custo de limite de uso acima de 272K', + longContextOverride: 'Substituição de contexto longo', + counts2x: 'Conta 2x', + normalUsageWindow: 'Janela de uso normal', + useCodexDefault: 'Usar padrão do Codex', + stdio: 'stdio', + streamableHttp: 'streamable-http', + responses: 'responses', + defaultTargetCli: 'CLI de Destino Padrão', + executionChain: 'Cadeia de execução', + targetPath: 'Caminho de destino atual', + userConfig: 'Configuração do usuário', + configYaml: 'config.yaml', + flow: 'Fluxo', + docsTab: 'Docs', + yes: 'Sim', + no: 'Não', + warningsTitle: 'Avisos', + features: 'Recursos', + featuresDesc: + 'Alterne as flags de recursos suportadas do Codex que o CCS pode gerenciar com segurança.', + configOnlyFlags: 'Flags existentes somente na configuração', + configOnlyFlagsDesc: + 'Essas chaves de recurso já existem no seu `config.toml`, então o CCS pode exibi-las sem alegar cobertura completa do catálogo.', + existing: 'existente', + nonBooleanForm: + 'Armazenado em uma forma não booleana. Use o TOML bruto se precisar editá-lo.', + discoveredFromFile: + 'Descoberto a partir do arquivo atual em vez do catálogo integrado do CCS.', + featureMultiAgentLabel: 'Multiagente', + featureMultiAgentDesc: 'Habilitar ferramentas de colaboração de subagentes.', + featureUnifiedExecLabel: 'Exec unificado', + featureUnifiedExecDesc: 'Usar a ferramenta de exec unificado baseada em PTY.', + featureShellSnapshotLabel: 'Snapshot de shell', + featureShellSnapshotDesc: 'Reutilizar snapshots do ambiente do shell.', + featureApplyPatchLabel: 'Aplicar patch', + featureApplyPatchDesc: 'Habilitar edições apply_patch em formato livre.', + featureJsReplLabel: 'REPL JS', + featureJsReplDesc: 'Habilitar o REPL de JavaScript baseado em Node.', + featureRuntimeMetricsLabel: 'Métricas de runtime', + featureRuntimeMetricsDesc: 'Coletar métricas de runtime do Codex.', + featurePreventIdleSleepLabel: 'Evitar suspensão por inatividade', + featurePreventIdleSleepDesc: 'Manter a máquina ativa enquanto estiver em uso.', + featureFastModeLabel: 'Modo rápido', + featureFastModeDesc: 'Permitir o caminho de nível de serviço rápido.', + featureAppsLabel: 'Apps', + featureAppsDesc: 'Habilitar suporte a Apps e conectores do ChatGPT.', + featureSmartApprovalsLabel: 'Aprovações inteligentes', + featureSmartApprovalsDesc: 'Rotear aprovações elegíveis pelo fluxo guardian.', + auth: { + terminalOnlyTooltip: + 'Use ccsx auth switch ou ccsx auth remove no terminal.', + terminalOnlyTooltipRich: + 'Use ccsx auth switch <nome> ou ccsx auth remove <nome> no terminal.', + activeSourceBadge: '{{source}}', + statusOk: 'OK', + statusInvalid: '[!] autenticação inválida', + loading: 'Carregando perfis de autenticação...', + loadError: '[!] Falha ao carregar perfis codex-auth.', + emptyRegistry: + '[i] Nenhum perfil codex-auth. Execute ccsx auth create para criar um.', + emptyRegistryRich: + '[i] Nenhum perfil codex-auth. Execute ccsx auth create <nome> para criar um.', + legacyCodexHome: 'O Codex usará o local padrão ~/.codex.', + legacyCodexHomeRich: 'O Codex usará o local padrão ~/.codex.', + legacyMode: + '[i] Nenhum perfil ativo. Usando ~/.codex (legado). Execute ccsx auth switch no terminal para ativar um.', + legacyModeRich: + '[i] Nenhum perfil ativo. Usando ~/.codex (legado). Execute ccsx auth switch <nome> no terminal para ativar um.', + externalCodexHome: + '[i] $CODEX_HOME definido externamente para {{path}}. O registro de perfis não está em uso nesta sessão.', + externalCodexHomeRich: + '[i] $CODEX_HOME definido externamente para {{path}}. O registro de perfis não está em uso nesta sessão.', + activeProfile: 'Perfil ativo:', + unknownProfile: '(desconhecido)', + planLabel: 'Plano:', + switchAction: 'Trocar', + removeAction: 'Remover', + sourceDefault: 'padrão', + sourceEnv: '$CCS_CODEX_PROFILE', + sourceExplicitCodexHome: '$CODEX_HOME', + col: { + name: 'Nome', + email: 'E-mail', + plan: 'Plano', + lastUsed: 'Último uso', + status: 'Status', + actions: 'Ações', + }, + }, + }, + droidSettings: { + quickControls: 'Controles Rápidos', + reasoningControls: 'Controles de Raciocínio', + thinkingBudget: 'Orçamento de Pensamento', + anthropicOnly: 'Somente modelos Anthropic', + byokCustomModels: 'Modelos Personalizados BYOK', + }, + rawJsonSettingsEditor: { + title: 'Editor de Configurações Brutas', + }, + copilotConfigForm: { + copilotConfiguration: 'Configuração do Copilot', + deprecatedModels: 'Modelos descontinuados do Copilot detectados', + failedLoadStatus: 'Falha ao carregar o status', + useWithClaudeCode: 'Use sua assinatura do GitHub Copilot com o Claude Code', + githubCopilotControls: 'Os controles do GitHub Copilot limitam prompt/contexto upstream.', + provider: 'Provedor', + filePath: 'Caminho do Arquivo', + status: 'Status', + enabled: 'Habilitado', + disabled: 'Desabilitado', + loadingEditor: 'Carregando editor...', + modelMapping: 'Mapeamento de Modelo', + quickUsage: 'Uso Rápido', + noPremiumUsage: 'Nenhuma contagem de uso premium', + }, + copilotPresets: { + gpt5Codex: 'GPT-5.3 Codex', + claude46: 'Claude 4.6', + gemini3: 'Gemini 3', + }, + + // ======================================== + // Domain 5: Logs / Monitoring / Health / Analytics + // ======================================== + healthCard: { + allSystemsNominal: 'Todos os Sistemas Normais', + machineChecks: 'Verificações da máquina', + }, + analyticsCards: { + cacheCost: 'Custo de Cache', + hitRate: 'Taxa de Acerto', + inputOutputRatio: 'Proporção Entrada/Saída', + noCacheData: 'Nenhum dado de cache disponível', + noModelData: 'Nenhum dado de modelo disponível', + noSessionData: 'Nenhum dado de sessão disponível', + noTokenData: 'Nenhum dado de token disponível', + totalCost: 'Custo Total', + totalTokens: 'Total de Tokens', + usageInsights: 'Insights de Uso', + }, + dateRangeFilter: { + pickADate: 'Escolha uma data', + }, + logsConfig: { + level: 'Nív', + message: 'Mensagem', + source: 'Origem', + time: 'Hora', + proc: 'Proc', + open: 'Abrir', + run: 'Executar', + refreshEntries: 'Atualizar Entradas', + }, + logsDetailPanel: { + details: 'Detalhes', + }, + logsFilters: { + filters: 'Filtros', + }, + logsOverviewCards: { + overview: 'Visão Geral', + }, + logsPageSkeleton: { + loadingLogs: 'Carregando logs...', + }, + monitoringErrorLogs: { + logContent: 'Conteúdo do Log', + }, + analyticsPages: { + chartsGrid: 'Gráficos', + costByModel: 'Custo por Modelo', + }, + + // ======================================== + // Domain 6: Hooks / Toasts / Error Transport + // ======================================== + toasts: { + profileCreated: 'Perfil criado com sucesso', + profileUpdated: 'Perfil atualizado com sucesso', + profileDeleted: 'Perfil excluído com sucesso', + orphanProfilesComplete: 'Registro de perfis órfãos concluído', + profileCopied: 'Perfil copiado com sucesso', + profileImported: 'Perfil importado com sucesso', + authRequired: 'Autorização do {{provider}} necessária', + authSuccess: 'Autenticação do {{provider}} bem-sucedida!', + authFailed: 'Falha na autenticação do {{provider}}', + deviceCodeExpired: 'O código do dispositivo expirou. Tente novamente.', + codeCopied: 'Código copiado para a área de transferência', + failedCopy: 'Falha ao copiar o código', + configSaved: 'Configuração salva com sucesso', + configSaveFailed: 'Falha ao salvar: {{error}}', + invalidYaml: 'Não é possível salvar YAML inválido', + configUpdatedExternally: 'Configuração atualizada externamente', + settingsFileUpdated: 'Arquivo de configurações atualizado', + accountsUpdated: 'Contas atualizadas', + noProfilesToSync: 'Nenhum perfil para sincronizar', + syncFailed: 'Falha na sincronização: {{error}}', + sessionAffinityUpdated: 'Afinidade de sessão {{state}}.', + providerAuthSuccess: 'Autenticação do {{provider}} bem-sucedida', + providerDeviceCodeInCallback: 'O provedor retornou o fluxo Device Code no modo callback', + providerAuthTimeout: 'A autenticação expirou. Tente novamente.', + providerAccountRegistrationFailed: 'Não foi possível registrar a conta autenticada', + providerLostStatusEndpoint: 'Contato perdido com o endpoint de status de autenticação', + providerUnknown: 'Provedor desconhecido: {{provider}}', + providerStartOAuthFailed: 'Falha ao iniciar o OAuth', + providerCallbackFailed: 'Falha no envio do callback', + providerSubmitCallbackFailed: 'Falha ao enviar o callback', + loggingConfigSaved: 'Configuração de log salva.', + loggingConfigSaveFailed: 'Falha ao salvar a configuração de log.', + unifiedConfigUpdated: 'Configuração atualizada com sucesso', + migrationPreviewComplete: 'Pré-visualização da migração concluída', + migrationComplete: 'Migração concluída com sucesso', + migrationFailed: 'Falha na migração', + rollbackComplete: 'Reversão concluída com sucesso', + rollbackFailed: 'Falha na reversão', + defaultAccountSet: 'Conta padrão definida como "{{name}}"', + defaultAccountReset: 'Conta padrão redefinida para o CCS', + accountDeleted: 'Conta "{{name}}" excluída', + contextUpdated: 'Contexto de "{{name}}" atualizado para {{summary}}', + legacyConfirmError: + 'A conta "{{name}}" precisa de confirmação explícita. Use Editar Sincronização de Histórico nesta conta.', + legacyConfirmFailed: 'Falha na confirmação da conta legada "{{name}}": {{error}}', + legacyConfirmSuccess_one: '{{count}} conta legada confirmada', + legacyConfirmSuccess_other: '{{count}} contas legadas confirmadas', + legacyConfirmPartial: + '{{updated}} conta(s) legada(s) confirmada(s), mas {{failed}} atualização(ões) falhou(aram). Estado das contas atualizado.', + legacyConfirmAllFailed: + 'Falha ao confirmar {{failed}} conta(s) legada(s). Estado das contas atualizado.', + noLegacyAccounts: 'Nenhuma conta legada precisa de confirmação', + routingStrategySet: 'Estratégia de roteamento definida como {{strategy}}', + variantCreated: 'Variante criada com sucesso', + variantUpdated: 'Variante atualizada com sucesso', + variantDeleted: 'Variante excluída com sucesso', + defaultAccountUpdated: 'Conta padrão atualizada', + accountRemoved: 'Conta removida', + accountPaused: 'Conta pausada', + accountResumed: 'Conta retomada', + accountAdded: 'Conta adicionada para {{provider}}', + kiroImported: 'Conta Kiro importada: {{name}}', + kiroTokenImported: 'Token Kiro importado', + modelUpdated: 'Modelo atualizado', + presetSaved: 'Preset "{{name}}" salvo', + presetDeleted: 'Preset excluído', + cliproxyAlreadyRunning: 'O CLIProxy já estava em execução', + cliproxyStarted: 'CLIProxy iniciado com sucesso', + cliproxyStartFailed: 'Falha ao iniciar o CLIProxy', + cliproxyStopped: 'CLIProxy parado', + cliproxyStopFailed: 'Falha ao parar o CLIProxy', + presetApplied: 'Preset "{{name}}" aplicado', + presetAppliedCustom: 'Preset personalizado aplicado', + settingsSavedWithAdjustments: 'Configurações salvas com ajustes de modelo', + settingsSaved: 'Configurações salvas', + failedSaveSettings: 'Falha ao salvar as configurações', + codexRefreshFailed: + 'Falha ao atualizar o instantâneo do Codex. As edições brutas foram mantidas.', + codexRefreshError: 'Falha ao atualizar o instantâneo do Codex.', + codexFixToml: 'Corrija o TOML antes de salvar.', + codexSaved: 'config.toml do Codex salvo.', + codexChangedExternally: + 'O config.toml foi alterado externamente. Atualize e tente novamente.', + codexSaveFailed: 'Falha ao salvar o config.toml do Codex.', + codexUpdateFailed: 'Falha ao atualizar a configuração do Codex.', + noOrphanProfiles: 'Nenhuma configuração de perfil órfã encontrada', + profilesRegistered: '{{count}} perfil(is) registrado(s){{skipped}}', + destinationEmpty: 'O nome do perfil de destino não pode estar vazio', + profileExportDownloaded: 'Exportação do perfil baixada', + profileImportFailed: 'Falha ao importar o pacote de perfil', + }, + providerConfig: { + defaultDeviceCodeInstruction: 'Complete a autorização no seu navegador.', + trackLabel: 'Faixa', + sectionCoreLabel: 'Núcleo / backend original', + sectionCoreHint: 'Faixa de provedor padrão, sempre disponível', + sectionPlusLabel: 'Extras Plus / mantidos pela comunidade', + sectionPlusHint: 'Ainda suportada, mas separada do backend padrão por enquanto', + plusTrackNote: + 'Requer o backend Plus opcional enquanto essa faixa permanecer mantida pela comunidade.', + }, + + // ======================================== + // Domain 7: Profiles / Settings / Pages + // ======================================== + profileEditorSections: { + imageAnalysis: 'Análise de Imagem', + loadingImageSettings: 'Carregando configurações de imagem...', + skipPermissionPrompts: 'Pular avisos de permissão ao iniciar', + useNativeImageReading: 'Usar leitura nativa de imagem', + skipTransformer: 'Pular transformador', + friendlyUi: 'Interface Amigável', + info: 'Informações', + }, + imageAnalysisStatus: { + sectionTitle: 'Imagem', + openSettings: 'Abrir Configurações', + useNativeImageReading: 'Usar leitura nativa de imagem', + refreshingPreview: 'Atualizando pré-visualização', + savedStatus: 'Status salvo', + livePreview: 'Pré-visualização ao vivo', + disabledGlobally: 'Desabilitado globalmente', + targetBypassesHook: '{{target}} ignora o hook', + nativeImageReading: 'Leitura nativa de imagem', + setupNeeded: 'Configuração necessária', + needsAuth: 'Precisa de autenticação', + needsProxy: 'Precisa de proxy', + nativeFallback: 'Fallback nativo', + transformerReady: 'Transformador pronto', + badgeDisabled: 'Desabilitado', + badgeBypassed: 'Ignorado', + badgeNative: 'Nativo', + badgeSetup: 'Configuração', + badgeAuth: 'Autenticação', + badgeProxy: 'Proxy', + badgeReady: 'Pronto', + capabilityVerified: 'Verificado', + capabilityUnknown: 'Desconhecido', + toggleSummaryNativeCapable: + '{{model}} parece pronto para imagens. O CCS vai ignorar o transformador aqui.', + toggleSummaryNativeModel: 'O CCS vai preferir a leitura nativa para {{model}}.', + toggleSummaryNativeDefault: + 'O CCS vai preferir a leitura nativa de imagem para este perfil.', + toggleSummaryNativeFileAccess: + 'Este perfil atualmente permanece no acesso nativo a arquivos.', + toggleSummaryInactiveTarget: + 'O roteamento de imagem salvo do lado do Claude está inativo enquanto {{target}} está selecionado.', + toggleSummaryTransformerRoute: 'Rota do transformador: {{backend}}{{modelSuffix}}.', + noteDisabledGlobally: 'A imagem está desabilitada globalmente nas configurações do CCS.', + noteTargetBypassesHook: 'O destino atual {{target}} ignora o hook de Leitura do Claude.', + notePersistHook: + 'Persista o hook do perfil antes que o roteamento do transformador possa funcionar aqui.', + targetLabel: { + claude: 'Claude Code', + droid: 'Factory Droid', + codex: 'Codex CLI', + }, + }, + openrouterBadge: { + new: 'NOVO', + integration: 'Integração OpenRouter', + }, + openrouterBanner: { + accessModels: 'Acesse mais de {{count}} modelos via OpenRouter', + add: 'Adicionar', + }, + openrouterModelPicker: { + searchModels: 'Buscar Modelos', + newestModels: 'Modelos Mais Recentes', + }, + openrouterPromoCard: { + title: 'OpenRouter', + description: 'Acesse centenas de modelos a partir de um único endpoint de API.', + }, + profileCard: { + profile: 'Perfil', + openRouter: 'Perfil OpenRouter', + claudeCode: 'Claude Code', + claudeCodeDefault: 'Claude Code (padrão)', + factoryDroid: 'Factory Droid', + codexCli: 'CLI do Codex', + ccsProfile: 'Perfil CCS', + }, + profileDeck: { + profiles: 'Perfis', + failedToLoad: 'Falha ao carregar perfis: {{message}}', + noProfiles: 'Nenhum perfil configurado. Crie seu primeiro perfil para começar.', + }, + profilesTable: { + name: 'Nome', + provider: 'Provedor', + model: 'Modelo', + target: 'Destino', + lastModified: 'Última Modificação', + actions: 'Ações', + edit: 'Editar', + }, + profileCreateDialog: { + createProfile: 'Criar Perfil', + appliedModelToTiers: '"{{model}}" aplicado a todos os níveis de modelo', + profileCreated: 'Perfil "{{name}}" criado', + failedCreate: 'Falha ao criar o perfil', + chooseProviderHint: + 'Escolha um preset de provedor ou configure um endpoint de API personalizado.', + basicInformation: 'Informações Básicas', + modelConfiguration: 'Configuração de Modelo', + usedInCli: 'Usado na CLI:', + apiBaseUrl: 'URL Base da API', + baseUrlPlaceholder: 'https://api.example.com/v1', + prefilledFromPreset: + 'Pré-preenchido a partir de {{name}}. Você pode personalizar se necessário.', + optionalForPreset: + 'Opcional para {{name}}. Deixe em branco para usar a autenticação nativa da Anthropic.', + endpointHint: 'O endpoint que aceita solicitações compatíveis com OpenAI e Anthropic', + optional: '(opcional)', + apiKeyOptionalPlaceholder: 'Opcional - somente se a autenticação estiver habilitada', + apiKeyPlaceholder: 'sk-...', + apiKeyOptionalHint: + 'Necessário apenas se o seu endpoint local tiver autenticação habilitada', + defaultTargetCli: 'CLI de Destino Padrão', + modelMapping: 'Mapeamento de Modelo', + modelMappingDesc: + 'Mapeie os níveis do Claude Code (Opus/Sonnet/Haiku) para modelos suportados pelo seu provedor.', + searchModelsPlaceholder: 'Digite para buscar (ex.: opus, sonnet, gpt-4o)...', + noModelsFound: 'Nenhum modelo encontrado para "{{query}}"', + loadingModels: 'Carregando modelos...', + defaultModel: 'Modelo Padrão', + sonnetMapping: 'Mapeamento Sonnet', + opusMapping: 'Mapeamento Opus', + haikuMapping: 'Mapeamento Haiku', + sonnetMappingPlaceholder: 'ex.: gpt-4o, claude-sonnet-4', + opusMappingPlaceholder: 'ex.: o1, claude-opus-4.5', + haikuMappingPlaceholder: 'ex.: gpt-4o-mini, claude-3.5-haiku', + free: 'Grátis', + }, + profileDialogLegacy: { + editProfile: 'Editar Perfil', + }, + supportEntryCard: { + actionRequired: 'Ação Necessária', + }, + settingsPage: { + title: 'Configurações', + loading: 'Carregando...', + failedLoad: 'Falha ao carregar as configurações.', + tabs: { + web: 'Web', + env: 'Ambiente', + think: 'Pensamento', + proxy: 'Proxy', + auth: 'Autenticação', + backup: 'Backup', + channels: 'Canais', + imageAnalysis: 'Imagem', + }, + websearchSection: { + title: 'Busca na Web', + description: 'Configuração de busca na web baseada em CLI.', + }, + thinkingSection: { + title: 'Pensamento', + description: 'Configure o pensamento estendido/raciocínio para modelos suportados.', + directOverride: 'Substituição direta', + youType: 'Você digita:', + ccsAdds: 'O CCS adiciona:', + executionChain: 'Cadeia de execução', + primaryBackends: 'Back-ends primários', + legacyCliFallbacks: 'Fallbacks legados de CLI', + managedPayload: 'Payload gerenciado', + sharedTargetMetadata: 'Metadados de destino compartilhados', + ideTargetMetadata: 'Metadados de destino da IDE', + ideSettingsPath: 'Caminho de configurações da IDE', + ideHost: 'Host da IDE', + resolvedBinding: 'Vínculo resolvido', + bindingName: 'Nome do vínculo', + inSync: 'Sincronizado', + currentTargetPath: 'Caminho de destino atual', + warnings: 'Avisos', + notes: 'Notas', + workspacePresets: 'Presets do workspace', + draft: 'Rascunho', + advanced: 'Avançado', + recommended: 'Fluxo de configuração recomendado', + configureModelFirst: 'Configure um modelo primeiro', + }, + proxySection: { + title: 'Proxy', + loadingImageSettings: 'Carregando configurações de imagem...', + }, + channelsSection: { + title: 'Canais Oficiais', + description: 'Veja e gerencie os canais de lançamento oficiais.', + }, + imageAnalysisSection: { + title: 'Análise de Imagem', + description: 'Configure as configurações de análise de imagem.', + loading: 'Carregando configurações de imagem...', + }, + browserSection: { + title: 'Navegador', + description: + 'Superfície principal de configuração para automação de navegador gerenciada no CCS.', + primaryTitle: + 'Configurações > Navegador é a superfície principal de configuração do navegador.', + primaryDescription: + 'Configure o Claude Browser Attach e as Ferramentas de Navegador do Codex aqui e depois use as orientações abaixo para iniciar ou verificar cada faixa.', + readiness: 'Prontidão', + nextStep: 'Próximo passo', + technicalDetails: 'Detalhes Técnicos', + diagnostics: 'Diagnósticos', + evalMode: { + label: 'acesso ao browser_eval', + options: { + disabled: 'Desabilitado', + readonly: 'Somente leitura', + readwrite: 'Leitura/escrita', + }, + }, + actions: { + saveClaude: 'Salvar configurações do Claude', + saveCodex: 'Salvar configurações do Codex', + testConnection: 'Testar conexão', + copyLaunchCommand: 'Copiar comando de inicialização', + }, + messages: { + statusRefreshed: 'Status do navegador atualizado', + launchCommandCopied: 'Comando de inicialização copiado', + }, + claude: { + title: 'Claude Browser Attach', + description: + 'Conecta as inicializações com destino Claude a uma sessão gerenciada do Chrome com depuração remota habilitada.', + enabledLabel: 'Habilitar Claude Browser Attach', + enabledDescription: + 'Quando habilitado, o CCS prepara o runtime MCP de navegador gerenciado para inicializações com destino Claude.', + userDataDir: 'Diretório de dados de usuário do Chrome', + userDataDirHint: + 'Use um diretório de perfil do Chrome dedicado para que o estado do modo attach permaneça isolado do seu navegador diário.', + devtoolsPort: 'Porta do DevTools', + devtoolsPortHint: 'Use a mesma porta ao iniciar o Chrome no modo attach.', + devtoolsPortInvalid: 'Digite uma porta válida entre 1 e 65535.', + effectivePath: 'Caminho de attach efetivo', + recommendedPath: 'Caminho recomendado', + managedRuntime: 'Runtime de navegador gerenciado', + evalModeHint: + 'Controla o acesso ao browser_eval para o Claude Browser Attach. Somente leitura permite inspeção; leitura/escrita também permite mutações no lado da página.', + overrideMessage: + 'Uma substituição de ambiente está atualmente ativa vindo de {{source}}. Este painel volta a ser a fonte da verdade assim que essa substituição for removida.', + launchGuidance: 'Orientação de inicialização', + launchGuidanceHint: + 'Inicie o Chrome com a depuração remota habilitada e depois execute novamente Testar conexão se necessário.', + }, + codex: { + title: 'Ferramentas de Navegador do Codex', + description: + 'Controla o caminho de substituição do Playwright MCP gerenciado para inicializações com destino Codex.', + enabledLabel: 'Habilitar Ferramentas de Navegador do Codex', + enabledDescription: + 'Mantenha isso ativado para tornar a página Navegador a superfície principal de configuração das ferramentas de navegador do Codex.', + serverName: 'Nome do servidor gerenciado', + overrideSupport: 'Suporte à substituição de configuração', + overrideSupported: 'Suportado', + overrideUnsupported: 'Não suportado', + binary: 'Binário do Codex detectado', + notDetected: 'Não detectado', + evalModeHint: + 'Armazenado para paridade das configurações do Navegador. Na Fase 1, a aplicação do browser_eval se aplica principalmente ao Claude Browser Attach.', + }, + }, + }, + codexPage: { + title: 'Codex', + controlCenter: 'Central de Controle', + overview: 'Visão Geral', + docs: 'Docs', + authProfiles: 'Perfis de Autenticação', + nativeRuntime: 'Runtime Nativo', + ccsProvider: 'Provedor CCS', + setup: 'Configuração', + }, + apiPage: { + title: 'Perfis de API', + subtitle: 'Gerencie seus perfis de API e endpoints.', + }, + claudeExtensionPage: { + title: 'Extensão Claude', + subtitle: 'Configurações de integração da Extensão Claude.', + claudeAuth: 'Autenticação do Claude', + status: 'Status', + targetMetadata: 'Metadados de destino da IDE', + }, + sharedPageV2: { + title: 'Compartilhado', + subtitle: 'Gerenciamento de dados compartilhados.', + }, + homePageV2: { + title: 'Início', + logsMoved: 'Os logs foram movidos para um workspace dedicado', + profiles: 'Perfis', + cliproxy: 'CLIProxy', + accounts: 'Contas', + health: 'Saúde', + }, + analyticsPageV2: { + title: 'Análises', + subtitle: 'Análises e insights de uso.', + }, + logsPageV2: { + title: 'Logs', + subtitle: 'Veja e gerencie os logs do sistema.', + }, + healthPageV2: { + title: 'Saúde', + subtitle: 'Monitoramento da saúde do sistema.', + }, + aiProvidersPage: { + title: 'Provedores de IA', + subtitle: 'Gerencie as configurações de provedores de IA.', + unableToLoad: 'Não foi possível carregar os Provedores de IA', + }, + }, + }, 'zh-CN': { translation: { locale: { @@ -2754,6 +5556,7 @@ const resources = { vi: '越南语', ja: '日语', ko: '韩语', + 'pt-BR': '巴西葡萄牙语', }, layout: { languageSwitcher: '语言', @@ -5363,6 +8166,7 @@ const resources = { vi: 'Tiếng Việt', ja: 'Tiếng Nhật', ko: 'Tiếng Hàn', + 'pt-BR': 'Tiếng Bồ Đào Nha (Brazil)', }, layout: { languageSwitcher: 'Ngôn ngữ', @@ -8097,6 +10901,7 @@ const resources = { vi: 'ベトナム語', ja: '日本語', ko: '韓国語', + 'pt-BR': 'ポルトガル語(ブラジル)', }, layout: { languageSwitcher: '言語', @@ -10855,6 +13660,7 @@ const resources = { vi: '베트남어', ja: '일본어', ko: '한국어', + 'pt-BR': '브라질 포르투갈어', }, layout: { languageSwitcher: '언어', diff --git a/ui/src/lib/locales.ts b/ui/src/lib/locales.ts index 087ad075..df97336e 100644 --- a/ui/src/lib/locales.ts +++ b/ui/src/lib/locales.ts @@ -1,6 +1,6 @@ export const LOCALE_STORAGE_KEY = 'ccs-ui-locale'; -export const SUPPORTED_LOCALES = ['en', 'zh-CN', 'vi', 'ja', 'ko'] as const; +export const SUPPORTED_LOCALES = ['en', 'pt-BR', 'zh-CN', 'vi', 'ja', 'ko'] as const; export type AppLocale = (typeof SUPPORTED_LOCALES)[number]; @@ -14,6 +14,7 @@ export function normalizeLocale(locale: string | null | undefined): AppLocale { if (locale.toLowerCase().startsWith('ja')) return 'ja'; if (locale.toLowerCase().startsWith('zh')) return 'zh-CN'; if (locale.toLowerCase().startsWith('vi')) return 'vi'; + if (locale.toLowerCase().startsWith('pt')) return 'pt-BR'; return 'en'; }