diff --git a/core/http/react-ui/public/locales/pt-BR/admin.json b/core/http/react-ui/public/locales/pt-BR/admin.json new file mode 100644 index 000000000..a10f157e4 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/admin.json @@ -0,0 +1,203 @@ +{ + "activity": { + "title": "Atividade", + "supporting": "Instalações, downloads e remoções nesta instância.", + "hide": "Ocultar", + "moveToHistory": "Mover para o histórico", + "moreCount": "mais {{count}}", + "waitingForInstaller": "aguardando o instalador", + "progressLabel": "Progresso de {{name}}", + "toNode": "para {{node}}", + "nodesDone": "{{done}} de {{total}} nós concluídos", + "timeLeft": "restam {{value}}", + "cancel": "Cancelar", + "cancelLabel": "Cancelar {{name}}", + "pause": "Pausar", + "pauseLabel": "Pausar {{name}} e manter os dados baixados", + "retry": "Tentar novamente", + "retryLabel": "Tentar novamente {{name}}", + "nodeCount": "{{count}} nós", + "showNodes": "Mostrar {{count}} nós", + "hideNodes": "Ocultar detalhes por nó", + "node": { + "done": "Concluído", + "failed": "Falhou", + "queued": "Na fila", + "workerBusy": "Worker ocupado", + "downloading": "Baixando" + }, + "kind": { + "model": "modelo", + "backend": "backend" + }, + "verb": { + "installing": "Instalando {{kind}}", + "installed": "{{kind}} instalado", + "removed": "{{kind}} removido", + "staged": "Modelo preparado", + "failed": "Não foi possível instalar {{kind}}", + "queued": "Na fila", + "staging": "Preparando modelo", + "removing": "Removendo {{kind}}", + "failedRemoval": "Não foi possível remover {{kind}}", + "failedStaging": "Não foi possível preparar o modelo" + }, + "phase": { + "resolving": "Resolvendo arquivos", + "downloading": "Baixando", + "verifying": "Verificando", + "committing": "Finalizando", + "persisting": "Salvando configuração" + }, + "clearHistory": "Limpar histórico", + "inProgress": "Em andamento", + "needsAttention": "Requer atenção", + "record": "Registro", + "historyNote": "Mantém as últimas 50 operações. O histórico fica na memória e é reiniciado quando o LocalAI reinicia.", + "emptyTitle": "Nenhuma operação desde a inicialização", + "emptyBody": "Instalações de modelos e backends aparecem aqui enquanto são executadas e permanecem como registro após a conclusão. O histórico fica na memória, portanto é reiniciado quando o LocalAI reinicia.", + "browseModels": "Procurar modelos", + "viewInModels": "Ver em Modelos", + "viewInBackends": "Ver em Backends", + "rowInstalled": "instalado em {{duration}}", + "rowFailed": "falhou: {{error}}", + "rowCancelled": "cancelado", + "rowRemoved": "removido", + "retryFailed": "Falha ao tentar novamente: {{message}}", + "filter": { + "all": "Todas", + "models": "Modelos", + "backends": "Backends", + "cluster": "Cluster" + }, + "summaryRunning_one": "{{count}} operação em andamento.", + "summaryRunning_other": "{{count}} operações em andamento.", + "summaryFailed_one": "{{count}} operação requer atenção.", + "summaryFailed_other": "{{count}} operações requerem atenção.", + "summaryQuiet_one": "Nada em execução. {{count}} operação desde a inicialização.", + "summaryQuiet_other": "Nada em execução. {{count}} operações desde a inicialização.", + "summaryIdle": "Nada em execução.", + "emptyFiltered": "Nenhuma operação corresponde a este filtro.", + "showAll": "Mostrar tudo", + "rowInstalledPlain": "instalado" + }, + "manage": { + "title": "Sistema", + "subtitle": "Gerenciar modelos e backends instalados" + }, + "settings": { + "title": "Configurações", + "subtitle": "Configurar as configurações de runtime do LocalAI", + "saved": "Configurações salvas com sucesso", + "saveFailed": "Falha ao salvar: {{message}}", + "loadFailed": "Falha ao carregar as configurações: {{message}}", + "sections": { + "branding": "Identidade visual", + "watchdog": "Watchdog", + "memory": "Memória", + "backends": "Backends", + "performance": "Desempenho", + "tracing": "Rastreamento", + "api": "API e CORS", + "p2p": "P2P", + "galleries": "Galerias", + "apikeys": "Chaves de API", + "agents": "Trabalhos de Agentes", + "agentpool": "Pool de Agentes", + "assistant": "Assistente LocalAI", + "distributed": "Distribuído", + "responses": "Respostas" + } + }, + "backends": { + "title": "Gerenciamento de Backends", + "subtitle": "Descubra e instale backends de IA para potencializar seus modelos" + }, + "backendLogs": { + "title": "Logs de Backends", + "subtitle": "Ver logs dos backends em execução", + "empty": "Nenhum log disponível" + }, + "traces": { + "title": "Rastreamentos", + "subtitle": "Ver requisições, respostas e operações de backend registradas" + }, + "nodes": { + "title": "Nós Distribuídos", + "subtitle": "Gerenciar nós workers de backend e de agentes" + }, + "scheduling": { + "title": "Agendamento", + "subtitle": "Regras de posicionamento de modelos e réplicas no cluster" + }, + "p2p": { + "title": "Computação de IA Distribuída", + "subtitle": "Escale suas cargas de trabalho de IA por vários dispositivos com distribuição ponto a ponto" + }, + "users": { + "title": "Usuários", + "subtitle": "Gerenciar usuários registrados, funções e convites" + }, + "usage": { + "title": "Uso", + "subtitle": "Estatísticas de uso de tokens da API", + "sources": { + "tab": "Origens", + "mixTitle": "Mix de origens", + "ribbonAria": "{{apikey}}% chaves de API, {{web}}% Web UI, {{legacy}}% Legado", + "topSources": "Principais origens ao longo do tempo", + "searchPlaceholder": "Buscar por nome ou prefixo", + "sortBy": "Ordenar", + "sortTokens": "Tokens", + "sortRequests": "Requisições", + "sortLastUsed": "Último uso", + "sortName": "Nome", + "sortUser": "Usuário", + "webUI": "Web UI", + "legacy": "Legado", + "revoked": "revogada", + "filteredTo": "Filtrado por: {{name}}", + "clearFilter": "Limpar filtro", + "other": "Outros ({{count}})", + "noTrafficShort": "Nenhuma requisição neste período.", + "noKeysYet": "Assim que houver requisições, você as verá detalhadas aqui.", + "createKey": "Criar sua primeira chave de API", + "truncatedWarning": "Mostrando as 200 principais chaves. Aplique um filtro para reduzir ainda mais." + } + }, + "explorer": { + "title": "Explorador", + "subtitle": "Navegar por arquivos e configurações" + }, + "operate": { + "overview": { + "title": "Visão geral", + "subtitle": "Tudo o que está em execução nesta instalação e tudo o que precisa de uma decisão.", + "attention": { + "heading": "Requer atenção", + "clear": "Nada requer atenção. Os backends estão atualizados, nenhuma operação falhou e todos os nós estão saudáveis.", + "backendUpdate": "Atualização disponível: {{from}} → {{to}}" + }, + "sections": { + "heading": "Seções", + "runtime": "Runtime", + "runtimeSummary": "{{backends}} backends · {{models}} modelos · {{updates}} atualizações · {{running}} em execução", + "cluster": "Cluster", + "clusterSummary": "{{nodes}} nós", + "observability": "Observabilidade", + "observabilitySummary": "Uso e rastreamentos", + "administration": "Administração", + "administrationSummary": "Usuários, middleware e configurações · {{memory}} de memória em uso", + "clusterSingle": "Nó único", + "observabilityCounted": "{{requests}} requisições · {{errors}} falhas · p95 {{p95}} ms" + }, + "headline": { + "requests": "Requisições · {{hours}}h", + "errors": "Requisições com falha", + "p95": "latência p95", + "quiet": "Nenhuma requisição atendida nesta janela ainda.", + "host": "Memória do host" + } + } + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/agents.json b/core/http/react-ui/public/locales/pt-BR/agents.json new file mode 100644 index 000000000..7cc352985 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/agents.json @@ -0,0 +1,55 @@ +{ + "title": "Agentes", + "subtitle": "Gerenciar agentes de IA autônomos", + "actions": { + "agentHub": "Central de Agentes", + "import": "Importar", + "createAgent": "Criar Agente", + "edit": "Editar", + "chat": "Conversar", + "export": "Exportar", + "delete": "Excluir", + "pause": "Pausar", + "resume": "Retomar" + }, + "table": { + "name": "Nome", + "status": "Status", + "events": "Eventos", + "actions": "Ações", + "eventsTooltip": "{{count}} eventos - Clique para ver" + }, + "search": { + "placeholder": "Buscar agentes...", + "summary_one": "{{shown}} de {{total}} agente", + "summary_other": "{{shown}} de {{total}} agentes" + }, + "empty": { + "noConfigured": "Nenhum agente configurado", + "noConfiguredText": "Crie um agente para começar com fluxos de trabalho autônomos de IA.", + "browseHub": "Não sabe por onde começar? Explore a <1>Central de Agentes para encontrar configurações de agentes prontas que você pode importar.", + "noMatching": "Nenhum agente correspondente", + "noMatchingText": "Nenhum agente corresponde a \"{{query}}\"" + }, + "sections": { + "yourAgents": "Seus Agentes", + "otherUsersAgents": "Agentes de Outros Usuários" + }, + "deleteDialog": { + "title": "Excluir Agente", + "message": "Excluir o agente \"{{name}}\"? Esta ação não pode ser desfeita.", + "confirm": "Excluir" + }, + "toasts": { + "loadFailed": "Falha ao carregar agentes: {{message}}", + "deleted": "Agente \"{{name}}\" excluído", + "deleteFailed": "Falha ao excluir agente: {{message}}", + "paused": "Agente \"{{name}}\" pausado", + "resumed": "Agente \"{{name}}\" retomado", + "pauseFailed": "Falha ao pausar agente: {{message}}", + "resumeFailed": "Falha ao retomar agente: {{message}}", + "exported": "Agente \"{{name}}\" exportado", + "exportFailed": "Falha ao exportar agente: {{message}}", + "parseFailed": "Falha ao analisar o arquivo do agente: {{message}}" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/auth.json b/core/http/react-ui/public/locales/pt-BR/auth.json new file mode 100644 index 000000000..2abf32124 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/auth.json @@ -0,0 +1,112 @@ +{ + "login": { + "subtitle": "Entre para continuar", + "registerSubtitle": "Crie uma conta", + "createAdminSubtitle": "Crie sua conta de administrador", + "tokenSubtitle": "Digite sua chave de API para continuar", + "email": "E-mail", + "emailPlaceholder": "voce@exemplo.com", + "name": "Nome", + "namePlaceholder": "Seu nome (opcional)", + "password": "Senha", + "passwordPlaceholder": "Digite a senha...", + "newPasswordPlaceholder": "Pelo menos 12 caracteres", + "confirmPassword": "Confirmar Senha", + "confirmPasswordPlaceholder": "Repita a senha", + "inviteCodeLabel": "Código de Convite", + "inviteCodeOptional": " (opcional — pule a espera de aprovação)", + "inviteCodePlaceholder": "Cole seu código de convite...", + "tokenPlaceholder": "Digite a chave de API...", + "tokenAltPlaceholder": "Digite o token de API...", + "signIn": "Entrar", + "signingIn": "Entrando...", + "register": "Registrar", + "creatingAccount": "Criando conta...", + "createAdminAccount": "Criar Conta de Administrador", + "signInWithGitHub": "Entrar com GitHub", + "signInWithSSO": "Entrar com SSO", + "loginWithToken": "Entrar com Token", + "showTokenLogin": "Entrar com Token de API", + "hideTokenLogin": "Ocultar login com token", + "noAccount": "Não tem uma conta?", + "hasAccount": "Já tem uma conta?", + "or": "ou", + "errors": { + "loginFailed": "Falha no login", + "registrationFailed": "Falha no registro", + "invalidToken": "Token inválido", + "passwordsDoNotMatch": "As senhas não coincidem", + "enterToken": "Digite um token", + "networkError": "Erro de rede", + "inviteRequired": "Um código de convite válido é obrigatório para registrar" + }, + "messages": { + "registrationPending": "Registro bem-sucedido, aguardando aprovação." + } + }, + "account": { + "title": "Conta", + "subtitle": "Perfil, credenciais e chaves de API", + "unavailable": "Conta indisponível", + "unavailableText": "A autenticação deve estar habilitada para gerenciar sua conta.", + "tabs": { + "profile": "Perfil", + "security": "Segurança", + "apiKeys": "Chaves de API" + }, + "profile": { + "displayName": "Nome de exibição", + "displayNameDescription": "Seu nome público de exibição", + "avatarUrl": "URL do avatar", + "avatarUrlDescription": "URL da sua foto de perfil", + "avatarUrlPlaceholder": "https://exemplo.com/avatar.png", + "save": "Salvar", + "saving": "Salvando...", + "updated": "Perfil atualizado", + "updateFailed": "Falha ao atualizar o perfil: {{message}}" + }, + "security": { + "currentPassword": "Senha atual", + "currentPasswordDescription": "Digite sua senha existente para verificar sua identidade", + "currentPasswordPlaceholder": "Senha atual", + "newPassword": "Nova senha", + "newPasswordDescription": "Deve ter pelo menos 12 caracteres", + "newPasswordPlaceholder": "Nova senha", + "confirmPassword": "Confirmar senha", + "confirmPasswordDescription": "Digite novamente sua nova senha", + "confirmPasswordPlaceholder": "Confirme a nova senha", + "changePassword": "Alterar senha", + "changing": "Alterando...", + "changed": "Senha alterada", + "passwordsDoNotMatch": "As senhas não coincidem", + "tooShort": "A nova senha deve ter pelo menos 12 caracteres", + "oauthOnly": "O gerenciamento de senha não está disponível para contas {{provider}}." + }, + "apiKeys": { + "create": "Criar chave de API", + "createDescription": "Gere uma chave para acesso programático", + "namePlaceholder": "Nome da chave (ex.: meu-app)", + "createButton": "Criar", + "creating": "Criando...", + "createdToast": "Chave de API criada", + "createFailed": "Falha ao criar a chave de API: {{message}}", + "loadFailed": "Falha ao carregar as chaves de API: {{message}}", + "revoke": "Revogar", + "revokeKey": "Revogar chave", + "revokeTitle": "Revogar Chave de API", + "revokeMessage": "Revogar a chave de API \"{{name}}\"? Esta ação não pode ser desfeita.", + "revoked": "Chave de API revogada", + "revokeFailed": "Falha ao revogar a chave de API: {{message}}", + "copyNow": "Copie agora — esta chave não será mostrada novamente", + "copiedToast": "Copiado para a área de transferência", + "copyFailed": "Falha ao copiar", + "empty": "Nenhuma chave de API ainda. Crie uma acima para obter acesso programático.", + "lastUsed": "último uso em {{date}}" + } + }, + "notFound": { + "title": "Página Não Encontrada", + "text": "Parece que esta página se perdeu. Vamos colocá-lo de volta no caminho certo.", + "goHome": "Ir para a Página Inicial" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/chat.json b/core/http/react-ui/public/locales/pt-BR/chat.json new file mode 100644 index 000000000..7f0aad636 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/chat.json @@ -0,0 +1,131 @@ +{ + "activity": { + "thought": "Pensamento", + "tool": "Ferramenta", + "result": "Resultado", + "toolResult": "Resultado de {{name}}", + "thinking": "Pensando..." + }, + "header": { + "manageModeTooltip": "Este chat pode instalar modelos, editar configurações e gerenciar backends conversando com o LocalAI.", + "modelInfo": "Informações do modelo", + "chatSettings": "Configurações do chat", + "modelInfoTitle": "Informações do Modelo: {{model}}", + "editConfig": "Editar configuração", + "close": "Fechar" + }, + "modelInfo": { + "backend": "Backend", + "modelFile": "Arquivo do modelo", + "contextSize": "Tamanho do contexto", + "threads": "Threads", + "mcp": "MCP", + "configured": "Configurado", + "chatTemplate": "Modelo de conversa", + "yes": "Sim", + "gpuLayers": "Camadas GPU" + }, + "context": { + "label": "Contexto: {{percent}}%", + "labelWithTokens": "Contexto: {{percent}}% ({{tokens}} tokens)" + }, + "settings": { + "title": "Configurações do Chat", + "manageMode": "Modo de gerenciamento", + "manageModeDesc": "Permita que este chat instale modelos, alterne backends e edite configurações conversando com o LocalAI.", + "systemPrompt": "Instrução do sistema", + "systemPromptPlaceholder": "Você é um assistente útil...", + "temperature": "Temperatura", + "topP": "Top P", + "topK": "Top K", + "contextSize": "Tamanho do contexto", + "contextSizePlaceholder": "2048", + "clearHistory": "Limpar histórico do chat" + }, + "empty": { + "manageTitle": "Gerencie o LocalAI conversando", + "manageText": "Peça para instalar modelos, alternar backends, editar configurações ou verificar o status. O assistente resumirá as ações e aguardará sua confirmação antes de alterar qualquer coisa.", + "startTitle": "Inicie uma conversa", + "readyText": "Pronto para conversar com {{model}}", + "selectModelText": "Selecione um modelo acima para começar", + "suggestionsManage": [ + "O que está instalado?", + "Instalar um modelo de chat", + "Mostrar o status do sistema", + "Atualizar um backend" + ], + "suggestionsChat": [ + "Explique como isto funciona", + "Ajude-me a escrever código", + "Resumir um documento", + "Gerar ideias" + ], + "recent": "Recente", + "noMessages": "Nenhuma mensagem ainda", + "hintEnter": "Enter para enviar", + "hintShiftEnter": "Shift+Enter para nova linha", + "hintAttach": "Anexar arquivos" + }, + "errors": { + "viewTraces": "Ver rastreamentos para detalhes" + }, + "actions": { + "copy": "Copiar", + "edit": "Editar", + "editMessage": "Editar mensagem", + "save": "Salvar", + "cancel": "Cancelar", + "regenerate": "Regenerar", + "branch": "Ramificar daqui", + "jumpToLatest": "Ir para a mais recente" + }, + "streaming": { + "transferring": "Transferindo modelo...", + "transferringTo": "Transferindo o modelo para {{node}}..." + }, + "tokens": { + "perSec": "{{count}} tok/s", + "peak": "Pico: {{count}} tok/s", + "usage": "{{prompt}}p + {{completion}}c = {{total}}" + }, + "input": { + "placeholder": "Mensagem...", + "attachFile": "Anexar arquivo", + "send": "Enviar mensagem", + "stopGenerating": "Parar a geração", + "canvasTitle": "Canvas — extrai blocos de código e mídia para um painel lateral para visualização, cópia e download", + "canvasLabel": "Canvas", + "openCanvas": "Abrir painel do canvas" + }, + "deleteAllDialog": { + "title": "Excluir Todos os Chats", + "message": "Excluir todos os chats? Esta ação não pode ser desfeita.", + "confirm": "Excluir todos" + }, + "toasts": { + "selectModel": "Selecione um modelo", + "copied": "Copiado para a área de transferência", + "copyFailed": "Não foi possível copiar para a área de transferência", + "chatCopied": "Chat copiado para a área de transferência", + "forked": "Novo chat criado" + }, + "menu": { + "trigger": "Chats", + "triggerTitle": "Conversas (Ctrl/Cmd+K)", + "search": "Buscar conversas...", + "clearSearch": "Limpar busca", + "noMatch": "Nenhuma conversa corresponde à sua busca", + "noConversations": "Nenhuma conversa ainda", + "rename": "Renomear", + "duplicate": "Duplicar chat", + "copyChat": "Copiar chat", + "exportMarkdown": "Exportar como Markdown", + "deleteChat": "Excluir chat", + "newChat": "Novo chat", + "clearAll": "Limpar tudo", + "deleteAllTitle": "Excluir todas as conversas" + }, + "message": { + "you": "Você" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/collections.json b/core/http/react-ui/public/locales/pt-BR/collections.json new file mode 100644 index 000000000..c492b69c7 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/collections.json @@ -0,0 +1,43 @@ +{ + "title": "Base de Conhecimento", + "subtitle": "Gerencie coleções de documentos para RAG de agentes", + "newPlaceholder": "Nome da nova coleção...", + "actions": { + "create": "Criar", + "creating": "Criando...", + "details": "Detalhes", + "reset": "Redefinir", + "delete": "Excluir", + "viewDetails": "Ver detalhes", + "resetCollection": "Redefinir coleção", + "deleteCollection": "Excluir coleção" + }, + "sections": { + "yourCollections": "Suas Coleções", + "otherUsersCollections": "Coleções de Outros Usuários" + }, + "empty": { + "title": "Nenhuma coleção ainda", + "text": "As coleções permitem organizar documentos em bases de conhecimento que os agentes podem pesquisar usando RAG (Retrieval-Augmented Generation). Crie uma coleção acima para começar.", + "noPersonal": "Você ainda não tem coleções." + }, + "deleteDialog": { + "title": "Excluir Coleção", + "message": "Excluir a coleção \"{{name}}\"? Isso removerá todas as entradas e não pode ser desfeito.", + "confirm": "Excluir" + }, + "resetDialog": { + "title": "Redefinir Coleção", + "message": "Redefinir a coleção \"{{name}}\"? Isso removerá todas as entradas, mas manterá a coleção.", + "confirm": "Redefinir" + }, + "toasts": { + "loadFailed": "Falha ao carregar coleções: {{message}}", + "created": "Coleção \"{{name}}\" criada", + "createFailed": "Falha ao criar a coleção: {{message}}", + "deleted": "Coleção \"{{name}}\" excluída", + "deleteFailed": "Falha ao excluir a coleção: {{message}}", + "reset": "Coleção \"{{name}}\" redefinida", + "resetFailed": "Falha ao redefinir a coleção: {{message}}" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/common.json b/core/http/react-ui/public/locales/pt-BR/common.json new file mode 100644 index 000000000..4b8ecf39c --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/common.json @@ -0,0 +1,115 @@ +{ + "unsaved": { + "title": "Descartar alterações não salvas?", + "message": "Você tem alterações não salvas que serão perdidas se você sair desta página.", + "leave": "Sair" + }, + "actions": { + "save": "Salvar", + "saving": "Salvando...", + "cancel": "Cancelar", + "close": "Fechar", + "confirm": "Confirmar", + "delete": "Excluir", + "edit": "Editar", + "add": "Adicionar", + "remove": "Remover", + "create": "Criar", + "update": "Atualizar", + "refresh": "Atualizar", + "reload": "Recarregar", + "retry": "Tentar novamente", + "search": "Buscar", + "filter": "Filtrar", + "clear": "Limpar", + "reset": "Redefinir", + "apply": "Aplicar", + "back": "Voltar", + "next": "Próximo", + "previous": "Anterior", + "open": "Abrir", + "submit": "Enviar", + "select": "Selecionar", + "selectAll": "Selecionar tudo", + "copy": "Copiar", + "copied": "Copiado", + "download": "Baixar", + "upload": "Enviar", + "import": "Importar", + "export": "Exportar", + "view": "Ver", + "details": "Detalhes", + "settings": "Configurações", + "help": "Ajuda", + "yes": "Sim", + "no": "Não", + "loading": "Carregando..." + }, + "status": { + "loading": "Carregando...", + "saving": "Salvando...", + "saved": "Salvo", + "ready": "Pronto", + "running": "Em execução", + "stopped": "Parado", + "starting": "Iniciando...", + "stopping": "Parando...", + "pending": "Pendente", + "active": "Ativo", + "inactive": "Inativo", + "enabled": "Habilitado", + "disabled": "Desabilitado", + "online": "Online", + "offline": "Offline", + "error": "Erro", + "success": "Sucesso", + "warning": "Aviso", + "info": "Informação", + "empty": "Nenhum item", + "none": "Nenhum", + "unknown": "Desconhecido" + }, + "dialogs": { + "confirmDelete": { + "title": "Confirmar exclusão", + "message": "Tem certeza de que deseja excluir isto? Esta ação não pode ser desfeita.", + "confirm": "Excluir", + "cancel": "Cancelar" + }, + "unsavedChanges": { + "title": "Alterações não salvas", + "message": "Você tem alterações não salvas. Deseja descartá-las?", + "discard": "Descartar", + "keepEditing": "Continuar editando" + } + }, + "forms": { + "required": "Obrigatório", + "optional": "Opcional", + "name": "Nome", + "description": "Descrição", + "type": "Tipo", + "value": "Valor", + "search": "Buscar...", + "selectPlaceholder": "Selecione uma opção...", + "noMatch": "Nenhuma correspondência" + }, + "time": { + "now": "agora", + "secondsAgo_one": "há {{count}} segundo", + "secondsAgo_other": "há {{count}} segundos", + "minutesAgo_one": "há {{count}} minuto", + "minutesAgo_other": "há {{count}} minutos", + "hoursAgo_one": "há {{count}} hora", + "hoursAgo_other": "há {{count}} horas", + "daysAgo_one": "há {{count}} dia", + "daysAgo_other": "há {{count}} dias" + }, + "units": { + "bytes": "B", + "kilobytes": "KB", + "megabytes": "MB", + "gigabytes": "GB", + "terabytes": "TB" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/errors.json b/core/http/react-ui/public/locales/pt-BR/errors.json new file mode 100644 index 000000000..6a10fc964 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/errors.json @@ -0,0 +1,17 @@ +{ + "generic": "Algo deu errado", + "network": "Erro de rede. Verifique sua conexão e tente novamente.", + "unauthorized": "Você não está autorizado a executar esta ação.", + "forbidden": "Acesso negado.", + "notFound": "O recurso solicitado não foi encontrado.", + "serverError": "Erro no servidor. Tente novamente mais tarde.", + "loadFailed": "Falha ao carregar: {{message}}", + "saveFailed": "Falha ao salvar: {{message}}", + "deleteFailed": "Falha ao excluir: {{message}}", + "updateFailed": "Falha ao atualizar: {{message}}", + "createFailed": "Falha ao criar: {{message}}", + "operationFailed": "Falha na operação: {{message}}", + "invalidInput": "Entrada inválida. Verifique o formulário e tente novamente.", + "tryAgain": "Tente novamente.", + "contactAdmin": "Se o problema persistir, entre em contato com o administrador." +} diff --git a/core/http/react-ui/public/locales/pt-BR/home.json b/core/http/react-ui/public/locales/pt-BR/home.json new file mode 100644 index 000000000..119af6174 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/home.json @@ -0,0 +1,119 @@ +{ + "cluster": { + "vram": "VRAM do cluster", + "ram": "RAM do cluster", + "nodesOnline": "{{healthy}}/{{total}} nós online" + }, + "resourceGpu": "GPU", + "resourceRam": "RAM", + "greeting": { + "morning": "Bom dia", + "afternoon": "Boa tarde", + "evening": "Boa noite", + "night": "Trabalhando até tarde" + }, + "statusLine": { + "modelsLoaded_one": "{{count}} modelo carregado", + "modelsLoaded_other": "{{count}} modelos carregados", + "noModelsLoaded": "Nenhum modelo carregado", + "nodes_one": "{{count}} nó", + "nodes_other": "{{count}} nós", + "loadedLabel": "Carregados", + "nodesLabel": "Nós" + }, + "assistant": { + "title": "Gerencie o LocalAI conversando", + "description": "Instale modelos, alterne backends, edite configurações e verifique o status conversando com o LocalAI.", + "open": "Abrir assistente", + "tooltip": "Gerencie o LocalAI conversando" + }, + "input": { + "placeholder": "Mensagem...", + "attachImage": "Anexar imagem", + "attachAudio": "Anexar áudio", + "attachFile": "Anexar arquivo", + "enterToSend": "Enter para enviar", + "selectModelFirst": "Selecione um modelo primeiro", + "sendMessage": "Enviar mensagem", + "selectModelToast": "Selecione um modelo primeiro" + }, + "quickLinks": { + "manageByChat": "Gerenciar por chat", + "installedModels": "Modelos Instalados", + "browseGallery": "Explorar Galeria", + "importModel": "Importar Modelo", + "documentation": "Documentação" + }, + "loadedModels": { + "heading": "Modelos ativos", + "count_one": "{{count}} modelo carregado", + "count_other": "{{count}} modelos carregados", + "stop": "Parar modelo", + "stopAll": "Parar todos", + "serving": "Servindo" + }, + "stopDialog": { + "title": "Parar Modelo", + "message": "Parar o modelo {{model}}?", + "confirm": "Parar {{model}}", + "stopAllTitle": "Parar Todos os Modelos", + "stopAllMessage": "Parar todos os {{count}} modelos carregados?", + "stopAllConfirm": "Parar todos", + "stoppedToast": "Modelo {{model}} parado", + "allStoppedToast": "Todos os modelos parados", + "stopFailed": "Falha ao parar: {{message}}" + }, + "wizard": { + "getStarted": "Comece com {{name}}", + "intro": "Instale seu primeiro modelo para começar. Explore a galeria ou importe o seu próprio.", + "steps": { + "step1Title": "Explore a Galeria de Modelos", + "step1Body": "Encontre o modelo certo para suas necessidades em nossa coleção selecionada.", + "step2Title": "Instale um Modelo", + "step2Body": "Clique em instalar para baixar e configurá-lo automaticamente.", + "step3Title": "Comece a Conversar", + "step3Body": "Converse com seu modelo direto do navegador ou use a API." + }, + "browseGallery": "Explorar Galeria de Modelos", + "importModel": "Importar Modelo", + "docs": "Documentação", + "noModelsTitle": "Nenhum Modelo Disponível", + "noModelsBody": "Ainda não há modelos instalados. Peça ao administrador para configurar modelos para você poder começar a conversar." + }, + "starters": { + "title": "Recomendados para o seu hardware", + "tier": { + "cpu": "Somente CPU", + "gpu-small": "GPU", + "gpu-mid": "GPU", + "gpu-large": "GPU" + }, + "cpuNote": "Nenhuma GPU detectada — estes modelos pequenos permanecem responsivos na CPU.", + "gpuNote": "Selecionados para caber na sua VRAM disponível com espaço para o contexto.", + "install": "Instalar", + "installing": "Instalando", + "installStarted": "Instalando {{model}}…", + "installFailed": "Falha na instalação: {{message}}" + }, + "connect": { + "title": "Um endpoint, toda API", + "subtitle": "O LocalAI oferece sua própria API completa — geração de imagem e vídeo, profundidade, detecção de objetos, reranking, áudio, reconhecimento facial e de voz, e voz em tempo real via WebRTC e WebSocket. Além disso, uma camada de compatibilidade permite que qualquer aplicativo criado para OpenAI, Anthropic, Ollama ou OpenAI Responses se comunique sem alterações.", + "nativeTitle": "API nativa", + "compatTitle": "Compatibilidade total", + "apiReference": "Referência completa da API", + "copy": "Copiar", + "copied": "Copiado", + "browse": "Explorar a API", + "hide": "Ocultar endpoints", + "dismiss": "Dispensar" + }, + "jump": { + "heading": "Continue de onde parou", + "discover": "Descobrir", + "discoverSummary": "Explore a galeria e instale modelos", + "create": "Criar", + "createSummary": "Abra uma sessão de chat, imagem ou voz", + "operate": "Operar", + "operateSummary": "{{models}} modelos configurados · nós, atividade e rastreamentos" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/importModel.json b/core/http/react-ui/public/locales/pt-BR/importModel.json new file mode 100644 index 000000000..1b0aec400 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/importModel.json @@ -0,0 +1,143 @@ +{ + "title": "Importar Novo Modelo", + "subtitle": { + "simple": "Importe um modelo de uma URI — a detecção automática escolhe o backend.", + "powerYaml": "Escreva a configuração YAML completa do modelo.", + "powerPrefs": "Preferências de importação refinadas." + }, + "actions": { + "import": "Importar Modelo", + "importing": "Importando...", + "create": "Criar", + "saving": "Salvando...", + "browseHF": "Explorar modelos no HF", + "addCustom": "Adicionar Personalizado", + "copy": "Copiar" + }, + "form": { + "modelUri": "URI do modelo", + "uriPlaceholder": "huggingface://TheBloke/Llama-2-7B-Chat-GGUF ou https://exemplo.com/modelo.gguf", + "uriHint": "Digite a URI ou o caminho do arquivo do modelo que deseja importar", + "supportedFormats": "Formatos de URI Suportados", + "options": "Opções", + "preferences": "Preferências (Opcional)", + "commonPreferences": "Preferências Comuns", + "customPreferences": "Preferências Personalizadas", + "customKeyValueHint": "Adicione pares de chave-valor personalizados para configuração avançada.", + "preferenceKey": "Chave da preferência da linha {{index}}", + "preferenceValue": "Valor da preferência da linha {{index}}", + "removePref": "Remover esta preferência", + "key": "Chave", + "value": "Valor", + "backend": "Backend", + "backendAuto": "Detecção automática (com base na URI)", + "backendLoading": "Carregando backends…", + "backendSearch": "Buscar backends...", + "backendHint": "Force um backend específico. Deixe vazio para detectar automaticamente pela URI. Itens marcados como \"seleção manual\" não são detectáveis automaticamente — escolha-os você mesmo se souber o que o modelo precisa.", + "backendErrorHint": "Não foi possível carregar a lista de backends — apenas detecção automática.", + "backendNotInstalled": "Este backend ainda não está instalado. Enviar a importação fará o download dele primeiro.", + "modelName": "Nome do Modelo", + "modelNamePlaceholder": "Deixe vazio para usar o nome do arquivo", + "modelNameHint": "Nome personalizado para o modelo. Se vazio, o nome do arquivo será usado.", + "description": "Descrição", + "descriptionPlaceholder": "Deixe vazio para usar a descrição padrão", + "descriptionHint": "Descrição personalizada para o modelo.", + "quantizations": "Quantizações", + "quantizationsPlaceholder": "q4_k_m,q4_k_s,q3_k_m (separados por vírgula)", + "quantizationsHint": "Quantizações preferidas (separadas por vírgula). Deixe vazio para o padrão (q4_k_m).", + "mmprojQuantizations": "Quantizações MMProj", + "mmprojQuantizationsPlaceholder": "fp16,fp32 (separados por vírgula)", + "mmprojQuantizationsHint": "Quantizações MMProj preferidas. Deixe vazio para o padrão (fp16).", + "embeddings": "Embeddings", + "embeddingsHint": "Habilite o suporte a embeddings para este modelo.", + "modelType": "Tipo do Modelo", + "modelTypePlaceholder": "AutoModelForCausalLM (para o backend transformers)", + "modelTypeHint": "Tipo de modelo para o backend transformers. Exemplos: AutoModelForCausalLM, SentenceTransformer, Mamba.", + "pipelineType": "Tipo de Pipeline", + "pipelineTypeHint": "Tipo de pipeline para o backend diffusers.", + "schedulerType": "Tipo de Scheduler", + "schedulerTypePlaceholder": "k_dpmpp_2m (opcional)", + "schedulerTypeHint": "Tipo de scheduler para o backend diffusers. Exemplos: k_dpmpp_2m, euler_a, ddim.", + "enableParameters": "Parâmetros Habilitados", + "enableParametersPlaceholder": "negative_prompt,num_inference_steps (separados por vírgula)", + "enableParametersHint": "Parâmetros habilitados para o backend diffusers (separados por vírgula).", + "cuda": "CUDA", + "cudaHint": "Habilite o suporte a CUDA para aceleração por GPU.", + "yamlEditor": "Editor de Configuração YAML", + "manualPick": "seleção manual", + "manualPickTooltip": "A detecção automática não roteará para este backend. Escolha-o aqui se você souber que é o que deseja." + }, + "modality": { + "text": "LLM de texto", + "asr": "Reconhecimento de fala", + "tts": "Texto para fala", + "image": "Imagem / Vídeo", + "video": "Geração de vídeo", + "embeddings": "Embeddings", + "reranker": "Rerankers", + "detection": "Detecção de objetos", + "vad": "Detecção de atividade de voz", + "other": "Outro" + }, + "powerTabs": { + "ariaLabel": "Aba do modo avançado", + "preferences": "Preferências", + "yaml": "YAML" + }, + "switchDialog": { + "title": "Manter suas preferências personalizadas?", + "body": "Alternar para o modo Simples oculta as preferências além de backend, nome e descrição. Elas ainda serão enviadas quando você importar.", + "cancel": "Cancelar", + "discard": "Descartar e alternar", + "keep": "Manter e alternar" + }, + "estimate": { + "title": "Requisitos estimados", + "download": "Download: {{size}}", + "vram": "VRAM: {{vram}}" + }, + "toasts": { + "noUri": "Digite uma URI de modelo", + "noYaml": "Digite a configuração YAML", + "started": "Importação iniciada! Acompanhando o progresso...", + "startedWithMeta": "Importação iniciada! Acompanhando o progresso... ({{meta}})", + "imported": "Modelo importado com sucesso!", + "importedYaml": "Configuração do modelo importada com sucesso!", + "importFailed": "Falha na importação: {{message}}", + "startImportFailed": "Falha ao iniciar a importação: {{message}}", + "backendsLoadFailed": "Não foi possível carregar a lista de backends — usando apenas detecção automática", + "modalityClearedBackend": "Seleção de backend limpa — ela não estava no grupo {{label}}.", + "copied": "Copiado para a área de transferência" + }, + "uriFormats": { + "huggingface": { + "title": "HuggingFace", + "standard": "Formato HuggingFace padrão", + "short": "Formato HuggingFace curto", + "fullUrl": "URL HuggingFace completa" + }, + "http": { + "title": "URLs HTTP/HTTPS", + "direct": "Download direto de qualquer URL HTTPS" + }, + "local": { + "title": "Arquivos Locais", + "filePath": "Caminho de arquivo local (absoluto)", + "directYaml": "Arquivo YAML de configuração local direto" + }, + "oci": { + "title": "Registro OCI", + "registry": "Registro de contêineres OCI", + "tarball": "Arquivo tarball OCI local" + }, + "ollama": { + "title": "Ollama", + "model": "Formato de modelo do Ollama" + }, + "yaml": { + "title": "Arquivos de Configuração YAML", + "remote": "Arquivo de configuração YAML remoto", + "local": "Arquivo de configuração YAML local" + } + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/media.json b/core/http/react-ui/public/locales/pt-BR/media.json new file mode 100644 index 000000000..2648d4665 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/media.json @@ -0,0 +1,461 @@ +{ + "studio": { + "tabs": { + "images": "Imagens", + "video": "Vídeo", + "tts": "TTS", + "sound": "Som", + "transform": "Transformar", + "threed": "3D", + "overview": "Visão geral" + }, + "overview": { + "eyebrow": "{{ready}} de {{total}} modalidades prontas", + "title": "Studio", + "subtitle": "Gere imagens, vídeos, 3D, fala e som com os modelos desta máquina.", + "canMake": "O que você pode criar", + "running": "Em execução agora", + "recent": "Saídas recentes", + "noModel": "Nenhum modelo instalado", + "install": "Instalar um modelo", + "ready": "Pronto", + "seconds": "{{seconds}}s", + "describe": { + "images": "Texto para imagem, imagem para imagem, imagens de referência", + "video": "Texto para vídeo e imagem para vídeo", + "threed": "Reconstrução de malha a partir de imagem", + "tts": "Texto para fala usando sua biblioteca de vozes", + "sound": "Música e efeitos sonoros a partir de um prompt", + "transform": "Separação, aprimoramento e conversão de voz" + } + }, + "groups": { + "create": "Criar", + "voice": "Voz", + "transform": "Transformar" + } + }, + "image": { + "title": "Geração de Imagens", + "labels": { + "model": "Modelo", + "prompt": "Prompt", + "promptPlaceholder": "Descreva a imagem que deseja gerar...", + "negativePrompt": "Prompt Negativo", + "negativePromptPlaceholder": "O que evitar...", + "size": "Tamanho", + "count": "Quantidade (1-4)", + "advanced": "Configurações Avançadas", + "imageInputs": "Entradas de Imagem", + "steps": "Etapas", + "stepsPlaceholder": "20", + "seed": "Semente", + "seedPlaceholder": "Aleatória", + "sourceImage": "Imagem de Origem (img2img)", + "refImages": "Imagens de Referência", + "refImagesAdded_one": "{{count}} imagem adicionada", + "refImagesAdded_other": "{{count}} imagens adicionadas" + }, + "actions": { + "view": "Ver", + "generate": "Gerar", + "generating": "Gerando..." + }, + "empty": "As imagens geradas aparecerão aqui", + "toasts": { + "noPrompt": "Digite um prompt", + "noModel": "Selecione um modelo", + "noResults": "Nenhuma imagem gerada" + } + }, + "video": { + "title": "Geração de Vídeo", + "labels": { + "model": "Modelo", + "prompt": "Prompt", + "promptPlaceholder": "Descreva o vídeo que deseja gerar...", + "duration": "Duração (segundos)", + "fps": "FPS", + "size": "Tamanho", + "advanced": "Configurações Avançadas", + "seed": "Semente", + "seedPlaceholder": "Aleatória", + "frames": "Quadros", + "referenceMedia": "Mídia de referência", + "startImage": "Imagem inicial", + "endImage": "Imagem final", + "avatarAudio": "Áudio do avatar" + }, + "actions": { + "generate": "Gerar", + "generating": "Gerando..." + }, + "empty": "O vídeo gerado aparecerá aqui", + "toasts": { + "noPrompt": "Digite um prompt", + "noModel": "Selecione um modelo", + "noResults": "Nenhum vídeo gerado" + } + }, + "threed": { + "title": "Geração 3D", + "labels": { + "model": "Modelo", + "image": "Imagem de entrada", + "quality": "Qualidade", + "quality_auto": "Automática (melhor disponível)", + "quality_coarse": "Pré-visualização grosseira (rápida)", + "quality_512": "512³ fino", + "quality_1024": "Cascata 1024³ (lenta)", + "background": "Fundo", + "background_auto": "Remover automaticamente o fundo sólido", + "background_keep": "Manter original", + "background_black": "Remover preto", + "background_white": "Remover branco", + "advanced": "Configurações Avançadas", + "steps": "Etapas de forma", + "textureSteps": "Etapas de material", + "guidance": "Orientação", + "seed": "Semente", + "seedPlaceholder": "Aleatória" + }, + "actions": { + "generate": "Gerar", + "generating": "Gerando...", + "remesh": "Aplicar remalhamento", + "remeshing": "Aplicando remalhamento...", + "showOriginal": "Mostrar original", + "download": "Baixar GLB" + }, + "remesh": { + "title": "Remalhamento hermético para impressão", + "detail": "Detalhe do remalhamento", + "coarser": "Mais grosseiro · mais rápido", + "finer": "Mais fino · mais lento", + "hint": "O detalhe controla as menores características preservadas. O deslocamento de envolvimento segue automaticamente.", + "ready": "Pré-visualizando o modelo remalhado hermético. Esta é a versão que será baixada." + }, + "viewer": { + "wireframe": "Wireframe", + "autoRotate": "Rotação automática", + "noWebgl": "WebGL2 não está disponível neste navegador — baixe o GLB para vê-lo em outro lugar.", + "contextLost": "A visualização 3D perdeu o contexto da GPU — recarregue a página para restaurá-la.", + "stats": "{{verts}} vértices · {{tris}} triângulos", + "hint": "arrastar: girar · pinça/roda: zoom · dois dedos/clique direito: mover · duplo clique: redefinir" + }, + "empty": "O modelo 3D gerado aparecerá aqui", + "toasts": { + "noImage": "Forneça uma imagem de entrada", + "noModel": "Selecione um modelo", + "noResults": "Nenhum modelo gerado" + } + }, + "tts": { + "title": "Texto para Fala", + "labels": { + "model": "Modelo", + "voice": "Voz", + "voicePlaceholder": "Falante opcional ou ID de voz", + "input": "Texto", + "inputPlaceholder": "Digite o texto para sintetizar..." + }, + "actions": { + "generate": "Gerar", + "generating": "Gerando..." + }, + "empty": "O áudio gerado aparecerá aqui", + "toasts": { + "noText": "Digite o texto", + "noModel": "Selecione um modelo", + "generated": "Fala gerada", + "generateFailed": "Falha na geração" + }, + "voiceLibrary": { + "cloningReady": "Clonagem de voz", + "loading": "Carregando vozes salvas…", + "modelDefault": "Usar padrão do modelo", + "empty": "Nenhuma voz salva ainda.", + "create": "Criar uma", + "manage": "Gerenciar Biblioteca de Vozes", + "namedVoiceHint": "Este modelo não aceita perfis de áudio de referência. Você ainda pode digitar um falante nomeado suportado pelo seu backend." + } + }, + "voiceLibrary": { + "title": "Biblioteca de Vozes", + "subtitle": "Crie e gerencie vozes de referência reutilizáveis para cada modelo instalado que suporta clonagem de voz.", + "loading": "Carregando vozes salvas…", + "listLabel": "Perfis de voz salvos", + "status": { + "ready": "Pronto" + }, + "summary": { + "label": "Status da biblioteca de vozes", + "profiles": "vozes salvas", + "modelsReady_one": "{{count}} modelo compatível pronto", + "modelsReady_other": "{{count}} modelos compatíveis prontos", + "noModels": "Nenhum modelo compatível instalado" + }, + "search": { + "label": "Buscar perfis de voz", + "placeholder": "Buscar vozes, idiomas ou transcrições" + }, + "filters": { + "language": "Filtrar por idioma", + "allLanguages": "Todos os idiomas" + }, + "empty": { + "title": "Sua biblioteca de vozes está vazia", + "body": "Grave ou envie um clipe de referência autorizado, adicione a transcrição exata e reuse-o nos modelos de TTS compatíveis." + }, + "noResults": { + "title": "Nenhuma voz corresponde a estes filtros", + "body": "Tente uma busca diferente ou mostre todos os idiomas." + }, + "detail": { + "eyebrow": "Voz selecionada", + "emptyTitle": "Selecione uma voz para inspecioná-la", + "emptyBody": "Áudio de referência, transcrição, compatibilidade e detalhes de consentimento aparecerão aqui.", + "referenceAudio": "Áudio de referência", + "transcript": "Transcrição de referência" + }, + "metadata": { + "language": "Idioma", + "languageUnknown": "Não especificado", + "duration": "Duração", + "sampleRate": "Taxa de amostragem", + "created": "Criado em" + }, + "consent": { + "confirmed": "Consentimento confirmado", + "confirmedAt": "Confirmado em {{date}}" + }, + "modelSetup": { + "title": "Instalar um modelo de clonagem de voz", + "body": "Esta voz está pronta, mas precisa de um modelo que aceite áudio de referência. Escolha um verificado por este servidor.", + "loading": "Encontrando modelos compatíveis em suas galerias…", + "backendUnknown": "Backend selecionado durante a instalação", + "install": "Instalar", + "installing": "Instalando…", + "loadFailed": "Recomendações compatíveis não puderam ser carregadas.", + "noneAvailable": "Nenhum modelo compatível não instalado está disponível nas galerias configuradas.", + "capabilityNote": "As recomendações vêm dos metadados de capacidade do modelo, não de uma lista de modelos do lado do navegador." + }, + "api": { + "title": "Uso da API e modelos compatíveis", + "summary": "Use esta voz fora do navegador ou verifique o suporte do modelo", + "body": "Envie a URI de voz estável do perfil com cada requisição de fala. O LocalAI resolve o áudio de referência privado e a transcrição no momento da geração; o YAML do modelo não é modificado.", + "compatibleModels": "Modelos compatíveis instalados", + "noInstalledModels": "Nenhum ainda. Instale um dos modelos verificados pelo servidor acima antes de enviar esta requisição.", + "curlExample": "Exemplo com cURL", + "copy": "Copiar requisição", + "endpointNote": "Os mesmos campos de modelo, entrada e voz também funcionam com POST /tts." + }, + "actions": { + "create": "Criar voz", + "createFirst": "Crie sua primeira voz", + "retry": "Tentar novamente", + "clearFilters": "Limpar filtros", + "useInTTS": "Usar em Texto para Fala", + "delete": "Excluir voz", + "installModel": "Instalar um modelo compatível", + "browseModels": "Explorar todos os modelos" + }, + "deleteDialog": { + "title": "Excluir esta voz?", + "message": "“{{name}}” e seu áudio de referência serão removidos permanentemente. O YAML dos modelos existentes não é alterado.", + "deleting": "Excluindo…" + }, + "toasts": { + "deleted": "Voz {{name}} excluída", + "installStarted": "Instalando {{name}}. O progresso está disponível em Operações.", + "installFailed": "Não foi possível iniciar a instalação: {{message}}", + "apiCopied": "Requisição de API copiada", + "copyFailed": "Não foi possível copiar a requisição de API" + } + }, + "voiceCreate": { + "eyebrow": "Biblioteca de Vozes", + "title": "Criar uma voz reutilizável", + "subtitle": "Adicione um clipe de referência limpo e sua transcrição exata. O LocalAI cuida dos parâmetros de clonagem específicos do backend no momento da geração.", + "sections": { + "reference": { + "title": "Áudio de referência", + "body": "Grave no navegador ou envie um clipe existente. A fala deve ser limpa, natural e de um único falante." + }, + "details": { + "title": "Identidade e transcrição", + "body": "Dê aos administradores um nome reconhecível e transcreva o clipe exatamente, incluindo hesitações e pontuação." + }, + "consent": { + "title": "Autorização", + "body": "A clonagem de voz pode ser sensível. Confirme a permissão antes que esta referência seja salva." + } + }, + "audio": { + "label": "Referência de voz", + "normalizing": "Preparando um PCM WAV seguro…", + "preview": "Referência normalizada", + "durationError": "O áudio de referência deve ter entre 1 segundo e 2 minutos.", + "decodeError": "Este navegador não conseguiu decodificar o arquivo de áudio selecionado.", + "qualityReady": "Duração recomendada", + "qualityHint": "6–30 segundos geralmente produzem um clone mais forte" + }, + "fields": { + "name": "Nome da voz", + "namePlaceholder": "ex.: Narrador de documentário", + "language": "Idioma (opcional)", + "languagePlaceholder": "ex.: pt-BR", + "description": "Descrição (opcional)", + "descriptionPlaceholder": "Tom, origem ou uso pretendido", + "transcript": "Transcrição exata", + "transcriptPlaceholder": "Digite cada palavra falada no clipe de referência…", + "transcriptHint": "Corresponda à gravação exatamente. Não reescreva a gramática nem remova pausas e hesitações." + }, + "consent": { + "title": "Confirmo que esta voz pode ser clonada", + "body": "Tenho a permissão do falante ou outra base legal para armazenar e usar esta gravação para fala sintetizada." + }, + "readiness": { + "title": "Prontidão do perfil", + "body": "Uma voz fica disponível em Texto para Fala quando todos os itens obrigatórios estão completos.", + "audio": "Referência PCM-WAV válida", + "quality": "Janela de qualidade de 6–30 segundos", + "name": "Nome de voz reconhecível", + "transcript": "Transcrição de referência exata", + "consent": "Autorização confirmada" + }, + "privacy": { + "title": "Privada por padrão. ", + "body": "O áudio de referência é armazenado no diretório de dados do LocalAI com permissões de arquivo restritas e nunca é exposto como um caminho de pasta de modelo." + }, + "actions": { + "back": "Voltar para a biblioteca", + "cancel": "Cancelar", + "save": "Salvar voz", + "saving": "Salvando…" + }, + "toasts": { + "created": "{{name}} está pronta para uso" + } + }, + "sound": { + "title": "Geração de Som", + "labels": { + "model": "Modelo", + "prompt": "Prompt", + "promptPlaceholder": "Descreva o som que deseja gerar...", + "instrumental": "Instrumental", + "bpm": "BPM", + "duration": "Duração (segundos)", + "language": "Idioma", + "timesignature": "Fórmula de Compasso", + "keyscale": "Tom/Escala", + "vocalLanguage": "Idioma vocal", + "vocalLanguagePlaceholder": "ex.: Português", + "caption": "Legenda", + "lyrics": "Letra", + "lyricsPlaceholder": "Letra para geração vocal", + "simple": "Simples", + "advanced": "Avançado", + "seed": "Semente", + "seedPlaceholder": "Aleatória", + "thinkMode": "Modo de pensamento" + }, + "actions": { + "generate": "Gerar", + "generating": "Gerando..." + }, + "empty": "O áudio gerado aparecerá aqui", + "toasts": { + "noPrompt": "Digite um prompt", + "noModel": "Selecione um modelo", + "generateFailed": "Falha na geração" + } + }, + "audioTransform": { + "title": "Transformação de Áudio", + "labels": { + "model": "Modelo", + "audio": "Áudio (obrigatório)", + "reference": "Referência (opcional)", + "referenceHelp": "Sinal de loopback / extremidade distante para cancelamento de eco, falante alvo para conversão de voz. Deixe vazio para transformação incondicional.", + "advancedParameters": "Parâmetros avançados", + "advancedParametersHelp": "específicos do backend (uma chave=valor por linha, ex.: noise_gate=true)", + "advancedParametersPlaceholder": "# Opcional. Para LocalVQE:\n# noise_gate=true\n# noise_gate_threshold_dbfs=-50" + }, + "input": { + "upload": "Enviar", + "uploadDescription": "Solte um arquivo aqui ou", + "uploadBrowse": "navegue", + "record": "Gravar", + "startRecording": "Iniciar gravação", + "stop": "Parar", + "encoding": "Codificando...", + "clear": "Limpar", + "microphoneUnavailable": "A captura de microfone não está disponível neste navegador.", + "echoNotice": "Os navegadores costumam aplicar seu próprio cancelamento de eco WebRTC e supressão de ruído por padrão. Isso geralmente resulta em desempenho pior do que executar o LocalVQE no áudio bruto.", + "echoTest": "Teste de eco (grave o microfone enquanto reproduz a referência)", + "stopEchoTest": "Parar teste de eco" + }, + "result": { + "audio": "Áudio", + "reference": "Referência", + "inputSpectrum": "Espectro de entrada", + "outputSpectrum": "Espectro de saída", + "outputSpectrumHint": "Transforme para comparar a atenuação", + "output": "Saída" + }, + "actions": { + "transform": "Transformar", + "processing": "Processando..." + }, + "empty": "Escolha um arquivo de áudio (e referência opcional) para transformar" + }, + "talk": { + "title": "Falar", + "subtitle": "Conversa de voz em tempo real", + "actions": { + "start": "Iniciar sessão", + "stop": "Encerrar sessão", + "connecting": "Conectando...", + "muted": "Mudo", + "mute": "Silenciar", + "unmute": "Reativar som" + }, + "labels": { + "model": "Modelo", + "voice": "Voz", + "voicePlaceholder": "alloy", + "language": "Idioma", + "languagePlaceholder": "pt", + "instructions": "Instruções", + "instructionsPlaceholder": "Defina a persona do assistente..." + }, + "status": { + "idle": "Ocioso", + "connecting": "Conectando...", + "listening": "Ouvindo...", + "speaking": "Falando...", + "ended": "Sessão encerrada" + }, + "toasts": { + "noModel": "Selecione um modelo primeiro", + "connectFailed": "Falha ao conectar: {{message}}" + } + }, + "history": { + "title": "Histórico", + "empty": "Nenhum histórico ainda", + "deleteEntry": "Excluir entrada", + "clear": "Limpar histórico", + "clearTitle": "Limpar todo o histórico", + "clearMessage": "Remover todas as entradas do histórico? Esta ação não pode ser desfeita.", + "clearConfirm": "Limpar", + "cleared": "Histórico limpo" + }, + "request": { + "heading": "Requisição", + "copyCurl": "Copiar como curl", + "copied": "Copiado" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/modelEditor.json b/core/http/react-ui/public/locales/pt-BR/modelEditor.json new file mode 100644 index 000000000..698b19f03 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/modelEditor.json @@ -0,0 +1,38 @@ +{ + "title": { + "add": "Adicionar Modelo", + "edit": "Editor de Modelo" + }, + "subtitle": { + "chooseModelType": "Escolha um tipo de modelo para começar", + "newModel": "Novo modelo" + }, + "actions": { + "backTo": "Voltar para {{page}}", + "system": "Sistema", + "templates": "Modelos", + "createModel": "Criar Modelo", + "saveChanges": "Salvar Alterações", + "saving": "Salvando...", + "saved": "Salvo", + "switchWarning": "Salve ou descarte as alterações antes de alternar as abas.", + "discardAndSwitch": "Descartar e Alternar" + }, + "tabs": { + "interactive": "Interativo", + "yaml": "YAML", + "yamlDescription": "Edite o YAML diretamente. O nome do modelo deve ser definido no YAML para que a criação funcione." + }, + "forms": { + "modelName": { + "label": "Nome do Modelo", + "placeholder": "meu-nome-de-modelo", + "hint": "Use apenas letras, números, hifens, sublinhados e pontos." + }, + "empty": { + "nav": "Use a barra de busca acima para adicionar campos", + "title": "Nenhum campo configurado", + "text": "Use a barra de busca acima para encontrar e adicionar campos de configuração." + } + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/models.json b/core/http/react-ui/public/locales/pt-BR/models.json new file mode 100644 index 000000000..1fb2e37c6 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/models.json @@ -0,0 +1,187 @@ +{ + "title": "Descobrir", + "subtitle": "Explore e instale modelos de IA da galeria", + "models": "Modelos", + "recommended": { + "title": "Recomendados para o seu hardware", + "cpuNote": "Nenhuma GPU detectada - modelos pequenos que permanecem responsivos na CPU.", + "gpuNote": "Dimensionados para caber na sua VRAM disponível com espaço para o contexto.", + "install": "Instalar", + "installing": "Instalando", + "installStarted": "Instalando {{model}}…", + "installFailed": "Falha na instalação: {{message}}", + "dismiss": "Dispensar recomendações", + "summary": "{{n}} modelos sugeridos", + "bestFit": "Melhor ajuste", + "alternative": "Também serve" + }, + "stats": { + "available": "Disponíveis", + "installed": "Instalados" + }, + "actions": { + "addModel": "Adicionar Modelo", + "importModel": "Importar Modelo", + "install": "Instalar", + "reinstall": "Reinstalar", + "delete": "Excluir" + }, + "filters": { + "all": "Todos", + "llm": "Chat", + "image": "Imagem", + "video": "Vídeo", + "threed": "3D", + "multimodal": "Multimodal", + "vision": "Visão", + "tts": "TTS", + "stt": "STT", + "diarization": "Diarização", + "soundClassification": "Classificação de Som", + "soundGen": "Som", + "audioTransform": "FX de Áudio", + "realtimeAudio": "Áudio em Tempo Real", + "embedding": "Embeddings", + "rerank": "Rerank", + "detection": "Detecção", + "vad": "VAD", + "ner": "NER", + "fitsGpu": "Cabe na GPU", + "collapseVariants": "Uma linha por modelo", + "allBackends": "Todos os Backends", + "searchBackends": "Buscar backends...", + "contextSize": "Contexto:", + "useCaseLabel": "Filtrar por caso de uso", + "unavailableForBackend": "Não disponível para o backend selecionado", + "someSelected": "{{count}} selecionados", + "refineLabel": "Refinar" + }, + "search": { + "placeholder": "Buscar modelos...", + "clearFilters": "Limpar filtros" + }, + "table": { + "modelName": "Nome do Modelo", + "description": "Descrição", + "backend": "Backend", + "sizeVram": "Tamanho / VRAM", + "status": "Status", + "actions": "Ações", + "size": "Tamanho: {{size}}", + "vram": "VRAM: {{vram}}", + "fits": "Cabe", + "mayNotFit": "Pode não caber", + "trustRemoteCode": "Confiar em Código Remoto", + "installing": "Instalando", + "installingPct": "Instalando · {{percent}}%", + "installed": "Instalado", + "notInstalled": "Não Instalado" + }, + "detail": { + "description": "Descrição", + "gallery": "Galeria", + "backend": "Backend", + "size": "Tamanho", + "vram": "VRAM", + "license": "Licença", + "tags": "Tags", + "links": "Links", + "warning": "Aviso", + "files": "Arquivos", + "fitsGpu": "Cabe na GPU", + "mayNotFitGpu": "Pode não caber na GPU", + "requiresTrustRemoteCode": "Requer Confiança em Código Remoto", + "fileCount_one": "{{count}} arquivo", + "fileCount_other": "{{count}} arquivos", + "filename": "Nome do arquivo", + "uri": "URI", + "sha256": "SHA256", + "backToAll": "Todos os modelos", + "vramAt": "VRAM em {{context}}", + "headroom": "Margem de sobra" + }, + "empty": { + "title": "Nenhum modelo encontrado", + "withFilters": "Nenhum modelo corresponde à sua busca ou filtros atuais.", + "collapsedVariantsHint": "Construções alternativas que outra entrada já oferece estão ocultas. Desative \"Uma linha por modelo\" para incluí-las.", + "noFilters": "A galeria de modelos está vazia." + }, + "deleteDialog": { + "title": "Excluir Modelo", + "message": "Excluir o modelo {{model}}?", + "confirm": "Excluir {{model}}", + "deletingToast": "Excluindo {{model}}..." + }, + "errors": { + "loadFailed": "Falha ao carregar modelos: {{message}}", + "installFailed": "Falha na instalação: {{message}}", + "deleteFailed": "Falha ao excluir: {{message}}" + }, + "selector": { + "loading": "Carregando modelos...", + "selectModel": "Selecionar modelo...", + "searchPlaceholder": "Buscar modelos...", + "noModels": "Nenhum modelo disponível" + }, + "variants": { + "title": "Variantes", + "chooseVariant": "Escolha uma variante", + "auto": "Automática", + "autoSelected": "Selecionada automaticamente", + "base": "Construção base", + "doesNotFit": "Não cabe", + "unknownSize": "Tamanho desconhecido", + "unknownBackend": "Backend desconhecido", + "loading": "Carregando variantes...", + "installVariant": "Instalar {{variant}}", + "quantizationTitle": "Formato dos pesos", + "unknownQuantization": "Formato desconhecido", + "showDetails": "Mostrar detalhes completos de {{variant}}", + "hideDetails": "Ocultar detalhes completos de {{variant}}", + "detailsLoading": "Carregando detalhes...", + "detailsUnavailable": "Os detalhes de {{variant}} não puderam ser carregados.", + "features": { + "dflash": "Mais rápido: DFlash", + "mtp": "Mais rápido: MTP" + } + }, + "rail": { + "sortLabel": "Ordenar modelos", + "downloadingPct": "baixando {{percent}}%", + "tooLarge": "{{size}} · muito grande", + "fitsSize": "{{size}} · cabe", + "previousPage": "Página anterior", + "nextPage": "Próxima página", + "showingCount": "{{shown}} de {{total}}", + "sizing": "medindo…" + }, + "groups": { + "text": "Texto e raciocínio", + "vision": "Visão", + "audio": "Fala e áudio", + "visual": "Imagem e vídeo", + "other": "Todo o resto" + }, + "chart": { + "title": "VRAM por tamanho de contexto", + "available": "{{vram}} disponíveis", + "barTitle": "o contexto {{context}} precisa de {{vram}}", + "fitsEverywhere": "Executa em qualquer tamanho de contexto neste host.", + "fitsNowhere": "Não caberá neste host em nenhum tamanho de contexto.", + "fitsUpTo": "Cabe em contextos de até {{context}}." + }, + "shelves": { + "hostLabel": "Seu host", + "heroWithGpu": "{{vram}} de memória GPU, {{count}} modelos na galeria.", + "heroNoGpu": "{{count}} modelos na galeria.", + "heroHint": "Escolha qualquer item à esquerda para ver seu tamanho, variantes e se ele executará aqui.", + "browsing": "Explorando", + "pickHint": "Selecione um modelo para ver seus detalhes.", + "heroWithRam": "{{ram}} de memória do sistema, {{count}} modelos na galeria.", + "byUseCase": "Ou comece por um caso de uso", + "pickText": "Chat, raciocínio, embeddings", + "pickVision": "Leia imagens e documentos", + "pickAudio": "Fala de entrada e saída", + "pickVisual": "Gere imagens e vídeos" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/nav.json b/core/http/react-ui/public/locales/pt-BR/nav.json new file mode 100644 index 000000000..683419407 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/nav.json @@ -0,0 +1,78 @@ +{ + "appName": "LocalAI", + "openMenu": "Abrir menu", + "closeMenu": "Fechar menu", + "primaryNavigation": "Navegação principal", + "switchToLightMode": "Alternar para o modo claro", + "switchToDarkMode": "Alternar para o modo escuro", + "expandSidebar": "Expandir barra lateral", + "collapseSidebar": "Recolher barra lateral", + "changeLanguage": "Alterar idioma", + "logout": "Sair", + "accountSettings": "Configurações da conta", + "account": "Conta", + "accountFor": "Conta: {{name}}", + "sections": { + "create": "Criar", + "recognition": "Reconhecimento", + "build": "Construir", + "operate": "Operar" + }, + "operate": { + "inference": "Inferência", + "cluster": "Cluster", + "observability": "Observabilidade", + "access": "Acesso", + "system": "Sistema", + "activity": "Atividade", + "runtime": "Runtime", + "administration": "Administração" + }, + "items": { + "home": "Início", + "discover": "Descobrir", + "chat": "Chat", + "studio": "Studio", + "talk": "Falar", + "fineTune": "Ajuste Fino", + "quantize": "Quantizar", + "faces": "Rostos", + "voices": "Vozes", + "jobs": "Trabalhos", + "operate": "Admin", + "host": "Host", + "audioTransform": "Transformação de Áudio", + "faceRecognition": "Reconhecimento Facial", + "voiceRecognition": "Reconhecimento de Voz", + "agents": "Agentes", + "skills": "Habilidades", + "memory": "Memória", + "mcpJobs": "Trabalhos de CI MCP", + "usage": "Uso", + "users": "Usuários", + "middleware": "Middleware", + "backends": "Backends", + "voiceLibrary": "Biblioteca de Vozes", + "traces": "Rastreamentos", + "nodes": "Nós", + "scheduling": "Agendamento", + "swarm": "Swarm", + "system": "Sistema", + "settings": "Configurações", + "api": "API", + "activity": "Atividade", + "overview": "Visão geral" + }, + "footer": { + "github": "GitHub", + "documentation": "Documentação", + "author": "Autor", + "copyright": "© 2023-{{year}} {{author}}" + }, + "console": { + "automation": "Automação", + "training": "Treinamento", + "expandNavigation": "Expandir navegação de {{section}}", + "collapseNavigation": "Recolher navegação de {{section}}" + } +} diff --git a/core/http/react-ui/public/locales/pt-BR/skills.json b/core/http/react-ui/public/locales/pt-BR/skills.json new file mode 100644 index 000000000..4cb2a6f99 --- /dev/null +++ b/core/http/react-ui/public/locales/pt-BR/skills.json @@ -0,0 +1,79 @@ +{ + "title": "Habilidades", + "subtitle": "Gerenciar habilidades de agentes (instruções e recursos reutilizáveis)", + "unavailable": { + "subtitle": "O serviço de habilidades não está disponível ou o índice está sendo reconstruído. Tente novamente em um momento.", + "retry": "Tentar novamente" + }, + "actions": { + "newSkill": "Nova habilidade", + "createSkill": "Criar habilidade", + "import": "Importar", + "importing": "Importando...", + "gitRepos": "Repositórios Git", + "edit": "Editar", + "delete": "Excluir", + "export": "Exportar", + "sync": "Sincronizar", + "addRepo": "Adicionar repositório", + "adding": "Adicionando...", + "remove": "Remover", + "enable": "Habilitar", + "disable": "Desabilitar" + }, + "search": { + "placeholder": "Buscar habilidades..." + }, + "git": { + "title": "Repositórios Git", + "description": "Adicione repositórios Git para obter habilidades. As habilidades aparecerão na lista após a sincronização.", + "urlPlaceholder": "https://github.com/usuário/repo ou git@github.com:usuário/repo.git", + "noRepos": "Nenhum repositório Git configurado. Adicione um acima.", + "disabled": "Desabilitado", + "removeRepo": "Remover repositório" + }, + "card": { + "noDescription": "Sem descrição", + "readOnly": "Somente leitura", + "editTitle": "Editar habilidade", + "deleteTitle": "Excluir habilidade", + "exportTitle": "Exportar como .tar.gz" + }, + "empty": { + "title": "Nenhuma habilidade encontrada", + "text": "Crie uma habilidade ou importe uma para começar.", + "noPersonal": "Você ainda não tem habilidades." + }, + "sections": { + "yourSkills": "Suas Habilidades", + "otherUsersSkills": "Habilidades de Outros Usuários" + }, + "deleteDialog": { + "title": "Excluir Habilidade", + "message": "Excluir a habilidade \"{{name}}\"? Esta ação não pode ser desfeita.", + "confirm": "Excluir" + }, + "removeRepoDialog": { + "title": "Remover Repositório Git", + "message": "Remover este repositório Git? As habilidades dele não estarão mais disponíveis.", + "confirm": "Remover" + }, + "toasts": { + "loadFailed": "Falha ao carregar habilidades", + "deleted": "Habilidade \"{{name}}\" excluída", + "deleteFailed": "Falha ao excluir a habilidade", + "exported": "Habilidade \"{{name}}\" exportada", + "exportFailed": "Falha na exportação", + "imported": "Habilidade importada de \"{{file}}\"", + "importFailed": "Falha na importação", + "loadReposFailed": "Falha ao carregar repositórios Git", + "repoAdded": "Repositório Git adicionado e sincronizando", + "addRepoFailed": "Falha ao adicionar o repositório", + "synced": "Repositório sincronizado", + "syncFailed": "Falha na sincronização", + "toggled": "Repositório alternado", + "toggleFailed": "Falha ao alternar", + "removed": "Repositório removido", + "removeFailed": "Falha na remoção" + } +} diff --git a/core/http/react-ui/src/i18n/index.js b/core/http/react-ui/src/i18n/index.js index 4a08ed939..f12e4e904 100644 --- a/core/http/react-ui/src/i18n/index.js +++ b/core/http/react-ui/src/i18n/index.js @@ -12,6 +12,7 @@ export const SUPPORTED_LANGUAGES = [ { code: 'zh-CN', name: '简体中文', flag: 'ZH' }, { code: 'id', name: 'Bahasa Indonesia', flag: 'ID' }, { code: 'ko', name: '한국어', flag: 'KO' }, + { code: 'pt-BR', name: 'Português (Brasil)', flag: 'BR' }, ] export const NAMESPACES = [