diff --git a/web/frontend/src/i18n/locales/pt-br.json b/web/frontend/src/i18n/locales/pt-br.json index eb9f5e155..c091625bb 100644 --- a/web/frontend/src/i18n/locales/pt-br.json +++ b/web/frontend/src/i18n/locales/pt-br.json @@ -5,6 +5,7 @@ "models": "Modelos", "credentials": "Credenciais", "agent_group": "Agente", + "hub": "Hub", "skills": "Skills", "tools": "Ferramentas", "services": "Serviços", @@ -14,10 +15,42 @@ "config": "Configuração", "logs": "Logs" }, + "launcherLogin": { + "title": "Entrar", + "description": "Digite a senha do dashboard para continuar.", + "passwordLabel": "Senha", + "passwordPlaceholder": "Digite a senha", + "submit": "Entrar", + "errorInvalid": "Senha incorreta. Tente novamente.", + "errorNetwork": "Erro de rede. Tente novamente." + }, + "launcherSetup": { + "title": "Definir senha do dashboard", + "description": "Escolha uma senha para proteger o acesso a este dashboard. Você a usará toda vez que entrar.", + "passwordLabel": "Senha", + "passwordPlaceholder": "Pelo menos 8 caracteres", + "confirmLabel": "Confirmar senha", + "confirmPlaceholder": "Repita a senha", + "submit": "Definir senha", + "errorMismatch": "As senhas não coincidem.", + "errorNetwork": "Erro de rede. Tente novamente." + }, "chat": { "welcome": "Como posso te ajudar hoje?", "welcomeDesc": "Pergunte sobre clima, configurações ou qualquer outra tarefa. Estou aqui para ajudar.", - "placeholder": "Digite uma mensagem...\nEnter para enviar, Shift + Enter para nova linha", + "placeholder": "Inicie uma nova mensagem...", + "disabledPlaceholder": { + "gatewayUnknown": "Não é possível conversar: o status do Gateway ainda está sendo verificado. Aguarde e atualize a página ou reinicie o Launcher se necessário.", + "gatewayStarting": "Não é possível conversar: o Gateway está iniciando. Aguarde a inicialização concluir e tente novamente.", + "gatewayRestarting": "Não é possível conversar: o Gateway está reiniciando. Aguarde o reinício terminar.", + "gatewayStopping": "Não é possível conversar: o Gateway está parando. Aguarde até que pare e inicie o Gateway novamente.", + "gatewayStopped": "Não é possível conversar: o Gateway não está iniciado. Clique em Iniciar Gateway na barra superior e tente novamente.", + "gatewayError": "Não é possível conversar: o Gateway está em estado de erro. Verifique os logs e reinicie o Gateway ou o Launcher.", + "websocketConnecting": "Conectando ao serviço de chat... Aguarde.", + "websocketDisconnected": "Não é possível conversar: a conexão WebSocket está desconectada. Verifique a rede e o status do gateway, atualize a página ou reinicie o Launcher.", + "websocketError": "Não é possível conversar: a conexão WebSocket falhou. Verifique a rede e o status do gateway e tente novamente.", + "noDefaultModel": "Não é possível conversar: nenhum modelo padrão está selecionado. Defina um modelo padrão na página de Modelos." + }, "newChat": "Novo Chat", "notConnected": "O Gateway não está rodando. Inicie-o para conversar.", "thinking": { @@ -26,6 +59,12 @@ "step3": "Preparando resposta...", "step4": "Quase lá..." }, + "reasoningLabel": "Raciocínio", + "toolCallsLabel": "Chamadas de ferramentas", + "toolCallExplanationLabel": "Nota da chamada", + "toolCallFunctionLabel": "Resumo da chamada", + "showAssistantDetails": "Mostrar raciocínio e chamadas de ferramentas", + "toolLabel": "Ferramenta", "history": "Histórico", "noHistory": "Nenhum histórico de chat ainda", "historyLoadFailed": "Falha ao carregar histórico de chat", @@ -34,6 +73,20 @@ "deleteSession": "Excluir sessão", "messagesCount": "{{count}} mensagens", "noModel": "Selecionar modelo", + "inputDisabled": { + "notConnected": "O Gateway não está rodando. Inicie-o para conversar.", + "noModel": "Nenhum modelo padrão configurado. Vá para a página de Modelos para definir um." + }, + "sendMessage": "Enviar mensagem", + "sendHint": "Pressione Enter para enviar\nShift + Enter para nova linha", + "contextTitle": "Contexto", + "contextDetail": "Ver Detalhes", + "attachImage": "Adicionar imagens", + "removeImage": "Remover imagem", + "uploadedImage": "Imagem enviada", + "invalidImage": "\"{{name}}\" não é um arquivo de imagem suportado.", + "imageTooLarge": "\"{{name}}\" excede o limite de {{size}}.", + "imageReadFailed": "Falha ao ler \"{{name}}\".", "empty": { "noConfiguredModel": "Nenhum Modelo Configurado", "noConfiguredModelDescription": "Você precisa configurar pelo menos um modelo de IA com uma API Key antes de iniciar o chat.", @@ -50,6 +103,11 @@ } }, "header": { + "logout": { + "tooltip": "Sair", + "confirm": "Sair", + "description": "Tem certeza de que deseja sair do dashboard?" + }, "gateway": { "stopDialog": { "title": "Parar o Serviço de Gateway?", @@ -66,7 +124,7 @@ "restarting": "Reiniciando Gateway...", "stopping": "Parando Gateway..." }, - "restartRequired": "Alterações no modelo requerem reiniciar o gateway para ter efeito." + "restartRequired": "Alterações de configuração requerem reiniciar o gateway para ter efeito." } }, "common": { @@ -74,34 +132,43 @@ "save": "Salvar", "saving": "Salvando...", "reset": "Redefinir", - "confirm": "Confirmar" + "confirm": "Confirmar", + "saveChangesTitle": "Você tem alterações de configuração não salvas", + "restartRequiredTitle": "Reinício do gateway necessário", + "restartRequiredDesc": "A configuração mais recente de {{name}} foi salva. Reinicie o gateway para que tenha efeito." }, "labels": { "loading": "Carregando..." }, + "footer": { + "version": "Versão", + "commit": "Commit", + "build": "Build", + "version_unknown": "Desconhecido" + }, "credentials": { - "description": "Gerencie credenciais OAuth e baseadas em token para provedores compatíveis.", + "description": "Gerencie credenciais OAuth e baseadas em token para os provedores suportados.", "loading": "Carregando credenciais...", "providers": { "openai": { - "description": "Suporta OAuth pelo navegador, código de dispositivo e login por token." + "description": "Suporta OAuth via navegador, device code e login por token." }, "anthropic": { "description": "Usa login por token para acesso ao Claude." }, "antigravity": { - "description": "Usa OAuth pelo navegador para Google Cloud Code Assist." + "description": "Usa OAuth via navegador para o Google Cloud Code Assist." } }, "status": { "connected": "Conectado", "needsRefresh": "Precisa atualizar", "expired": "Expirado", - "notLoggedIn": "Não conectado" + "notLoggedIn": "Não autenticado" }, "actions": { - "browser": "OAuth pelo Navegador", - "deviceCode": "Código do Dispositivo", + "browser": "OAuth via Navegador", + "deviceCode": "Device Code", "stopLoading": "Parar Carregamento", "saveToken": "Salvar", "logout": "Sair" @@ -116,7 +183,7 @@ }, "labels": { "account": "Conta", - "email": "E-mail", + "email": "Email", "project": "Projeto" }, "errors": { @@ -124,8 +191,8 @@ "flowFailed": "Falha ao verificar fluxo de autenticação", "loginFailed": "Falha no login", "logoutFailed": "Falha ao sair", - "invalidBrowserResponse": "Resposta inválida do login pelo navegador", - "invalidDeviceResponse": "Resposta inválida do código de dispositivo", + "invalidBrowserResponse": "Resposta de login do navegador inválida", + "invalidDeviceResponse": "Resposta de device code inválida", "popupBlocked": "Não foi possível abrir uma nova aba. Permita popups e tente novamente." }, "flow": { @@ -136,22 +203,26 @@ "expired": "Sessão de autenticação expirada" }, "device": { - "title": "Login por Dispositivo OpenAI", - "description": "Abra a página de verificação e insira o código abaixo. Esta página será atualizada automaticamente.", + "title": "Login por Device do OpenAI", + "description": "Abra a página de verificação e digite o código abaixo. Esta página será atualizada automaticamente.", "code": "Código do Usuário", "url": "URL de Verificação", - "polling": "Verificando status de login...", + "polling": "Verificando status do login...", "open": "Abrir Página de Verificação" } }, "models": { - "description": "Configure API Keys para provedores de IA. Apenas modelos configurados estarão disponíveis para chat.", + "description": "Configure API Keys para provedores de IA. Apenas modelos configurados ficam disponíveis para o chat.", + "defaultChangeSuccess": "Modelo padrão atualizado.", + "unsavedPrompt": "Esta alteração ainda não foi salva. Salve para gravá-la na configuração do modelo.", + "restartHint": "Alterações na configuração de modelos só têm efeito após o gateway reiniciar.", "loadError": "Falha ao carregar modelos", - "noDefaultHintPrefix": "Nenhum modelo padrão definido. Clique em", + "noDefaultHintPrefix": "Nenhum modelo padrão definido ainda. Clique em", "noDefaultHintSuffix": "para definir um.", "status": { - "configured": "Configurado", - "unconfigured": "Não configurado" + "available": "Disponível", + "unconfigured": "Não configurado", + "unreachable": "Serviço inacessível" }, "badge": { "default": "Padrão", @@ -160,7 +231,16 @@ "action": { "edit": "Editar API Key", "setDefault": "Definir como padrão", - "delete": "Excluir modelo" + "delete": "Excluir modelo", + "setDefaultDisabled": { + "setting": "Definindo como padrão...", + "unavailable": "Não é possível definir um modelo indisponível como padrão", + "isDefault": "Já é o modelo padrão", + "isVirtual": "Não é possível definir um modelo virtual como padrão" + }, + "deleteDisabled": { + "isDefault": "Não é possível excluir o modelo padrão" + } }, "defaultOnSave": { "label": "Modelo Padrão", @@ -168,64 +248,67 @@ }, "add": { "button": "Adicionar Modelo", - "title": "Adicionar Modelo Personalizado", - "description": "Adicione um endpoint de modelo compatível com OpenAI ou nativo.", - "modelName": "Nome do Modelo", + "title": "Adicionar Modelo Customizado", + "description": "Adicione um endpoint de modelo nativo ou compatível com OpenAI.", + "modelName": "Apelido do Modelo", "modelNamePlaceholder": "ex: meu-gpt4", "modelNameHint": "Um nome curto usado para identificar este modelo nas conversas.", "modelId": "Identificador do Modelo", - "modelIdPlaceholder": "ex: openai/gpt-4o", - "modelIdHint": "Formato: protocolo/id-modelo. Suportados: openai, anthropic, gemini, groq, …", + "modelIdPlaceholder": "ex: gpt-4o ou openai/gpt-4o", + "modelIdHint": "Se Provider não estiver especificado, valores como openai/gpt-4o são interpretados no formato provider/modelo. Se Provider estiver especificado, este campo é tratado como o ID canônico do modelo e não é parseado em busca de prefixo de provider.", "errorRequired": "Este campo é obrigatório.", - "errorDuplicateModelName": "Este nome já existe. Use um nome diferente.", + "errorDuplicateModelName": "Apelido de modelo já existe. Use um nome diferente.", "saveError": "Falha ao adicionar modelo", + "saveSuccess": "Modelo adicionado.", "confirm": "Adicionar Modelo" }, "delete": { "title": "Excluir Modelo?", - "description": "\"{{name}}\" será removido permanentemente da sua lista de modelos. Isso não pode ser desfeito.", + "description": "\"{{name}}\" será removido permanentemente da sua lista de modelos. Esta ação não pode ser desfeita.", "confirm": "Excluir" }, "advanced": { "toggle": "Opções avançadas" }, "field": { + "provider": "Provider", + "providerPlaceholder": "ex: openai", + "providerHint": "Opcional. Se especificado, este valor é usado como o provider efetivo, e Identificador do Modelo é interpretado como o ID canônico do modelo.", "apiBase": "URL Base da API", "apiKey": "API Key", - "apiKeyPlaceholder": "Insira sua API Key", - "apiKeyPlaceholderSet": "Deixe em branco para manter a chave atual", + "apiKeyPlaceholder": "Digite sua API Key", + "apiKeyPlaceholderSet": "Deixe em branco para manter a chave existente", "proxy": "Proxy HTTP", "proxyHint": "Opcional. ex: http://127.0.0.1:7890", "authMethod": "Método de Autenticação", "authMethodHint": "Método de autenticação: oauth, token. Deixe em branco para autenticação por API Key.", "connectMode": "Modo de Conexão", - "connectModeHint": "Modo de conexão para provedores via CLI: stdio ou grpc.", - "workspace": "Diretório de Trabalho", - "workspaceHint": "Diretório de trabalho para provedores via CLI (ex: GitHub Copilot).", + "connectModeHint": "Modo de conexão para providers baseados em CLI: stdio ou grpc.", + "workspace": "Caminho do Workspace", + "workspaceHint": "Diretório de trabalho para providers baseados em CLI (ex: GitHub Copilot).", "requestTimeout": "Timeout da Requisição (s)", - "requestTimeoutHint": "Máximo de segundos para aguardar uma resposta. 0 = usar padrão.", + "requestTimeoutHint": "Tempo máximo em segundos para aguardar uma resposta. 0 = usar padrão.", "rpm": "Limite de Taxa (RPM)", "rpmHint": "Máximo de requisições por minuto. 0 = sem limite.", - "thinkingLevel": "Nível de Raciocínio", - "thinkingLevelHint": "Orçamento de raciocínio estendido: off, low, medium, high, xhigh, adaptive.", + "thinkingLevel": "Nível de Pensamento", + "thinkingLevelHint": "Orçamento de pensamento estendido: off, low, medium, high, xhigh, adaptive.", "maxTokensField": "Campo de Max Tokens", - "maxTokensFieldHint": "Sobrescrever o nome do campo de max tokens na requisição, ex: max_completion_tokens.", - "extraBody": "Corpo Extra", - "extraBodyHint": "Campos JSON adicionais para injetar no corpo da requisição, ex: {\"reasoning_split\": true}." + "maxTokensFieldHint": "Sobrescreve o nome do campo de max tokens na requisição, ex: max_completion_tokens.", + "extraBody": "Body Extra", + "extraBodyHint": "Campos JSON adicionais para injetar no body da requisição, ex: {\"reasoning_split\": true}.", + "customHeaders": "Headers Customizados", + "customHeadersHint": "Headers HTTP adicionais para injetar em cada requisição, ex: {\"X-Source\": \"coding-plan\"}." }, "edit": { "title": "Configurar {{name}}", - "apiKeyHint": "Uma chave já está definida. Deixe em branco para mantê-la.", - "oauthNote": "Este provedor usa OAuth — não é necessária API Key.", - "saveError": "Falha ao salvar" + "apiKeyHint": "Já existe uma chave definida. Deixe em branco para mantê-la inalterada.", + "oauthNote": "Este provider usa OAuth — não é necessária API Key.", + "saveError": "Falha ao salvar", + "saveSuccess": "Configuração do modelo salva." } }, "channels": { "loadError": "Falha ao carregar canais", - "edit": "Configurar {{name}}", - "status": { - "configured": "Configurado" - }, "name": { "telegram": "Telegram", "discord": "Discord", @@ -245,14 +328,12 @@ "weixin": "WeChat" }, "weixin": { - "warningTitle": "Fase de testes, use com cautela", - "warningDesc": "O canal do WeChat ainda é experimental e pode ter risco de suspensão de conta. Use apenas se você entende e aceita o risco.", - "bindTitle": "Vinculação de Conta WeChat", + "bindTitle": "Vincular Conta do WeChat", "bindDesc": "Escaneie o QR code com o WeChat para vincular sua conta pessoal.", "bind": "Vincular WeChat", - "rebind": "Revincular", + "rebind": "Re-vincular", "bound": "WeChat Vinculado", - "notBound": "Conta WeChat ainda não vinculada.", + "notBound": "Conta do WeChat ainda não vinculada.", "generating": "Gerando QR code...", "scanHint": "Abra o WeChat e escaneie o QR code", "scanned": "Escaneado — confirme no WeChat", @@ -262,12 +343,10 @@ "errorGeneric": "Ocorreu um erro. Tente novamente." }, "wecom": { - "bindTitle": "Vinculação WeCom", + "bindTitle": "Vincular WeCom", "bindDesc": "Escaneie o QR code com o WeCom para vincular seu AI Bot.", - "enableDesc": "Após vincular, você pode habilitar ou desabilitar o canal aqui.", - "enableBindFirst": "Vincule o bot primeiro, depois habilite o canal.", "bind": "Vincular WeCom", - "rebind": "Revincular", + "rebind": "Re-vincular", "bound": "WeCom Vinculado", "notBound": "AI Bot do WeCom ainda não vinculado.", "generating": "Gerando QR code...", @@ -280,63 +359,68 @@ }, "field": { "token": "Token do Bot", - "tokenPlaceholder": "Insira o token do bot", + "tokenPlaceholder": "Digite o token do bot", "botToken": "Token do Bot", - "appToken": "Token do App", - "appId": "ID do App", - "appSecret": "Segredo do App", + "appToken": "App Token", + "appId": "App ID", + "appSecret": "App Secret", "verificationToken": "Token de Verificação", "encryptKey": "Chave de Criptografia", "baseUrl": "URL Base da API", "proxy": "Proxy HTTP", - "mentionOnly": "Apenas Menções", + "mentionOnly": "Apenas com Menção", "typingEnabled": "Indicador de Digitação", - "placeholderEnabled": "Mensagem Provisória", - "placeholderText": "Texto Provisório", - "groupTriggerMentionOnly": "Apenas Menções em Grupo", - "groupTriggerPrefixes": "Prefixos de Ativação em Grupo", + "placeholderEnabled": "Mensagem de Placeholder", + "placeholderText": "Texto do Placeholder", + "groupTriggerMentionOnly": "Apenas Menção em Grupo", + "groupTriggerPrefixes": "Prefixos de Trigger em Grupo", + "groupTriggerPrefixesPlaceholder": "ex: /, !, ?", + "randomReactionEmoji": "Emoji de Reação Aleatório", + "randomReactionEmojiPlaceholder": "ex: THUMBSUP, HEART, SMILE", "isLark": "Lark (Internacional)", "allowFrom": "Permitir De", "allowFromPlaceholder": "ex: 123456, 789012", "allowOrigins": "Origens Permitidas", "allowOriginsPlaceholder": "ex: https://exemplo.com, http://localhost:5173", - "secretPlaceholder": "Insira o segredo", - "secretHintSet": "Um valor já está definido. Deixe em branco para mantê-lo." + "removeListItem": "Remover {{value}}", + "secretPlaceholder": "Digite o segredo", + "secretHintSet": "Já existe um valor definido. Deixe em branco para mantê-lo inalterado." }, "page": { "notFound": "Canal \"{{name}}\" não é suportado.", "saveSuccess": "Configuração do canal salva.", "saveError": "Falha ao salvar configuração do canal", - "enabled": "habilitado", + "savePrompt": "Esta alteração ainda não foi salva. Salve para gravá-la na configuração do canal.", "docLink": "Documentação", "enableLabel": "Habilitar canal", - "restartRequiredTitle": "Reinicialização do gateway necessária", - "restartRequiredDesc": "A configuração mais recente de {{name}} foi salva. Reinicie o gateway para que ela entre em vigor." + "restartRequiredTitle": "Reinício do gateway necessário", + "restartRequiredDesc": "A configuração mais recente de {{name}} foi salva. Reinicie o gateway para que tenha efeito." }, "form": { "desc": { "token": "Token de acesso do bot usado para conectar à API da plataforma.", "botToken": "Token do bot usado para enviar e receber mensagens.", - "appToken": "Token do app usado para conexões em Socket Mode.", - "appId": "ID único do aplicativo usado para autenticação.", - "appSecret": "Segredo do aplicativo usado para assinatura e autenticação.", + "appToken": "App token usado para conexões em modo Socket.", + "appId": "ID único da aplicação usado para autenticação.", + "appSecret": "Segredo da aplicação usado para assinatura e autenticação.", "verificationToken": "Token de verificação para callbacks de eventos.", "encryptKey": "Chave de criptografia usada para descriptografar payloads de callback.", "baseUrl": "URL base da API da plataforma. O endpoint oficial é usado por padrão.", - "proxy": "Endereço de proxy HTTP para acesso à rede externa.", - "mentionOnly": "Responder apenas quando o bot for explicitamente mencionado em chats de grupo.", + "proxy": "Endereço de proxy HTTP para acesso de rede de saída.", + "mentionOnly": "Responder apenas quando o bot for explicitamente mencionado em chats em grupo.", "typingEnabled": "Exibir status de digitação enquanto o assistente está gerando uma resposta.", - "placeholderEnabled": "Habilitar mensagens provisórias temporárias antes da resposta final ser enviada.", - "groupTriggerMentionOnly": "Em chats de grupo, responder apenas quando o bot for mencionado.", - "groupTriggerPrefixes": "Prefixos personalizados de ativação em grupo, separados por vírgulas.", - "isLark": "Usar domínio internacional Lark (open.larksuite.com) em vez do domínio Feishu (open.feishu.cn).", - "allowFrom": "IDs de usuários ou grupos permitidos, separados por vírgulas.", - "allowOrigins": "Domínios de origem permitidos, separados por vírgulas.", + "placeholderEnabled": "Habilitar mensagens de placeholder temporárias antes da resposta final ser enviada.", + "groupTriggerMentionOnly": "Em chats em grupo, responder apenas quando o bot for mencionado.", + "groupTriggerPrefixes": "Prefixos customizados de trigger para chats em grupo. Adicione itens um a um ou cole vários valores de uma vez.", + "randomReactionEmoji": "PicoClaw adiciona reações de emoji às mensagens dos usuários para confirmar recebimento. Exemplo: \"THUMBSUP\", \"HEART\", \"SMILE\". Deixe vazio para usar o emoji \"Pin\" padrão.", + "isLark": "Usar o domínio internacional do Lark (open.larksuite.com) em vez do domínio do Feishu (open.feishu.cn).", + "allowFrom": "IDs de usuário ou grupo permitidos. Adicione itens um a um ou cole vários valores de uma vez.", + "allowOrigins": "Domínios de origem permitidos. Adicione itens um a um ou cole vários valores de uma vez.", "wsUrl": "URL do serviço WebSocket.", "reconnectInterval": "Intervalo de reconexão após desconexão (segundos).", "bridgeUrl": "URL do serviço de bridge.", - "sessionStorePath": "Caminho local para armazenamento de sessão.", - "useNative": "Usar modo de cliente nativo.", + "sessionStorePath": "Caminho local para armazenamento de sessões.", + "useNative": "Se deve usar modo de cliente nativo.", "host": "Endereço do host do serviço.", "port": "Porta do serviço.", "homeserver": "URL do homeserver Matrix.", @@ -344,28 +428,28 @@ "deviceId": "ID do dispositivo.", "joinOnInvite": "Entrar automaticamente em salas quando convidado.", "clientId": "Client ID usado para autenticação na plataforma.", - "corpId": "Corp ID da empresa.", - "agentId": "Agent ID do aplicativo empresarial.", + "corpId": "Corp ID corporativo.", + "agentId": "Agent ID da aplicação corporativa.", "webhookUrl": "URL completa do webhook.", "webhookHost": "Host de escuta do webhook.", "webhookPort": "Porta de escuta do webhook.", - "webhookPath": "Caminho da rota do webhook.", + "webhookPath": "Caminho de rota do webhook.", "replyTimeout": "Timeout de resposta em segundos.", - "maxSteps": "Número máximo de etapas de processamento.", + "maxSteps": "Número máximo de passos de processamento.", "welcomeMessage": "Conteúdo da mensagem de boas-vindas para novas sessões.", - "allowTokenQuery": "Permitir token em parâmetros de query da URL.", + "allowTokenQuery": "Permitir token nos parâmetros de query da URL.", "pingInterval": "Intervalo de heartbeat da conexão em segundos.", "readTimeout": "Timeout de leitura em segundos.", "writeTimeout": "Timeout de escrita em segundos.", - "maxConnections": "Número máximo de conexões simultâneas.", + "maxConnections": "Número máximo de conexões concorrentes.", "server": "Endereço do servidor IRC.", - "tls": "Habilitar TLS.", + "tls": "Se deve habilitar TLS.", "nick": "Apelido do bot.", - "user": "Nome de usuário IRC.", + "user": "Nome de usuário do IRC.", "realName": "Nome real exibido.", "channels": "Canais IRC para entrar.", - "requestCaps": "Lista de capabilities IRC solicitadas na conexão.", - "maxBase64FileSizeMiB": "Tamanho máximo em MiB para converter arquivos locais em base64 antes do upload. 0 significa ilimitado. Aplica-se apenas a arquivos locais, não uploads por URL.", + "requestCaps": "Lista de capabilities IRC requisitada na conexão.", + "maxBase64FileSizeMiB": "Tamanho máximo em MiB para converter arquivos locais em base64 antes do upload. 0 significa ilimitado. Aplica-se apenas a arquivos locais, não a uploads via URL.", "genericField": "Usado para configurar {{field}}." } }, @@ -377,11 +461,18 @@ "agent": { "load_error": "Falha ao carregar informações de suporte do agente.", "skills": { - "description": "Skills são carregadas do workspace, diretório home global do PicoClaw e diretórios internos.", "empty": "Nenhuma skill disponível no momento.", + "install_success": "{{name}} instalada.", + "install_error": "Falha ao instalar skill.", + "search_placeholder": "Pesquisar por nome, descrição ou registry", + "source_label": "Tipo", + "sort_label": "Ordenar", "import": "Importar Skill", "import_success": "Skill importada.", "import_error": "Falha ao importar skill.", + "import_invalid_type": "Apenas arquivos de skill em Markdown ou ZIP são suportados.", + "import_invalid_size": "O arquivo de skill deve ter 1 MB ou menos.", + "import_constraints": "Importe um arquivo de skill em Markdown ou ZIP de até 1 MB", "view": "Visualizar", "delete": "Excluir", "delete_title": "Excluir Skill?", @@ -390,25 +481,115 @@ "delete_success": "Skill excluída.", "delete_error": "Falha ao excluir skill.", "viewer_title": "Conteúdo da Skill", - "viewer_description": "Leia o conteúdo atual efetivo do SKILL.md aqui.", - "loading_detail": "Carregando conteúdo da skill...", + "viewer_description": "Leia aqui o conteúdo efetivo atual de SKILL.md.", "load_detail_error": "Falha ao carregar conteúdo da skill.", - "path": "Caminho da Skill", - "no_description": "Sem descrição fornecida." + "no_description": "Nenhuma descrição fornecida.", + "no_results": "Nenhuma skill corresponde aos filtros atuais.", + "dropzone_title": "Importar para o Workspace", + "dropzone_description": "Arraste um arquivo de skill aqui ou escolha um do disco.", + "dropzone_label": "Solte um arquivo de skill aqui", + "dropzone_active": "Solte para importar esta skill", + "dropzone_release": "A skill será normalizada e salva no diretório de skills do workspace.", + "marketplace_title": "Descobrir Skills", + "marketplace_description": "Pesquise nos registries de skills e instale skills úteis neste workspace", + "marketplace_search_placeholder": "Pesquise capacidades como github, docker, database...", + "marketplace_search_action": "Pesquisar", + "marketplace_search_status": "Status da Pesquisa", + "marketplace_install_status": "Status da Instalação", + "marketplace_notice_title": "Aviso de Segurança", + "marketplace_notice_body": "Skills do registry são conteúdo de terceiros. Revise o autor, URL da página, instruções e qualquer código ou credencial requerida antes de instalar.", + "marketplace_status_disabled": "Desabilitado. Habilite a ferramenta correspondente na página de Ferramentas primeiro.", + "marketplace_status_enable_hint": "Habilite a ferramenta relacionada na página de Ferramentas primeiro.", + "marketplace_search_error": "Falha ao pesquisar registries.", + "marketplace_loading_results": "Pesquisando skills...", + "marketplace_loading_more": "Carregando mais skills...", + "marketplace_results_title": "{{count}} resultados para “{{query}}”", + "marketplace_results_hint": "Resultados do registry instalam no workspace atual.", + "marketplace_install_action": "Instalar", + "marketplace_installed": "Instalada", + "marketplace_view_installed": "Ver Local", + "marketplace_installed_hint": "Já disponível neste workspace como “{{name}}”.", + "marketplace_empty_results": "Nenhuma skill instalável encontrada para “{{query}}”.", + "marketplace_idle": "Pesquise por uma capacidade para descobrir skills instaláveis nos registries configurados.", + "marketplace_unavailable": "Pesquisa de registries indisponível no momento. Verifique a configuração das ferramentas de Skills.", + "sort": { + "name_asc": "Nome (A-Z)", + "name_desc": "Nome (Z-A)", + "source": "Tipo" + }, + "origin": { + "all": "Todos os Tipos", + "builtin": "Embutida", + "third_party": "Terceiros", + "manual": "Manual" + }, + "summary": { + "total": "Total de Skills" + }, + "detail_tabs": { + "preview": "Visualização", + "raw": "Bruto", + "meta": "Metadados" + }, + "metadata": { + "name": "Nome", + "description": "Descrição", + "registry": "Registry", + "url": "URL", + "version": "Versão Instalada", + "lines": "Quantidade de Linhas", + "characters": "Quantidade de Caracteres" + }, + "marketplace_installDisabled": { + "installing": "Instalando...", + "installed": "Já instalada", + "cannotInstall": "Não é possível instalar: ferramenta relacionada não está habilitada" + } }, "tools": { - "description": "Esta visualização mostra se cada ferramenta do agente está habilitada, desabilitada ou bloqueada por um pré-requisito ausente.", + "search_placeholder": "Pesquisar ferramentas...", + "no_results": "Nenhuma ferramenta corresponde aos seus critérios.", + "filter": { + "all": "Todos os Status", + "enabled": "Habilitada", + "disabled": "Desabilitada", + "blocked": "Bloqueada" + }, "empty": "Nenhuma ferramenta disponível.", - "enable": "Habilitar", - "disable": "Desabilitar", "enable_success": "Ferramenta habilitada.", "disable_success": "Ferramenta desabilitada.", "toggle_error": "Falha ao atualizar estado da ferramenta.", - "config_key": "Controlado por tools.{{key}}", + "library_title": "Biblioteca de Ferramentas", + "library_description": "Navegue e gerencie o conjunto de ferramentas disponíveis para seus agentes de IA.", + "web_search": { + "title": "Pesquisa Web", + "description": "Fornece capacidade de pesquisa web aos agentes para encontrar informações atualizadas do mundo real. Roteia automaticamente para o provedor ativo ideal.", + "unsaved_prompt": "Esta alteração ainda não foi salva. Salve para gravá-la na configuração de Pesquisa Web.", + "global_settings": "Geral", + "providers_config": "Integrações", + "load_error": "Falha ao carregar configuração de pesquisa web.", + "save": "Salvar Alterações", + "open_settings": "Abrir Configurações", + "save_success": "Configurações salvas com sucesso.", + "save_error": "Falha ao salvar configurações.", + "provider": "Provedor Principal", + "provider_description": "Selecione o provedor padrão a ser usado quando a ferramenta de pesquisa web atender a uma requisição.", + "proxy": "Proxy HTTPS", + "proxy_description": "Proxy HTTP/S global opcional para requisições web subjacentes.", + "prefer_native": "Preferir Pesquisa Nativa", + "prefer_native_hint": "Quando habilitado, o modelo pode usar sua capacidade de pesquisa nativa em vez da lista de provedores configurados.", + "provider_hint": "Habilite este provedor e preencha as configurações de conexão necessárias.", + "max_results": "Máx. de Resultados", + "base_url": "URL Base", + "base_url_placeholder": "Sobrescrita opcional do endpoint", + "api_key": "API Key / Token", + "api_key_placeholder": "Digite a API Key, deixe em branco para manter a chave original", + "none": "Indisponível" + }, "status": { - "enabled": "Habilitado", - "disabled": "Desabilitado", - "blocked": "Bloqueado" + "enabled": "Habilitada", + "disabled": "Desabilitada", + "blocked": "Bloqueada" }, "categories": { "automation": "Automação", @@ -421,105 +602,120 @@ "discovery": "Descoberta" }, "reasons": { - "requires_linux": "Esta ferramenta funciona apenas em hosts Linux com os arquivos de dispositivo necessários expostos.", - "requires_skills": "Habilite `tools.skills` antes que esta ferramenta de registro de skills possa ser usada.", - "requires_subagent": "Habilite `tools.subagent` antes que a ferramenta spawn possa delegar trabalho.", - "requires_mcp_discovery": "Habilite `tools.mcp.discovery` antes que as ferramentas de descoberta MCP fiquem disponíveis." + "requires_linux": "Esta ferramenta só funciona em hosts Linux com os arquivos de dispositivo necessários expostos.", + "requires_serial_platform": "Esta ferramenta atualmente suporta hosts Linux, macOS e Windows com portas seriais acessíveis.", + "requires_skills": "Habilite `tools.skills` antes que esta ferramenta de skill-registry possa ser usada.", + "requires_subagent": "Habilite `tools.subagent` antes que a ferramenta de spawn possa delegar trabalho.", + "requires_mcp_discovery": "Habilite `tools.mcp.discovery` antes que as ferramentas de descoberta MCP fiquem disponíveis.", + "requires_web_search_provider": "Configure ao menos um provedor externo de pesquisa web pronto para uso." } } }, "config": { "load_error": "Falha ao carregar configuração. Atualize a página e tente novamente.", - "workspace": "Diretório de Trabalho", + "workspace": "Diretório do Workspace", "workspace_hint": "Diretório base para operações de arquivo do agente.", "restrict_workspace": "Restringir ao Workspace", - "restrict_workspace_hint": "Permitir apenas operações de arquivo dentro do workspace.", - "split_on_marker": "Modo Conversacional", - "split_on_marker_hint": "Dividir mensagens longas em curtas como uma conversa humana real.", + "restrict_workspace_hint": "Permitir operações de arquivo apenas dentro do workspace.", + "split_on_marker": "Modo Tagarela", + "split_on_marker_hint": "Dividir mensagens longas em várias curtas, como em uma conversa real.", "tool_feedback_enabled": "Feedback de Ferramentas", - "tool_feedback_enabled_hint": "Enviar uma prévia curta da chamada de ferramenta no chat atual antes de cada execução.", - "tool_feedback_max_args_length": "Tamanho da Prévia de Argumentos", - "tool_feedback_max_args_length_hint": "Número máximo de caracteres de argumentos mostrados em cada mensagem de feedback. 0 para usar o padrão.", + "tool_feedback_enabled_hint": "Enviar uma breve nota de execução no chat atual antes de cada ferramenta rodar.", + "tool_feedback_separate_messages": "Mensagens de Feedback Separadas", + "tool_feedback_separate_messages_hint": "Manter cada atualização de feedback de ferramenta como uma mensagem própria no chat em vez de reusar uma única mensagem de placeholder/progresso.", + "tool_feedback_max_args_length": "Tamanho do Preview de Args da Ferramenta", + "tool_feedback_max_args_length_hint": "Número máximo de caracteres exibidos em cada preview de argumento da ferramenta. Defina 0 para usar o padrão.", "exec_enabled": "Permitir Comandos", - "exec_enabled_hint": "Habilitar ou desabilitar execução de comandos. Quando desabilitado, nenhuma solicitação de comando será executada.", + "exec_enabled_hint": "Habilita ou desabilita execução de comandos para o app. Quando desabilitado, nenhuma requisição de comando rodará.", "allow_remote": "Permitir Comandos Remotos", - "allow_remote_hint": "Quando habilitado, sessões remotas também podem executar comandos. Quando desabilitado, a execução fica limitada a contextos locais seguros.", + "allow_remote_hint": "Quando habilitado, sessões remotas ou contextos não locais também podem executar comandos. Quando desabilitado, a execução de comandos fica limitada a contextos locais seguros.", "enable_deny_patterns": "Habilitar Lista Negra", - "enable_deny_patterns_hint": "Quando habilitado, bloqueia comandos que correspondam aos padrões perigosos internos e à lista negra personalizada abaixo.", + "enable_deny_patterns_hint": "Quando habilitado, o app bloqueia comandos que correspondam aos seus padrões perigosos embutidos e à lista negra customizada abaixo.", "exec_timeout_seconds": "Timeout de Comando (segundos)", - "exec_timeout_seconds_hint": "Tempo máximo de execução para comandos. 0 para usar o timeout padrão.", + "exec_timeout_seconds_hint": "Tempo máximo de execução para requisições de comando. Defina 0 para usar o timeout padrão.", "custom_deny_patterns": "Lista Negra de Comandos", - "custom_deny_patterns_hint": "Adicione regras extras de bloqueio de comandos, uma expressão regular por linha.", + "custom_deny_patterns_hint": "Adicione regras extras de bloqueio de comando, uma expressão regular por linha. Um comando que casar com qualquer regra aqui será bloqueado.", "custom_allow_patterns": "Lista Branca de Comandos", - "custom_allow_patterns_hint": "Adicione regras extras de permissão de comandos, uma expressão regular por linha. Comandos correspondentes pulam a lista negra, mas outros limites de segurança ainda se aplicam.", + "custom_allow_patterns_hint": "Adicione regras extras de permissão de comando, uma expressão regular por linha. Um comando que casar com qualquer regra aqui pula a verificação da lista negra, mas outros limites de segurança ainda se aplicam.", "custom_patterns_placeholder": "^rm\\s+-rf\\b\n^git\\s+push\\b", "pattern_detector_title": "Ferramenta de Detecção de Padrões", - "pattern_detector_hint": "Insira um comando para testar se ele corresponde a algum padrão da lista negra ou branca.", - "pattern_detector_input_placeholder": "Insira um comando para testar, ex: rm -rf /tmp", + "pattern_detector_hint": "Digite um comando para testar se ele casa com algum padrão da lista negra ou branca.", + "pattern_detector_input_placeholder": "Digite um comando para testar, ex: rm -rf /tmp", "pattern_detector_test_button": "Testar", "pattern_detector_result_allowed": "Permitido (corresponde à lista branca)", "pattern_detector_result_blocked": "Bloqueado (corresponde à lista negra)", - "pattern_detector_result_no_match": "Sem correspondência (usará regras padrão)", + "pattern_detector_result_no_match": "Sem correspondência (usará as regras padrão)", "allow_shell_execution": "Permitir Comandos Agendados", - "allow_shell_execution_hint": "Permitir que tarefas agendadas executem comandos por padrão. Quando desabilitado, é necessário passar command_confirm=true para agendar uma tarefa de comando.", + "allow_shell_execution_hint": "Permitir que tarefas agendadas executem comandos por padrão. Quando desabilitado, usuários precisam passar command_confirm=true para agendar uma tarefa de comando.", "cron_exec_timeout": "Timeout de Comando Agendado (minutos)", - "cron_exec_timeout_hint": "Tempo máximo de execução para comandos agendados. 0 para desabilitar o timeout.", - "max_tokens": "Máximo de Tokens", + "cron_exec_timeout_hint": "Tempo máximo de execução para comandos agendados. Defina 0 para desabilitar o timeout.", + "max_tokens": "Max Tokens", "max_tokens_hint": "Limite superior de tokens por resposta do modelo.", "context_window": "Janela de Contexto", - "context_window_hint": "Capacidade de contexto de entrada do modelo em tokens. Deixe vazio para usar o padrão (4x max tokens).", - "max_tool_iterations": "Máximo de Iterações de Ferramentas", - "max_tool_iterations_hint": "Máximo de loops de chamadas de ferramentas em uma única tarefa.", - "summarize_threshold": "Limite para Resumo de Mensagens", - "summarize_threshold_hint": "Iniciar resumo após esta quantidade de mensagens.", - "summarize_token_percent": "Percentual de Tokens para Resumo", + "context_window_hint": "Capacidade do contexto de entrada do modelo em tokens. Deixe vazio para usar o padrão (4x max tokens).", + "max_tool_iterations": "Máx. de Iterações de Ferramenta", + "max_tool_iterations_hint": "Loops máximos de chamadas de ferramenta em uma única tarefa.", + "summarize_threshold": "Limite para Resumir Mensagens", + "summarize_threshold_hint": "Iniciar resumo após este número de mensagens.", + "summarize_token_percent": "Percentual de Token para Resumir", "summarize_token_percent_hint": "Usado quando o resumo da conversa é acionado.", "session_scope": "Escopo da Sessão", - "session_scope_hint": "Como o contexto do chat é isolado entre pares/canais.", - "session_scope_per_channel_peer": "Por Canal + Usuário", + "session_scope_hint": "Como o contexto do chat é isolado entre peers/canais.", + "session_scope_per_channel_peer": "Por Canal + Peer", "session_scope_per_channel_peer_desc": "Contexto separado para cada usuário em cada canal.", "session_scope_per_channel": "Por Canal", "session_scope_per_channel_desc": "Um contexto compartilhado por canal.", - "session_scope_per_peer": "Por Usuário", - "session_scope_per_peer_desc": "Um contexto por usuário em todos os canais.", + "session_scope_per_peer": "Por Peer", + "session_scope_per_peer_desc": "Um contexto por usuário entre canais.", "session_scope_global": "Global", - "session_scope_global_desc": "Todas as mensagens compartilham um único contexto global.", + "session_scope_global_desc": "Todas as mensagens compartilham um contexto global.", "heartbeat_enabled": "Heartbeat", - "heartbeat_enabled_hint": "Enviar mensagens periódicas de heartbeat.", - "heartbeat_interval": "Intervalo de Heartbeat (minutos)", + "heartbeat_enabled_hint": "Enviar mensagens de heartbeat periódicas.", + "heartbeat_interval": "Intervalo do Heartbeat (minutos)", "heartbeat_interval_hint": "Intervalo em minutos entre sinais de heartbeat.", "devices_enabled": "Habilitar Dispositivos", "devices_enabled_hint": "Habilitar integrações com dispositivos de hardware.", "monitor_usb": "Monitorar USB", - "monitor_usb_hint": "Observar eventos de conexão/desconexão USB quando dispositivos estão habilitados.", + "monitor_usb_hint": "Observar eventos de plug/unplug USB quando dispositivos estiverem habilitados.", "autostart_label": "Iniciar no Login", - "autostart_hint": "Iniciar o PicoClaw Web automaticamente ao fazer login.", + "autostart_hint": "Iniciar o PicoClaw Web automaticamente quando você fizer login.", "autostart_unsupported": "Iniciar no login não é suportado nesta plataforma.", - "autostart_load_error": "Falha ao carregar status de inicialização automática.", + "autostart_load_error": "Falha ao carregar status de iniciar no login.", "server_port": "Porta do Serviço", "server_port_hint": "Porta HTTP usada pelo PicoClaw Web.", - "lan_access": "Habilitar Acesso LAN", + "launcher_section_hint": "Alterações nesta seção entram em vigor após o launcher reiniciar.", + "gateway_restart_hint": "Alterações nesta seção entram em vigor após o gateway reiniciar.", + "dashboard_password": "Senha de Login", + "dashboard_password_hint": "Defina uma nova senha de login.", + "dashboard_password_placeholder": "Pelo menos 8 caracteres", + "dashboard_password_confirm": "Confirmar Nova Senha", + "dashboard_password_confirm_hint": "Digite a nova senha de login novamente.", + "dashboard_password_confirm_placeholder": "Repita a senha", + "dashboard_password_required": "Digite e confirme a nova senha de login.", + "dashboard_password_mismatch": "As senhas de login não coincidem.", + "dashboard_password_min_length": "A senha de login deve ter pelo menos 8 caracteres.", + "lan_access": "Habilitar Acesso pela LAN", "lan_access_hint": "Permitir acesso de outros dispositivos na sua rede local.", "allowed_cidrs": "CIDRs de Rede Permitidos", "allowed_cidrs_hint": "Apenas clientes destes intervalos CIDR podem acessar o serviço. Um por linha ou separados por vírgula. Deixe vazio para permitir todos.", "allowed_cidrs_placeholder": "192.168.1.0/24\n10.0.0.0/8", "sections": { "agent": "Agente", - "runtime": "Execução", - "exec": "Executar Comandos", - "cron": "Tarefas Cron", - "launcher": "Serviço", + "runtime": "Runtime", + "exec": "Execução de Comandos", + "cron": "Tarefas Agendadas", + "launcher": "Launcher", "devices": "Dispositivos" }, - "open_raw": "Config Bruta", - "back_to_visual": "Config Visual", + "open_raw": "Configuração Bruta", + "back_to_visual": "Configuração Visual", "raw_json_title": "Configuração JSON Bruta", - "json_placeholder": "Insira configuração JSON válida...", + "json_placeholder": "Digite uma configuração JSON válida...", "save_success": "Configuração salva com sucesso.", "save_error": "Falha ao salvar configuração.", "reset_confirm_title": "Redefinir Alterações", "reset_confirm_desc": "Tem certeza de que deseja redefinir suas alterações não salvas para o último estado salvo?", - "reset_success": "Alterações redefinidas para o último estado salvo.", + "reset_success": "Alterações foram redefinidas para o último estado salvo.", "invalid_json": "Formato JSON inválido.", "format_success": "JSON formatado com sucesso.", "format_error": "Formato JSON inválido.", @@ -527,8 +723,31 @@ "unsaved_changes": "Você tem alterações não salvas." }, "logs": { + "log_level_error": "Falha ao atualizar nível de log.", "clear": "Limpar logs", "empty": "Aguardando logs..." } + }, + "tour": { + "skip": "Pular tour", + "prev": "Anterior", + "next": "Próximo", + "finish": "Concluir", + "welcome": { + "title": "Bem-vindo ao PicoClaw", + "description": "PicoClaw é uma plataforma poderosa de assistente de IA. Vamos levar alguns segundos para te ajudar a concluir a configuração básica." + }, + "models": { + "title": "Configurar Modelos", + "description": "Clique no menu \"Modelos\" à esquerda para configurar API Keys dos provedores de IA. Apenas modelos configurados podem ser usados no chat." + }, + "gateway": { + "title": "Iniciar Gateway", + "description": "Após configurar modelos, clique no botão \"Iniciar Gateway\" no topo para começar a conversar com a IA." + }, + "docs": { + "title": "Ver Documentação", + "description": "Precisa de mais ajuda? Clique no botão de documentação no canto superior direito para ver guias detalhados e documentação de configuração." + } } }