// SPDX-License-Identifier: AGPL-3.0-only
// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0

import type { DeepPartialMessageTree } from "../types";
import type { en } from "./en";

export const ptBR = {
  picker: {
    onDevice: "No dispositivo",
    huggingFace: "Hugging Face",
    retry: "Tentar novamente",
    loadMore: "Carregar mais",
    offlineTitle: "Você está offline",
    offlineBody:
      "Mude para Dispositivo para usar {noun} locais ou em cache.",
    offlineSwitchDevice: "Dispositivo",
    searchAriaLabel: "Buscar {noun}",
    modelSourceAriaLabel: "Origem do modelo",
    hubSectionAriaLabel: "Seção do Hub",
    modelDropped: "Não é mais oferecido",
    modelDroppedByProvider: "{provider} · não é mais oferecido",
    modelDisabled: "Não ativado",
    modelDisabledByProvider: "{provider} · não ativado",
    multipleMatches:
      "Há vários {noun} correspondentes. Escolha uma opção na lista.",
    rateLimitedTitle: "Limite de requisições do Hugging Face atingido",
    rateLimitedBody:
      "Aguarde um momento e tente buscar {noun} novamente.",
    hfToken: {
      label: "Token do HF",
      saved: "Salvo",
      add: "Adicionar",
      savedAriaLabel: "Token do Hugging Face salvo",
      addAriaLabel: "Definir token do Hugging Face",
      savedHint: "Token salvo. O acesso será verificado quando ele for usado.",
      addHint:
        "Defina um token para acessar repositórios privados e restritos.",
    },
  },
  common: {
    cancel: "Cancelar",
    close: "Fechar",
    delete: "Excluir",
    done: "Concluir",
    error: "Erro",
    export: "Exportar",
    help: "Ajuda",
    loading: "Carregando...",
    new: "Novo",
    rename: "Renomear",
    save: "Salvar",
    saving: "Salvando...",
    search: "Buscar",
    shutdown: "Desligar",
  },
  shell: {
    beta: "BETA",
    brand: "unsloth",
    product: "Unsloth",
    accountMenu: "Menu da conta de {name}",
    updateAvailable: "Atualização disponível",
    resize: {
      collapse: "Clique para recolher",
      expand: "Clique para expandir",
      drag: "Arraste para redimensionar",
    },
    aria: {
      home: "Início do Unsloth",
      closeSidebar: "Fechar barra lateral",
      openSidebar: "Abrir barra lateral",
      resizeSidebar: "Redimensionar ou recolher a barra lateral",
      resizeRunSettings: "Redimensionar ou fechar as configurações de execução",
      openRunSettings: "Abrir as configurações de execução",
      chatOptions: "Opções de chat",
      runOptions: "Opções de execução",
    },
    navigation: {
      newChat: "Novo chat",
      returnToChat: "Voltar ao chat",
      returnToChats: "Voltar aos {count} chats",
      chatGenerating: "Gerando",
      compare: "Comparar",
      search: "Buscar",
      hub: "Hub de modelos",
      projects: "Projetos",
      train: "Treinar",
      recipes: "Receitas",
      images: "Imagens",
      video: "Vídeo",
      audio: "Áudio",
      trainChecking: "Verificando se esta máquina oferece suporte a treino...",
      videoChecking: "Verificando se esta máquina oferece suporte a vídeo...",
      more: "Mais",
      customizeSidebar: "Personalizar barra lateral",
      newBadge: "Novo",
      export: "Exportar",
      recents: "Recentes",
      noChatsYet: "Nenhum chat ainda",
      settings: "Configurações",
      api: "API",
      lightMode: "Modo claro",
      darkMode: "Modo escuro",
      guidedTour: "Tour guiado",
      help: "Ajuda",
      logOut: "Sair",
      shutdown: "Desligar",
    },
    notFound: {
      title: "Página não encontrada",
      description: "{path} não existe.",
      backToChat: "Voltar para o chat",
    },
    dialog: {
      deleteChat: {
        title: "Excluir chat",
        description: 'Tem certeza de que deseja excluir este chat "{name}"?',
      },
      deleteRun: {
        title: "Excluir execução de treino",
        description: 'Tem certeza de que deseja excluir esta execução "{name}"?',
      },
      renameChat: {
        title: "Renomear chat",
        placeholder: "Título do chat",
      },
      renameRun: {
        title: "Renomear execução",
        placeholder: "Nome da execução",
      },
    },
    toast: {
      cannotDeleteRunningRun: "Não é possível excluir uma execução de treino em andamento",
      failedToDeleteChat: "Falha ao excluir o chat",
      failedToDeleteRun: "Falha ao excluir a execução",
      failedToRenameChat: "Falha ao renomear o chat",
      failedToRenameRun: "Falha ao renomear a execução",
    },
  },
  settings: {
    title: "Configurações",
    dialog: {
      title: "Configurações",
      description: "Gerencie suas preferências do Unsloth.",
      closeAriaLabel: "Fechar configurações",
      searchPlaceholder: "Pesquisar configurações…",
      searchNoResults: "Nenhuma configuração encontrada.",
    },
    tabs: {
      general: "Geral",
      profile: "Perfil",
      appearance: "Aparência",
      resources: "Sistema",
      chat: "Chat",
      connections: "Conexões",
      apiKeys: "API",
      about: "Sobre",
      voice: "Voz",
      data: "Dados",
      agents: "Agentes",
      debugging: "Registros",
    },
    debugging: {
      logSection: "Arquivo de log",
      source: "Arquivo de log",
      sourceHint: "Os executores de modelos gravam os próprios logs, então uma falha ao carregar ou ao gerar costuma ser explicada ali, e não no log do servidor.",
      path: "Local",
      pathCopy: "Copiar caminho",
      refreshSection: "Atualização",
      mode: "Modo",
      modeLive: "Ao vivo",
      modeInterval: "A cada 3 segundos",
      modeManual: "Manual",
      refreshNow: "Atualizar agora",
      privacyNote: "As credenciais são mascaradas nesta visualização. No arquivo em disco elas não são mascaradas.",
      copyVisible: "Copiar log visível",
      empty: "Nada foi registrado ainda.",
      disabled: "O log em arquivo está desativado (UNSLOTH_STUDIO_NO_FILE_LOG=1).",
      missing: "Nenhum arquivo de log foi encontrado.",
      unreadable: "Não foi possível ler o arquivo de log.",
      timeout: "A solicitacao do registro expirou. O servidor pode estar inacessivel.",
      droppedNotice: "Algumas linhas foram ignoradas: o log foi gravado mais rápido do que era possível ler.",
      morePending: "Mais linhas ainda estao sendo lidas; elas chegam na proxima atualizacao.",
      staleSession: "O registro em arquivo esta desativado, portanto esta e uma sessao anterior e nao sera atualizada.",
      keywords: "depuracao depurar registro registros log logs erro erros falha rastreamento diagnostico solucao de problemas debug",
    },
    voice: {
      title: "Voz",
      description: "Microfone, ditado, conversão de fala em texto e leitura em voz alta",
      dictation: {
        sectionTitle: "Ditado",
        engineLabel: "Mecanismo de ditado",
        engineBrowser: "Navegador",
        engineBrowserDescription:
          "Transcreve o áudio usando o serviço de fala do seu navegador. Selecione 'Transcrição local' para usar um modelo STT.",
        engineModel: "Transcrição local",
        engineModelDescription:
          "Executa um modelo de conversão de fala em texto (STT) localmente e funciona offline. Baixe e carregue o modelo; ele é descarregado após um período sem uso.",
        sttModelLabel: "Modelo de reconhecimento de fala",
        sttModelDescription:
          "Escolha ou busque um modelo STT para executar localmente.",
        sttModelSearchPlaceholder: "Buscar modelo",
        sttModelSearching: "Buscando no Hugging Face…",
        sttModelValidating: "Verificando a compatibilidade com o Whisper…",
        sttModelNoResults: "Nenhum modelo Whisper encontrado",
        sttModelInvalid: "Este repositório não pode ser usado para ditado",
        sttModelFailed: "Não foi possível carregar o modelo STT",
        sttModelUnsupported: "A gravação não é suportada neste navegador",
        sttChecking: "Verificando…",
        sttOnDemand: "Baixado",
        sttLoadingModel: "Carregando o modelo…",
        sttReady: "Carregado em {device}",
        sttLoaded: "Carregado",
        sttUnavailable:
          "Não instalado neste servidor. Execute `unsloth studio update` para habilitar o ditado local.",
        sttRetry: "Tentar novamente",
        sttDownloadChecking: "Verificando o status do download…",
        sttNotDownloaded: "Não baixado",
        sttDownloadStatusFailed: "Não foi possível verificar o status do download",
        sttDownload: "Baixar",
        sttDownloadConfirmTitle: "Baixar {model}?",
        sttDownloadConfirmBody:
          "O ditado local funciona totalmente offline, mas antes precisa do modelo de fala {model}. Cerca de {size}, baixado uma única vez para o cache do Hugging Face.",
        sttDownloadConfirmBodyUnsized:
          "O ditado local funciona totalmente offline, mas antes precisa do modelo de fala {model}. Ele é baixado uma única vez para o cache do Hugging Face.",
        sttOpenVoiceSettings: "Abrir as configurações de Voz",
        sttDownloadStarted: "Baixando {model}",
        sttDownloading: "Baixando… {progress}%",
        sttCancelDownload: "Cancelar",
        sttCancellingDownload: "Cancelando…",
        sttCancelDownloadFailed: "Não foi possível cancelar o download",
        sttDownloadComplete: "Modelo de reconhecimento de fala baixado",
        sttModelReady: "O modelo {model} está pronto para o ditado",
        sttRecommended: "Recomendado",
        sttDownloadFailed:
          "Não foi possível baixar o modelo de reconhecimento de fala",
        sttLoad: "Carregar",
        sttUnload: "Descarregar",
        sttUnloading: "Descarregando…",
        microphoneLabel: "Microfone",
        microphoneFallbackName: "Microfone {index}",
        microphoneDescription: "Usado para ditado",
        microphoneFallbackHint:
          "Usado para ditado. Usa o dispositivo padrão do sistema se o mecanismo de fala do navegador não conseguir usar este dispositivo",
        microphoneGrantDescription:
          "Permita o acesso ao microfone para ver os nomes dos dispositivos",
        allowMicrophone: "Permitir acesso ao microfone",
        micAccessBlocked:
          "O acesso ao microfone foi bloqueado. Permita o acesso ao microfone nesta página do Unsloth e tente novamente.",
        micAccessUnsupported:
          "O acesso ao microfone não é suportado neste navegador ou contexto.",
        systemDefault: "Padrão do sistema",
        savedMicDisconnected: "Microfone salvo (não conectado)",
        languageLabel: "Idioma do ditado",
        languageDescription: "Idioma a ser reconhecido",
        languageAuto: "Automático (idioma do navegador)",
      },
      dictionary: {
        sectionTitle: "Dicionário de ditado",
        sectionDescription:
          "Defina como o ditado escreve palavras ou frases específicas",
        manageLabel: "Grafias personalizadas",
        manage: "Gerenciar",
        backToVoice: "Voltar para Voz",
        addEntry: "Adicionar entrada",
        newEntryAria: "Nova entrada do dicionário",
        entryPlaceholder: "Maria Silva",
        entryAria: "Entrada do dicionário {index}",
        removeEntryAria: "Remover entrada {index} do dicionário",
      },
      recents: {
        sectionTitle: "Histórico de ditados",
        sectionDescription:
          "Todo ditado é salvo aqui para você recuperar o texto",
        manageLabel: "Histórico de ditados",
        manage: "Gerenciar",
        pageDescription:
          "Todo ditado é salvo. Veja, copie ou exclua os ditados, ou abra o chat em que um deles foi usado.",
        searchPlaceholder: "Buscar ditados",
        sortLabel: "Ordenar ditados",
        sortNewest: "Mais recentes",
        sortOldest: "Mais antigos",
        sortAlpha: "De A a Z",
        noMatches: "Nenhum ditado corresponde à sua busca",
        detailTitle: "Ditado salvo",
        backToVoice: "Voltar para Voz",
        backToRecents: "Voltar para os ditados recentes",
        view: "Ver o ditado completo",
        empty: "Nenhum ditado ainda",
        dictationColumn: "Ditado",
        dateColumn: "Data de criação",
        copy: "Copiar ditado",
        copied: "Copiado para a área de transferência",
        copyFailed: "Não foi possível copiar para a área de transferência",
        delete: "Excluir ditado",
        deleteTitle: "Excluir ditado",
        deleteDescription:
          "Excluir este ditado salvo? Esta ação não pode ser desfeita.",
        deleteLinkedDescription:
          "Excluir este ditado salvo? Você também pode excluir o chat em que ele foi usado. Esta ação não pode ser desfeita.",
        deleteWithChat: "Excluir chat e ditado",
        deleteWithChatFailed: "Não foi possível excluir o chat",
        clear: "Limpar histórico",
        clearTitle: "Limpar histórico de ditados",
        clearDescription:
          "Excluir todos os ditados salvos? Esta ação não pode ser desfeita.",
        clearConfirm: "Limpar tudo",
        showMore: "Mostrar mais ({count})",
        openChat: "Abrir chat",
      },
      readAloud: {
        sectionTitle: "Leitura em voz alta",
        buttonLabel: "Botão de leitura em voz alta",
        buttonDescription: "Exibe o botão nas respostas do assistente",
        engineLabel: "Mecanismo de TTS",
        engineSystemDescription: "Vozes nativas do dispositivo",
        engineStudioDescription:
          "Usa o modelo de áudio carregado (por exemplo, Orpheus)",
        engineSystem: "Vozes do sistema",
        engineStudio: "Carregar modelo de TTS",
        modelLabel: "Modelo de TTS",
        modelDescription:
          "Carregue um modelo de áudio pelo seletor de modelos (por exemplo, Orpheus TTS)",
        voiceLabel: "Voz",
        voiceDescription: "As melhores vozes deste dispositivo",
        speedLabel: "Velocidade",
        pitchLabel: "Tom",
        volumeLabel: "Volume",
        previewLabel: "Ouvir a voz",
        previewDescription: "Reproduz uma amostra curta",
        previewAction: "Ouvir",
        previewFailed: "Não foi possível reproduzir a prévia de TTS",
        stopAction: "Parar",
        ttsLabel: "Conversão de texto em fala",
        notSupported: "Este navegador não oferece suporte",
      },
    },
    general: {
      title: "Geral",
      description: "Preferências globais do Unsloth.",
      account: "Conta",
      huggingFaceToken: "Token do Hugging Face",
      huggingFaceTokenDescription:
        "Usado para carregar modelos restritos e enviar artefatos.",
      tokenValidated: "Token validado",
      hideToken: "Ocultar token",
      showToken: "Mostrar token",
      clearToken: "Limpar",
      checkingToken: "Verificando token...",
      password: "Senha",
      passwordDescription: "Altere a senha desta conta do Unsloth.",
      passwordDialog: {
        trigger: "Alterar senha",
        title: "Alterar senha",
        description:
          "Insira sua senha atual e escolha uma nova (no mínimo {minLength} caracteres).",
        setTrigger: "Definir senha remota",
        setTitle: "Definir senha remota",
        setDescription:
          "Escolha a senha que os navegadores remotos usam para entrar como unsloth (no mínimo {minLength} caracteres). O aplicativo de desktop da Unsloth continua entrando automaticamente.",
        setSubmit: "Definir senha",
        setting: "Definindo...",
        setDone: "Senha definida.",
        currentPassword: "Senha atual",
        newPassword: "Nova senha",
        confirmPassword: "Confirmar nova senha",
        currentTooShort:
          "A senha atual deve ter no mínimo {minLength} caracteres.",
        newTooShort: "A nova senha deve ter no mínimo {minLength} caracteres.",
        mismatch: "As senhas não coincidem.",
        samePassword:
          "A nova senha deve ser diferente da senha atual.",
        update: "Atualizar senha",
        updating: "Atualizando...",
        updated: "Senha atualizada.",
        updateFailed: "Falha ao atualizar a senha.",
        newHasSpaces: "A nova senha não pode conter espaços.",
      },
      chatDefaults: "Padrões do chat",
      autoTitleNewChats: "Gerar título automático para novos chats",
      autoTitleNewChatsDescription:
        "Gera um título curto a partir da primeira mensagem.",
      helperLlm: {
        sectionTitle: "LLM auxiliar",
        preloadOnStartup: "Armazenar o LLM auxiliar em cache na inicialização",
        preloadOnStartupDescription:
          "Baixa o modelo auxiliar do AI Assist em segundo plano na inicialização. Desativado por padrão; o AI Assist ainda pode baixá-lo sob demanda.",
        disabledByEnv:
          "Desativado por UNSLOTH_HELPER_MODEL_DISABLE no ambiente de backend.",
        loadError: "Falha ao carregar as configurações do LLM Auxiliar.",
        saveError: "Falha ao salvar as configurações do LLM Auxiliar.",
      },
      modelAutoSwitch: {
        sectionTitle: "Troca automática de modelo (API OpenAI)",
        enable: "Trocar de modelo por requisição",
        enableDescription:
          "Carrega, antes de responder, um GGUF baixado indicado em uma requisição da API. Desativado por padrão.",
        idleUnload: "Descarregamento automático por inatividade",
        idleUnloadDescription:
          "Libera a VRAM após esta quantidade de segundos de inatividade. 0 mantém o modelo carregado; o mínimo é 60.",
        idleSecondsAriaLabel:
          "Segundos até o descarregamento automático por inatividade",
        mediaIdleUnload:
          "Descarregamento automático por inatividade de imagem e vídeo",
        mediaIdleUnloadDescription:
          "Libera a VRAM descarregando os modelos de imagem e vídeo após esta quantidade de segundos de inatividade. É uma configuração própria: a de cima cobre apenas o modelo de chat. 0 os mantém carregados; o mínimo é 60.",
        mediaIdleSecondsAriaLabel:
          "Segundos até o descarregamento automático por inatividade de imagem e vídeo",
        mediaIdlePaused:
          "Pausado enquanto Manter o modelo na memória da GPU ou Descarregar apenas modelos carregados pela API estiver ativado.",
        idleNeedsEnable: "Primeiro, ative Trocar de modelo por requisição.",
        idleActiveViaEnv: "Ativo por meio de UNSLOTH_MODEL_IDLE_TTL.",
        loadError: "Falha ao carregar as configurações de troca automática de modelo.",
        saveError: "Falha ao salvar as configurações de troca automática de modelo.",
        idleError: "Insira 0 para manter o modelo carregado, ou pelo menos 60 segundos.",
        autoDownload: "Baixar modelos ausentes",
        autoDownloadDescription:
          "Busca um GGUF indicado em uma requisição da API que ainda não foi baixado. Com isso, qualquer pessoa com uma chave de API pode consumir disco e largura de banda.",
        keepKv: "Manter o contexto do chat ao descarregar por inatividade",
        keepKvDescription:
          "Salva o cache KV antes de um descarregamento por inatividade, para que chats retomados não releiam o histórico. Até 10 GB em disco.",
        apiOnly: "Descarregar apenas modelos carregados pela API",
        apiOnlyDescription:
          "O descarregamento por inatividade mantém na memória o modelo que você carregou pelo Studio e libera apenas os que uma requisição da API carregou.",
      },
      previewSharing: {
        sectionTitle: "Compartilhamento de pré-visualização",
        enableLabel: "Links públicos de pré-visualização",
        enableDescription:
          "Permite que qualquer pessoa com um link assinado converse com um modelo concluído, sem necessidade de login. Desative para tirar a superfície de pré-visualização pública do ar; os links compartilhados param de funcionar.",
        loadError: "Falha ao carregar as configurações de compartilhamento de pré-visualização.",
        saveError: "Falha ao salvar as configurações de compartilhamento de pré-visualização.",
        revokeLabel: "Revogar todos os links de pré-visualização",
        revokeDescription:
          "Rotaciona o segredo de assinatura para que todos os links que você compartilhou parem de funcionar. Links copiados recentemente continuam funcionando.",
        revokeAction: "Revogar links",
        revoking: "Revogando...",
        revokeConfirmTitle: "Revogar todos os links de pré-visualização?",
        revokeConfirmDescription:
          "Todos os links de pré-visualização que você compartilhou pararão de funcionar imediatamente. Isso não pode ser desfeito.",
        revokeConfirmAction: "Revogar todos os links",
        revoked: "Todos os links de pré-visualização foram revogados",
        revokeError: "Não foi possível revogar os links de pré-visualização",
      },
      notifications: {
        sectionTitle: "Notificações",
        showLlamaUpdates: "Notificações de atualização do llama.cpp",
        showLlamaUpdatesDescription:
          "Notifica quando uma versão mais recente do llama.cpp está disponível para executar novos modelos. Desative se você só treina modelos.",
        showLoadedModels: "Indicador de modelos carregados",
        showLoadedModelsDescription:
          "Mostra um pequeno cartão no canto inferior direito listando todos os modelos atualmente na memória (chat, fala, imagem, vídeo), com um botão para liberar cada um.",
      },
      startup: {
        sectionTitle: "Inicialização",
        launchAtLogin: "Executar o Unsloth ao fazer login",
        launchAtLoginDescription:
          "Inicia o Unsloth em segundo plano quando você faz login. Ele permanece na barra de menus ou na bandeja do sistema até você abri-lo.",

        closeToTray: "Fechar para a bandeja do sistema",
        closeToTrayDescription:
          "Mantém o Unsloth e seu servidor em execução em segundo plano ao fechar a janela principal.",
        closeToTraySaveError:
          "Não foi possível atualizar a configuração de fechar para a bandeja do sistema.",
        loadError:
          "Não foi possível carregar a configuração de inicialização no login.",
        saveError:
          "Não foi possível atualizar a configuração de inicialização no login.",
      },
      uploads: {
        sectionTitle: "Uploads",
        maxUploadSize: "Limite de upload do dataset de treino",
        maxUploadSizeDescription:
          "O padrão é {defaultSize} MB.",
      },
      rag: {
        sectionTitle: "Documentos e RAG",
        embeddingModel: "Modelo de embedding",
        embeddingModelDescription:
          "Modelo do Hugging Face ou caminho local usado para indexar e buscar seus documentos. O padrão é {defaultModel}.",
        reindexWarning:
          "Afeta apenas documentos recém-indexados. Reenvie os documentos existentes após alterar o modelo.",
        emptyError: "Insira um id de modelo do Hugging Face ou um caminho local.",
        loadError: "Falha ao carregar a configuração do modelo de embedding.",
        saveError: "Falha ao salvar o modelo de embedding.",
        saved: "Modelo de embedding salvo.",
        saveAnyway: "Salvar mesmo assim",
        resetAction: "Redefinir para o padrão",
      },
      storage: {
        sectionTitle: "Armazenamento",
        modelsFolder: "Pasta de modelos",
        modelsFolderDescription:
          "Onde os modelos baixados são armazenados.",
        openAction: "Abrir",
        copyAction: "Copiar caminho",
        copied: "Caminho copiado",
        openError: "Não foi possível abrir a pasta",
        copyError: "Não foi possível copiar o caminho",
      },
      resetPreferences: {
        sectionTitle: "Zona de perigo",
        label: "Redefinir todas as preferências locais",
        description:
          "Limpa apenas as preferências locais. Chats, acesso à API e configurações salvas no banco de dados são mantidos.",
        action: "Redefinir preferências",
        confirmTitle: "Redefinir todas as preferências locais?",
        confirmDescription:
          "Limpa as preferências locais e recarrega o Unsloth. Chats, acesso à API e configurações salvas no banco de dados são mantidos.",
        confirmAction: "Redefinir e recarregar",
      },
      permissions: {
        sectionTitle: "Permissões",
        bypassLabel: "Permissões de ferramentas",
        bypassDescription:
          "Como o Unsloth aprova as chamadas de ferramentas do chat (terminal, python, web, MCP) antes de executá-las. O modo “Full access” desativa as aprovações e o sandbox de código.",
      },
    },
    profile: {
      title: "Perfil",
      description: "Como seu perfil aparece no Unsloth.",
      changePicture: "Alterar foto de perfil",
      displayName: "Nome de exibição",
      nickname: "Como o Unsloth deve chamar você?",
      nicknamePlaceholder: "Apelido",
      nicknameSaved: "Nome preferido salvo",
      avatarShape: "Formato da foto de perfil",
      avatarShapeCircle: "Círculo",
      avatarShapeRounded: "Arredondado",
      greetingSloth: "Bicho-preguiça na saudação",
      greetingSlothDescription: "Mostra o bicho-preguiça na saudação do chat.",
      chooseSloth: "Ou escolha um bicho-preguiça",
      noPicture: "Sem foto de perfil",
      noneLabel: "Nenhuma",
      nameSaved: "Nome de perfil salvo",
      namePersistErrorTitle: "Não foi possível salvar o nome do perfil",
      namePersistErrorDescription:
        "O nome foi atualizado nesta sessão, mas talvez não seja mantido após recarregar a página.",
      photoUpdated: "Foto de perfil atualizada",
      photoPersistErrorTitle: "Não foi possível salvar a foto do perfil",
      photoPersistErrorDescription:
        "A foto foi atualizada nesta sessão, mas talvez não seja mantida após recarregar a página.",
      photoUpdateErrorTitle: "Não foi possível atualizar a foto de perfil",
      imageUseError: "Não foi possível usar esta imagem.",
      uploadPhoto: "Enviar foto",
      removePhoto: "Remover",
      pictureOptions: "Opções da foto de perfil",
      stats: {
        title: "Suas estatísticas",
        subtitle:
          "Tudo abaixo é calculado a partir do seu próprio histórico. Nada é coletado nem enviado ao Unsloth.",
        retry: "Tentar novamente",
        privacyNote:
          "As estatísticas são calculadas a partir do histórico de chats e de treinos guardado pela sua instalação do Unsloth. Nada é coletado e nada é enviado ao Unsloth ou a terceiros.",
        emptyChats:
          "Nenhum chat ainda. Comece uma conversa e suas estatísticas aparecerão aqui.",
        lifetimeTokens: "Tokens acumulados",
        peakTokens: "Dia de pico",
        longestChat: "Chat mais longo",
        currentStreak: "Sequência atual",
        longestStreak: "Maior sequência",
        activityTitle: "Atividade de tokens",
        activityDescription: "Período: {weeks} · {total}",
        mode: {
          daily: "Diária",
          weekly: "Semanal",
          cumulative: "Acumulada",
        },
        cellTooltip: "{date} · {tokens}, {messages}",
        weekTooltip: "Semana de {date} · {tokens}",
        less: "Menos",
        more: "Mais",
        insightsTitle: "Análise de atividade",
        totalChats: "Total de chats",
        totalMessages: "Total de mensagens",
        tokensIn: "Tokens enviados",
        tokensOut: "Tokens gerados",
        cachedTokens: "Tokens em cache",
        cachedValue: "{tokens} ({percent}% da entrada)",
        avgTokensPerChat: "Média de tokens por chat",
        timeInChat: "Tempo em chats",
        activeDays: "Dias ativos",
        toolCalls: "Chamadas de ferramentas",
        attachments: "Arquivos anexados",
        avgSpeed: "Velocidade média",
        bestSpeed: "Resposta mais rápida",
        firstToken: "Tempo médio até o primeiro token",
        tokensPerSecond: "{value} tok/s",
        topModelsTitle: "Modelos mais usados",
        topModelsDescription: "Classificados por tokens trocados",
        modelSummary: "{tokens} · {messages}",
        noModels: "Nenhum uso de modelo registrado ainda.",
        trainingTitle: "Treino",
        trainingDescription: "Execuções de fine-tuning deste espaço de trabalho",
        trainingRuns: "Execuções",
        trainingCompleted: "Concluídas",
        trainingSteps: "Passos",
        trainingTokens: "Tokens treinados",
        trainingTime: "Tempo de treino",
        bestLoss: "Melhor loss",
        runSteps: "{steps}",
        runLoss: "loss {loss}",
      },
    },
    appearance: {
      title: "Aparência",
      description: "A aparência do Unsloth neste dispositivo.",
      theme: {
        title: "Tema",
        label: "Esquema de cores",
        description: "Tema claro, escuro ou o mesmo do sistema.",
        system: "Sistema",
        light: "Claro",
        dark: "Escuro",
      },
      palette: {
        label: "Paleta de cores",
        description: "Cores usadas no Unsloth, nos modos claro e escuro.",
        standard: "Padrão",
        classic: "Clássico",
        minimal: "Minimalista",
      },
      custom: {
        reset: "Redefinir",
        resetAll: "Redefinir personalização",
        preferencesTitle: "Preferências",
        colors: {
          lightGroup: "Tema claro",
          darkGroup: "Tema escuro",
          accent: "Destaque",
          background: "Fundo",
          foreground: "Texto",
        },
        fontDefault: "Padrão",
        fontBundledGroup: "Integradas",
        fontImportedGroup: "Importadas",
        fontDeviceGroup: "Neste dispositivo",
        fontFolderGroup: "Da pasta",
        fontDeviceLoading: "Procurando fontes do dispositivo…",
        fontSearch: "Buscar fontes…",
        fontNoResults: "Nenhuma fonte encontrada.",
        colorPicker: {
          hue: "Matiz",
          hex: "Cor hexadecimal",
          eyedropper: "Escolher uma cor da tela",
        },
        uiFont: {
          label: "Fonte da interface",
        },
        headingFont: {
          label: "Fonte de títulos",
        },
        chatFont: {
          label: "Fonte do chat",
        },
        codeFont: {
          label: "Fonte de código",
        },
        importFont: {
          upload: "Enviar",
          scanFolder: "Selecionar pasta",
          alreadyAvailable: "Esta fonte já está disponível, então a cópia existente será usada.",
          folderNoFonts: "Nenhum arquivo de fonte encontrado nessa pasta.",
          remove: "Remover",
          errorInvalidType:
            "Tipo de arquivo não suportado. Use .woff2, .woff, .ttf ou .otf.",
          errorTooLarge: "O arquivo de fonte é muito grande (máx. 1,5 MB).",
          errorLimit: "Você pode importar até 3 fontes.",
          errorStorageFull: "Sem espaço de armazenamento local para esta fonte. Remova uma fonte importada primeiro.",
          errorFailed: "Não foi possível carregar este arquivo de fonte.",
        },
        uiFontSize: {
          label: "Tamanho da fonte da interface",
          description: "Ajuste o tamanho base da interface do Unsloth.",
        },
        codeFontSize: {
          label: "Tamanho da fonte de código",
          description: "Ajuste o tamanho base do código.",
        },
        fontSmoothing: {
          label: "Suavização de fonte",
          description: "Usar anti-aliasing suavizado nas fontes.",
        },
        contrast: {
          label: "Contraste",
          description: "Intensidade das bordas e do texto secundário.",
        },
        reduceMotion: {
          label: "Reduzir movimento",
          description: "Reduza as animações ou siga o sistema.",
          system: "Sistema",
          on: "Ativado",
          off: "Desativado",
        },
        pointerCursors: {
          label: "Usar cursor de ponteiro",
          description:
            "Muda o cursor para ponteiro ao passar sobre elementos interativos.",
        },
      },
      language: {
        title: "Idioma",
        label: "Idioma de exibição",
        description: "O idioma utilizado pelo Unsloth.",
        autoDetect: "Detecção automática",
      },
      layout: {
        title: "Layout",
        compactSidebar: "Fixar barra lateral por padrão",
        compactSidebarDescription:
          "Mantém a barra lateral expandida em vez de recolhê-la em ícones.",
      },
      sidebarNav: {
        title: "Navegação da barra lateral",
        description:
          "Fixe e reordene as abas da barra lateral. As abas não fixadas ficam no menu Mais; se só houver uma aba não fixada, ela é ocultada em vez de virar um menu de um item só. Novo chat permanece fixo.",
        dragToReorder: "Arraste para reordenar",
        pinToSidebar: "Fixar {name} na barra lateral",
        moreHolds: "Mais ({count})",
      },
      sidebarMenu: {
        title: "Menu da barra lateral",
        description:
          "Mostre, oculte e reordene os itens do menu de perfil da barra lateral. Configurações, Ajuda, Sair e Desligar permanecem fixos.",
        darkModeToggle: "Alternador de modo escuro",
        dragToReorder: "Arraste para reordenar",
      },
    },
    resources: {
      title: "Sistema",
      description: "Monitore o hardware e o armazenamento deste servidor Unsloth.",
      liveUpdates: "Atualizações ao vivo",
      floatingWindow: "Janela flutuante",
      disableOverlay: "Desativar sobreposição",
      liveMonitor: {
        title: "Monitor ao vivo",
        apiTitle: "Monitor da API",
        summary: "Solicitações ativas, erros e uso de tokens",
        status: "{active} ativas · {recent} recentes · {model}",
        noModelLoaded: "nenhum modelo carregado",
        autoOpen: "Mostrar o monitor flutuante automaticamente",
        autoOpenDescription:
          "Abre um pequeno painel quando chega tráfego da API.",
        cpu: "CPU",
        ram: "RAM",
        disk: "Disco",
        vram: "VRAM",
        cpuCores: "{logical} lógicos / {physical} físicos",
        currentLoad: "Carga atual",
        free: "{value} livres",
        noGpu: "Nenhuma GPU visível",
      },
      gpu: {
        title: "Dispositivos de GPU",
        ggufInference: "Inferência com GGUF",
        unavailable: "indisponível",
        noGpu: "Nenhuma GPU visível detectada. Os recursos somente CPU aparecem acima.",
        unknownDevice: "GPU desconhecida",
        deviceWithIndex: "GPU {index}",
        vramUtilization: "VRAM",
        used: "{value} usados",
        free: "{value} livres",
        total: "{value} total",
      },
      llamaBackend: {
        title: "GGUF inference engine",
        label: "Compute backend",
        description: "The backend llama.cpp uses to run GGUF models.",
        runningOn: "llama.cpp currently runs on {backend}.",
        hint: "Installs the llama.cpp build for this backend and keeps it across updates. Useful when the automatic choice crashes or your GPU driver does not support it. Only backends with a build for this machine are listed; training is unaffected.",
        autoWith: "Automatic ({backend})",
        apply: "Apply",
        applying: "Installing...",
        applyHint: "Downloads the new build and restarts llama.cpp. A loaded model is unloaded.",
        applyHintWithSize: "Downloads {size} and restarts llama.cpp. A loaded model is unloaded.",
        switchedTo: "llama.cpp now runs on {backend}.",
        switchFailed: "Could not change the llama.cpp backend.",
        switchInterrupted: "The switch was interrupted before completion.",
        envLocked: "Set to {backend} by the UNSLOTH_LLAMA_CPP_BACKEND environment variable, which overrides this setting.",
        backends: {
          auto: "Automatic",
          cpu: "CPU",
          cuda: "CUDA",
          rocm: "ROCm",
          vulkan: "Vulkan",
          metal: "Metal",
        },
        unsupported: {
          notInstalled: "No managed llama.cpp install was found, so there is no backend to switch.",
          localLink: "llama.cpp is a local directory you linked yourself, so Unsloth will not replace it.",
          sourceBuild: "This llama.cpp was built from source, so its backend cannot be switched from here.",
          unresolved: "The available backends could not be checked. Check your connection and try again.",
        },
        // Not rendered: extra terms the settings search matches these rows on.
        llamaBackendKeywords:
          "llama.cpp backend gguf inference cuda rocm hip vulkan metal cpu gpu accelerator prebuilt switch engine",
      },
      modelMemory: {
        title: "Memória do modelo",
        keepResident: "Manter o modelo na memória da GPU",
        keepResidentDescription: "Permanece na VRAM entre os prompts.",
        keepResidentHint: "Não devolve os pesos à RAM do sistema enquanto o modelo continuar carregado. Desativa a descarga automática por inatividade e, quando os pesos de fato ficam na RAM do host (memória unificada ou offload parcial para a GPU), também passa --mlock, para que o sistema operacional não os pagine e os reenvie no próximo prompt.",
        noRamReserve: "Não reservar RAM do sistema para o modelo",
        noRamReserveDescription: "Não mantém uma cópia completa na RAM.",
        noRamReserveHint: "Transfere os pesos para a VRAM em vez de manter uma cópia completa na RAM. Mantém o carregamento mapeado em memória do llama.cpp e remove --no-mmap e --mlock.",
        mlockVetoed: "--mlock continua desativado: fixar o modelo reservaria RAM para todo ele. A descarga automática por inatividade continua desativada.",
        memlockCapped: "Este sistema limita a memória bloqueada a {limit}. Um modelo maior não será totalmente fixado; aumente o limite com ulimit -l.",
        reloadRequired: "Recarregue o modelo para aplicar as novas opções de memória.",
        loadError: "Falha ao carregar as configurações de memória do modelo",
        saveError: "Falha ao salvar as configurações de memória do modelo",
        // Not rendered: extra terms the settings search matches these rows on.
        modelMemoryKeywords:
          "mlock memlock ulimit vram gpu memoria ram residente fixar travar manter carregado descarregar ocioso mmap no-mmap load-mode paginacao swap",
      },
      storage: {
        title: "Armazenamento",
        systemDisk: "Disco do sistema",
        diskUsage: "{used} usados / {total}",
        diskFree: "{free} livres",
        modelsFolder: "Pasta de modelos",
        modelsFolderKeywords:
          "modelos pasta diretorio diretório caminho local localizacao localização downloads baixar cache armazenamento disco unidade mover alterar models folder path hugging face",
        modelsFolderDescription: "Onde os modelos baixados são armazenados.",
        modelsFolderHint: "Onde os modelos baixados são armazenados. Altere para manter os modelos fora da sua unidade de sistema. Vale apenas para novos downloads. Os modelos que você já tem permanecem onde estão.",
        openAction: "Abrir",
        copyAction: "Copiar caminho",
        copied: "Caminho copiado",
        openError: "Não foi possível abrir a pasta",
        copyError: "Não foi possível copiar o caminho",
        futureDownloads: "Apenas novos downloads",
        environmentManaged: "Gerenciado pela variável de ambiente {variable}.",
        locationFree: "{free} livres",
        changeAction: "Alterar",
        resetAction: "Usar o padrão",
        chooseTitle: "Escolher o local de download dos modelos",
        chooseAction: "Usar para downloads futuros",
        cacheSaved: "Local de download dos modelos atualizado",
        cacheSaveError:
          "Não foi possível atualizar o local de download dos modelos",
        cachePickerError: "Não foi possível abrir o seletor de pastas",
      },
      environment: {
        title: "Ambiente",
        backend: "Backend",
        python: "Python",
        torch: "Torch",
        transformers: "Transformers",
        uptime: "Tempo de atividade",
        processMemory: "Memória do processo",
        notInstalled: "Não instalado",
        unknown: "Desconhecido",
      },
    },
    agents: {
      title: "Agentes",
      description:
        "Conecte agentes de código como Claude Code e Codex a um modelo local com unsloth start.",
      intro:
        "conecta Claude Code, Codex, Hermes, OpenClaw, OpenCode e outros agentes a um modelo servido localmente pelo Unsloth, totalmente offline. Ele executa um servidor compatível com a API da OpenAI e nunca altera os arquivos de configuração do seu agente.",
      readDocs: "Ler a documentação",
      copy: "Copiar",
      copied: "Copiado",
      commandBuilder: "Construtor de comandos",
      agent: "Agente de código",
      model: "Modelo",
      searchModels: "Buscar modelos GGUF...",
      noModels: "Nenhum modelo GGUF correspondente.",
      showingModels:
        "Mostrando {shown} de {total} resultados. Continue digitando para refinar a lista.",
      quantization: "Quantização",
      loadingQuantizations: "Carregando quantizações...",
      noQuantizations: "Sem quantização separada",
      recommended: "Recomendado",
      downloaded: "Baixado",
      quantizationLoadError:
        "Não foi possível carregar todas as quantizações. O comando usará o valor de modelo disponível.",
      generatedCommand: "Comando gerado",
      docs: "Documentação",
      agentDocs: "Abrir a documentação de configuração do {agent}",
      copyGeneratedCommand: "Copiar comando gerado",
      modelNote:
        "O Codex exige um modelo GGUF servido pelo llama-server. Outros agentes também podem usar modelos baseados em transformers; remova --model para usar o modelo já carregado no Unsloth.",
      subagent: {
        title: "Usar um modelo local como subagente",
        description:
          "Mantenha o {agent} no modelo atual e delegue tarefas selecionadas a este modelo local do Unsloth.",
        setupCommand: "Comando de configuração",
        copySetupCommand: "Copiar comando de configuração do subagente",
        usagePrompt: "Depois, no {agent}, digite:",
        copyUsagePrompt: "Copiar prompt de uso do subagente",
        defaultPrompt: "Crie um agente local para implementar esta função.",
        opencodePrompt: "@unsloth encontre a causa desta falha de teste",
      },
      quickstart: {
        title: "Montar um comando",
        description:
          "Inicie um agente com o modelo carregado no Studio. Carregue um modelo primeiro e depois troque claude por qualquer agente compatível abaixo.",
        noneDetected:
          "Nenhuma CLI de agente compatível foi encontrada no seu PATH.",
        installed: "Instalado",
      },
      supportedAgents: {
        title: "Agentes compatíveis",
        description: "Cada agente é iniciado com o próprio comando:",
        requiresGguf: "Precisa de um modelo GGUF",
      },
      models: {
        title: "Escolher um modelo",
        description:
          "Use --model para escolher um modelo e a quantização, e --context-length para definir a janela. Use um sufixo de quantização ou a flag explícita --gguf-variant.",
        suffixLabel: "Com sufixo de quantização",
        variantLabel: "Com a flag explícita de variante",
      },
      options: {
        title: "Opções comuns",
        description:
          "As flags do Unsloth são interpretadas primeiro; tudo o que ele não reconhecer é repassado direto ao agente.",
        model:
          "Seleciona um modelo. Sem --model, o unsloth start usa o modelo carregado no Studio e retorna erro se não houver nenhum.",
        contextLength:
          "Define o tamanho de contexto solicitado (alias: --max-seq-length).",
        ggufVariant: "Escolhe a variante de quantização GGUF.",
        loadIn4bit:
          "Ativa ou desativa o carregamento em 4 bits para modelos do Hugging Face.",
        tensorParallel:
          "Ativa ou desativa o paralelismo de tensores entre várias GPUs.",
        serve: "Ativa ou desativa o servidor local automático.",
        launch: "Inicia o agente ou apenas exibe o comando e o ambiente.",
        persist:
          "Mantém entre execuções o armazenamento de agentes gerenciado pelo Unsloth.",
        asSubagent:
          "Mantém o agente principal no modelo atual e registra o Unsloth como subagente local (Claude Code, Codex e OpenCode).",
        apiKey:
          "Informa sua chave de API do Unsloth (ou defina UNSLOTH_API_KEY).",
        yolo: "Pula os pedidos de aprovação. Use apenas em ambientes confiáveis.",
      },
      remote: {
        title: "Conectar a um Studio remoto",
        description:
          "Aponte o unsloth start para um Studio em execução em outro lugar, definindo estas variáveis antes de iniciar (ou passe --api-key diretamente):",
      },
      passthrough: {
        title: "Repassar argumentos ao agente",
        description:
          "Os argumentos após as flags do Unsloth são encaminhados ao próprio agente, então comandos nativos como resume continuam funcionando:",
      },
      dryRun: {
        title: "Visualizar sem iniciar",
        description:
          "Adicione --no-launch para exibir o ambiente e o comando em vez de iniciar o agente. Se --model estiver definido, o modelo ainda pode ser resolvido e carregado.",
      },
    },
    chat: {
      title: "Chat",
      description: "Personalize o funcionamento do chat neste dispositivo.",
      modelSelection: {
        title: "Configurações de seleção de modelo",
        expandQuantizations: "Expandir quantizações",
        expandQuantizationsDescription:
          "Ativado: os modelos GGUF em “On Device” exibem imediatamente suas quantizações. Desativado: clique em um modelo para ver suas quantizações.",
        showAllQuantizations: "Mostrar todas as quantizações",
        showAllQuantizationsDescription:
          "Ativado: lista todas as quantizações em “On Device”, inclusive as que não foram baixadas. Desativado: mostra apenas as quantizações baixadas.",
      },
      menu: {
        title: "Menu do chat",
        description:
          "Fixe itens no menu lateral do botão + do chat. Os demais ficam em “Mais”.",
        chatWithFiles: "Chat com arquivos (RAG)",
        mcp: "MCP",
        savedPrompts: "Prompts salvos",
        compareChat: "Comparar chats",
        exportChat: "Exportar chat",
      },
      showResponseModel: "Mostrar o modelo da resposta",
      showResponseModelDescription:
        "Mostra os metadados do modelo nas respostas do assistente.",
      modelDisclaimer: "Mostrar aviso do modelo",
      modelDisclaimerDescription:
        'Mostra "LLMs podem cometer erros" abaixo da caixa de chat.',
      thinking: {
        collapseByDefault: "Recolher o raciocínio por padrão",
        collapseByDefaultDescription:
          "Mantém o raciocínio recolhido enquanto o modelo pensa, em vez de abri-lo automaticamente. Expanda um bloco para lê-lo.",
      },
      artifacts: {
        title: "Canvas",
        collapseHtmlBlocks: "Recolher blocos HTML",
        collapseHtmlBlocksDescription:
          "O modo Canvas recolhe automaticamente páginas HTML completas. Ative esta opção para também recolher documentos HTML em blocos de código delimitados quando o Canvas estiver desativado.",
        allowNetworkAccess: "Permitir acesso à rede no canvas",
        allowNetworkAccessDescription:
          "Permite que as pré-visualizações do canvas carreguem scripts, estilos, fontes, mídia e recursos de rede de CDNs. Mantenha desativado para pré-visualizações totalmente offline.",
        blockedBanner: "{count} recurso externo de {hosts} bloqueado.",
        blockedBannerPlural: "{count} recursos externos de {hosts} bloqueados.",
        blockedBannerAction: "Permitir neste Canvas",
      },
      data: "Dados",
      exportHistory: "Exportar histórico de chat",
      exportHistoryDescription:
        "Baixe todos os chats e mensagens em formato JSON.",
      exportAction: "Exportar",
      exportingAction: "Exportando...",
      exportConversations: "Exportar Recentes e Projetos",
      exportConversationsDescription:
        "Baixe os chats de Recentes ou de Recentes e Projetos como JSONL bruto, CSV ou JSONL do ShareGPT, em um arquivo combinado ou em arquivos separados por chat.",
      exportConversationsAction: "Exportar",
      exportScopeRecents: "Recentes",
      exportScopeAll: "Recentes + Projetos",
      exportCombinedSuffix: "(combinado)",
      exportPerChatSuffix: "(por chat)",
      importChats: "Importar chats",
      importChatsDescription:
        "Importe um export do Open WebUI, JSONL, NDJSON ou CSV para Recentes.",
      importChatsAction: "Importar",
      importNoConversations: "Nenhuma conversa encontrada no arquivo.",
      importedOneChat: "1 conversa foi importada para Recentes.",
      importedChatCount: "{count} conversas foram importadas para Recentes.",
      importingChats: "Importando chats: {count} até agora ({percent}%)...",
      importedChatCountPartial: "{count} conversas importadas para Recentes; {failed} não puderam ser salvas.",
      importFailed: "Falha na importação.",
      clearHistory: "Limpar histórico de chat",
      clearHistoryDescription: "Exclui o histórico de chat deste dispositivo.",
      clearAction: "Limpar",
      clearAllChats: "Limpar todos os chats",
      clearAllChatsDescription: "Exclui permanentemente todos os chats deste dispositivo.",
      noChatsToClear: "Nenhum chat para limpar.",
      clearOneChatDescription:
        "Exclui permanentemente o único chat deste dispositivo.",
      clearChatCountDescription:
        "Exclui permanentemente todos os {count} chats deste dispositivo.",
      clearChatsAction: "Limpar chats",
      clearOneChatTitle: "Limpar 1 chat?",
      clearChatsTitle: "Limpar {count} chats?",
      clearChatsConfirmDescription:
        "Exclui permanentemente todos os chats deste dispositivo. Esta ação não pode ser desfeita.",
      clearingAction: "Limpando...",
      clearOneChatAction: "Limpar 1 chat",
      clearChatCountAction: "Limpar {count} chats",
      clearedAllChats: "Todos os chats foram limpos",
      clearedOneChat: "1 chat foi limpo",
      clearedChatCount: "{count} chats foram limpos",
      someChatsCouldNotBeCleared: "Não foi possível limpar alguns chats",
      chatsClearedRemainOne:
        "{clearedCount} chats limpos; 1 chat restante. Por favor, tente novamente.",
      chatsClearedRemain:
        "{clearedCount} chats limpos; {remainingCount} chats restantes. Por favor, tente novamente.",
      oneChatClearedRemain:
        "1 chat limpo; {remainingCount} chats restantes. Por favor, tente novamente.",
      oneChatClearedRemainOne: "1 chat limpo; 1 chat restante. Por favor, tente novamente.",
      storageClearFailedOne:
        "Falha ao limpar o armazenamento; 1 chat pode ter restado. Por favor, tente novamente.",
      storageClearFailed:
        "Falha ao limpar o armazenamento; {count} chats podem ter restado. Por favor, tente novamente.",
      failedToClearChats: "Falha ao limpar os chats",
    },
    data: {
      title: "Dados",
      backToData: "Voltar para Dados",
      exportFailed: "Não foi possível exportar os chats",
      description:
        "Gerencie o histórico de chats e os arquivos enviados que ficam armazenados neste dispositivo.",
      archivedChats: "Chats arquivados",
      archivedChatsDescription: "Veja e gerencie os chats que você arquivou.",
      archivedImages: "Imagens arquivadas",
      archivedImagesDescription: "Veja e gerencie as imagens que você arquivou.",
      archivedVideos: "Vídeos arquivados",
      archivedVideosDescription: "Veja e gerencie os vídeos que você arquivou.",
      manageAction: "Gerenciar",
      exportArchivedChats: "Exportar",
      exportingArchivedChats: "Exportando...",
      exportedOneArchivedChat: "1 chat arquivado exportado",
      exportedArchivedChatCount: "{count} chats arquivados exportados",
      noArchivedChatsToExport: "Nenhum chat arquivado para exportar.",
      failedToExportArchivedChats: "Falha ao exportar os chats arquivados",
      archiveAllChats: "Arquivar todos os chats",
      archiveAllChatsDescription:
        "Arquiva todos os chats de Recentes e Projetos.",
      noChatsToArchive: "Nenhum chat para arquivar.",
      archiveAllAction: "Arquivar todos",
      archivingAction: "Arquivando...",
      archiveAllChatsTitle: "Arquivar todos os chats?",
      archiveAllChatsConfirmDescription:
        "Arquiva todos os chats deste dispositivo. Os chats arquivados continuam disponíveis e podem ser desarquivados a qualquer momento.",
      archivedAllChats: "Todos os chats foram arquivados",
      archivedOneChat: "1 chat arquivado",
      archivedChatCount: "{count} chats arquivados",
      failedToArchiveChats: "Falha ao arquivar os chats",
      confirmBeforeDeleting: "Confirmar antes de excluir",
      confirmBeforeDeletingDescription:
        "Pede confirmação antes de excluir um chat. Desative para excluir imediatamente.",
      filesSection: "Arquivos",
      uploadedFiles: "Arquivos enviados",
      uploadedFilesDescription:
        "Veja e gerencie os arquivos enviados a chats, projetos e bases de conhecimento.",
      fineTuneExport: "Usar chats como dados de treino",
      fineTuneExportDescription:
        "Crie um dataset JSONL de fine-tuning a partir dos seus chats. Carregue-o em Treinar, refine-o em Receitas ou exporte-o.",
      fineTuneExportAction: "Exportar JSONL",
      fineTuneRunAction: "Executar",
      fineTuneExportingAction: "Exportando...",
      fineTuneOpenRecipesAction: "Abrir em Receitas",
      fineTuneOpeningRecipesAction: "Abrindo...",
      fineTuneTrainAction: "Carregar na aba Treinar",
      fineTuneTrainingAction: "Carregando...",
      fineTuneExportFailed: "Falha ao exportar os dados de treino",
      fineTuneRecipeFailed: "Falha ao abrir os chats em Receitas",
      fineTuneTrainFailed: "Falha ao carregar o dataset na aba Treinar",
    },
    connections: {
      title: "Conexões",
      description: "Gerencie provedores e conexões externas.",
    },
    apiKeys: {
      title: "API",
      description:
        "Acesse o Unsloth por meio da API compatível com OpenAI.",
      readDocs: "Leia a documentação da API",
      noAccess: "Nenhum acesso à API ainda.",
      accessTokens: "Tokens de acesso",
      loadError: "Não foi possível carregar o acesso à API.",
      createError: "Não foi possível criar o token de acesso.",
      revokeError: "Não foi possível revogar o token de acesso.",
      never: "Nunca",
      tokenNamePlaceholder: "Nome do token (ex.: produção)",
      newAccessTokenName: "Nome do novo token de acesso",
      createToken: "Criar token",
      creating: "Criando...",
      newTokenCreated: "Novo token de acesso criado",
      accessTokenCopied: "Token de acesso copiado",
      copyAccessToken: "Copiar token de acesso",
      copyNow: "Copie agora. O token não será exibido novamente.",
      usageExamples: "Exemplos de uso",
      usageTools: "Ferramentas",
      exampleCurlTools: "curl + ferramentas",
      examplePythonTools: "Python + ferramentas",
      exampleJavaScriptTools: "JavaScript + ferramentas",
      exampleCurlAdvanced: "curl + avançado",
      examplePythonAdvanced: "Python + avançado",
      exampleJavaScriptAdvanced: "JavaScript + avançado",
      osUnix: "Linux / macOS / WSL",
      osWindows: "Windows",
      secureHttps: "HTTPS seguro",
      secureHttpsHint:
        "O endereço 0.0.0.0 ainda está acessível globalmente. Para segurança total, inicie o Unsloth com --secure para expor apenas este link HTTPS.",
      copyTunnelUrl: "Copiar URL do túnel",
      copySnippet: "Copiar trecho de código",
      copy: "Copiar",
      copied: "Copiado",
      setupDocs: "Docs de configuração:",
      codingAgents: "Agentes de código",
      codingAgentsHint:
        "Inicie um agente de código conectado a este servidor. Ele usa o modelo carregado; um servidor local gera uma chave de API automaticamente, um remoto a inclui no comando.",
      codingAgentsSwap: "Troque claude por codex, openclaw, opencode ou hermes.",
      codingAgentDetected: "Instalado nesta máquina",
      codingAgentsDetectedHint: "Detectados nesta máquina: {agents}.",
      relativeNever: "nunca",
      relativeJustNow: "agora mesmo",
      expired: "expirado",
      today: "hoje",
      created: "Criado {value}",
      used: "Usado {value}",
      expires: "Expira {value}",
      actionsFor: "Ações para {name}",
      copyPrefix: "Copiar prefixo",
      revokeToken: "Revogar token",
      revokeTitle: 'Revogar token de acesso "{name}"?',
      revokeDescription:
        "Aplicativos que usam este token perderão o acesso imediatamente. Esta ação não pode ser desfeita.",
      revokeAction: 'Revogar "{name}"',
      revoking: "Revogando...",
      usageNoModel:
        "Carregue ou baixe um modelo para ver exemplos executáveis. Este servidor ainda não tem nenhum modelo para indicar.",
    },
    about: {
      title: "Sobre",
      description:
        "Documentação, notas de lançamento, feedback e informações da compilação.",
      studioVersion: "Versão do Unsloth",
      packageVersion: "Versão do pacote",
      desktopAppVersion: "Versão do aplicativo de desktop",
      desktopAppVersionUnavailable: "Indisponível",
      llamaCppVersion: "Versão do llama.cpp",
      hardware: "Hardware",
      gpu: "GPU",
      cuda: "CUDA",
      rocm: "ROCm",
      xpu: "XPU",
      updates: "Atualização",
      help: "Ajuda",
      documentation: "Documentação",
      releaseNotes: "Notas de lançamento",
      whatsNew: "O que há de novo",
      feedback: "Feedback",
      reportIssue: "Reportar um problema",
      license: {
        sectionTitle: "Licença",
        studioLabel: "Unsloth",
        studioLicense: "AGPL-3.0",
        studioDescription:
          "Código aberto sob a licença GNU AGPL v3.0.",
        libraryLabel: "Unsloth Core",
        libraryLicense: "Apache-2.0",
        libraryDescription: "Licenciado sob a licença Apache 2.0.",
      },
      dangerZone: "Zona de perigo",
      shutDownStudio: "Desligar o Unsloth",
      shutDownStudioDescription:
        "Interrompe o servidor Unsloth e encerra sua sessão.",
      shutDown: "Desligar",
      update: {
        title: "Atualizar Unsloth",
        commandText: "Texto de {label}",
        copied: "Copiado",
        copyCommand: "Copiar comando",
        commandCopied: "{label} copiado",
        copyNamedCommand: "Copiar {label}",
        checkingInstall: "Verificando como o Unsloth foi instalado...",
        installIntro: "Para instalar ou atualizar o Unsloth:",
        localUpdateHeading: "Atualização local",
        installCommandUnix: "Comando de instalação para macOS/Linux",
        installCommandWindows: "Comando de instalação para Windows",
        localInstallDetected:
          "Instalação local detectada. Atualize a partir da cópia de trabalho original para evitar substituí-la por uma instalação do PyPI.",
        pullThenUpdate:
          "Obtenha as alterações mais recentes e depois execute o instalador local:",
        gitPullCommand: "comando git pull",
        localInstallerCommand: "comando do instalador local",
        sourceInstallDetected:
          "Foi detectada uma instalação do pacote via código-fonte ou VCS. Reinstale a partir do caminho local original ou da URL do Git.",
        repoCheckoutFallback:
          "Se você ainda tiver a cópia local do repositório, execute o instalador local a partir dela:",
        restartAfterUpdate: "Reinicie o Unsloth após a atualização.",
        desktopManaged:
          "O aplicativo de desktop verifica automaticamente se há novas versões. Você também pode verificar ou atualizar aqui a qualquer momento.",
        desktopReady: "Atualizações do aplicativo de desktop",
        desktopReadyDescription:
          "Verifique se há uma versão mais recente do aplicativo de desktop.",
        desktopChecking: "Verificando se há atualizações",
        desktopCheckingDescription: "Isso costuma levar alguns segundos.",
        desktopAvailable:
          "A versão {version} do aplicativo de desktop está disponível",
        desktopAvailableDescription:
          "Atualize agora. O aplicativo de desktop será reiniciado quando a atualização terminar.",
        desktopExternalServer:
          "Execute `unsloth studio update` no terminal usado para iniciar o servidor.",
        desktopManualInstall:
          "Abra a página de lançamentos para instalar o pacote mais recente para Linux.",
        desktopCheckFailed: "Não foi possível verificar se há atualizações",
        desktopCheckFailedDescription:
          "Verifique sua conexão e tente novamente.",
        desktopCurrent: "O aplicativo de desktop está atualizado",
        desktopCurrentDescription:
          "O Unsloth continuará verificando automaticamente.",
        checkForUpdates: "Verificar se há atualizações",
        checkAgain: "Verificar novamente",
        retryCheck: "Tentar novamente",
        checking: "Verificando...",
        updateNow: "Atualizar agora",
        openReleasePage: "Abrir página de lançamentos",
        unknownInstall:
          "Não foi possível detectar como o Unsloth foi instalado. Para instalações via instalador ou PyPI, use os comandos acima.",
        localCheckout:
          "Para instalações feitas a partir de uma cópia local do repositório, execute o instalador local nesse diretório:",
        docs: "Docs de instalação:",
        docsInstall: "Instalação",
        docsUpdating: "Atualização",
        docsMac: "Mac",
        docsWindows: "Windows",
      },
    },
  },
  studio: {
    imageTraining: "Treinamento de imagens",
    goToImageTraining: "Ir para o treinamento de imagens",
    routeTitle: "Treinar",
    wizard: {
      modelTitle: "Modelo",
      modelDescription: "Escolha um modelo e um método de treinamento",
      datasetTitle: "Dataset",
      datasetDescription: "Selecione ou envie os dados de treinamento",
      paramsTitle: "Parâmetros",
      paramsDescription: "Configure os parâmetros de treinamento",
      configTitle: "Configuração",
      configDescription: "Salve e carregue configurações",
      modelLabel: "Modelo",
      methodLabel: "Método",
      datasetLabel: "Dataset",
      modelTooltip: "O modelo base que você quer ajustar.",
      methodTooltip: "Como o modelo é treinado. LoRA e QLoRA atualizam adaptadores pequenos em vez de todos os pesos.",
      datasetTooltip: "Os dados de treinamento usados para ajustar o modelo.",
      hfTokenDescription:
        "Necessário para modelos e conjuntos de dados restritos ou privados.",
      uploadLocalLabel: "Ou envie um arquivo local",
      sourceBrowse: "Procurar",
      releaseToUpload: "Solte para enviar",
      loadYaml: "Carregar YAML",
      saveYaml: "Salvar YAML",
      resetDefaults: "Restaurar padrões",
      cachedModelGoneTitle: "O modelo em cache não está mais disponível",
      cachedModelGoneDescription:
        "Os arquivos do modelo não estão mais neste dispositivo. Eles serão baixados novamente quando o treinamento começar.",
      cachedDatasetGoneTitle: "O dataset em cache não está mais disponível",
      cachedDatasetGoneDescription:
        "Os arquivos do dataset não estão mais neste dispositivo. Eles serão baixados novamente quando o treinamento começar.",
    },
    preview: {
      title: "Prévia da execução",
      ready: "Pronto",
      notReady: "Não está pronto",
      modelPending: "Modelo pendente",
      datasetPending: "Dataset pendente",
      method: "Método",
      length: "Duração",
      stepZero: "{count} passos",
      step: "{count} passo",
      stepTwo: "{count} passos",
      stepFew: "{count} passos",
      stepMany: "{count} passos",
      steps: "{count} passos",
      epochZero: "{count} épocas",
      epoch: "{count} época",
      epochTwo: "{count} épocas",
      epochFew: "{count} épocas",
      epochMany: "{count} épocas",
      epochs: "{count} épocas",
      batch: "Lote",
      context: "Contexto",
      lr: "LR",
      hardware: "Hardware",
      noGpu: "Nenhuma GPU detectada",
      hfToken: "Token do HF",
      saved: "Salvo",
      notSet: "Não definido",
      files: "Arquivos",
      model: "Modelo",
      dataset: "Dataset",
      downloadsOnStart: "Será baixado ao iniciar",
      continuesOnStart: "Continuará ao iniciar",
      noticeModelDownload:
        "Este modelo ainda não está no dispositivo. Ele será baixado automaticamente quando o treinamento começar.",
      noticeModelPartial:
        "O download incompleto do modelo será concluído antes do carregamento.",
      noticeDatasetDownload:
        "Este dataset ainda não está no dispositivo. Ele será baixado automaticamente quando o treinamento começar.",
      noticeDatasetPartial:
        "O download incompleto do dataset será concluído antes da leitura.",
      noticeTransformersUpgrade:
        "Nenhuma versão instalada do transformers suporta esta arquitetura ainda. Ao iniciar a execução, será oferecida a instalação do transformers {version} antes.",
      noticeSixteenBitOnly:
        "Esta arquitetura treina em LoRA de 16 bits: 4 bits não está disponível, então a execução precisa de muito mais VRAM que QLoRA.",
      noticeInstallSwitchesSixteenBit:
        "Instalar essa versão em vez de manter o código do próprio modelo muda esta execução para LoRA de 16 bits, que precisa de muito mais VRAM que QLoRA.",
      advancedSettings: "Configurações avançadas",
      defaultAdvancedSettings: "Padrões",
      nonDefaultAdvancedSettings: "{count} fora do padrão",
    },
    datasetPicker: {
      noun: "datasets",
      selectDataset: "Selecionar dataset",
      hubPlaceholder: "Buscar datasets no Hugging Face...",
      devicePlaceholder: "Buscar datasets locais...",
      useAsHubDataset: "Usar como dataset do Hugging Face",
      hfCacheLabel: "Cache do HF",
      scanningLocal: "Procurando datasets neste dispositivo…",
      couldntScan: "Não foi possível procurar datasets locais",
      someLocationsUnscanned:
        "Não foi possível verificar alguns locais de datasets.",
      noLocalDatasets:
        "Ainda não há nada neste dispositivo. Baixe um dataset do Hub, crie um em Receitas ou envie um arquivo.",
      openDataRecipes: "Abrir Receitas de Dados",
      searchingHub: "Buscando no Hugging Face…",
      noDatasetsFound: "Nenhum dataset encontrado.",
      tokenRejectedTitle: "Token do Hugging Face rejeitado",
      tokenRejectedBody:
        "Atualize seu token em Configurações → Geral e tente novamente.",
      hubUnreachable: "Não foi possível acessar o Hugging Face",
      cantUseDataset: "Não é possível usar o dataset",
      reasonInvalidHubId:
        "Insira um ID válido de dataset do Hugging Face: repositório ou proprietário/repositório, usando apenas letras, números, ., _ ou - (no máximo 96 caracteres por parte).",
      sourceRecipe: "Receita",
      sourceUpload: "Envio",
      sourceLocal: "Local",
    },
    modelPicker: {
      noun: "modelos",
      selectModel: "Selecionar modelo",
      hubPlaceholder: "Busque ou cole um ID do Hugging Face...",
      devicePlaceholder: "Busque modelos locais ou cole o caminho de uma pasta...",
      useAsHubModel: "Usar como modelo do Hugging Face",
      useAsLocalPath: "Usar como caminho local",
      hfCacheLabel: "Cache do HF",
      scanningLocal: "Procurando modelos locais…",
      couldntScan: "Não foi possível procurar modelos locais",
      someLocationsUnscanned:
        "Não foi possível verificar alguns locais deste dispositivo.",
      noLocalModels: "Nenhum modelo local encontrado.",
      noLocalModelsHint:
        "Cole o caminho de uma pasta acima ou mude para o Hugging Face.",
      searchingHub: "Buscando no Hugging Face…",
      noModelsFound: "Nenhum modelo encontrado.",
      tokenRejectedTitle: "Token do Hugging Face rejeitado",
      tokenRejectedBody:
        "Atualize seu token em Configurações → Geral e tente novamente.",
      hubUnreachable: "Não foi possível acessar o Hugging Face",
      cantUseModel: "Não é possível usar o modelo para treinamento",
      reasonTypeMismatch:
        "Este modelo não corresponde ao tipo de treinamento selecionado na etapa anterior.",
      reasonEmptyId: "Informe um ID de modelo ou um caminho de modelo local.",
      reasonInvalidHubId:
        "Insira um ID válido de modelo do Hugging Face: repositório ou proprietário/repositório, usando apenas letras, números, ., _ ou - (no máximo 96 caracteres por parte).",
      reasonGguf: "Modelos GGUF não podem ser treinados.",
      reasonAdapter:
        "Saídas de adaptadores não podem ser usadas como modelos base para treinamento.",
      reasonNotTrainable:
        "Este modelo no dispositivo não pode ser treinado.",
      reasonUnsupportedFormat:
        "Este formato de modelo não é compatível com treinamento.",
      vramNeeds: "Precisa de ~{est} GB de VRAM (GPU: {total} GB)",
      vramTight: "~{est} GB de VRAM (no limite de {total} GB)",
      vramApprox: "~{est} GB de VRAM",
      sourceModelsFolder: "Pasta de modelos",
      sourceHfCache: "Cache do HF",
      sourceLmStudio: "LM Studio",
      sourceOllama: "Ollama",
      sourceCustomFolder: "Pasta personalizada",
      sourceLocalModel: "Modelo local",
      vramOomBadge: "OOM",
      vramTightBadge: "No limite",
    },
    methods: {
      qlora: {
        label: "QLoRA",
        hint: "Quantização de 4 bits. Menor uso de VRAM e inicialização mais rápida.",
        note: "4 bits",
      },
      lora: {
        label: "LoRA",
        hint: "Adaptadores de 16 bits. Equilíbrio entre qualidade e memória.",
        note: "16 bits",
      },
      full: {
        label: "Fine-tuning completo",
        hint: "Treina todos os pesos. Maior qualidade e maior uso de VRAM.",
        note: "fp16",
      },
      cpt: {
        label: "Pré-treinamento contínuo",
        hint: "Pré-treinamento contínuo para novos domínios ou idiomas.",
        note: "contínuo",
      },
    },
    subtitles: {
      configure: "Configure e inicie o treinamento",
      trainingInProgress: "Treinamento em andamento",
      viewPastRuns: "Visualizar execuções de treino anteriores",
      viewingPastRun: "Visualizando execução anterior",
    },
    tabs: {
      configure: "Configurar",
      currentRun: "Execução Atual",
      history: "Histórico",
    },
    loadingRuntime: "Carregando ambiente de execução de treino...",
    checkingSupport: "Verificando se esta máquina oferece suporte a treino...",
    backToHistory: "Voltar ao histórico",
    dataset: {
      selectors: {
        subset: "Subconjunto",
        subsetTooltip:
          "Selecione qual subconjunto (configuração) do dataset usar.",
        trainSplit: "Divisão de treino",
        trainSplitTooltip: "Selecione qual divisão usar para o treinamento.",
        evaluationSplit: "Divisão de avaliação",
        evaluationSplitTooltip:
          "Selecione qual divisão usar para a avaliação. Nenhuma significa que não haverá avaliação durante o treinamento.",
        selectSubset: "Selecione um subconjunto...",
        selectSplit: "Selecione uma divisão...",
        none: "Nenhuma",
        loading: "Carregando configurações e divisões do dataset...",
        manualTitle: "Insira as opções do dataset manualmente",
        manualDescription:
          "Insira os nomes exatos da configuração e das divisões do Hugging Face que serão usados.",
        manualSubsetPlaceholder: "Nome de configuração opcional",
        manualRequired: "Uma divisão de treino é obrigatória.",
        manualTooLong: "Use no máximo 128 caracteres.",
        manualInvalid: "Este valor contém caracteres não suportados.",
      },
      sourceAriaLabel: "Origem do dataset",
      localDataset: "Dataset local",
      localDatasetRows: " / {count} linhas",
      huggingFaceDataset: "Dataset do Hugging Face",
      localDatasetMetadata: "Metadados do dataset local",
      dataRecipeOutput: "Saída da Receita de Dados.",
      rows: "Linhas",
      columns: "Colunas",
      batches: "Lotes",
      updated: "Atualizado",
      evalDataset: "Dataset de validação (Eval)",
      uploading: "Enviando...",
      uploadEvalFile: "Enviar arquivo de validação",
      fileTooLarge: "Arquivo muito grande",
      fileTooLargeDescription:
        "{file} tem {size}. Os uploads de treinamento aceitam até {limit}.",
      documentRedirect: {
        title: "Este arquivo precisa ser convertido primeiro",
        genericFile: "Este arquivo",
        description:
          "{file} é material de origem, não um dataset pronto para treinamento. Use Data Recipes para transformar o documento em um dataset e depois volte aqui para fazer o ajuste fino.",
        nextStepTitle: "Melhor próximo passo",
        nextStepDescription:
          "Abra Learning Recipes e comece com uma receita baseada em documento, como PDF grounded QA.",
        openAction: "Abrir Learning Recipes",
      },
      evalDatasetDescription:
        "Opcional. Se não for fornecido, uma pequena parte dos dados de treinamento será separada para validação.",
      advanced: "Avançado",
      targetFormat: "Formato de Destino",
      targetFormatTooltip:
        "Formato dos seus dados de treinamento. A detecção automática funciona para a maioria dos datasets.",
      streamingInfoAriaLabel: "Informações sobre o streaming do dataset",
      streaming: {
        label: "Ativar streaming",
        description:
          "Use datasets de texto do Hugging Face em streaming em vez de baixá-los.",
        unavailable: "Streaming indisponível. Para ativar:",
        completionsUnavailable:
          "Indisponível enquanto o streaming do dataset estiver ativado.",
        blockers: {
          source:
            "Use um dataset do Hugging Face (não um upload local nem uma origem S3).",
          maxSteps:
            "Defina Passos Máximos > 0 — datasets em streaming não têm comprimento conhecido.",
          trainOnCompletions:
            'Desative "Apenas respostas do assistente".',
          evalSplit:
            "Escolha uma divisão de validação separada — a validação está ativada, mas não há uma divisão distinta definida.",
          visionModel: "Modelos de visão não oferecem suporte a streaming.",
          audioModel: "Modelos de áudio não oferecem suporte a streaming.",
          embeddingModel:
            "Modelos de embeddings não oferecem suporte a streaming (o treinamento precisa do dataset completo).",
          imageDataset:
            "Este dataset parece conter imagens e não pode ser usado em streaming.",
          audioDataset:
            "Este dataset parece conter áudio e não pode ser usado em streaming.",
          appleSilicon:
            "O streaming ainda não é compatível com Apple Silicon (MLX).",
        },
        options: {
          trainOnCompletions: "apenas respostas do assistente",
          evaluation:
            "validação (precisa de uma divisão de validação separada)",
        },
        notifications: {
          turnedOffMaxSteps:
            "Streaming desativado: é necessário um valor fixo de Passos Máximos > 0.",
          adjusted:
            "Ajustado para streaming. Opções incompatíveis desativadas: {options}.",
          needsMaxSteps:
            "O streaming precisa de um valor fixo de Passos Máximos (datasets em streaming não têm comprimento conhecido). Primeiro, defina Passos Máximos > 0.",
          enabledAdjusted:
            "Streaming ativado. Opções incompatíveis desativadas: {options}.",
          disabledForDetectedModality:
            "O streaming foi desativado porque datasets de imagem e áudio precisam ser baixados por completo. Revise a configuração e inicie o treinamento novamente.",
        },
      },
      auto: "Auto",
      rawText: "Texto Bruto",
      trainSplitStart: "Início da Divisão de Treino",
      trainSplitStartTooltip:
        "Treine apenas em um subconjunto da sua divisão de treino especificando um índice de linha inicial (inclusivo, baseado em 0). Deixe em branco para começar da primeira linha.",
      trainSplitEnd: "Fim da Divisão de Treino",
      trainSplitEndTooltip:
        "Último índice de linha a ser incluído da divisão de treino (inclusivo, baseado em 0). Por exemplo, defina o Início como 0 e o Fim como 99 para treinar nas primeiras 100 linhas. Deixe em branco para usar todas as linhas restantes.",
      endPlaceholder: "Fim",
      clear: "Limpar",
      dropFileOrClick: "Solte 1 arquivo aqui ou clique para fazer upload",
      uploadDetails: "Detalhes do upload",
      uploadDetailsTooltip:
        "Até {limit} por arquivo. PDF, DOCX e TXT não são datasets prontos para treinamento; converta-os primeiro em Receitas.",
      viewDataset: "Visualizar dataset",
      uploadFailed: "Falha no envio",
      unknownError: "Erro desconhecido",
      unsupportedFileType: "Tipo de arquivo não suportado",
      uploadOneFileType: "Envie um arquivo do tipo {types}.",
      datasetUploaded: "Dataset enviado",
      evalDatasetUploaded: "Dataset de validação enviado",
      uploadOneFileAtATime: "Envie um arquivo por vez",
      uploadSingleFileDescription:
        "O upload do dataset de treinamento aceita apenas um único arquivo.",
      previewLoadingHuggingFace:
        "Buscando a pré-visualização do dataset no Hugging Face...",
      previewLoading: "Carregando pré-visualização...",
      mappingRequirements: {
        audioAndText: "áudio e texto",
        imageAndText: "imagem e texto",
        instructionAndOutput: "instrução e saída",
        humanAndGpt: "humano e GPT",
        userAndAssistant: "usuário e assistente",
      },
      mappingStatus: {
        heuristicTitle: "Mapeamento detectado por heurística",
        readyTitle: "Mapeamento pronto",
        requiredTitle: "Mapear colunas do dataset",
        heuristicDescription:
          "Detectamos automaticamente o mapeamento de colunas abaixo usando heurísticas. Revise e ajuste pelos menus nos cabeçalhos das colunas ou use a assistência de IA para um mapeamento mais preciso.",
        readyDescription:
          "Tudo certo. Converteremos este dataset automaticamente.",
        requiredDescription:
          "Atribua funções às colunas usando os menus nos cabeçalhos. Atribua pelo menos {required}.",
      },
      s3: {
        title: "Configuração do S3",
        description: "Carregue datasets em .parquet, .json, .jsonl ou .csv do Amazon S3",
        bucket: "Nome do Bucket",
        bucketPlaceholder: "meu-bucket-de-dados-de-treino",
        region: "Região da AWS",
        regionPlaceholder: "us-east-1",
        prefix: "Prefixo do Caminho",
        prefixPlaceholder: "datasets/whisper/",
        accessKeyId: "ID da Chave de Acesso",
        accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE",
        secretAccessKey: "Chave de Acesso Secreta",
        secretAccessKeyPlaceholder: "Sua chave de acesso secreta da AWS",
        useIamRole: "Usar Função IAM",
      },
    },
    params: {
      mode: {
        simple: "Simples",
        advanced: "Avançado",
        ariaLabel: "Modo dos parâmetros",
      },
      projectName: "Nome do Projeto",
      optional: "Opcional",
      projectNameDescription:
        "Usado nos nomes das pastas de saída do treinamento, nos padrões de exportação e no histórico.",
      loraSettings: "Configurações do LoRA",
      trainingHyperparameters: "Hiperparâmetros de Treinamento",
      maxSteps: "Passos Máximos (Max Steps)",
      epochs: "Épocas (Epochs)",
      useMaxSteps: "Usar Passos Máximos",
      useEpochs: "Usar Épocas",
      maxStepsTooltip: "Sobrescreve o total de passos do otimizador.",
      epochsTooltip: "Número de passagens completas pelo dataset.",
      contextLength: "Comprimento do Contexto",
      contextLengthTooltip: "Número máximo de tokens por amostra de treinamento.",
      customContextLength: "Insira um valor personalizado",
      learningRate: "Taxa de Aprendizado (Learning Rate)",
      learningRateTooltip:
        "Tamanho do passo para atualizações de peso. Valores menores treinam mais lentamente, mas com mais estabilidade.",
      learningRateDescription:
        "Recomendado: 2e-4 para LoRA, 5e-5 para CPT, 2e-5 para fine-tune completo",
      embeddingLearningRate: "Taxa de Aprendizado do Embedding",
      embeddingLearningRateTooltip:
        "Usado apenas quando o CPT está treinando embed_tokens. Os embeddings são mais fáceis de desestabilizar do que os pesos LoRA, por isso geralmente precisam de um LR menor. Deixe em branco para usar lr/10; a faixa típica de funcionamento é de 2x a 10x menor que o LR principal. Aumente apenas se a adaptação de vocabulário ou de tokens de domínio estiver muito lenta.",
      rank: "Rank",
      rankTooltip:
        "Dimensão das matrizes de baixo rank. Maior = mais capacidade.",
      alpha: "Alpha",
      alphaTooltip: "Fator de escala para atualizações LoRA. Geralmente o dobro do rank.",
      dropout: "Dropout",
      dropoutTooltip:
        "Probabilidade de dropout para as camadas LoRA para reduzir o overfitting.",
      visionLayers: "Camadas de visão",
      languageLayers: "Camadas de linguagem",
      attentionModules: "Módulos de atenção",
      mlpModules: "Módulos MLP",
      targetModules: "Módulos de Destino",
      enableLora: "Ativar LoRA",
      trainWithLora: "Treinar com LoRA",
      stableRank: "Stable Rank",
      memoryEfficient: "Eficiente em Memória",
      weightDecomposed: "Pesos Decompostos",
      notSupportedAppleSilicon: "Não compatível com Apple Silicon",
      optimization: "Otimização",
      schedule: "Cronograma",
      memory: "Memória",
      optimizer: "Otimizador",
      optimizerTooltip:
        "Algoritmo de otimização. Variantes de 8 bits reduzem o uso de memória. Fused é recomendado para modelos de visão.",
      optimizerTooltipMlx:
        "Algoritmo de otimização. AdamW é o padrão. Lion usa menos memória, mas normalmente requer uma taxa de aprendizado menor.",
      lrScheduler: "Agendador de LR",
      lrSchedulerTooltip:
        "Como a taxa de aprendizado muda ao longo do treino. Linear decai de forma constante; cosine decai em curva.",
      optimizerOptions: {
        adamw8bit: "AdamW 8-bit",
        pagedAdamw8bit: "Paged AdamW 8-bit",
        adamwBnb8bit: "AdamW BNB 8-bit",
        pagedAdamw32bit: "Paged AdamW 32-bit",
        adamwTorch: "AdamW (PyTorch)",
        adamwTorchFused: "AdamW (PyTorch Fused)",
      },
      lrSchedulerOptions: {
        linear: "Linear",
        cosine: "Cosine",
      },
      batchSize: "Tamanho do Lote (Batch Size)",
      batchSizeTooltip: "Amostras processadas por passo. Maior consome mais VRAM.",
      gradAccum: "Acúmulo de Gradiente",
      gradAccumTooltip: "Simula tamanhos de lote maiores sem gastar VRAM extra.",
      weightDecay: "Decaimento de Peso",
      weightDecayTooltip: "Regularização L2 para evitar overfitting.",
      warmupSteps: "Passos de Aquecimento (Warmup)",
      warmupStepsTooltip:
        "Aumenta gradualmente a LR no início do treino para garantir estabilidade.",
      scheduleEpochsTooltip:
        "Número de passagens completas pelo dataset. Defina 0 para rodar por passos máximos.",
      saveSteps: "Passos para Salvar",
      saveStepsTooltip: "Salva um checkpoint a cada N passos. 0 para desativar.",
      evalSteps: "Passos de Validação",
      evalStepsTooltip:
        "Fração dos passos totais de treino entre as validações (0-1). Defina como 0 para desativar. Ex: 0.01 = valida a cada 1% dos passos.",
      seed: "Seed",
      seedTooltip: "Semente aleatória para reprodutibilidade.",
      gradCheckpoint: "Checkpoint de gradiente",
      gradCheckpointTooltip:
        "Reduz o uso de memória ao recalcular as ativações, em troca de maior custo computacional.",
      none: "Nenhum",
      standard: "Padrão",
      enablePacking: "Ativar empacotamento (packing)",
      assistantCompletionsOnly: "Apenas respostas do assistente",
      readMore: "Leia mais",
    },
    training: {
      startTraining: "Iniciar Treinamento",
      starting: "Iniciando...",
      loadingModel: "Carregando modelo...",
      checkingDataset: "Verificando dataset...",
      chooseModel: "Escolher modelo",
      chooseDataset: "Escolher dataset",
      chooseModelAndDataset: "Escolher modelo e dataset",
      modelUnverified:
        "Não foi possível verificar os parâmetros deste modelo. Verifique sua conexão ou seu token do Hugging Face e tente novamente.",
      legacyDatasetScriptUnsupported:
        "Este dataset do Hub depende de um script personalizado legado e não é compatível com este fluxo de treinamento.",
      hfModelAccessDenied:
        "O Hugging Face negou o acesso a este modelo. Adicione um token válido do Hugging Face com acesso ao repositório, aceite os termos de acesso necessários e tente novamente.",
      hfModelVerificationRateLimited:
        "A verificação do modelo do Hugging Face está com limite de solicitações. Tente novamente em instantes.",
      hfModelVerificationFailed:
        "Não foi possível verificar o modelo do Hugging Face. Confira o ID do repositório e seu token de acesso.",
      hfModelMetadataUnavailable:
        "Os metadados do modelo do Hugging Face estão temporariamente indisponíveis. Tente novamente antes de iniciar o treinamento.",
      datasetUnverified:
        "Não foi possível verificar se o dataset é compatível com este modelo. Verifique sua conexão ou seu token do Hugging Face; o início do treinamento tentará verificar novamente.",
      setupChanged:
        "A configuração de treinamento mudou durante a verificação. Revise-a e inicie o treinamento novamente.",
      validation: {
        s3MultimodalUnsupported:
          "Datasets do S3 ainda não são compatíveis com treinamento de visão ou áudio.",
        s3BucketRequired: "Insira primeiro o nome de um bucket do S3.",
        s3CredentialsRequired:
          "Forneça as chaves de acesso do S3 ou ative a função do IAM.",
        modelRequired: "Selecione primeiro um modelo base.",
        learningRatePositive: "Insira uma taxa de aprendizado maior que zero.",
        embeddingLearningRateRange:
          "Insira uma taxa de aprendizado do embedding maior que 0 e menor que 1.",
        hfDatasetRequired: "Selecione primeiro um dataset do Hugging Face.",
        hfDatasetSplitRequired:
          "Selecione ou insira primeiro uma divisão de treino.",
        localDatasetRequired: "Selecione primeiro um dataset local.",
        unsupportedDatasetSource: "Fonte de dataset não compatível.",
      },
      startFailed: "Falha ao iniciar o treinamento",
      startUnconfirmed:
        "O Unsloth não conseguiu confirmar se o treinamento foi iniciado. O status está sendo verificado em segundo plano.",
      stopFailed: "Falha ao interromper o treinamento",
      trainingStillActiveTitle: "O treinamento ainda está ativo",
      stopBeforeConfig:
        "Interrompa o treinamento primeiro e depois volte à configuração.",
      resumeFailed: "Falha ao retomar o treinamento",
      resumeFailedTitle: "Não foi possível retomar o treinamento",
      resumeUnavailable:
        "Somente execuções de treinamento interrompidas ou com erro e que tenham um checkpoint salvo podem ser retomadas.",
      uploadConfigTooltip: "Carregar uma configuração YAML salva",
      saveConfigTooltip: "Baixar configuração atual como YAML",
      resetConfigTooltip: "Redefinir para os padrões do modelo",
      configLoaded: "Configuração carregada",
      failedToLoadConfig: "Falha ao carregar a configuração",
      invalidYamlFile: "Arquivo YAML inválido",
      configTooLarge:
        "O arquivo de configuração de treinamento é muito grande (máximo de 1 MiB).",
      failedToReadFile: "Falha ao ler o arquivo",
      failedToSaveConfig: "Falha ao salvar a configuração",
      parametersReset: "Parâmetros redefinidos para os padrões do modelo",
      audioIncompatible:
        "Este modelo não suporta áudio. Mude para um modelo compatível com áudio ou escolha um dataset sem áudio.",
      visionIncompatible:
        "O modelo de texto não é compatível com um dataset multimodal. Mude para um modelo de visão ou escolha um dataset apenas de texto.",
      cancelTitle: "Cancelar Treinamento",
      cancelDescription: "Deseja cancelar a execução de treino atual?",
      continueAction: "Continuar Treinamento",
      cancelAction: "Cancelar Treinamento",
      stopTitle: "Interromper Treinamento",
      stopDescription:
        "Escolha como interromper a execução de treino atual. Interromper e Salvar cria um checkpoint que poderá ser retomado mais tarde; se interromper sem salvar, não será possível retomar o treino.",
      stopAction: "Interromper",
      stopping: "Interrompendo...",
      stopAndSave: "Interromper e Salvar",
      compareInChat: "Comparar no Chat",
      exportModel: "Exportar Modelo",
      milestone: "Marco",
      halfwayDone: "Metade concluída. O treinamento passou de 50%.",
      doneNextStep:
        "Treinamento concluído. Próximo passo: compare as saídas do modelo base com as do modelo ajustado.",
    },
    history: {
      title: "Histórico",
      emptyDescription:
        "Nenhuma execução de treino ainda. Inicie sua primeira execução na aba Configurar.",
      loadError: "Falha ao carregar as execuções de treino",
      deleteError: "Falha ao excluir a execução de treino. Por favor, tente novamente.",
      retry: "Tentar novamente",
      loadMore: "Carregar mais",
      loading: "Carregando...",
      loadingRun: "Carregando execução de treino...",
      runNotFound: "Execução não encontrada",
      deleteTitle: "Excluir execução de treino?",
      deleteDescription:
        "Isso excluirá permanentemente esta execução de treino e todas as suas métricas. Esta ação não pode ser desfeita.",
      filesDeleted: "Arquivos excluídos",
      deleteArtifactsLabel:
        "Excluir também do disco os arquivos do adaptador",
      deleteArtifactsDescription:
        "Exclui a pasta de saída da execução, incluindo adaptadores e checkpoints salvos.",
      deleteArtifactsSharedNote:
        "Outra execução compartilha esta pasta de saída. Os arquivos serão mantidos até que a última execução que os utiliza seja excluída.",
      artifactsKeptShared:
        "Execução excluída. Os arquivos do adaptador foram mantidos porque outra execução usa a mesma pasta.",
      deleteArtifactsActiveError:
        "Esses arquivos estão sendo usados pelo treinamento atual. Interrompa o treinamento antes de excluí-los.",
      deleteArtifactsFailed:
        "A execução foi excluída, mas não foi possível apagar seus arquivos.",
      deleteArtifactsRetainedError:
        "Não foi possível remover os arquivos do adaptador, então a execução foi mantida no histórico.",
      resumeTraining: "Retomar treinamento",
      resuming: "Retomando...",
      deleteRun: "Excluir execução",
      loss: "Loss",
      steps: "Passos",
      lossTrendSparkline: "Minigráfico de tendência da loss",
      relativeJustNow: "agora mesmo",
      status: {
        completed: "Concluído",
        stopped: "Interrompido",
        error: "Erro",
        running: "Em andamento",
        continued: "Continuado",
      },
      message: {
        completed: "Treinamento concluído",
        stopped: "Treinamento interrompido",
        running: "Treinamento em andamento",
        errored: "Treinamento com erro",
      },
      copyPreviewLink: "Copiar link de pré-visualização",
      previewLinkCopied: "Link de pré-visualização copiado",
      previewLinkCopyFailed: "Não foi possível copiar o link",
    },
    charts: {
      settings: "Configurações do Gráfico",
      settingsDescription:
        "Ajuste a apresentação do gráfico enquanto o treinamento continua rodando.",
      openSettings: "Abrir configurações do gráfico",
      viewWindow: "Janela de visualização",
      viewWindowDescription: "Mostra apenas os passos mais recentes ou o histórico completo.",
      window: "Janela",
      all: "Tudo",
      trainingLoss: "Loss de Treinamento",
      trainingLossDescription: "Controle as sobreposições e a suavização EMA.",
      smoothing: "Suavização",
      smoothingDescription: "Mova para a direita para mais suavização. `0` = bruto.",
      showRawLoss: "Mostrar loss bruta",
      showSmoothedLoss: "Mostrar loss suavizada",
      showAverageLine: "Mostrar linha média",
      scaleAndCleanup: "Escala e limpeza",
      linear: "Linear",
      log: "Log",
      noClip: "Sem corte",
      clipP99: "Cortar p99",
      clipP95: "Cortar p95",
      lossAxis: "Eixo da loss",
      gradientNormAxis: "Eixo da norma do gradiente",
      learningRateAxis: "Eixo da taxa de aprendizado",
      resetDefaults: "Redefinir padrões",
      loss: "Loss",
      smoothed: "Suavizado",
      evalLoss: "Loss de Validação",
      learningRate: "Taxa de Aprendizado",
      lr: "LR",
      gradNorm: "Norma do Grad.",
      gradientNorm: "Norma do Gradiente",
      step: "Passo {step}",
      averageValue: "média {value}",
      waitingForFirstEvaluationStep: "Aguardando o primeiro passo de validação...",
      evaluationNotConfigured: "Validação não configurada",
      evalChartWillAppear: "O gráfico aparecerá assim que o eval_steps for alcançado",
      setEvalDatasetAndSteps:
        "Defina o dataset de validação e eval_steps para acompanhar a loss de validação",
    },
    progress: {
      title: "Progresso do Treinamento",
      liveMetrics: "Métricas de treino em tempo real",
      exportGguf: "Exportar para GGUF",
      openConfig: "Abrir configuração de treino",
      configLabel: "Configuração de Treino",
      hyperparams: "Hiperparâmetros",
      epochs: "Épocas",
      batchSize: "Tamanho do lote",
      learningRate: "Taxa de aprendizado",
      optimizer: "Otimizador",
      maxSteps: "Passos máximos",
      contextLength: "Comprimento do contexto",
      warmupSteps: "Passos de warmup",
      rank: "Rank",
      alpha: "Alpha",
      dropout: "Dropout",
      variant: "Variante",
      epoch: "Época {value}",
      percentComplete: "{percent}% completo",
      stepProgress: "Passo {current} / {total}",
      loss: "Loss",
      lr: "LR",
      gradNorm: "Norma do Grad.",
      project: "Projeto",
      model: "Modelo",
      method: "Método",
      elapsed: "Decorrido: {value}",
      eta: "ETA: {value}",
      stepsPerSecond: "{value} passos/s",
      noStepsPerSecond: "-- passos/s",
      tokens: "Tokens: {value}",
      gpuMonitor: "Monitor da GPU",
      live: "Ao vivo",
      utilization: "Utilização",
      temperature: "Temperatura",
      vram: "VRAM",
      power: "Energia",
      phase: {
        idle: "Ocioso",
        downloadingModel: "Baixando modelo",
        downloadingDataset: "Baixando dataset",
        loadingModel: "Carregando modelo",
        loadingDataset: "Carregando dataset",
        configuring: "Configurando",
        training: "Treinando",
        finalizing: "Salvando modelo",
        completed: "Concluído",
        error: "Erro",
        stopped: "Interrompido",
      },
    },
    trainingStart: {
      ready: "Pronto",
      downloading: "Baixando",
      preparing: "Preparando",
      left: "restam {eta}",
      downloaded: "{size} baixados",
      terminalStart: "> treinamento do unsloth iniciado...",
      preparingResources: "> Preparando modelo e dataset...",
      gettingReady: "> Estamos deixando tudo pronto para a sua execução...",
      waitingForFirstStep: "> {message} | aguardando o primeiro passo... ({step})",
      resumingTraining: "Retomando treinamento...",
      startingTraining: "iniciando treinamento...",
      dataset: "Dataset",
      datasetStreaming: "Dataset: streaming (sem download completo)",
      modelWeights: "Pesos do modelo",
    },
  },
} satisfies DeepPartialMessageTree<typeof en>;
