// Brazilian Portuguese dictionary. Mirror the shape of src/lang/en.ts — // missing keys fall back to English per createI18n's fallbackLocale. const ptBRMessages = { common: { downloadZip: "ZIP", downloadFailed: "Falha no download", save: "Salvar", cancel: "Cancelar", loading: "Carregando...", close: "Fechar", dismiss: "Dispensar", add: "Adicionar", remove: "Remover", yes: "Sim", no: "Não", saving: "Salvando...", saved: "Salvo", noResultsYet: "Ainda não há resultados", noImageYet: "Ainda não há imagem", sendChat: "Iniciar um novo chat", }, sessionTabBar: { newSession: "Nova sessão", activeSessions: "{count} sessão ativa (agente em execução) | {count} sessões ativas (agente em execução)", unreadReplies: "{count} resposta não lida | {count} respostas não lidas", unreadDot: "Nova resposta", origin: { scheduler: "Iniciada pelo agendador", skill: "Iniciada por uma skill", bridge: "Iniciada por um bridge", }, }, chatInput: { placeholder: "Mensagem para Claude…", send: "Enviar", stop: "Parar", runningPlaceholder: "Em execução… pressione Enter para enfileirar", removeBuffered: "Remover mensagem da fila", attachFile: "Anexar arquivo", fileTooLarge: "Arquivo muito grande ({sizeMB} MB). O limite é 30 MB.", unsupportedFileType: "Tipo de arquivo não suportado. Aceitos: imagens, PDF, DOCX, XLSX, PPTX e arquivos de texto.", attachImageFailed: "Falha ao anexar a imagem: {error}", stopFailed: "Falha ao parar a execução: {error}", dropHint: "Solte o arquivo para anexar", tooManyFiles: "Você pode anexar no máximo {max} arquivos por vez.", removeAttachment: "Remover {name}", attachmentFallbackName: "anexo", voice: { start: "Iniciar entrada de voz", stop: "Parar entrada de voz", }, }, cspViolation: { notice: "⚠ Uma visualização tentou carregar {host}, mas a política de segurança de conteúdo bloqueou ({directive}). Para permitir, adicione o host a config/csp.json — somente se você confiar nele.", dismiss: "Dispensar", }, sessionHistoryPanel: { filters: { all: "Todas", unread: "Não lidas", bookmarked: "Favoritas", longRunning: "De longa duração (24h+)", human: "Pessoa", scheduler: "Agendador", skill: "Skill", bridge: "Bridge", }, failedToRefresh: "⚠ Falha ao atualizar: {error}", showingLastKnown: " — exibindo a última lista conhecida.", noSessions: "Ainda não há sessões.", noMatching: "Nenhuma sessão correspondente.", running: "Em execução", noMessages: "(sem mensagens)", openRowAria: "Abrir sessão: {preview}", rowMenuAria: "Ações da sessão", bookmark: "Favoritar", unbookmark: "Remover favorito", delete: "Excluir", deleteConfirm: "Excluir esta sessão?\n\n{preview}\n\nEsta ação não pode ser desfeita.", }, notificationBell: { notifications: "Notificações", activeSection: "Ativas", historySection: "Histórico", noActive: "Sem notificações ativas", noHistory: "Sem atividade recente", clearAll: "Limpar", dismiss: "Dispensar", cancel: "Cancelar", showMore: "Mostrar mais ({count})", showLess: "Mostrar menos", openTarget: "Abrir", expandDetails: "Expandir detalhes", }, pluginDiagnostics: { title: "Problema de configuração do plugin", hostBody: 'O plugin "{plugin}" tentou registrar a chave {label} "{key}", mas ela está reservada para o host. A entrada do plugin foi descartada.', intraBody: 'Os plugins "{first}" e "{second}" registram o mesmo {dimension} "{key}". "{first}" o reivindicou primeiro, portanto o registro de "{second}" é ignorado.', }, shadowedEnv: { title: "O shell está sobrepondo o .env", body: "Definido tanto no shell quanto no .env: {keys}. O valor do shell prevalece, portanto o .env é ignorado. Se você editou o .env, atualize ou remova o valor do shell e reinicie.", }, optionalDeps: { // `title` genérico mantido para compatibilidade com entradas do // histórico persistidas antes da divisão por motivo; as novas // usam `titleNotFound` / `titleNotResponding`. title: "Dependência opcional indisponível", titleNotFound: "{command} não está instalado", titleNotResponding: "{command} não está em execução", notFound: "{command} não encontrado — recursos relacionados foram desativados. Instale {command} e reinicie o MulmoClaude para habilitá-los.", notResponding: "{command} está instalado mas não está em execução — recursos relacionados foram desativados. Inicie {command} e reinicie o MulmoClaude para habilitá-los.", }, billingMigration: { title: "O faturamento passou a ser configurado sob demanda", body: "As coleções incluídas clients, worklog, invoice e profile foram removidas do seu painel, mas seus dados estão seguros e intactos. Peça para configurar o controle de clientes e horas e, em seguida, o faturamento para recriá-las; seus registros existentes reaparecerão.", }, backendOffline: { title: "Não foi possível conectar ao backend", body: "O servidor do MulmoClaude pode não estar em execução. Verifique o servidor de desenvolvimento e tente novamente.", retry: "Tentar novamente", }, pluginErrorBoundary: { title: "O plugin {pkg} travou", subtitle: "O plugin falhou ao renderizar. O erro foi registrado no console.", showDetails: "Mostrar detalhes", hideDetails: "Ocultar detalhes", retry: "Tentar novamente", }, remoteHostOffline: { title: "Host remoto desconectado", body: "Seu telefone não conseguirá enviar para este dispositivo até você reconectar.", reconnect: "Reconectar", }, remoteHost: { title: "Host remoto", online: "Host remoto on-line", offline: "Host remoto off-line", uid: "uid {uid}", signIn: "Entrar com o Google", connecting: "Conectando…", disconnect: "Desconectar", disconnecting: "Desconectando…", noToken: "O login do Google não retornou idToken", connectFailed: "Falha ao conectar", disconnectFailed: "Falha ao desconectar", signInFailed: "Falha ao entrar com o Google", statusFailed: "Falha ao carregar o status", description: "O acesso remoto permite que um dispositivo móvel se conecte às coleções e feeds deste MulmoClaude.", howTo: "No seu telefone, abra {url} e entre com a mesma conta do Google.", customViewHint: "Para uma visualização adaptada ao celular, peça ao Claude para criar uma {keyword} (não uma custom view comum).", qrHint: "Ou escaneie este código QR com a câmera do seu celular.", }, sidebarHeader: { newMessages: "Novas mensagens", home: "Ir para o chat mais recente", toolCallHistory: "Histórico de chamadas de ferramentas", settings: "Configurações", settingsGeminiMissing: "Configurações — Chave da API Gemini ausente", todayJournal: "Resumo de hoje", todayJournalNotFound: "Ainda sem resumo — converse um pouco e o journal será gerado.", todayJournalLoadFailed: "Falha ao carregar o journal (status {status}): {error}", copyMarkdown: "Copiar conversa como Markdown", copiedMarkdown: "Copiado!", }, rightSidebar: { permalink: "Link para a mensagem selecionada", copyPermalink: "Copiar link para a mensagem selecionada", copiedPermalink: "Copiado!", toggleSystemPrompt: "Alternar system prompt", systemPrompt: "System Prompt", availableTools: "Ferramentas disponíveis", toggleToolDescription: "Alternar descrição da ferramenta", toolCallHistory: "Histórico de chamadas de ferramentas", copyHistory: "Copiar histórico de chamadas de ferramentas", copiedHistory: "Copiado!", noToolCalls: "Ainda não há chamadas de ferramentas", arguments: "Argumentos", error: "Erro", result: "Resultado", running: "Executando...", mcpHint: { title: (ctx: { named: (key: "server") => string }) => `Dica de configuração: ${ctx.named("server")}`, requiredKeys: "Chaves obrigatórias", setupGuide: "Abrir guia de configuração", }, }, fileTreePane: { sort: "Ordenar:", sortByName: "Ordenar por nome", name: "Nome", sortByRecent: "Ordenar por data de modificação (mais recentes primeiro)", recent: "Recente", reference: "Referência", // "RO" = Read-Only. Abreviação em inglês mantida para caber como // badge compacto ao lado do rótulo Referência. readOnlyBadge: "RO", showSystemFiles: "Exibir arquivos do sistema", showSystemFilesTitle: "Mostra os diretórios raiz internos do agente (conversations/, feeds/ etc.) além do conteúdo do usuário (data/, artifacts/, config/).", }, fileTree: { dropHint: "Solte arquivos aqui para salvá-los nesta pasta", upload: { progress: "Enviando {done} de {total}…", done: "{count} arquivo(s) salvo(s)", failed: "Não foi possível salvar {count} arquivo(s)", }, workspace: "(workspace)", recentlyChanged: "Alterados recentemente", newFileMenuItem: "Novo arquivo", newFileInputAria: "Nome do novo arquivo", newFilePlaceholder: { wikiPage: "slug-da-página", summary: "nome-do-resumo", document: "nome-do-documento", html: "nome-da-página", story: "nome-da-história", }, newFileError: { empty: "O nome do arquivo não pode ficar vazio.", unsafe: "O nome do arquivo contém caracteres inválidos.", exists: "Já existe um arquivo chamado {filename} aqui.", saveFailed: "Não foi possível criar o arquivo. Tente novamente.", }, }, lockStatusPopup: { sandboxEnabledTooltip: "Sandbox habilitado (Docker)", noSandboxTooltip: "Sem sandbox (Docker não encontrado)", sandboxEnabledLabel: "Sandbox habilitado:", sandboxEnabledBody: "Docker está em execução. O acesso ao sistema de arquivos está isolado.", noSandboxLabel: "Sem sandbox:", noSandboxBodyPrefix: "O Claude pode acessar todos os arquivos da sua máquina. Instale o", noSandboxBodySuffix: "para habilitar o isolamento do sistema de arquivos.", dockerDesktop: "Docker Desktop", hostCredentials: "Credenciais do host anexadas:", credsLoading: "carregando…", sshAgent: "Agente SSH:", forwarded: "encaminhado", notForwarded: "não encaminhado", mountedConfigs: "Configurações montadas:", none: "nenhuma", testIsolation: "Testar isolamento do sandbox:", }, settingsModal: { title: "Configurações", version: "MulmoClaude v{version}", tabs: { gemini: "Chave API do Gemini", tools: "Ferramentas permitidas", mcp: "Servidores MCP", dirs: "Diretórios", refs: "Diretórios de referência", map: "Mapa", photos: "Fotos", google: "Google", model: "Modelo", voice: "Voz", chatIndex: "Índice de chat", journal: "Diário", notifications: "Web Push", skills: "Skills", roles: "Papéis", quit: "Encerrar", }, groups: { llm: "LLM", servers: "Servidores", workspace: "Espaço de trabalho", notifications: "Notificações", plugins: "Plugins", management: "Gerenciamento", server: "Servidor", }, navAriaLabel: "Seções de configurações", googleTab: { description: "Vincule sua conta do Google para que esta máquina possa chamar as APIs do Google (Calendar primeiro). O token de atualização fica salvo apenas nesta máquina e nunca é enviado a nenhum servidor além do Google.", statusLinked: "Vinculada", statusNotLinked: "Não vinculada", statusPending: "Aguardando a conclusão do consentimento no navegador…", connect: "Vincular conta do Google", unlink: "Desvincular", unlinkConfirm: "Desvincular a conta do Google? O token salvo será revogado e excluído desta máquina.", clientSecretAmbiguous: "Vários arquivos client_secret_*.json foram encontrados em ~/.secrets/. Mantenha apenas um para que o token salvo continue pareado com o cliente OAuth correto.", loadError: "Falha ao carregar o estado da vinculação com o Google.", connectError: "Falha ao iniciar o fluxo de autorização do Google.", unlinkError: "Falha ao desvincular a conta do Google.", }, mapTab: { description: "Define a chave da API do Google Maps usada pelo plugin de mapa. A chave fica salva localmente e só é enviada para o Google Maps.", apiKeyLabel: "Chave API do Google Maps", apiKeyPlaceholder: "AIza…", helperText: "Crie ou copie uma chave em {consoleLink}.", requiredApis: "APIs necessárias: Maps JavaScript API, Geocoding API, Places API (New), Directions API.", configured: "Configurada", notConfigured: "Não configurada", clear: "Limpar", loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, photosTab: { description: "Controles de privacidade para fotos recebidas pelo chat ou por um bridge conectado. Os dados de localização EXIF são sensíveis — desmarque para desativar a captura automática.", autoCaptureLabel: "Capturar automaticamente a localização das fotos", autoCaptureHint: "Ativado: cada imagem enviada com GPS no EXIF gera um sidecar de localização em data/locations/. Desativado: nada é capturado automaticamente; o LLM ainda pode extrair EXIF manualmente.", statusOn: "Captura automática ATIVADA", statusOff: "Captura automática DESATIVADA", loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, quitTab: { description: "Encerra o servidor do MulmoClaude em execução nesta máquina. Iniciado pelo ícone, ele continua rodando mesmo se você fechar esta aba — é assim que se encerra sem um terminal.", // Message function form — skips vue-i18n's message compiler so the // literal `@` in `mulmoclaude@latest` is not parsed as a linked-message // reference (the compiler throws, and the whole tab renders as nothing). restartHint: () => "Para iniciar de novo, dê um duplo clique no ícone do MulmoClaude (ou rode `npx mulmoclaude@latest`).", quitLabel: "Encerrar o MulmoClaude", confirmBody: "O servidor para e esta página deixa de funcionar. O que estiver em andamento é interrompido.", confirmLabel: "Encerrar", stopping: "Encerrando…", stoppedTitle: "O MulmoClaude foi encerrado", stoppedBody: "Você pode fechar esta aba. Dê um duplo clique no ícone para iniciar de novo.", error: "Falha ao encerrar o servidor", }, notificationsTab: { description: "Receba uma notificação push nos seus dispositivos registrados quando uma tarefa que você iniciou aqui terminar — útil quando você pergunta algo, se afasta e quer saber assim que a resposta estiver pronta.", enableLabel: "Enviar um Web Push quando uma tarefa terminar", enableHint: "Dispara quando um chat que você iniciou aqui é concluído. Tarefas agendadas e em segundo plano não o acionam.", remoteHostNote: "Requer a conexão RemoteHost (que fornece o login) e pelo menos um dispositivo registrado. Se algum faltar, não faz nada.", macosRemindersLabel: "Criar um lembrete do macOS quando uma tarefa terminar", macosRemindersHint: "Adiciona a tarefa concluída à sua lista padrão de Lembretes. A sincronização do iCloud espelha no seu iPhone, que é quem entrega a notificação.", macosRemindersForcedOff: "Desativado na inicialização por --disable-macos-reminders ou DISABLE_MACOS_REMINDER_NOTIFICATIONS. Remova a flag ou limpe a variável de ambiente e reinicie para controlar por aqui.", statusOn: "Web Push está ATIVADO", statusOff: "Web Push está DESATIVADO", loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, modelTab: { description: "Controla o esforço de raciocínio que o Claude Code usa em cada turno. Deixe sem configurar para usar o padrão do Claude.", effortLabel: "Esforço de raciocínio", effortUnset: "(sem configurar — usar padrão do Claude)", helperText: "Níveis mais altos permitem mais tempo de pensamento mas aumentam latência e uso de tokens.", configured: "Esforço: {level}", notConfigured: "Sem configurar", loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, voiceTab: { description: "Dite mensagens de chat com sua voz. O áudio é transcrito localmente na máquina que executa o MulmoClaude — nada é enviado para nenhum serviço externo.", requirements: "Disponível apenas no macOS. Requer o servidor whisper.cpp — compile-o com yarn build:whisper (veja a seção Local Voice Input no README).", unsupported: "A entrada de voz requer macOS com o servidor whisper.cpp instalado. Não está disponível nesta máquina.", enableLabel: "Ativar entrada de voz", enableHint: "Ao ativar, o modelo de voz (1–3 GB) é baixado uma vez. Em seguida, um botão de microfone aparece na entrada de chat.", modelLabel: "Modelo de voz", downloading: "Baixando modelo… {percent}%", ready: "Modelo pronto", downloadError: "Falha ao baixar o modelo.", retry: "Tentar novamente", loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, chatIndexTab: { description: "Títulos e resumos gerados por IA para o histórico do chat. Sai desativado por padrão — sessões de automação (scheduler / workers do sistema) sempre são ignoradas mesmo quando ativado; sessões humanas pagam apenas uma chamada ao sumarizador ao terminar cada turno.", modeLabel: "Modelo do índice de chat", helperText: "Haiku é mais barato; Sonnet dá títulos mais precisos em sessões longas que mudam de assunto.", mode: { off: "Desativado", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "Indexação DESATIVADA", haiku: "Indexando com Haiku", sonnet: "Indexando com Sonnet", }, loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, journalTab: { description: "Diário diário automatizado — resume sessões recentes de chat em journal/*.md e extrai notas de memória duradoura. Sai desativado por padrão. Sessões de automação (scheduler / workers do sistema) são sempre excluídas, independentemente desta configuração.", modeLabel: "Modelo do diário", helperText: "Haiku é mais barato; Sonnet produz resumos diários / por tópico mais ricos. A passagem horária só é executada quando isto está ativado.", mode: { off: "Desativado", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "Diário DESATIVADO", haiku: "Diário em execução com Haiku", sonnet: "Diário em execução com Sonnet", }, loadError: "Falha ao carregar as configurações", saveError: "Falha ao salvar", }, // Slots `` — os nomes `envKey` / `envFile` renderizam como // `` inline no SettingsModal.vue, então os literais de // variável e nome de arquivo permanecem não traduzidos. geminiRequired: "A geração de imagens requer {envKey}. Adicione-o a {envFile} e reinicie o app.", geminiAskButton: "Perguntar ao Claude", geminiAskMessage: "Qual é o papel da chave API do Gemini neste app?", toolNamesLabel: "Nomes de ferramentas", invalidToolNamesPrefix: "Estes parecem não padrão (prefixo esperado", invalidToolNamesSuffix: "):", mcpToolsError: "⚠ Não foi possível obter o status das ferramentas MCP: {error}. Exibindo todas as ferramentas independentemente de estarem habilitadas.", changesHint: "As alterações se aplicam na próxima mensagem. Não é preciso reiniciar.", cannotSaveTooltip: "Não é possível salvar até as configurações carregarem com sucesso", saving: "Salvando…", loadingLabel: "Carregando…", unsavedMarker: "●", unsavedToolsConfirm: "Allowed Tools tem alterações não salvas. Fechar mesmo assim?", unsavedMcpDraftConfirm: "Há um rascunho de servidor MCP aberto. Fechar mesmo assim?", mcpSaveFailed: "Não foi possível salvar as alterações dos servidores MCP.", }, canvasViewToggle: { stackViewTooltip: "Visão em pilha · clique para alternar para visão única", singleViewTooltip: "Visão única · clique para alternar para visão em pilha", switchToSingle: "Alternar para visão única", switchToStack: "Alternar para visão em pilha", }, sessionHistoryToggle: { showTooltip: "Mostrar o painel de histórico de sessões à esquerda", hideTooltip: "Ocultar o painel de histórico de sessões", show: "Mostrar histórico de sessões", hide: "Ocultar histórico de sessões", }, sessionHistoryExpand: { expandTooltip: "Expandir o painel de histórico de sessões para largura total", collapseTooltip: "Recolher o painel de histórico de sessões", expand: "Expandir histórico de sessões", collapse: "Recolher histórico de sessões", }, settingsWorkspaceDirs: { explanation: "Diretórios personalizados para organizar arquivos em {dataDir} e {artifactsDir}. O Claude os usa para decidir onde salvar arquivos.", noEntries: "Nenhum diretório personalizado configurado.", addDirTitle: "Adicionar diretório", pathPlaceholder: "data/clientes ou artifacts/relatorios", descPlaceholder: "Descrição (o que vai nesta pasta)", errPathRequired: "Caminho é obrigatório", errMustStartWith: "Deve começar com data/ ou artifacts/", errAlreadyExists: "Já existe", }, settingsReferenceDirs: { explanation: "Diretórios externos que o Claude pode ler, mas não modificar. No modo Docker, são montados como somente leitura. Úteis para referenciar vaults do Obsidian, código de projetos ou pastas de documentos.", noEntries: "Nenhum diretório de referência configurado.", addDirTitle: "Adicionar diretório de referência", pathPlaceholder: "/Users/eu/ObsidianVault ou ~/Documentos/notas", labelPlaceholder: "Rótulo (opcional — padrão é o nome da pasta)", readOnlyBadge: "somente leitura", errPathRequired: "Caminho é obrigatório", errMustBeAbsolute: "Deve ser um caminho absoluto ou começar com ~/", errAlreadyExists: "Já existe", errLabelConflict: 'Rótulo "{label}" já existe', }, dashboard: { empty: "Ainda não há coleções favoritas.", emptyHint: "Fixe uma coleção (★) para vê-la aqui.", viewTable: "Tabela", viewCalendar: "Calendário", viewKanban: "Kanban", viewPickerLabel: "Escolher visualização", openFull: "Clique duplo para abrir a visualização completa", dragHint: "Arraste para reordenar", resizeHint: "Arraste para redimensionar a altura", }, pluginLauncher: { chat: { label: "Chat" }, dashboard: { label: "Painel" }, automations: { label: "Ações" }, wiki: { label: "Wiki" }, collections: { label: "Coleções" }, feeds: { label: "Feeds" }, accounting: { label: "Contabilidade" }, files: { label: "Arquivos" }, }, shortcuts: { pin: "Fixar no iniciador", unpin: "Desafixar do iniciador", zoneAriaLabel: "Atalhos fixados", reorder: { open: "Reordenar atalhos", title: "Reordenar", moveUp: "Mover para cima", moveDown: "Mover para baixo", }, }, fileContentHeader: { showRendered: "Mostrar Markdown renderizado", showRaw: "Mostrar código-fonte", rendered: "Renderizado", raw: "Fonte", closeFile: "Fechar arquivo", revealInOs: "Mostrar na pasta", revealInOsFailed: "Falha ao mostrar na pasta", }, fileContentRenderer: { download: "ZIP", downloadZip: "Baixar como zip autônomo (recursos incluídos)", downloadError: "Falha no download", selectFile: "Selecione um arquivo", htmlPreview: "Pré-visualização HTML", pdfPreview: "Pré-visualização PDF", parseError: "erro de análise", editJson: "Editar JSON", jsonEditorLabel: "Editor JSON", invalidJson: "JSON inválido", undo: "Desfazer", redo: "Refazer", editMarp: "Editar código do slide", marpEditorLabel: "Código do slide Marp", openInOs: "Abrir no SO", openingInOs: "Abrindo…", openInOsFailed: "Falha ao abrir no SO", }, filesView: { chatPlaceholder: "Pergunte sobre este arquivo…", }, systemFiles: { schemaLabel: "Esquema", showDetails: "Mostrar detalhes", hideDetails: "Ocultar detalhes", editPolicy: { "agent-managed-but-hand-editable": "Gerenciado pelo agente (edição manual permitida)", "user-editable": "Editável pelo usuário", "agent-managed": "Gerenciado pelo agente", "fragile-format": "Formato frágil", ephemeral: "Efêmero", }, mcp: { title: "Servidores MCP", summary: "Servidores externos do Model Context Protocol conectados ao agente. Adicione servidores HTTP ou stdio para expandir as ferramentas.", }, settings: { title: "Configurações do app", summary: "Preferências de comportamento editáveis — chave da API Gemini, ferramentas permitidas, configuração do sandbox etc.", }, schedulerTasks: { title: "Tarefas do agendador", summary: "Automações recorrentes do agente que disparam em horário definido. Gerenciadas pela UI Automations; este arquivo é a fonte em disco.", }, schedulerOverrides: { title: "Sobrescritas do agendador", summary: "Sobrescritas por tarefa de horário / intervalo aplicadas sobre o agendamento do sistema. O agente edita quando você pede para mudar o horário de uma tarefa.", }, schedulerItems: { title: "Fila de itens do agendador", summary: "Invocações agendadas prontas para disparar. Gerenciado pelo agente; não edite manualmente sem entender cada campo.", }, wikiIndex: { title: "Índice da wiki", summary: "Índice autogerado de todas as páginas da wiki. Atualizado a cada edição — não edite manualmente (suas alterações serão sobrescritas).", }, wikiLog: { title: "Log de edição da wiki", summary: "Log de atividade de criação e edição de páginas. Gerenciado pelo agente e somente acréscimos — útil como feed de mudanças recentes.", }, wikiSummary: { title: "Resumo da wiki", summary: "Visão geral autogerada da wiki — clusters de tópicos, contagem de páginas, atividade recente. Atualizado pelo agente.", }, wikiSchema: { title: "Esquema da wiki", summary: "Especificação de formato que o agente lê para manter as páginas da wiki consistentes. Frágil — espera uma estrutura específica; prefira edições via agente.", }, memory: { title: "Memória", summary: "Fatos destilados sobre você, sempre carregados como contexto em novas conversas. O extrator do journal adiciona automaticamente; você também pode editar manualmente.", }, summariesIndex: { title: "Índice de resumos", summary: "Índice navegável com links para os resumos diários e por tópico gerados pelo journal. Gerenciado pelo agente; atualizado a cada execução do journal.", }, rolesJson: { title: "Definição da role (JSON)", summary: "Configuração da role — escolha de modelo, servidores MCP, plugins permitidos, sugestões de query. Editável, sem reinício.", }, rolesMd: { title: "Descrição da role (Markdown)", summary: "Persona e system prompt da role, carregada como contexto quando esta role está ativa. Editável; mudanças aplicam na próxima mensagem.", }, journalDaily: { title: "Resumo diário do journal", summary: "Retrospectiva autogerada da sua atividade em um dia, destilada pelo journal a partir das sessões de chat.", }, journalTopic: { title: "Journal por tópico", summary: "Notas de longo prazo sobre um tópico específico, acumuladas e revisadas conforme você continua falando dele. Gerenciado pelo agente.", }, }, settingsMcpTab: { explanation: "Adicione servidores MCP externos. Servidores HTTP funcionam em todos os modos. Servidores Stdio usam o {npx} / {node} / {tsx} da imagem do sandbox; quando o Docker está habilitado, os caminhos devem ficar dentro do workspace.", localhostRewrite: "No modo Docker, {localhost} é reescrito para {hostDockerInternal}.", noServers: "Ainda não há servidores MCP configurados.", enabled: "habilitado", urlLabel: "URL:", commandLabel: "Comando:", dockerStdioUnsupported: "⚠ Não será executado enquanto o sandbox do Docker estiver ativado.", dockerStdioHostExecActive: "⚠ Executa no host: este servidor sai do sandbox do Docker.", dockerStdioHostExecOptIn: "Executar no host mesmo assim (avançado). Este servidor é executado fora do sandbox do Docker por meio de um gateway HTTP local e pode acessar sua máquina.", learnMore: "Saiba mais", addServerButton: "+ Adicionar servidor MCP", nameLabel: "Nome", namePlaceholder: "meu-servidor", typeHttp: "HTTP", typeStdio: "Stdio (comando)", urlFieldLabel: "URL", urlPlaceholder: "https://example.com/mcp", commandFieldLabel: "Comando", argsLabel: "Argumentos (um por linha)", // Forma de função de mensagem — ignora o compilador de mensagens do // vue-i18n para que o `@` literal não seja interpretado como // referência a mensagem vinculada. argsPlaceholder: () => "-y\n@modelcontextprotocol/server-filesystem\n/workspace/path", errNoName: "Informe um Nome, ou forneça uma URL / argumentos dos quais possamos derivá-lo.", errBadName: "O nome deve começar com letra minúscula e conter apenas [a-z0-9_-].", errIdExists: 'O id de servidor "{id}" já existe.', errBadHttpUrl: "A URL HTTP deve começar com http:// ou https://", pendingEntryWarning: "Conclua ou cancele primeiro a entrada de servidor MCP pendente.", customHeading: "Servidores personalizados", catalog: { heading: "Servidores MCP pré-configurados", audience: { general: "🟢 Geral", developer: "🔵 Desenvolvedor" }, risk: { low: "baixo", medium: "médio", high: "alto" }, upstream: "📦 Origem", setupGuide: "📚 Configuração", entry: { memory: { displayName: "Memória", description: "Permite que o Claude lembre o contexto entre sessões.", }, sequentialThinking: { displayName: "Pensamento sequencial", description: "Ajuda o Claude a resolver problemas complexos passo a passo.", }, context7: { displayName: "Context7 (documentação de bibliotecas)", description: "Documentação atualizada de bibliotecas populares — supera o corte de treinamento do modelo.", }, deepwiki: { displayName: "DeepWiki (wiki de repos do GitHub)", description: "Pergunte sobre qualquer repositório do GitHub e receba uma resposta estruturada estilo wiki.", }, notion: { displayName: "Notion", description: "Leia e escreva no seu workspace do Notion — páginas, bancos de dados e busca.", field: { apiKey: { label: "Token de integração do Notion", help: "Crie uma integração no Notion e copie o Internal Integration Secret. Clique em 🔑 para abrir a página de integrações.", }, }, }, slack: { displayName: "Slack", description: "Liste canais, envie mensagens e busque o histórico do seu workspace do Slack.", field: { botToken: { label: "Token do bot", help: "App do Slack → OAuth & Permissions → Bot User OAuth Token. Começa com xoxb-.", }, teamId: { label: "ID do team / workspace", help: "Execute team.info ou veja a URL do workspace — algo como T01ABC23DEF.", }, }, }, googleMaps: { displayName: "Google Maps", description: "Buscar lugares, obter rotas e consultar detalhes de localização.", field: { apiKey: { label: "Chave de API do Google Maps", help: "Google Cloud Console → APIs & Services → Credentials → Criar chave de API. Habilite Places + Directions.", }, }, }, appleNative: { displayName: "Apps nativos da Apple (macOS)", description: "Lê e escreve em Lembretes, Calendário, Notas, Mail e Mapas via AppleScript. Apenas macOS — sem credenciais.", }, gmail: { displayName: "Gmail", description: "Lê, envia e etiqueta seu Gmail. Usa um cliente OAuth do Google criado por você no seu próprio projeto do Google Cloud (sem verificação de app).", field: { credentials: { label: "Caminho para credentials.json", help: "Google Cloud Console → APIs & Services → Credentials → ID do cliente OAuth (Desktop app). Baixe credentials.json e cole o caminho absoluto.", }, }, }, googleCalendar: { displayName: "Google Agenda", description: "Lê e cria eventos no Google Agenda. Mesmo padrão BYO credentials.json do Gmail.", field: { credentials: { label: "Caminho para credentials.json", help: "Reutilize o mesmo cliente OAuth do Google Cloud usado no Gmail, ou crie um separado para o Calendar.", }, }, }, googleDrive: { displayName: "Google Drive", description: "Pesquisa e lê arquivos do Google Drive. BYO credenciais OAuth do Google — o token é armazenado localmente ao lado do arquivo.", field: { credentials: { label: "Caminho para credentials.json", help: "Google Cloud Console → APIs & Services → Credentials → ID do cliente OAuth (Desktop app). Habilite a API do Google Drive no mesmo projeto.", }, }, }, github: { displayName: "GitHub", description: "Lê repos, issues, PRs e executa buscas com um Personal Access Token. Limite o escopo — permissões de escrita (`repo`) deixam o agente fazer push em qualquer repo acessível.", field: { token: { label: "Personal Access Token", help: "GitHub → Settings → Developer settings → Personal access tokens. Prefira fine-grained tokens limitados aos repos onde o agente deve atuar.", }, }, }, linear: { displayName: "Linear", description: "Lê e atualiza issues, projetos e ciclos do Linear com uma chave de API pessoal.", field: { apiKey: { label: "Chave de API do Linear", help: "Linear → Settings → API → Personal API keys. Clique em 🔑 para abrir a página e em Create key.", }, }, }, weatherOpenMeteo: { displayName: "Clima (Open-Meteo)", description: "Previsão do tempo gratuita e condições atuais no mundo todo — sem chave de API.", }, spotify: { displayName: "Spotify", description: "Pesquisa faixas, gerencia playlists e controla a reprodução. BYO app de desenvolvedor do Spotify — apenas Client ID (fluxo PKCE, sem client secret).", field: { clientId: { label: "Client ID", help: "Spotify Developer Dashboard → Create app, defina a Redirect URI como http://127.0.0.1:8888/callback, copie o Client ID. Depois execute uma vez no terminal `SPOTIFY_CLIENT_ID= npx spotify-mcp@latest auth` para fazer login (refresh token fica em cache em ~/.spotify-mcp/tokens.json).", }, }, }, youtubeTranscript: { displayName: "Transcrição do YouTube", description: "Obtém as legendas de qualquer vídeo público do YouTube pela URL. Sem credenciais.", }, }, config: { howToGet: "Como obter", install: "Instalar", errMissingRequired: "Campos obrigatórios faltando: {fields}", requiredMarker: "*", requiredAria: "obrigatório", }, }, }, pluginScheduler: { previewIcon: "📅", previewAutomations: "{count} automação | {count} automações", previewMore: "+ {count} mais…", }, pluginSchedulerTasks: { recommendedFrequencies: "Frequências recomendadas", tableTaskType: "Tipo de tarefa", tableSuggestedSchedule: "Agendamento sugerido", noTasks: "Nenhuma tarefa agendada", runNow: "Executar agora", enable: "Habilitar", disable: "Desabilitar", delete: "Excluir", nextRun: "Próxima: {time}", originSystem: "Sistema", originUser: "Usuário", originSkill: "Skill", runFailed: "Falha na execução: {error}", toggleFailed: "Falha ao alternar: {error}", deleteFailed: "Falha ao excluir: {error}", detailsToggle: "Mostrar detalhes", promptLabel: "Prompt", roleLabel: "Função", confirmDelete: "Excluir a tarefa « {name} »? Esta ação não pode ser desfeita.", hintNewsRss: "Busca de notícias / RSS", hintJournal: "Passagem diária do diário", hintWiki: "Manutenção do wiki", hintMemory: "Extração de memória", hintCalendar: "Sincronização de calendário / contatos", }, pluginCanvas: { undo: "Desfazer", redo: "Refazer", clear: "Limpar", styleLabel: "Estilo:", stylePromptWithPath: "Transforme a imagem em `{path}` em uma imagem no estilo {style}.", stylePromptNoPath: "Transforme meu desenho na tela em uma imagem no estilo {style}.", saveFailed: "Não salvo", }, pluginWiki: { backToIndex: "Voltar ao índice", pdf: "PDF", pdfFailed: "⚠ Falha no PDF", tabIndex: "Índice", tabLog: "Log", tabLint: "Lint", tabGraph: "Grafo", graphEmpty: "Ainda não há links para exibir no grafo.", linkedReferences: "Referências vinculadas", empty: "O wiki está vazio. Peça ao Wiki Manager para ingerir uma fonte.", previewMore: "+ {count} mais…", chatPlaceholder: "Pergunte sobre esta página…", emptyPage: 'A página "{title}" ainda não existe.', emptyContent: 'A página "{title}" existe, mas não tem conteúdo.', createPage: "Solicitar a criação desta página wiki", updatePage: "Solicitar a atualização desta página wiki", tagFilterAll: "Todas", noMatches: "Nenhuma página com a tag #{tag}", lintChat: "Revisar meu wiki", taskCountMismatch: "A fonte do wiki e a saída renderizada divergem no número de tarefas. A alternância foi recusada para evitar corromper o arquivo.", metadataCreated: "Criado", metadataUpdated: "Atualizado", metadataEditor: "Editor", pageEditHeader: "Edição do wiki", snapshotExpired: "Snapshot expirado — exibindo a página atual", snapshotLoadError: "Não foi possível carregar o snapshot — a página pode ainda existir. Tente atualizar.", pageDeleted: "Página excluída", history: { tabContent: "Conteúdo", tabHistory: "Histórico", empty: "Ainda sem histórico — edite esta página e a primeira versão aparecerá aqui.", loading: "Carregando histórico…", backToList: "Voltar ao histórico", restoreButton: "Restaurar esta versão", restoreConfirmTitle: "Restaurar esta versão?", restoreConfirmBody: "Restaurar a página para a versão de {ts} por {editor}. A página atual será substituída. O histórico existente é preservado.", restoreConfirmAction: "Restaurar", restoreConfirmCancel: "Cancelar", restoreSuccessToast: "Página restaurada.", restoreFailureBanner: "Falha ao restaurar: {error}", compareCurrent: "Comparar com a página atual", comparePrevious: "Comparar com a versão anterior", diffNoPrevious: "Não há versão anterior para comparar.", diffNoChanges: "Sem diferenças de conteúdo entre esta versão e o objeto de comparação.", editorBadgeUser: "Usuário", editorBadgeLLM: "LLM", editorBadgeSystem: "Sistema", hiddenLines: "{count} linhas inalteradas ocultas", expandHidden: "Mostrar", }, }, pluginPresentForm: { fallbackTitle: "Formulário", fieldCount: "{count} campo | {count} campos", submitted: "Enviado", errorSummary: "Por favor, corrija os seguintes erros", requiredMarker: "*", selectOption: "Selecione uma opção", charactersCount: "{current} / {max} caracteres", charactersCountNoMax: "{current} caracteres", submit: "Enviar", progress: "{filled} de {total} campos obrigatórios preenchidos", }, pluginPresentSvg: { saveAsPng: "Baixar como PNG", png: "PNG", saveAsPdf: "Salvar como PDF (abre o diálogo de impressão)", pdf: "PDF", untitled: "Desenho SVG", editSource: "Editar fonte SVG", cancel: "Cancelar", applyChanges: "Aplicar alterações", saving: "Salvando...", saveError: "⚠ Falha ao salvar: {error}", exportError: "⚠ Falha ao exportar: {error}", loadingSource: "Carregando fonte…", sourceError: "Falha ao carregar a fonte: {error}", }, photoLocations: { title: "Localizações das fotos", summary: "{total} capturadas · {withGps} com GPS", mapHint: 'Peça ao Claude "mostre no mapa" para plotá-las com o plugin do Google Map.', loading: "Carregando…", empty: "Nenhuma localização capturada ainda. Envie uma foto com tag GPS pelo chat ou por um bridge conectado para começar.", noGps: "Sem dados GPS", }, pluginManageSkills: { deleteProjectSkill: "Excluir esta skill de projeto", unstarPresetSkill: "Remover favorito deste preset — volta ao catálogo", heading: "Skills", previewCount: "{count} skill | {count} skills", previewMore: "+{count} mais", subheading: ({ named }: { named: (key: string) => unknown }) => `${named("count")} disponíveis · clique para visualizar · "Run" invoca como /`, emptyWithPath: "Nenhuma skill encontrada. Adicione pastas de skills em {path}.", emptySkillPath: "~/.claude/skills/", selectHint: "Selecione uma skill à esquerda para ver seu SKILL.md.", loading: "Carregando…", fieldDescription: "Descrição", fieldBody: "Corpo (Markdown)", emptyBody: "(corpo vazio)", btnEdit: "Editar", btnDelete: "Excluir", btnUnstar: "Remover favorito", errListFailed: "Falha ao carregar skills: {error}", errDetailFailed: "Falha ao carregar a skill: {error}", errSaveFailed: "Falha ao salvar: {error}", errDeleteFailed: "Falha ao excluir", confirmDelete: 'Excluir a skill "{name}"? Isso remove ~/mulmoclaude/.claude/skills/{name}/SKILL.md.', confirmUnstar: 'Mover "{name}" de volta ao catálogo? Ela deixará de ser carregada no prompt, mas a cópia do catálogo permanece — você pode favoritá-la novamente quando quiser.', sectionActive: "Ativas", sectionCatalog: "Catálogo", sectionLegendActive: "Skills que o Claude pode usar agora. O Claude as usa automaticamente no fluxo da conversa, ou você pode invocar uma digitando seu nome. {system} Sistema (mc- inclusa) / {project} Projeto (editável, somente neste workspace) / {user} Usuário (skills em ~/.claude/skills/).", sectionLegendCatalog: "Catálogo: skills que passam a ser Ativas ao marcar com {star}. Remover {star} de Ativas devolve a skill ao Catálogo — o Claude deixa de usá-la (a skill não é excluída).", catalogEmpty: "Nenhuma skill de preset disponível.", catalogPresetHeading: "Presets", catalogStar: "Favoritar", catalogStarred: "Favoritada", sourceUserTitle: "Skill do usuário (~/.claude/skills/, disponível em todos os workspaces)", sourceSystemTitle: "Skill de sistema (inclusa, prefixo mc- — somente leitura, sobrescrita pelo launcher)", sourceProjectTitle: "Skill do projeto (.claude/skills/ do workspace, apenas este workspace)", sourcePresetTitle: "Catálogo de presets — clique em Favoritar para ativar neste workspace", errCatalogListFailed: "Falha ao carregar o catálogo: {error}", errCatalogStarFailed: "Falha ao favoritar a skill: {error}", errCatalogPreviewFailed: "Falha ao carregar a pré-visualização da skill: {error}", catalogAddRepo: "Adicionar repositório de skills", catalogAddRepoTitle: "Adicionar um repositório de skills", catalogRepoUrlLabel: "URL do GitHub", catalogRepoUrlPlaceholder: "https://github.com/owner/repo", catalogRepoSubpathLabel: "Subcaminho (opcional)", catalogRepoSubpathPlaceholder: "skills", catalogAddRepoSubmit: "Instalar", catalogAddRepoSuggestions: "Repositórios sugeridos", catalogUninstallRepo: "Desinstalar repositório", catalogUpdateRepo: "Atualizar repositório (rebuscar o mais recente)", catalogRepoOpenLink: "Abrir o repositório no GitHub (nova aba)", catalogUninstallConfirm: "Desinstalar este repositório? As skills que você já marcou com estrela permanecem na sua lista ativa.", catalogRepoInstalling: "Instalando…", catalogRepoEmpty: "Nenhuma skill encontrada neste repositório.", sourceExternalTitle: "Skill externa (instalada de um repositório do GitHub — clique na estrela para ativar)", errCatalogRepoListFailed: "Falha ao carregar os repositórios instalados: {error}", errCatalogRepoInstallFailed: "Falha ao instalar o repositório: {error}", errCatalogRepoUninstallFailed: "Falha ao desinstalar o repositório: {error}", errCatalogRepoInvalidUrl: "Informe uma URL de repositório do GitHub.", }, pluginManageRoles: { heading: "Papéis personalizados", roleCount: "{count} papel | {count} papéis", addButton: "+ Adicionar", createPanel: "Criar novo papel", fieldId: "ID", fieldName: "Nome", fieldIcon: "Ícone", fieldPrompt: "Prompt", fieldPlugins: "Plugins", fieldStarterQueries: "Consultas iniciais", onePerLine: "(uma por linha)", helpLink: "?", idFormatted: "({id})", missingEnv: "({env} ausente)", requiresEnv: "Requer {env} no .env", collapse: "Recolher", expand: "Expandir", idPlaceholder: "id-unico", creating: "Criando…", create: "Criar", updating: "Atualizando…", update: "Atualizar", cancel: "Cancelar", delete: "Excluir", emptyHint: 'Ainda não há papéis personalizados. Clique em "+ Adicionar" ou peça ao Claude para criar um.', errIdRequired: "O ID é obrigatório.", errIdInvalid: "O ID pode conter apenas letras, números, '-' e '_'.", errNameRequired: "O nome é obrigatório.", errIdDuplicate: "Já existe um papel com ID '{id}'.", errCreateFailed: "Falha ao criar", errSaveFailed: "Falha ao salvar", errDeleteFailed: "Falha ao excluir", errNetworkError: "Erro de rede", errServerError: "Erro do servidor: {status}", errRefreshFailed: "Salvo, mas não foi possível atualizar a lista.", confirmDelete: "Excluir o papel « {name} »? Esta ação não pode ser desfeita.", }, pluginUiImage: { promptLabel: "{label}:", }, markdownMermaid: { loadFailed: "⚠ Falha ao carregar o Mermaid: {error}", renderFailed: "⚠ Falha ao renderizar o Mermaid: {error}", }, pluginTextResponse: { pdf: "PDF", pdfFailed: "⚠ Falha no PDF", editContent: "Editar conteúdo de texto", applyChanges: "Aplicar alterações", copyLabel: "Copiar", speakerSystem: "Sistema", speakerUser: "Você", speakerAssistant: "Assistente", copiedLabel: "Copiado!", cancel: "Cancelar", seededByPlugin: "de {pkg}", seededByPluginTooltip: "Esta mensagem foi gerada pelo plugin {pkg}, não foi enviada por você.", truncatedForRender: "Esta mensagem é excepcionalmente longa ({total} caracteres no total). Apenas a primeira parte é renderizada — {omitted} caracteres ocultos para manter a aba responsiva. Use Copiar para obter o texto completo.", }, pluginSkill: { noDescription: "(sem descrição)", }, pluginSpreadsheet: { previewUntitled: "Planilha", previewSheets: "{count} aba | {count} abas", untitled: "Planilha", excel: "Excel", valuePlaceholder: "Valor", valueOrFormulaPlaceholder: "Valor ou Fórmula (ex.: 100 ou SUM(B2:B11))", formatPlaceholder: "Formato (ex.: $#,##0.00)", loading: "Carregando planilha...", noData: "Nenhum dado de planilha disponível", editData: "Editar dados da planilha", applyChanges: "Aplicar alterações", dataMustBeArray: "Os dados devem ser uma matriz de planilhas", loadFailed: "Falha ao carregar a planilha: {error}", invalidJsonAlert: "Formato JSON inválido: {error}", unknownError: "Erro desconhecido", update: "Atualizar", stringType: "Texto", formulaType: "Fórmula", }, app: { startConversation: "Iniciar uma conversa", thinking: "Pensando…", }, suggestionsPanel: { suggestions: "Sugestões", skills: "Habilidades", tooltip: "Sugestões e habilidades", emptySuggestions: "Sem sugestões.", emptySkills: "Nenhuma habilidade instalada.", skillsError: "Falha ao carregar habilidades: {error}", sendEditHint: "clique para enviar · shift+clique para editar", }, settingsToolsTab: { // Renderizado via com slots nomeados `allowedTools` e // `claudeMcp` para que as tags `` inline mantenham seu estilo // enquanto o texto é traduzível. explanation: "Nomes adicionais de ferramentas a serem passados ao Claude via {allowedTools}. Um por linha. Útil para servidores MCP integrados ao Claude Code como Gmail / Google Calendar após autenticar via {claudeMcp}.", connectorsSectionTitle: "Conectores conectados", connectorsEmpty: "Nenhum conector encontrado.", connectorConnected: "Conectado", connectorDisconnected: "Não conectado", connectorsGuide: "Conectores como Slack e Gmail permitem que o Claude acesse suas contas. Adicione ou remova conectores pelo Claude Desktop ou configure-os {configLink}. (Abre claude.ai)", connectorsConfigLinkText: "aqui", }, confirmModal: { defaultTitle: "Confirmar", defaultConfirm: "Confirmar", defaultCancel: "Cancelar", }, }; export default ptBRMessages;