diff --git a/static/i18n.js b/static/i18n.js index 2972fe43..5a56106a 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -3959,6 +3959,641 @@ const LOCALES = { composer_disabled_empty: '\u8acb\u8f38\u5165\u8a0a\u606f\u5f8c\u50b3\u9001', }, + + pt: { + _lang: 'pt', + _label: 'Português', + _speech: 'pt-BR', + // boot.js + cancelling: 'Cancelando…', + cancel_failed: 'Falha ao cancelar: ', + mic_denied: 'Acesso ao microfone negado. Verifique as permissões do navegador.', + mic_no_speech: 'Nenhuma fala detectada. Tente novamente.', + mic_network: 'Reconhecimento de fala indisponível.', + mic_error: 'Erro no input de voz: ', + session_imported: 'Sessão importada', + import_failed: 'Falha na importação: ', + import_invalid_json: 'JSON inválido', + image_pasted: 'Imagem colada: ', + // messages.js + edit_message: 'Editar mensagem', + regenerate: 'Regenerar resposta', + copy: 'Copiar', + copied: 'Copiado!', + copy_failed: 'Falha ao copiar', + you: 'Você', + thinking: 'Pensando', + expand_all: 'Expandir tudo', + collapse_all: 'Recolher tudo', + edit_failed: 'Falha ao editar: ', + regen_failed: 'Falha ao regenerar: ', + reconnect_active: 'Uma resposta ainda está sendo gerada. Recarregar quando estiver pronto?', + reconnect_finished: 'Uma resposta estava em andamento quando você saiu. As mensagens podem ter atualizado.', + // approval card + approval_heading: 'Aprovação necessária', + approval_desc_prefix: 'Comando perigoso detectado', + approval_btn_once: 'Permitir uma vez', + approval_btn_once_title: 'Permitir este comando (Enter)', + approval_btn_session: 'Permitir sessão', + approval_btn_session_title: 'Permitir para esta sessão de conversa', + approval_btn_always: 'Sempre permitir', + approval_btn_always_title: 'Sempre permitir este padrão de comando', + approval_btn_deny: 'Negar', + approval_btn_deny_title: 'Negar — não executar este comando', + approval_responding: 'Respondendo…', + clarify_heading: 'Esclarecimento necessário', + clarify_hint: 'Escolha uma opção ou digite sua resposta abaixo.', + clarify_other: 'Outro', + clarify_send: 'Enviar', + clarify_input_placeholder: 'Digite sua resposta…', + clarify_responding: 'Respondendo…', + untitled: 'Sem título', + n_messages: (n) => `${n} mensagens`, + load_older_messages: '↑ Role para cima ou clique para carregar mensagens mais antigas', + queued_label: 'Envia após a resposta', + queued_count: (n) => n === 1 ? '1 na fila' : `${n} na fila`, + queued_cancel: 'Cancelar mensagem na fila', + model_unavailable: ' (indisponível)', + model_unavailable_title: 'Este modelo não está mais na sua lista de provedores', + provider_mismatch_warning: (m,p)=>`"${m}" pode não funcionar com seu provedor configurado (${p}). Enviar assim mesmo, ou execute \`hermes model\` no terminal para trocar.`, + provider_mismatch_label: 'Provedor incompatível', + model_not_found_label: 'Modelo não encontrado', + model_custom_label: 'ID de modelo customizado', + model_custom_placeholder: 'ex: openai/gpt-5.4', + model_search_placeholder: 'Buscar modelos…', + model_search_no_results: 'Nenhum modelo encontrado', + // commands.js + cmd_clear: 'Limpar mensagens da conversa', + cmd_compress: 'Comprimir manualmente o contexto (uso: /compress [tópico])', + cmd_compact_alias: 'Alias legado para /compress', + cmd_model: 'Trocar modelo (ex: /model gpt-4o)', + cmd_workspace: 'Trocar workspace por nome', + cmd_new: 'Iniciar nova sessão de chat', + cmd_usage: 'Alternar exibição de uso de tokens', + cmd_theme: 'Trocar aparência (tema: system/dark/light, skin: default/ares/mono/slate/poseidon/sisyphus/charizard)', + cmd_personality: 'Trocar personalidade do agente', + cmd_skills: 'Listar skills disponíveis do Hermes', + available_commands: 'Comandos disponíveis:', + type_slash: 'Digite / para ver comandos', + conversation_cleared: 'Conversa limpa', + command_label: 'Comando', + context_compaction_label: 'Compactação de contexto', + preserved_task_list_label: 'Lista de tarefas preservada', + reference_only_label: 'Apenas referência', + model_usage: 'Uso: /model ', + no_model_match: 'Nenhum modelo correspondendo "', + switched_to: 'Trocado para ', + workspace_usage: 'Uso: /workspace ', + no_workspace_match: 'Nenhum workspace correspondendo "', + switched_workspace: 'Trocado para workspace: ', + workspace_switch_failed: 'Falha ao trocar workspace: ', + new_session: 'Nova sessão criada', + compressing: 'Solicitando compressão de contexto...', + compress_running_label: 'Comprimindo', + compress_complete_label: 'Compressão completa', + auto_compress_label: 'Compressão automática', + compress_failed_label: 'Falha na compressão', + focus_label: 'Foco', + token_usage_on: 'Uso de tokens ligado', + token_usage_off: 'Uso de tokens desligado', + theme_usage: 'Uso: /theme ', + theme_set: 'Tema: ', + no_active_session: 'Nenhuma sessão ativa', + cmd_queue: 'Enfileirar mensagem para o próximo turno', + cmd_interrupt: 'Cancelar turno atual e enviar nova mensagem', + cmd_steer: 'Injetar correção no meio do turno sem interromper', + cmd_queue_no_msg: 'Uso: /queue ', + cmd_queue_not_busy: 'Nenhuma tarefa ativa — apenas envie normalmente', + cmd_queue_confirm: 'Mensagem enfileirada', + cmd_interrupt_no_msg: 'Uso: /interrupt ', + cmd_interrupt_confirm: 'Interrompido — enviando nova mensagem', + cmd_steer_no_msg: 'Uso: /steer ', + cmd_steer_fallback: 'Steer indisponível — enfileirado para próximo turno', + cmd_steer_delivered: 'Steer entregue — agente verá no próximo resultado', + steer_leftover_queued: 'Steer enfileirado para próximo turno', + busy_steer_fallback: 'Steer indisponível — enfileirado para próximo turno', + busy_interrupt_confirm: 'Interrompido — enviando nova mensagem', + settings_label_busy_input_mode: 'Modo de input ocupado', + settings_desc_busy_input_mode: 'Controla o que acontece ao enviar mensagem com agente rodando. Fila espera; Interromper cancela; Steer injeta correção.', + settings_busy_input_mode_queue: 'Enfileirar follow-up', + settings_busy_input_mode_interrupt: 'Interromper turno atual', + settings_busy_input_mode_steer: 'Steer (correção no meio do turno)', + + slash_skill_badge: 'Skill', + slash_skill_desc: 'Invocar esta skill', + cmd_stop: 'Parar resposta atual', + cmd_title: 'Obter ou definir título da sessão', + cmd_retry: 'Reenviar última mensagem', + cmd_undo: 'Remover última troca', + cmd_btw: 'Fazer pergunta lateral (efêmera)', + cmd_btw_usage: '/btw — fazer pergunta lateral', + cmd_background: 'Rodar prompt em background', + cmd_background_usage: '/background — rodar em paralelo', + btw_asking: 'Fazendo pergunta lateral...', + btw_label: 'Pergunta lateral — não no histórico', + btw_done: 'Pergunta lateral respondida', + btw_no_answer: 'Nenhuma resposta recebida.', + btw_failed: 'Pergunta lateral falhou: ', + bg_running: 'Rodando em background...', + bg_complete: 'Tarefa de background completa', + bg_label: 'Resultado de background:', + bg_no_answer: '(sem resposta)', + bg_failed: 'Tarefa de background falhou: ', + undo_exchange: 'Desfazer última troca', + cmd_status: 'Mostrar info da sessão', + cmd_voice: 'Alternar input de microfone', + stream_stopped: 'Resposta parada.', + no_active_task: 'Nenhuma tarefa ativa para parar.', + cancel_unavailable: 'Cancelar indisponível.', + retry_failed: 'Retry falhou: ', + undo_failed: 'Undo falhou: ', + undid_n_messages: 'Removido', + undid_messages_suffix: 'mensagem(s).', + status_heading: 'Status da Sessão', + status_session_id: 'ID da Sessão', + status_title: 'Título', + status_model: 'Modelo', + status_workspace: 'Workspace', + status_personality: 'Personalidade', + status_messages: 'Mensagens', + status_agent_running: 'Agente rodando', + status_profile: 'Perfil', + status_started: 'Iniciado', + status_tokens: 'Tokens', + status_no_tokens: 'Nenhum token usado', + status_unknown: 'Desconhecido', + status_yes: 'Sim', + status_no: 'Não', + status_load_failed: 'Falha ao carregar status: ', + title_current: 'Título atual', + title_change_hint: 'Use `/title ` para renomear.', + title_set: 'Título definido como', + cmd_webui_only_session: 'Comando indisponível para sessões CLI.', + cmd_voice_use_mic: 'Clique no botão de mic no composer.', + usage_heading: 'Uso de Tokens', + usage_default_model: 'padrão', + usage_unknown: 'desconhecido', + usage_input_tokens: 'Tokens de input', + usage_output_tokens: 'Tokens de output', + usage_total: 'Total de tokens', + usage_estimated_cost: 'Custo estimado', + usage_settings_tip: 'Nota: estimativas são aproximadas.', + usage_load_failed: 'Falha ao carregar uso: ', + usage_personality_none: 'nenhuma', + + no_personalities: 'Nenhuma personalidade encontrada (adicione em ~/.hermes/personalities/)', + available_personalities: 'Personalidades disponíveis:', + personality_switch_hint: '\n\nUse `/personality ` para trocar, ou `/personality none` para limpar.', + personalities_load_failed: 'Falha ao carregar personalidades', + personality_cleared: 'Personalidade limpa', + personality_set: 'Personalidade: ', + failed_colon: 'Falhou: ', + // ui.js + no_workspace: 'Nenhum workspace', + workspace_empty_no_path: 'Nenhum workspace selecionado. Configure em Configurações → Workspace.', + workspace_empty_dir: 'Este workspace está vazio.', + dialog_confirm_title: 'Confirmar ação', + dialog_prompt_title: 'Digite um valor', + dialog_confirm_btn: 'Confirmar', + // workspace.js + unsaved_confirm: 'Você tem mudanças não salvas. Descartar e navegar?', + discard: 'Descartar', + save: 'Salvar', + edit: 'Editar', + clear: 'Limpar', + create: 'Criar', + remove: 'Remover', + save_title: 'Salvar mudanças', + edit_title: 'Editar este arquivo', + saved: 'Salvo', + save_failed: 'Falha ao salvar: ', + image_load_failed: 'Não foi possível carregar imagem', + file_open_failed: 'Não foi possível abrir arquivo', + downloading: (name) => `Baixando ${name}…`, + double_click_rename: 'Duplo clique para renomear', + renamed_to: 'Renomeado para ', + rename_failed: 'Falha ao renomear: ', + delete_title: 'Excluir', + delete_confirm: (name) => `Excluir ${name}?`, + deleted: 'Excluído ', + delete_failed: 'Falha ao excluir: ', + new_file_prompt: 'Nome do novo arquivo (ex: notes.md):', + project_name_prompt: 'Nome do projeto:', + created: 'Criado ', + create_failed: 'Falha ao criar: ', + new_folder_prompt: 'Nome da nova pasta:', + folder_created: 'Pasta criada ', + folder_create_failed: 'Falha ao criar pasta: ', + workspace_auto_create_folder: 'Criar pasta se não existir', + folder_add_as_space_btn: 'Adicionar como Space', + folder_add_as_space_msg: 'Adicionar esta pasta como novo space?', + folder_add_as_space_title: 'Adicionar como Space?', + remove_title: 'Remover', + empty_dir: '(vazio)', + upload_failed: 'Falha ao upload: ', + all_uploads_failed: (n) => `Todos ${n} upload(s) falharam`, + session_pin: 'Fixar conversa', + session_unpin: 'Desfixar conversa', + session_pin_desc: 'Manter esta conversa no topo', + session_unpin_desc: 'Remover dos fixados', + session_pin_failed: 'Falha ao fixar: ', + session_move_project: 'Mover para projeto', + session_move_project_desc_has: 'Mudar projeto desta conversa', + session_move_project_desc_none: 'Atribuir projeto a esta conversa', + session_archive: 'Arquivar conversa', + session_restore: 'Restaurar conversa', + session_archive_desc: 'Esconder conversa até mostrar arquivados', + session_restore_desc: 'Trazer conversa de volta à lista principal', + session_archived: 'Sessão arquivada', + session_restored: 'Sessão restaurada', + session_archive_failed: 'Falha ao arquivar: ', + session_duplicate: 'Duplicar conversa', + session_duplicate_desc: 'Criar cópia com mesmo workspace e modelo', + session_duplicated: 'Sessão duplicada', + session_duplicate_failed: 'Falha ao duplicar: ', + session_delete: 'Excluir conversa', + session_delete_desc: 'Remover permanentemente esta conversa', + // settings panel + settings_heading_title: 'Control Center', + settings_heading_subtitle: 'Preferências, ferramentas de conversa e controles do sistema.', + settings_section_conversation_title: 'Conversa', + settings_section_appearance_title: 'Aparência', + settings_section_appearance_meta: 'Tema, cores de destaque e estilo visual.', + settings_section_preferences_title: 'Preferências', + settings_section_preferences_meta: 'Padrões e comportamento UI do Hermes Web UI.', + settings_section_system_title: 'Sistema', + settings_section_system_meta: 'Versão da instância e controles de acesso.', + settings_check_now: 'Verificar agora', + settings_checking: 'Verificando…', + settings_up_to_date: 'Atualizado ✓', + settings_updates_available: '{count} atualização(ões) disponível(is)', + settings_updates_disabled: 'Verificação de updates desativada', + settings_update_check_failed: 'Falha ao verificar updates', + settings_label_workspace_panel_open: 'Manter painel workspace aberto por padrão', + settings_desc_workspace_panel_open: 'Quando ativo, o painel workspace abre automaticamente com cada nova sessão.', + open_in_browser: 'Abrir no navegador', + settings_dropdown_conversation: 'Conversa', + settings_dropdown_appearance: 'Aparência', + settings_dropdown_preferences: 'Preferências', + settings_dropdown_providers: 'Provedores', + settings_dropdown_system: 'Sistema', + settings_tab_conversation: 'Conversa', + settings_tab_appearance: 'Aparência', + settings_tab_preferences: 'Preferências', + settings_tab_system: 'Sistema', + settings_title: 'Configurações', + settings_save_btn: 'Salvar Configurações', + settings_label_model: 'Modelo Padrão', + settings_label_send_key: 'Tecla de Envio', + settings_label_theme: 'Tema', + settings_label_skin: 'Skin', + settings_label_font_size: 'Tamanho da fonte', + font_size_small: 'Pequeno', + font_size_default: 'Padrão', + font_size_large: 'Grande', + settings_label_language: 'Idioma', + settings_label_token_usage: 'Mostrar uso de tokens', + settings_label_sidebar_density: 'Densidade da sidebar', + cmd_reasoning: 'Alternar visibilidade do pensamento (mostrar/ocultar)', + settings_label_cli_sessions: 'Mostrar sessões do agente', + settings_label_sync_insights: 'Sincronizar para insights', + settings_label_check_updates: 'Verificar atualizações', + settings_label_bot_name: 'Nome do Assistente', + settings_label_password: 'Senha de Acesso', + settings_saved: 'Configurações salvas', + settings_save_failed: 'Falha ao salvar: ', + settings_load_failed: 'Falha ao carregar configurações: ', + settings_saved_pw: 'Configurações salvas — senha ativada e navegador permanece logado', + settings_saved_pw_updated: 'Configurações salvas — senha atualizada', + // login page + login_title: 'Entrar', + login_subtitle: 'Digite sua senha para continuar', + login_placeholder: 'Senha', + login_btn: 'Entrar', + login_invalid_pw: 'Senha inválida', + login_conn_failed: 'Falha na conexão', + + // Sidebar & Tabs + tab_chat: 'Chat', + tab_tasks: 'Tarefas', + tab_skills: 'Skills', + tab_memory: 'Memória', + tab_workspaces: 'Spaces', + tab_profiles: 'Perfis', + tab_todos: 'Todos', + tab_settings: 'Configurações', + new_conversation: 'Nova conversa', + filter_conversations: 'Filtrar conversas...', + session_time_unknown: 'Desconhecido', + session_time_minutes_ago: (n) => `${n}m`, + session_time_hours_ago: (n) => `${n}h`, + session_time_days_ago: (n) => `${n}d`, + session_time_last_week: '1s', + session_time_bucket_today: 'Hoje', + session_time_bucket_yesterday: 'Ontem', + session_time_bucket_this_week: 'Esta semana', + session_time_bucket_last_week: 'Semana passada', + session_time_bucket_older: 'Antigo', + scheduled_jobs: 'Tarefas agendadas', + new_job: 'Nova tarefa', + loading: 'Carregando...', + search_skills: 'Buscar skills...', + new_skill: 'Nova skill', + personal_memory: 'Memória pessoal', + current_task_list: 'Lista de tarefas atual', + workspace_desc: 'Adicionar e trocar workspaces para suas sessões.', + session_meta_messages: (n) => `${n} msg${n === 1 ? '' : 's'}`, + new_profile: 'Novo perfil', + transcript: 'Transcrição', + download_transcript: 'Baixar como Markdown', + import: 'Importar', + // Settings detail + settings_label_sound: 'Som de notificação', + settings_desc_sound: 'Tocar som quando assistente finalizar resposta.', + settings_label_notifications: 'Notificações do navegador', + settings_desc_notifications: 'Mostrar notificação quando resposta completar com app em background.', + settings_desc_token_usage: 'Exibe contagem de tokens abaixo de cada resposta. Também com /usage.', + settings_sidebar_density_compact: 'Compacto', + settings_sidebar_density_detailed: 'Detalhado', + settings_desc_sidebar_density: 'Controla quanto metadado a lista de sessões mostra na sidebar.', + settings_label_auto_title_refresh: 'Atualização adaptativa de título', + settings_auto_title_refresh_off: 'Desligado', + settings_auto_title_refresh_5: 'A cada 5 trocas', + settings_auto_title_refresh_10: 'A cada 10 trocas', + settings_auto_title_refresh_20: 'A cada 20 trocas', + settings_desc_auto_title_refresh: 'Re-gera título da sessão baseado na última troca.', + settings_desc_cli_sessions: 'Mescla sessões do Hermes CLI na lista. Clique para importar.', + settings_desc_sync_insights: 'Espelha uso de tokens para state.db.', + settings_desc_check_updates: 'Mostrar banner quando versões mais novas estiverem disponíveis.', + settings_desc_bot_name: 'Nome de exibição do assistente. Padrão: Hermes.', + settings_desc_password: 'Digite nova senha para definir ou trocar. Deixe em branco para manter.', + password_placeholder: 'Digite nova senha…', + disable_auth: 'Desativar Auth', + sign_out: 'Sair', + // Providers panel + providers_tab_title: 'Provedores', + providers_section_title: 'Provedores', + providers_section_meta: 'Gerenciar API keys. Mudanças fazem efeito imediatamente.', + providers_status_configured: 'API key configurada', + providers_status_not_configured: 'Sem API key', + providers_status_oauth: 'OAuth', + providers_status_api_key: 'API key', + providers_status_not_configured_label: 'Não configurado', + providers_oauth_hint: 'Autenticado via OAuth. Sem API key necessária.', + providers_oauth_config_yaml_hint: 'Token configurado via config.yaml. Para atualizar, edite config.yaml ou rode hermes auth.', + providers_oauth_not_configured_hint: 'Não autenticado. Rode hermes auth no terminal.', + providers_save: 'Salvar', + providers_remove: 'Remover', + providers_saving: 'Salvando…', + providers_removing: 'Removendo…', + providers_enter_key: 'Por favor digite uma API key', + providers_empty: 'Nenhum provedor configurável encontrado.', + providers_key_updated: 'API key salva', + providers_key_removed: 'API key removida', + providers_key_placeholder_new: 'sk-...', + providers_key_placeholder_replace: 'Digite nova key para substituir…', + cancel: 'Cancelar', + create_job: 'Criar tarefa', + save_skill: 'Salvar skill', + editing: 'Editando', + // Empty state + empty_title: 'Como posso ajudar?', + empty_subtitle: 'Pergunte qualquer coisa, rode comandos, explore arquivos ou gerencie tarefas.', + suggest_files: 'Quais arquivos estão neste workspace?', + suggest_schedule: 'O que tenho na agenda hoje?', + suggest_plan: 'Me ajude a planejar um pequeno projeto.', + // onboarding + onboarding_badge: 'PRIMEIRO ACESSO', + onboarding_title: 'Bem-vindo ao Hermes Web UI', + onboarding_lead: 'Uma configuração rápida vai verificar Hermes, salvar provedor, escolher workspace e modelo, e opcionalmente proteger com senha.', + onboarding_back: 'Voltar', + onboarding_continue: 'Continuar', + onboarding_skip: 'Pular configuração', + onboarding_skipped: 'Configuração pulada — usando config existente.', + onboarding_open: 'Abrir Hermes', + onboarding_step_system_title: 'Verificação do sistema', + onboarding_step_system_desc: 'Verificar Hermes Agent e visibilidade da config.', + onboarding_step_setup_title: 'Configuração do provedor', + onboarding_step_setup_desc: 'Salvar config mínima do provedor Hermes.', + onboarding_step_workspace_title: 'Workspace + modelo', + onboarding_step_workspace_desc: 'Escolher padrões para novas sessões e chat.', + onboarding_step_password_title: 'Senha opcional', + onboarding_step_password_desc: 'Proteger Web UI antes de compartilhar.', + onboarding_step_finish_title: 'Finalizar', + onboarding_step_finish_desc: 'Revisar e entrar no app.', + onboarding_notice_system_ready: 'Hermes Agent parece acessível pela Web UI.', + onboarding_notice_system_unavailable: 'Hermes Agent não está totalmente disponível. Bootstrap pode instalar, mas setup do provedor pode requerer terminal.', + onboarding_check_agent: 'Hermes Agent', + onboarding_check_agent_ready: 'Detectado e importável', + onboarding_check_agent_missing: 'Ausente ou parcialmente importável', + onboarding_check_password: 'Senha', + onboarding_check_password_enabled: 'Já ativada', + onboarding_check_password_disabled: 'Não ativada ainda', + onboarding_check_provider: 'Config do provedor', + onboarding_check_provider_ready: 'Pronto para conversar', + onboarding_check_provider_partial: 'Salvo mas incompleto', + onboarding_check_provider_pending: 'Precisa verificação', + onboarding_config_file: 'Arquivo de config:', + onboarding_env_file: 'Arquivo .env:', + onboarding_unknown: 'Desconhecido', + onboarding_current_provider: 'Config atual:', + onboarding_missing_imports: 'Imports ausentes:', + onboarding_notice_setup_required: 'Escolha caminho simples de provedor aqui. OAuth avançado ainda pertence ao Hermes CLI.', + onboarding_notice_setup_already_ready: 'Setup de provedor Hermes já detectado. Pode manter ou substituir.', + onboarding_oauth_provider_ready_title: 'Provedor já autenticado', + onboarding_oauth_provider_ready_body: 'Esta instância usa provedor OAuth ({provider}) configurado via CLI. Sem API key necessária.', + onboarding_oauth_provider_not_ready_title: 'Provedor OAuth não autenticado', + onboarding_oauth_provider_not_ready_body: 'Esta instância usa {provider} com OAuth. Rode `hermes auth` no terminal.', + onboarding_oauth_switch_hint: 'Ou escolha provedor diferente abaixo para trocar para API-key:', + onboarding_notice_workspace: 'Estes valores reusam as mesmas APIs de settings do app normal.', + onboarding_workspace_label: 'Workspace', + onboarding_workspace_or_path: 'Ou digite path do workspace', + onboarding_workspace_placeholder: '/home/voce/workspace', + onboarding_provider_label: 'Modo de setup', + onboarding_quick_setup_badge: 'setup rápido', + provider_category_easy_start: 'Início fácil', + provider_category_self_hosted: 'Open / self-hosted', + provider_category_specialized: 'Especializado', + onboarding_api_key_label: 'API key', + onboarding_api_key_placeholder: 'Deixe em branco para manter key existente', + onboarding_api_key_help_prefix: 'Salvo como segredo no .env do Hermes usando', + onboarding_base_url_label: 'Base URL', + onboarding_base_url_placeholder: 'https://seu-endpoint.exemplo/v1', + onboarding_base_url_help: 'Use para endpoints OpenAI-compatible, self-hosted, LiteLLM, Ollama, LM Studio, vLLM.', + onboarding_model_label: 'Modelo padrão', + onboarding_workspace_help: 'Escolha modelo que Hermes deve usar para novos chats.', + onboarding_custom_model_placeholder: 'nome-do-seu-modelo', + onboarding_custom_model_help: 'Para endpoints customizados, digite ID exato que seu servidor espera.', + onboarding_notice_password_enabled: 'Senha já configurada. Digite nova apenas se quiser substituir.', + onboarding_notice_password_recommended: 'Opcional mas recomendado se expor UI além de localhost.', + onboarding_password_label: 'Senha (opcional)', + onboarding_password_placeholder: 'Deixe em branco para pular', + onboarding_password_help: 'Senhas são salvas via settings API e hasheadas no servidor.', + onboarding_notice_finish: 'Pode reabrir Configurações depois para mudar qualquer coisa.', + onboarding_not_set: 'Não definido', + onboarding_password_will_enable: 'Será ativada', + onboarding_password_will_replace: 'Será substituída', + onboarding_password_keep_existing: 'Manter senha atual', + onboarding_password_remains_disabled: 'Permanecerá desativada', + onboarding_password_skipped: 'Pulado por enquanto', + onboarding_finish_help: 'Finalizar guarda onboarding_completed em settings e leva ao app normal.', + onboarding_error_choose_workspace: 'Escolha workspace antes de continuar.', + onboarding_error_choose_model: 'Escolha modelo antes de continuar.', + onboarding_error_provider_required: 'Escolha modo de setup antes de continuar.', + onboarding_error_base_url_required: 'Base URL é necessária para endpoints customizados.', + onboarding_error_workspace_required: 'Workspace é necessário.', + onboarding_error_model_required: 'Modelo é necessário.', + onboarding_complete: 'Configuração completa', + + // panel/runtime i18n + error_prefix: 'Erro: ', + not_available: 'N/D', + never: 'nunca', + add: 'Adicionar', + add_failed: 'Falha ao adicionar: ', + remove_failed: 'Falha ao remover: ', + switch_failed: 'Falha ao trocar: ', + name_required: 'Nome é necessário', + content_required: 'Conteúdo é necessário', + view: 'Ver', + dismiss: 'Dispensar', + disable: 'Desativar', + cron_no_jobs: 'Nenhuma tarefa agendada encontrada.', + cron_status_off: 'desligado', + cron_status_paused: 'pausado', + cron_status_error: 'erro', + cron_status_active: 'ativo', + cron_status_running: 'rodando…', + cron_status_needs_attention: 'precisa atenção', + cron_attention_desc: 'Esta tarefa não tem próxima execução. Scheduler pode não ter calculado.', + cron_attention_croniter_hint: 'Gateway pode não ter pacote croniter. Reinicie com cron support.', + cron_attention_resume: 'Retomar e recalcular', + cron_attention_run_once: 'Rodar uma vez agora', + cron_attention_copy_diagnostics: 'Copiar diagnóstico', + cron_diagnostics_copied: 'Diagnóstico copiado', + cron_next: 'Próxima', + cron_last: 'Última', + cron_run_now: 'Rodar agora', + cron_pause: 'Pausar', + cron_resume: 'Retomar', + cron_job_name_placeholder: 'Nome da tarefa', + cron_schedule_placeholder: 'Agendamento', + cron_prompt_placeholder: 'Prompt', + cron_last_output: 'Último output', + cron_all_runs: 'Todas execuções', + cron_hide_runs: 'Esconder execuções', + cron_no_runs_yet: '(sem execuções ainda)', + cron_schedule_required_example: 'Agendamento necessário (ex: "0 9 * * *" ou "every 1h")', + cron_schedule_required: 'Agendamento é necessário', + cron_prompt_required: 'Prompt é necessário', + cron_job_created: 'Tarefa criada', + cron_job_triggered: 'Tarefa acionada', + cron_job_paused: 'Tarefa pausada', + cron_job_resumed: 'Tarefa retomada', + cron_job_updated: 'Tarefa atualizada', + cron_delete_confirm_title: 'Excluir tarefa cron', + cron_delete_confirm_message: 'Isso não pode ser desfeito.', + cron_job_deleted: 'Tarefa excluída', + cron_completion_status: (name, status) => `Cron "${name}" ${status}`, + status_failed: 'falhou', + status_completed: 'completou', + todos_no_active: 'Nenhuma lista de tarefas ativa nesta sessão.', + clear_conversation_title: 'Limpar conversa', + clear_conversation_message: 'Limpar todas mensagens? Isso não pode ser desfeito.', + clear_failed: 'Falha ao limpar: ', + skills_no_match: 'Nenhuma skill corresponde.', + linked_files: 'Arquivos vinculados', + skill_load_failed: 'Não foi possível carregar skill: ', + skill_file_load_failed: 'Não foi possível carregar arquivo: ', + skills_empty_title: 'Selecione uma skill', + skills_empty_sub: 'Escolha skill da sidebar para ver conteúdo, ou crie nova.', + skills_edit: 'Editar', + skills_delete: 'Excluir', + skills_back_to: 'Voltar para {0}', + tasks_empty_title: 'Selecione tarefa agendada', + tasks_empty_sub: 'Escolha tarefa da sidebar para ver detalhes e execuções.', + workspaces_empty_title: 'Selecione um space', + workspaces_empty_sub: 'Escolha space da sidebar para ver arquivos e settings.', + profiles_empty_title: 'Selecione um perfil', + profiles_empty_sub: 'Escolha perfil da sidebar para ver e editar settings.', + memory_notes_label: 'memória (notas)', + memory_saved: 'Memória salva', + my_notes: 'Minhas Notas', + user_profile: 'Perfil do Usuário', + no_notes_yet: 'Nenhuma nota ainda.', + no_profile_yet: 'Nenhum perfil definido.', + // skill form + skill_name: 'Nome', + skill_category: 'Categoria', + skill_category_placeholder: 'Opcional, ex: devops', + skill_content: 'Conteúdo SKILL.md', + skill_content_placeholder: 'YAML frontmatter + markdown body', + skill_rename_not_supported: 'Renomear skill não suportado. Crie nova e exclua antiga.', + skill_metadata: 'Metadados', + // cron form + cron_name_label: 'Nome', + cron_name_placeholder: 'Opcional', + cron_schedule_label: 'Agendamento', + cron_schedule_hint: "Expressão Cron ou shorthand como 'every 1h'.", + cron_prompt_label: 'Prompt', + cron_deliver_label: 'Entregar output para', + cron_deliver_local: 'Local (salvar output apenas)', + cron_deliver_origin: 'Origem (mesmo chat)', + cron_deliver_telegram: 'Telegram', + cron_deliver_discord: 'Discord', + cron_skills_label: 'Skills', + cron_skills_placeholder: 'Adicionar skills (opcional)…', + cron_skills_edit_hint: 'Lista de skills não editável após criação.', + // workspace form + workspace_name_label: 'Nome', + workspace_name_placeholder: 'Nome amigável opcional', + workspace_path_label: 'Path', + workspace_path_required: 'Path é necessário', + workspace_path_readonly: 'Path não pode mudar. Apenas renomear.', + workspace_new_title: 'Novo space', + workspace_rename_title: 'Renomear space', + // profile form + profile_name_label: 'Nome', + profile_name_required: 'Nome é necessário', + profile_name_placeholder: 'ex: Trabalho, Pessoal', + profile_provider_label: 'Provedor', + profile_model_label: 'Modelo', + profile_model_required: 'Modelo é necessário', + profile_base_url_label: 'Base URL', + profile_base_url_placeholder: 'Opcional, ex: http://localhost:11434', + profile_api_key_label: 'API key', + profile_api_key_placeholder: 'Opcional', + manage_profiles: 'Gerenciar perfis', + profiles_load_failed: 'Falha ao carregar perfis', + profiles_busy_switch: 'Não pode trocar perfis com agente rodando', + profile_switched_new_conversation: (name) => `Trocado para perfil: ${name} — nova conversa iniciada`, + profile_switched: (name) => `Trocado para perfil: ${name}`, + profile_delete_confirm: (name) => `Excluir perfil "${name}"?`, + profile_deleted: 'Perfil excluído', + profile_delete_failed: 'Falha ao excluir perfil: ', + profile_create_failed: 'Falha ao criar perfil: ', + profile_update_failed: 'Falha ao atualizar perfil: ', + profile_already_exists: 'Perfil já existe', + // workspace switch dialog + workspace_switch_prompt_title: 'Trocar workspace', + workspace_switch_prompt_message: 'Digite path absoluto do workspace para adicionar e trocar.', + workspace_switch_prompt_confirm: 'Trocar', + workspace_switch_prompt_placeholder: '/Users/voce/projeto', + workspace_not_added: 'Workspace não adicionado', + workspace_already_saved: 'Workspace já salvo — escolha da lista', + workspace_busy_switch: 'Não pode trocar workspace com agente rodando', + discard_file_edits_title: 'Descartar edições de arquivo?', + discard_file_edits_message: 'Trocar workspace descarta edições não salvas no preview.', + workspace_switched_to: (name) => `Trocado para ${name}`, + workspace_use: 'Usar', + workspace_use_title: 'Usar nesta conversa', + workspace_add_title: 'Adicionar workspace', + // Approval card + approval_skip: 'Pular', + approval_skip_title: 'Pular este prompt de aprovação', + approval_skip_all: 'Pular todos', + approval_skip_all_title: 'Pular todos prompts de aprovação nesta sessão' + }, ko: { _lang: 'ko', _label: '한국어',