diff --git a/web-app/src/containers/LanguageSwitcher.tsx b/web-app/src/containers/LanguageSwitcher.tsx
index 3358c348fe..8b8b9b9ea7 100644
--- a/web-app/src/containers/LanguageSwitcher.tsx
+++ b/web-app/src/containers/LanguageSwitcher.tsx
@@ -16,6 +16,7 @@ const LANGUAGES = [
{ value: 'zh-CN', label: '简体中文' },
{ value: 'zh-TW', label: '繁體中文' },
{ value: 'de-DE', label: 'Deutsch' },
+ { value: 'pt-BR', label: 'Português (Brasil)' },
{ value: 'ja', label: '日本語' },
]
diff --git a/web-app/src/locales/pt-BR/assistants.json b/web-app/src/locales/pt-BR/assistants.json
new file mode 100644
index 0000000000..e6188824cf
--- /dev/null
+++ b/web-app/src/locales/pt-BR/assistants.json
@@ -0,0 +1,35 @@
+{
+ "title": "Assistentes",
+ "editAssistant": "Editar Assistente",
+ "deleteAssistant": "Remover Assistente",
+ "deleteConfirmation": "Remover Assistente",
+ "deleteConfirmationDesc": "Tem certeza de que deseja remover este assistente? Esta ação não pode ser desfeita.",
+ "cancel": "Cancelar",
+ "delete": "Remover",
+ "addAssistant": "Adicionar Assistente",
+ "emoji": "Emoji",
+ "name": "Nome",
+ "enterName": "Digite o nome",
+ "nameRequired": "O nome é obrigatório",
+ "description": "Descrição (opcional)",
+ "enterDescription": "Digite a descrição",
+ "instructions": "Instruções",
+ "enterInstructions": "Digite as instruções",
+ "predefinedParameters": "Parâmetros Predefinidos",
+ "parameters": "Parâmetros",
+ "key": "Chave",
+ "value": "Valor",
+ "stringValue": "Texto",
+ "numberValue": "Número",
+ "booleanValue": "Booleano",
+ "jsonValue": "JSON",
+ "trueValue": "Verdadeiro",
+ "falseValue": "Falso",
+ "jsonValuePlaceholder": "JSON",
+ "save": "Salvar",
+ "createNew": "Criar Novo Assistente",
+ "personality": "Personalidade",
+ "capabilities": "Capacidades",
+ "instructionsDateHint": "Dica: Use {{current_date}} para inserir a data de hoje.",
+ "maxToolSteps": "Máximo de passos das ferramentas (tools)"
+}
diff --git a/web-app/src/locales/pt-BR/chat.json b/web-app/src/locales/pt-BR/chat.json
new file mode 100644
index 0000000000..e637206b37
--- /dev/null
+++ b/web-app/src/locales/pt-BR/chat.json
@@ -0,0 +1,12 @@
+{
+ "welcome": "Olá, como você está?",
+ "description": "Como posso ajudá-lo hoje?",
+ "temporaryChat": "Chat Temporário",
+ "temporaryChatDescription": "Inicie uma conversa temporária que não será salva no seu histórico de chat.",
+ "status": {
+ "empty": "Nenhum Chat Encontrado"
+ },
+ "sendMessage": "Enviar Mensagem",
+ "newConversation": "Nova Conversa",
+ "clearHistory": "Limpar Histórico"
+}
\ No newline at end of file
diff --git a/web-app/src/locales/pt-BR/common.json b/web-app/src/locales/pt-BR/common.json
new file mode 100644
index 0000000000..4e2cf76d2e
--- /dev/null
+++ b/web-app/src/locales/pt-BR/common.json
@@ -0,0 +1,375 @@
+{
+ "assistants": "Assistentes",
+ "hardware": "Hardware",
+ "mcp-servers": "Servidores MCP",
+ "local_api_server": "Servidor de API Local",
+ "https_proxy": "Proxy HTTPS",
+ "extensions": "Extensões",
+ "attachments": "Anexos",
+ "general": "Geral",
+ "settings": "Configurações",
+ "modelProviders": "Provedores de Modelo",
+ "appearance": "Aparência",
+ "privacy": "Privacidade",
+ "keyboardShortcuts": "Atalhos",
+ "newChat": "Novo Chat",
+ "favorites": "Favoritos",
+ "recents": "Recentes",
+ "hub": "Hub",
+ "helpSupport": "Ajuda e Suporte",
+ "helpUsImproveJan": "Ajude-nos a Melhorar o Jan",
+ "unstarAll": "Remover todos os favoritos",
+ "unstar": "Remover Favorito",
+ "deleteAll": "Apagar Tudo",
+ "star": "Favoritar",
+ "rename": "Renomear",
+ "delete": "Apagar",
+ "copied": "Copiado!",
+ "dataFolder": "Pasta de Dados",
+ "others": "Outros",
+ "language": "Idioma",
+ "login": "Entrar",
+ "loginWith": "Entrar com {{provider}}",
+ "loginFailed": "Falha ao Entrar",
+ "logout": "Sair",
+ "loggingOut": "Saindo...",
+ "loggedOut": "Saída Realizada com Sucesso",
+ "logoutFailed": "Falha ao Sair",
+ "profile": "Perfil",
+ "reset": "Redefinir",
+ "search": "Buscar",
+ "name": "Nome",
+ "cancel": "Cancelar",
+ "create": "Criar",
+ "save": "Salvar",
+ "edit": "Editar",
+ "copy": "Copiar",
+ "back": "Voltar",
+ "close": "Fechar",
+ "next": "Próximo",
+ "finish": "Finalizar",
+ "skip": "Pular",
+ "allow": "Permitir",
+ "deny": "Negar",
+ "start": "Iniciar",
+ "stop": "Parar",
+ "preview": "Visualizar",
+ "compactWidth": "Largura Compacta",
+ "fullWidth": "Largura Completa",
+ "dark": "Escuro",
+ "light": "Claro",
+ "system": "Sistema",
+ "auto": "Automático",
+ "english": "Inglês",
+ "medium": "Médio",
+ "newThread": "Nova Conversa",
+ "noResultsFound": "Nenhum resultado encontrado",
+ "noThreadsYet": "Nenhuma conversa ainda",
+ "noThreadsYetDesc": "Inicie uma nova conversa para ver seu histórico de conversas aqui.",
+ "downloads": "Downloads",
+ "downloading": "Baixando",
+ "cancelDownload": "Cancelar download",
+ "downloadCancelled": "Download Cancelado",
+ "downloadComplete": "Download Concluído",
+ "thinking": "Pensando...",
+ "thought": "Pensamento",
+ "callingTool": "Chamando ferramenta",
+ "completed": "Concluído",
+ "image": "Imagem",
+ "vision": "Visão",
+ "embeddings": "Embeddings",
+ "tools": "Ferramentas",
+ "webSearch": "Busca na Web",
+ "reasoning": "Raciocínio",
+ "selectAModel": "Selecione um modelo",
+ "noToolsAvailable": "Nenhuma ferramenta disponível",
+ "noModelsFoundFor": "Nenhum modelo encontrado para \"{{searchValue}}\"",
+ "failedToLoadModels": "Falha ao carregar modelos",
+ "noModels": "Nenhum modelo encontrado",
+ "customAvatar": "Avatar personalizado",
+ "editAssistant": "Editar Assistente",
+ "jan": "Jan",
+ "metadata": "Metadados",
+ "regenerate": "Regenerar",
+ "threadImage": "Imagem da conversa",
+ "editMessage": "Editar Mensagem",
+ "deleteMessage": "Apagar Mensagem",
+ "deleteThread": "Apagar Conversa",
+ "renameThread": "Renomear Conversa",
+ "threadTitle": "Título da Conversa",
+ "deleteAllThreads": "Apagar Todas as Conversas",
+ "allThreadsUnfavorited": "Todas as Conversas Removidas dos Favoritos",
+ "deleteAllThreadsConfirm": "Tem certeza de que deseja deletar todas as conversas? Esta ação não pode ser desfeita.",
+ "addProvider": "Adicionar Provedor",
+ "addOpenAIProvider": "Adicionar Provedor OpenAI",
+ "enterNameForProvider": "Digite um nome para seu provedor",
+ "providerAlreadyExists": "Provedor com nome \"{{name}}\" já existe. Por favor, escolha um nome diferente.",
+ "adjustFontSize": "Ajustar Tamanho da Fonte",
+ "changeLanguage": "Alterar Idioma",
+ "editTheme": "Editar Tema",
+ "editCodeBlockStyle": "Editar Estilo do Bloco de Código",
+ "editServerHost": "Editar Host do Servidor",
+ "pickColorWindowBackground": "Escolher Cor do Fundo da Janela",
+ "pickColorAppMainView": "Escolher Cor da Visualização Principal do App",
+ "pickColorAppPrimary": "Escolher Cor Primária do App",
+ "pickColorAppAccent": "Escolher Cor de Destaque do App",
+ "pickColorAppDestructive": "Escolher Cor Destrutiva do App",
+ "apiKeyRequired": "Chave API é obrigatória",
+ "enterTrustedHosts": "Digite os hosts confiáveis",
+ "placeholder": {
+ "chatInput": "Pergunte-me qualquer coisa..."
+ },
+ "confirm": "Confirmar",
+ "continue": "Continuar",
+ "loading": "Carregando...",
+ "error": "Erro",
+ "success": "Sucesso",
+ "warning": "Aviso",
+ "conversationNotAvailable": "Conversa não disponível",
+ "conversationNotAvailableDescription": "A conversa que você está tentando acessar não está disponível ou foi removida.",
+ "temporaryChat": "Chat Temporário",
+ "temporaryChatTooltip": "Chat temporário não aparecerá no seu histórico",
+ "noResultsFoundDesc": "Não conseguimos encontrar chats correspondentes à sua busca. Tente uma palavra-chave diferente.",
+ "searchModels": "Buscar modelos...",
+ "searchStyles": "Buscar estilos...",
+ "createAssistant": "Criar Assistente",
+ "enterApiKey": "Digite a Chave API",
+ "scrollToBottom": "Rolar até embaixo",
+ "generateAiResponse": "Gerar Resposta da IA",
+ "addModel": {
+ "title": "Adicionar Modelo",
+ "modelId": "ID do Modelo",
+ "enterModelId": "Digite o ID do Modelo",
+ "addModel": "Adicionar Modelo",
+ "description": "Adicionar um novo modelo ao provedor",
+ "exploreModels": "Ver lista de modelos do provedor"
+ },
+ "mcpServers": {
+ "editServer": "Editar Servidor",
+ "addServer": "Adicionar Servidor",
+ "serverName": "Nome do Servidor",
+ "enterServerName": "Digite o nome do servidor",
+ "command": "Comando",
+ "enterCommand": "Digite o comando",
+ "arguments": "Argumentos",
+ "argument": "Argumento {{index}}",
+ "envVars": "Variáveis de Ambiente",
+ "key": "Chave",
+ "value": "Valor",
+ "save": "Salvar"
+ },
+ "deleteServer": {
+ "title": "Remover Servidor",
+ "delete": "Remover"
+ },
+ "editJson": {
+ "errorParse": "Falha ao analisar JSON",
+ "errorPaste": "Falha ao colar JSON",
+ "errorFormat": "Formato JSON inválido",
+ "titleAll": "Editar Configuração de Todos os Servidores",
+ "placeholder": "Entre com a configuração do JSON...",
+ "save": "Salvar"
+ },
+ "editModel": {
+ "title": "Editar Modelo: {{modelId}}",
+ "description": "Configure as capacidades do modelo alterando as opções abaixo.",
+ "capabilities": "Capacidades",
+ "tools": "Ferramentas",
+ "vision": "Visão",
+ "embeddings": "Embeddings",
+ "notAvailable": "Ainda não disponível"
+ },
+ "outOfContextError": {
+ "truncateInput": "Truncar Entrada",
+ "title": "Erro de contexto esgotado",
+ "description": "Este chat está atingindo o limite de memória da IA, como um quadro branco ficando cheio. Podemos expandir a janela de memória (chamada tamanho do contexto) para que ela lembre mais, mas pode usar mais da memória do seu computador. Também podemos truncar a entrada, o que significa que ela esquecerá parte do histórico do chat para dar espaço a novas mensagens.",
+ "increaseContextSizeDescription": "Você quer aumentar o tamanho do contexto?",
+ "increaseContextSize": "Aumentar Tamanho do Contexto"
+ },
+ "toolApproval": {
+ "title": "Solicitação de Permissão para Ferramenta",
+ "description": "O assistente quer usar {{toolName}}",
+ "securityNotice": "Permita apenas ferramentas em que você confia. Ferramentas podem acessar seu sistema e dados.",
+ "deny": "Negar",
+ "allowOnce": "Permitir Uma Vez",
+ "alwaysAllow": "Sempre Permitir"
+ },
+ "deleteModel": {
+ "title": "Remover Modelo: {{modelId}}",
+ "description": "Tem certeza de que deseja remover este modelo? Esta ação não pode ser desfeita.",
+ "success": "Modelo {{modelId}} foi removido permanentemente.",
+ "cancel": "Cancelar",
+ "delete": "Remover"
+ },
+ "deleteProvider": {
+ "title": "Remover Provedor",
+ "description": "Remover este provedor e todos os seus modelos. Esta ação não pode ser desfeita.",
+ "success": "Provedor {{provider}} foi removido permanentemente.",
+ "confirmTitle": "Remover Provedor: {{provider}}",
+ "confirmDescription": "Tem certeza de que deseja remover este provedor? Esta ação não pode ser desfeita.",
+ "cancel": "Cancelar",
+ "delete": "Remover"
+ },
+ "modelSettings": {
+ "title": "Configurações do Modelo - {{modelId}}",
+ "description": "Configure as configurações do modelo para otimizar desempenho e comportamento."
+ },
+ "dialogs": {
+ "changeDataFolder": {
+ "title": "Alterar Localização da Pasta de Dados",
+ "description": "Tem certeza de que deseja alterar a localização da pasta de dados? Isso moverá todos os seus dados para a nova localização e reiniciará a aplicação.",
+ "currentLocation": "Localização Atual:",
+ "newLocation": "Nova Localização:",
+ "cancel": "Cancelar",
+ "changeLocation": "Alterar Localização"
+ },
+ "deleteAllThreads": {
+ "title": "Remover Todas as Conversas",
+ "description": "Todas as conversas serão removidas. Esta ação não pode ser desfeita."
+ },
+ "deleteThread": {
+ "description": "Tem certeza de que deseja remover esta conversa? Esta ação não pode ser desfeita."
+ },
+ "editMessage": {
+ "title": "Editar Mensagem"
+ },
+ "messageMetadata": {
+ "title": "Metadados da Mensagem"
+ }
+ },
+ "projects": {
+ "title": "Projetos",
+ "addProject": "Adicionar Projeto",
+ "addToProject": "Adicionar ao projeto",
+ "removeFromProject": "Remover do projeto",
+ "createNewProject": "Criar Novo Projeto",
+ "editProject": "Editar Projeto",
+ "deleteProject": "Remover Projeto",
+ "projectName": "Nome do Projeto",
+ "enterProjectName": "Digite o nome do projeto...",
+ "noProjectsAvailable": "Nenhum projeto disponível",
+ "noProjectsYet": "Nenhum Projeto Ainda",
+ "noProjectsYetDesc": "Inicie um novo projeto clicando no botão Adicionar Projeto.",
+ "projectNotFound": "Projeto Não Encontrado",
+ "projectNotFoundDesc": "O projeto que você está procurando não existe ou foi removido.",
+ "deleteProjectDialog": {
+ "title": "Remover Projeto",
+ "permanentDelete": "ThiIsso removerá permanentemente todas as conversas.",
+ "permanentDeleteWarning": "Esta ação removerá permanentemente TODAS as conversas dentro do projeto!",
+ "deleteEmptyProject": "Esta ação removerá o projeto \"{{projectName}}\".",
+ "saveThreadsAdvice": "Para salvar conversas, mova-as para sua lista de conversas ou outro projeto antes de remover.",
+ "starredWarning": "Você ainda tem conversas favoritadas dentro do projeto.",
+ "deleteButton": "Remover",
+ "successWithName": "Projeto \"{{projectName}}\" removido com sucesso",
+ "successWithoutName": "Projeto removido com sucesso",
+ "error": "Falha ao remover projeto. Tente novamente.",
+ "ariaLabel": "Remover {{projectName}}"
+ },
+ "addProjectDialog": {
+ "createTitle": "Criar Novo Projeto",
+ "editTitle": "Editar Projeto",
+ "nameLabel": "Nome do Projeto",
+ "namePlaceholder": "Digite o nome do projeto...",
+ "createButton": "Criar",
+ "updateButton": "Atualizar",
+ "alreadyExists": "Projeto \"{{projectName}}\" já existe",
+ "createSuccess": "Projeto \"{{projectName}}\" criado com sucesso",
+ "renameSuccess": "Projeto renomeado de \"{{oldName}}\" para \"{{newName}}\""
+ },
+ "noConversationsIn": "Nenhuma Conversa em {{projectName}}",
+ "startNewConversation": "Inicie uma nova conversa com {{projectName}} abaixo",
+ "conversationsIn": "Conversas em {{projectName}}",
+ "conversationsDescription": "Clique em qualquer conversa para continuar o chat, ou inicie uma nova abaixo.",
+ "thread": "conversa",
+ "threads": "conversas",
+ "updated": "Atualizado:",
+ "collapseProject": "Recolher projeto",
+ "expandProject": "Expandir projeto",
+ "update": "Atualizar",
+ "searchProjects": "Buscar projetos...",
+ "noProjectsFound": "Nenhum projeto encontrado",
+ "tryDifferentSearch": "Tente um termo de busca diferente"
+ },
+ "toast": {
+ "allThreadsUnfavorited": {
+ "title": "Todas as Conversas Removidas dos Favoritos",
+ "description": "Todas as conversas foram removidas dos seus favoritos."
+ },
+ "deleteAllThreads": {
+ "title": "Remover Todas as Conversas",
+ "description": "Todas as conversas foram removidas permanentemente."
+ },
+ "renameThread": {
+ "title": "Renomear Conversa",
+ "description": "Título da conversa foi renomeado para '{{title}}'"
+ },
+ "deleteThread": {
+ "title": "Remover Conversa",
+ "description": "Esta conversa foi removida permanentemente."
+ },
+ "editMessage": {
+ "title": "Editar Mensagem",
+ "description": "Mensagem editada com sucesso. Aguarde a resposta do modelo."
+ },
+ "appUpdateDownloaded": {
+ "title": "Atualização do App Baixada",
+ "description": "A atualização do app foi baixada com sucesso."
+ },
+ "appUpdateDownloadFailed": {
+ "title": "Falha no Download da Atualização do App",
+ "description": "Falha ao baixar a atualização do app. Tente novamente."
+ },
+ "downloadComplete": {
+ "title": "Download Concluído",
+ "description": " {{item}} foi baixado"
+ },
+ "downloadCancelled": {
+ "title": "Download Cancelado",
+ "description": "O processo de download foi cancelado"
+ },
+ "downloadFailed": {
+ "title": "Falha no Download",
+ "description": "Falha no download de {{item}}"
+ },
+ "modelValidationStarted": {
+ "title": "Validando Modelo",
+ "description": "Modelo \"{{modelId}}\" baixado com sucesso. Verificando integridade..."
+ },
+ "modelValidationFailed": {
+ "title": "Falha na Validação do Modelo",
+ "description": "O modelo baixado \"{{modelId}}\" falhou na verificação de integridade e foi removido. O arquivo pode estar corrompido ou adulterado."
+ },
+ "downloadAndVerificationComplete": {
+ "title": "Download Concluído",
+ "description": "Modelo \"{{item}}\" baixado e verificado com sucesso"
+ },
+ "projectCreated": {
+ "title": "Projeto Criado",
+ "description": "Projeto \"{{projectName}}\" criado com sucesso"
+ },
+ "projectRenamed": {
+ "title": "Projeto Renomeado",
+ "description": "Projeto renomeado de \"{{oldName}}\" para \"{{newName}}\""
+ },
+ "projectDeleted": {
+ "title": "Projeto Removido",
+ "description": "Projeto \"{{projectName}}\" removido com sucesso"
+ },
+ "projectAlreadyExists": {
+ "title": "Projeto Já Existe",
+ "description": "Projeto \"{{projectName}}\" já existe"
+ },
+ "projectDeleteFailed": {
+ "title": "Falha ao Remover",
+ "description": "Falha ao remover projeto. Tente novamente."
+ },
+ "threadAssignedToProject": {
+ "title": "Conversa Atribuída",
+ "description": "Conversa atribuída a \"{{projectName}}\" com sucesso"
+ },
+ "threadRemovedFromProject": {
+ "title": "Conversa Removida",
+ "description": "Conversa removida de \"{{projectName}}\" com sucesso"
+ }
+ }
+}
diff --git a/web-app/src/locales/pt-BR/hub.json b/web-app/src/locales/pt-BR/hub.json
new file mode 100644
index 0000000000..2edbd7e86b
--- /dev/null
+++ b/web-app/src/locales/pt-BR/hub.json
@@ -0,0 +1,31 @@
+{
+ "sortNewest": "Mais Recentes",
+ "sortMostDownloaded": "Mais Baixados",
+ "use": "Usar",
+ "download": "Baixar",
+ "downloaded": "Baixado",
+ "loadingModels": "Carregando modelos...",
+ "noModels": "Nenhum modelo encontrado",
+ "by": "Por",
+ "downloads": "Downloads",
+ "variants": "Variantes",
+ "showVariants": "Mostrar variantes",
+ "useModel": "Usar este modelo",
+ "downloadModel": "Baixar modelo",
+ "tools": "Ferramentas",
+ "searchPlaceholder": "Buscar modelos no Hugging Face...",
+ "joyride": {
+ "recommendedModelTitle": "Modelo Recomendado",
+ "recommendedModelContent": "Navegue e baixe modelos de IA poderosos de vários provedores, tudo em um só lugar. Sugerimos começar com o Jan-Nano - um modelo otimizado para chamadas de função, integração de ferramentas e capacidades de pesquisa. É ideal para construir agentes de IA interativos.",
+ "downloadInProgressTitle": "Download em Progresso",
+ "downloadInProgressContent": "Seu modelo está sendo baixado. Acompanhe o progresso aqui - uma vez finalizado, estará pronto para usar.",
+ "downloadModelTitle": "Baixar Modelo",
+ "downloadModelContent": "Clique no botão Baixar para começar a baixar o modelo.",
+ "back": "Voltar",
+ "close": "Fechar",
+ "lastWithDownload": "Baixar",
+ "last": "Finalizar",
+ "next": "Próximo",
+ "skip": "Pular"
+ }
+}
diff --git a/web-app/src/locales/pt-BR/logs.json b/web-app/src/locales/pt-BR/logs.json
new file mode 100644
index 0000000000..409aa69a0f
--- /dev/null
+++ b/web-app/src/locales/pt-BR/logs.json
@@ -0,0 +1,3 @@
+{
+ "noLogs": "Nenhum log disponível"
+}
\ No newline at end of file
diff --git a/web-app/src/locales/pt-BR/mcp-servers.json b/web-app/src/locales/pt-BR/mcp-servers.json
new file mode 100644
index 0000000000..13ff1ed033
--- /dev/null
+++ b/web-app/src/locales/pt-BR/mcp-servers.json
@@ -0,0 +1,47 @@
+{
+ "editServer": "Editar Servidor MCP",
+ "addServer": "Adicionar Servidor MCP",
+ "serverName": "Nome do Servidor",
+ "enterServerName": "Digite o nome do servidor",
+ "command": "Comando",
+ "enterCommand": "Digite o comando (uvx ou npx)",
+ "arguments": "Argumentos",
+ "argument": "Argumento {{index}}",
+ "envVars": "Variáveis de Ambiente",
+ "key": "Chave",
+ "value": "Valor",
+ "save": "Salvar",
+ "status": "Status",
+ "connected": "Conectado",
+ "disconnected": "Desconectado",
+ "deleteServer": {
+ "title": "Remover Servidor MCP",
+ "description": "Tem certeza de que deseja remover o servidor MCP {{serverName}}? Esta ação não pode ser desfeita.",
+ "delete": "Remover",
+ "success": "Servidor MCP {{serverName}} removido com sucesso"
+ },
+ "editJson": {
+ "title": "Editar JSON para Servidor MCP: {{serverName}}",
+ "titleAll": "Editar JSON de Todos os Servidores MCP",
+ "placeholder": "Digite a configuração JSON",
+ "errorParse": "Falha ao analisar dados iniciais",
+ "errorPaste": "Formato JSON inválido no conteúdo colado",
+ "errorFormat": "Formato JSON inválido",
+ "errorServerName": " Nome do servidor é obrigatório e não pode estar vazio",
+ "errorMissingServerNameKey": "JSON deve estar estruturado como {\"serverName\": {config}} - chave com nome do servidor ausente",
+ "errorInvalidType": "Tipo inválido '{{type}}' para servidor '{{serverName}}'. Tipo deve ser 'stdio', 'http', ou 'sse'",
+ "save": "Salvar"
+ },
+ "checkParams": "Por favor, verifique os parâmetros de acordo com o tutorial.",
+ "title": "Servidores MCP",
+ "experimental": "Experimental",
+ "editAllJson": "Editar JSON de Todos os Servidores",
+ "findMore": "Encontre mais servidores MCP em",
+ "allowPermissions": "Permitir Todas as Permissões de Ferramentas MCP",
+ "allowPermissionsDesc": "Quando habilitado, todas as chamadas de ferramentas MCP serão automaticamente aprovadas sem mostrar diálogos de permissão. Esta configuração se aplica globalmente a todas as conversas, incluindo novos chats.",
+ "noServers": "Nenhum servidor MCP encontrado",
+ "args": "Args",
+ "env": "Env",
+ "serverStatusActive": "Servidor {{serverKey}} ativado com sucesso",
+ "serverStatusInactive": "Servidor {{serverKey}} desativado com sucesso"
+}
diff --git a/web-app/src/locales/pt-BR/model-errors.json b/web-app/src/locales/pt-BR/model-errors.json
new file mode 100644
index 0000000000..0abca540bc
--- /dev/null
+++ b/web-app/src/locales/pt-BR/model-errors.json
@@ -0,0 +1,7 @@
+{
+ "title": "Erro de contexto esgotado",
+ "description": "Este chat está atingindo o limite de memória da IA, como um quadro branco ficando cheio. Podemos expandir a janela de memória (chamada tamanho do contexto) para que ela lembre mais, mas pode usar mais da memória do seu computador. Também podemos truncar a entrada, o que significa que ela esquecerá parte do histórico do chat para dar espaço a novas mensagens.",
+ "increaseContextSizeDescription": "Você quer aumentar o tamanho do contexto?",
+ "truncateInput": "Truncar Entrada",
+ "increaseContextSize": "Aumentar Tamanho do Contexto"
+}
diff --git a/web-app/src/locales/pt-BR/provider.json b/web-app/src/locales/pt-BR/provider.json
new file mode 100644
index 0000000000..2bc1768d75
--- /dev/null
+++ b/web-app/src/locales/pt-BR/provider.json
@@ -0,0 +1,5 @@
+{
+ "addProvider": "Adicionar Provedor",
+ "addOpenAIProvider": "Adicionar Provedor OpenAI",
+ "enterNameForProvider": "Digite o nome para o provedor"
+}
\ No newline at end of file
diff --git a/web-app/src/locales/pt-BR/providers.json b/web-app/src/locales/pt-BR/providers.json
new file mode 100644
index 0000000000..37ff68aaf4
--- /dev/null
+++ b/web-app/src/locales/pt-BR/providers.json
@@ -0,0 +1,74 @@
+{
+ "joyride": {
+ "chooseProviderTitle": "Escolha um Provedor",
+ "chooseProviderContent": "Escolha o provedor que você quer usar, certifique-se de ter acesso a uma chave API para ele.",
+ "getApiKeyTitle": "Obtenha sua Chave de API",
+ "getApiKeyContent": "Entre no painel do provedor para encontrar ou gerar sua chave de API.",
+ "insertApiKeyTitle": "Insira sua Chave de API",
+ "insertApiKeyContent": "Cole sua chave de API aqui para conectar e ativar o provedor.",
+ "back": "Voltar",
+ "close": "Fechar",
+ "last": "Finalizar",
+ "next": "Próximo",
+ "skip": "Pular"
+ },
+ "refreshModelsError": "Provedor deve ter URL base e chave API configuradas para buscar modelos.",
+ "refreshModelsSuccess": "Adicionado {{count}} novo(s) modelo(s) de {{provider}}.",
+ "noNewModels": "Nenhum modelo novo encontrado. Todos os modelos disponíveis já foram adicionados.",
+ "refreshModelsFailed": "Falha ao buscar modelos de {{provider}}. Verifique sua chave de API e URL base.",
+ "models": "Modelos",
+ "refreshing": "Atualizando...",
+ "refresh": "Atualizar",
+ "import": "Importar",
+ "importModelSuccess": "Modelo {{provider}} foi importado com sucesso.",
+ "importModelError": "Falha ao importar modelo:",
+ "stop": "Parar",
+ "start": "Iniciar",
+ "noModelFound": "Nenhum modelo encontrado",
+ "noModelFoundDesc": "Modelos disponíveis serão listados aqui. Se você ainda não tem modelos, visite o Hub para baixar.",
+ "configuration": "Configuração",
+ "apiEndpoint": "Endpoint da API",
+ "testConnection": "Testar Conexão",
+ "addModel": {
+ "title": "Adicionar Novo Modelo",
+ "description": "Adicionar um novo modelo ao provedor {{provider}}.",
+ "modelId": "ID do Modelo",
+ "enterModelId": "Digite o ID do modelo",
+ "exploreModels": "Ver lista de modelos de {{provider}}",
+ "addModel": "Adicionar Modelo",
+ "modelExists": "Modelo já existe",
+ "modelExistsDesc": "Por favor, escolha um ID de modelo diferente."
+ },
+ "deleteModel": {
+ "title": "Remover Modelo: {{modelId}}",
+ "description": "Tem certeza de que deseja remover este modelo? Esta ação não pode ser desfeita.",
+ "success": "Modelo {{modelId}} foi removido permanentemente.",
+ "cancel": "Cancelar",
+ "delete": "Remover"
+ },
+ "deleteProvider": {
+ "title": "Remover Provedor",
+ "description": "Remover este provedor e todos os seus modelos. Esta ação não pode ser desfeita.",
+ "success": "Provedor {{provider}} foi removido permanentemente.",
+ "confirmTitle": "Remover Provedor: {{provider}}",
+ "confirmDescription": "Tem certeza de que deseja remover este provedor? Esta ação não pode ser desfeita.",
+ "cancel": "Cancelar",
+ "delete": "Remover"
+ },
+ "editModel": {
+ "title": "Editar Modelo: {{modelId}}",
+ "description": "Configure as capacidades do modelo alterando as opções abaixo.",
+ "capabilities": "Capacidades",
+ "tools": "Ferramentas",
+ "vision": "Visão",
+ "embeddings": "Embeddings",
+ "notAvailable": "Ainda não disponível",
+ "warning": {
+ "title": "Prossiga com Cautela",
+ "description": "Modificar capacidades do modelo pode afetar desempenho e funcionalidade. Configurações incorretas podem causar comportamento inesperado ou erros."
+ }
+ },
+ "addProvider": "Adicionar Provedor",
+ "addOpenAIProvider": "Adicionar Provedor OpenAI",
+ "enterNameForProvider": "Digite o nome para o provedor"
+}
diff --git a/web-app/src/locales/pt-BR/settings.json b/web-app/src/locales/pt-BR/settings.json
new file mode 100644
index 0000000000..45c85eb99e
--- /dev/null
+++ b/web-app/src/locales/pt-BR/settings.json
@@ -0,0 +1,304 @@
+{
+ "autoDownload": "Download automático de novas atualizações",
+ "checkForUpdates": "Verificar Atualizações",
+ "checkForUpdatesDesc": "Verificar se uma versão mais nova do Jan está disponível.",
+ "checkingForUpdates": "Verificando atualizações...",
+ "noUpdateAvailable": "Você está executando a versão mais recente",
+ "devVersion": "Versão de desenvolvimento detectada",
+ "updateError": "Falha ao verificar atualizações",
+ "checkForBackendUpdates": "Verificar Atualizações do Llamacpp",
+ "checkForBackendUpdatesDesc": "Verificar se uma versão mais nova do backend Llamacpp está disponível.",
+ "checkingForBackendUpdates": "Verificando atualizações do Llamacpp...",
+ "noBackendUpdateAvailable": "Você está executando a versão mais recente do Llamacpp",
+ "backendUpdateError": "Falha ao verificar atualizações do Llamacpp",
+ "changeLocation": "Alterar Localização",
+ "copied": "Copiado",
+ "copyPath": "Copiar Caminho",
+ "openLogs": "Abrir Logs",
+ "revealLogs": "Mostrar Logs",
+ "showInFinder": "Mostrar no Finder",
+ "showInFileExplorer": "Mostrar no Explorer de Arquivos",
+ "openContainingFolder": "Abrir Pasta",
+ "failedToRelocateDataFolder": "Falha ao realocar pasta de dados",
+ "failedToRelocateDataFolderDesc": "Falha ao realocar pasta de dados. Tente novamente.",
+ "factoryResetTitle": "Redefinir para Configurações originais",
+ "factoryResetDesc": "Isso redefinirá todas as configurações do app para os padrões originais. Isso não pode ser desfeito. Recomendamos isso apenas se o app estiver corrompido.",
+ "cancel": "Cancelar",
+ "reset": "Redefinir",
+ "resources": "Recursos",
+ "documentation": "Documentação",
+ "documentationDesc": "Aprenda como usar o Jan e explore seus recursos.",
+ "viewDocs": "Ver Documentação",
+ "releaseNotes": "Notas de Versão",
+ "releaseNotesDesc": "Veja o que há de novo na versão mais recente do Jan.",
+ "viewReleases": "Ver Versões",
+ "community": "Comunidade",
+ "github": "GitHub",
+ "githubDesc": "Contribua para o desenvolvimento do Jan.",
+ "discord": "Discord",
+ "discordDesc": "Junte-se à nossa comunidade para suporte e discussões.",
+ "support": "Suporte",
+ "reportAnIssue": "Reportar um Problema",
+ "reportAnIssueDesc": "Encontrou um bug? Ajude-nos relatando um problema no GitHub.",
+ "reportIssue": "Reportar Problema",
+ "credits": "Créditos",
+ "creditsDesc1": "👋 Jan é construído com ❤️ pela equipe Menlo Research.",
+ "creditsDesc2": "Agradecimentos especiais às nossas dependências de código aberto—especialmente llama.cpp e Tauri—e à nossa incrível comunidade de IA.",
+ "appVersion": "Versão do App",
+ "dataFolder": {
+ "appData": "Dados do App",
+ "appDataDesc": "Localização padrão para mensagens e outros dados do usuário.",
+ "appLogs": "Logs do App",
+ "appLogsDesc": "Ver logs detalhados do App."
+ },
+ "others": {
+ "spellCheck": "Verificação Ortográfica",
+ "spellCheckDesc": "Habilitar verificação ortográfica para suas conversas.",
+ "resetFactory": "Redefinir para Configurações Originais",
+ "resetFactoryDesc": "Restaurar aplicação ao seu estado inicial, apagando todos os modelos e histórico de chat. Esta ação é irreversível e recomendada apenas se a aplicação estiver corrompida."
+ },
+ "shortcuts": {
+ "application": "Aplicação",
+ "newChat": "Novo Chat",
+ "newChatDesc": "Criar um novo chat.",
+ "toggleSidebar": "Mostrar/Ocultar Barra Lateral",
+ "toggleSidebarDesc": "Mostrar/ocultar a barra lateral.",
+ "zoomIn": "Aumentar Zoom",
+ "zoomInDesc": "Aumentar o nível de zoom.",
+ "zoomOut": "Diminuir Zoom",
+ "zoomOutDesc": "Diminuir o nível de zoom.",
+ "chat": "Chat",
+ "sendMessage": "Enviar Mensagem",
+ "sendMessageDesc": "Enviar a mensagem atual.",
+ "enter": "Enter",
+ "newLine": "Nova Linha",
+ "newLineDesc": "Inserir uma nova linha.",
+ "shiftEnter": "Shift + Enter",
+ "navigation": "Navegação",
+ "goToSettings": "Ir para Configurações",
+ "goToSettingsDesc": "Abrir configurações."
+ },
+ "appearance": {
+ "title": "Aparência",
+ "theme": "Tema",
+ "themeDesc": "Corresponder ao tema do Sistema Operacional.",
+ "fontSize": "Tamanho da Fonte",
+ "fontSizeDesc": "Ajustar o tamanho da fonte do app.",
+ "windowBackground": "Fundo da Janela",
+ "windowBackgroundDesc": "Definir a cor de fundo da janela do app.",
+ "appMainView": "Visualização Principal do App",
+ "appMainViewDesc": "Definir a cor de fundo da área de conteúdo principal.",
+ "primary": "Primário",
+ "primaryDesc": "Definir a cor primária para componentes da UI.",
+ "accent": "Destaque",
+ "accentDesc": "Definir a cor de destaque para realces da UI.",
+ "destructive": "Destrutivo",
+ "destructiveDesc": "Definir a cor para ações destrutivas.",
+ "resetToDefault": "Redefinir para Padrão",
+ "resetToDefaultDesc": "Redefinir todas as configurações de aparência para padrão.",
+ "resetAppearanceSuccess": "Aparência redefinida com sucesso",
+ "resetAppearanceSuccessDesc": "Todas as configurações de aparência foram restauradas para padrão.",
+ "chatWidth": "Largura do Chat",
+ "chatWidthDesc": "Personalizar a largura da visualização do chat.",
+ "tokenCounterCompact": "Contador de Tokens Compacto",
+ "tokenCounterCompactDesc": "Mostrar contador de tokens dentro da entrada do chat. Quando desabilitado, contador de tokens aparece abaixo da entrada.",
+ "codeBlockTitle": "Bloco de Código",
+ "codeBlockDesc": "Escolher um estilo de realce de sintaxe.",
+ "showLineNumbers": "Mostrar Números de Linha",
+ "showLineNumbersDesc": "Exibir números de linha em blocos de código.",
+ "resetCodeBlockStyle": "Redefinir Estilo do Bloco de Código",
+ "resetCodeBlockStyleDesc": "Redefinir estilo do bloco de código para padrão.",
+ "resetCodeBlockSuccess": "Estilo do bloco de código redefinido com sucesso",
+ "resetCodeBlockSuccessDesc": "Estilo do bloco de código foi restaurado para padrão."
+ },
+ "hardware": {
+ "os": "Sistema Operacional",
+ "name": "Nome",
+ "version": "Versão",
+ "cpu": "CPU",
+ "model": "Modelo",
+ "architecture": "Arquitetura",
+ "cores": "Cores",
+ "instructions": "Instruções",
+ "usage": "Uso",
+ "memory": "Memória",
+ "totalRam": "RAM Total",
+ "availableRam": "RAM Disponível",
+ "vulkan": "Vulkan",
+ "enableVulkan": "Habilitar Vulkan",
+ "enableVulkanDesc": "Usar API Vulkan para aceleração GPU. Não habilite Vulkan se você tem uma GPU NVIDIA pois pode causar problemas de compatibilidade.",
+ "gpus": "GPUs",
+ "noGpus": "Nenhuma GPU detectada",
+ "vram": "VRAM",
+ "freeOf": "livre de",
+ "driverVersion": "Versão do Driver",
+ "computeCapability": "Capacidade de Computação",
+ "systemMonitor": "Monitor do Sistema"
+ },
+ "httpsProxy": {
+ "proxy": "Proxy",
+ "proxyUrl": "URL do Proxy",
+ "proxyUrlDesc": "A URL e porta do seu servidor proxy.",
+ "proxyUrlPlaceholder": "http://proxy.example.com:8080",
+ "authentication": "Autenticação",
+ "authenticationDesc": "Credenciais para o servidor proxy, se necessário.",
+ "username": "Nome de Usuário",
+ "password": "Senha",
+ "noProxy": "Sem Proxy",
+ "noProxyDesc": "Uma lista separada por vírgulas de hosts para contornar o proxy.",
+ "noProxyPlaceholder": "localhost,127.0.0.1,.local",
+ "sslVerification": "Verificação SSL",
+ "ignoreSsl": "Ignorar Certificados SSL",
+ "ignoreSslDesc": "Permitir certificados auto-assinados ou não verificados. Isso pode ser necessário para alguns proxies, mas reduz a segurança. Habilite apenas se confiar no seu proxy.",
+ "proxySsl": "SSL do Proxy",
+ "proxySslDesc": "Validar o certificado SSL ao conectar ao proxy.",
+ "proxyHostSsl": "SSL do Host do Proxy",
+ "proxyHostSslDesc": "Validar o certificado SSL do host do proxy.",
+ "peerSsl": "SSL do Peer",
+ "peerSslDesc": "Validar os certificados SSL das conexões peer.",
+ "hostSsl": "SSL do Host",
+ "hostSslDesc": "Validar os certificados SSL dos hosts de destino."
+ },
+ "localApiServer": {
+ "title": "Servidor de API Local",
+ "description": "Executar um servidor compatível com OpenAI localmente.",
+ "startServer": "Iniciar Servidor",
+ "loadingModel": "Carregando Modelo",
+ "startingServer": "Iniciando Servidor",
+ "stopServer": "Parar Servidor",
+ "serverLogs": "Logs do Servidor",
+ "serverLogsDesc": "Ver logs detalhados do servidor API local.",
+ "openLogs": "Abrir Logs",
+ "swaggerDocs": "Documentação da API",
+ "swaggerDocsDesc": "Ver documentação interativa da API (Swagger UI).",
+ "openDocs": "Abrir Documentos",
+ "startupConfiguration": "Configuração de Inicialização",
+ "runOnStartup": "Inicialização automática",
+ "runOnStartupDesc": "Iniciar automaticamente o Servidor API Local quando a aplicação for lançada. Usa o último modelo usado, ou escolhe o primeiro modelo disponível se indisponível.",
+ "serverConfiguration": "Configuração do Servidor",
+ "serverHost": "Host do Servidor",
+ "serverHostDesc": "Endereço de rede para o servidor.",
+ "serverPort": "Porta do Servidor",
+ "serverPortDesc": "Número da porta para o servidor API.",
+ "apiPrefix": "Prefixo da API",
+ "apiPrefixDesc": "Prefixo do caminho para endpoints da API.",
+ "apiKey": "Chave de API",
+ "apiKeyDesc": "Autenticar requisições com uma chave de API.",
+ "trustedHosts": "Hosts Confiáveis",
+ "trustedHostsDesc": "Hosts permitidos para acessar o servidor, separados por vírgulas.",
+ "advancedSettings": "Configurações Avançadas",
+ "cors": "Compartilhamento de Recursos de Origem Cruzada (CORS)",
+ "corsDesc": "Permitir requisições de origem cruzada para o servidor de API.",
+ "verboseLogs": "Logs Detalhados do Servidor",
+ "verboseLogsDesc": "Habilitar logs detalhados do servidor para depuração.",
+ "proxyTimeout": "Timeout de Requisição",
+ "proxyTimeoutDesc": "Tempo para aguardar uma resposta do modelo local, segundos."
+ },
+ "privacy": {
+ "analytics": "Analytics",
+ "helpUsImprove": "Ajude-nos a melhorar",
+ "helpUsImproveDesc": "Para nos ajudar a melhorar o Jan, você pode compartilhar dados anônimos como uso de recursos e contagem de usuários. Nunca coletamos seus chats ou informações pessoais.",
+ "privacyPolicy": "Você tem controle total sobre seus dados. Saiba mais em nossa Política de Privacidade.",
+ "analyticsDesc": "Para melhorar o Jan, precisamos entender como é usado—mas apenas com sua ajuda. Você pode alterar esta configuração a qualquer momento.",
+ "privacyPromises": "Sua escolha aqui não mudará nossas promessas básicas de privacidade:",
+ "promise1": "Suas conversas permanecem privadas e no seu dispositivo",
+ "promise2": "Nunca coletamos suas informações pessoais ou conteúdo de chat",
+ "promise3": "Todo compartilhamento de dados é anônimo e agregado",
+ "promise4": "Você pode optar por sair a qualquer momento sem perder funcionalidade",
+ "promise5": "Somos transparentes sobre o que coletamos e por quê"
+ },
+ "general": {
+ "showInFinder": "Mostrar no Finder",
+ "showInFileExplorer": "Mostrar no Explorador de Arquivos",
+ "openContainingFolder": "Abrir Pasta Contendo",
+ "failedToRelocateDataFolder": "Falha ao realocar pasta de dados",
+ "couldNotRelocateToRoot": "Não é possível realocar pasta de dados para diretório raiz. Por favor, escolha outra localização.",
+ "couldNotResetRootDirectory": "Não é possível redefinir pasta de dados quando está definida para um diretório raiz. Por favor, delete a pasta de dados manualmente.",
+ "failedToRelocateDataFolderDesc": "Falha ao realocar pasta de dados. Tente novamente.",
+ "devVersion": "Versão de desenvolvimento detectada",
+ "noUpdateAvailable": "Você está executando a versão mais recente",
+ "updateError": "Falha ao verificar atualizações",
+ "appVersion": "Versão do App",
+ "checkForUpdates": "Verificar Atualizações",
+ "checkForUpdatesDesc": "Verificar se uma versão mais nova do Jan está disponível.",
+ "checkingForUpdates": "Verificando atualizações...",
+ "copied": "Copiado",
+ "copyPath": "Copiar Caminho",
+ "changeLocation": "Alterar Localização",
+ "openLogs": "Abrir Logs",
+ "revealLogs": "Mostrar Logs",
+ "factoryResetTitle": "Redefinir para Configurações de Fábrica",
+ "factoryResetDesc": "Isso redefinirá todas as configurações do app para os padrões. Isso não pode ser desfeito. Recomendamos isso apenas se o app estiver corrompido.",
+ "cancel": "Cancelar",
+ "reset": "Redefinir",
+ "huggingfaceToken": "Token HuggingFace",
+ "huggingfaceTokenDesc": "Seu token da API HuggingFace para acessar modelos.",
+ "resources": "Recursos",
+ "documentation": "Documentação",
+ "documentationDesc": "Aprenda como usar o Jan e explore seus recursos.",
+ "viewDocs": "Ver Documentos",
+ "releaseNotes": "Notas de Versão",
+ "releaseNotesDesc": "Veja o que há de novo na versão mais recente do Jan.",
+ "viewReleases": "Ver Versões",
+ "community": "Comunidade",
+ "github": "GitHub",
+ "githubDesc": "Contribua para o desenvolvimento do Jan.",
+ "discord": "Discord",
+ "discordDesc": "Junte-se à nossa comunidade para suporte e discussões.",
+ "support": "Suporte",
+ "reportAnIssue": "Reportar um Problema",
+ "reportAnIssueDesc": "Encontrou um bug? Ajude-nos relatando um problema no GitHub.",
+ "reportIssue": "Reportar Problema",
+ "credits": "Créditos",
+ "creditsDesc1": "👋 Jan é construído com ❤️ pela equipe Menlo Research.",
+ "creditsDesc2": "Agradecimentos especiais às nossas dependências de código aberto—especialmente llama.cpp e Tauri—e à nossa incrível comunidade de IA."
+ },
+ "extensions": {
+ "title": "Extensões"
+ },
+ "attachments": {
+ "subtitle": "Configure anexos de documentos, limites de tamanho e comportamento de recuperação.",
+ "featureTitle": "Recurso",
+ "enable": "Habilitar Anexos",
+ "enableDesc": "Permitir upload e indexação de documentos para recuperação.",
+ "limitsTitle": "Limites",
+ "maxFile": "Tamanho Máximo do Arquivo (MB)",
+ "maxFileDesc": "Tamanho máximo por arquivo. Aplicado no upload e processamento.",
+ "retrievalTitle": "Recuperação",
+ "topK": "Top-K",
+ "topKDesc": "Máximo de citações para retornar.",
+ "threshold": "Limite de Afinidade",
+ "thresholdDesc": "Pontuação mínima de similaridade (0-1). Usado apenas para busca linear cosseno, não ANN.",
+ "searchMode": "Modo de Busca Vetorial",
+ "searchModeDesc": "Escolha entre sqlite-vec ANN, cosseno linear, ou auto.",
+ "searchModeAuto": "Auto (recomendado)",
+ "searchModeAnn": "ANN (sqlite-vec)",
+ "searchModeLinear": "Linear",
+ "chunkingTitle": "Fragmentação",
+ "chunkSize": "Tamanho do Fragmento (tokens)",
+ "chunkSizeDesc": "Máximo aproximado de tokens por fragmento para embeddings.",
+ "chunkOverlap": "Sobreposição (tokens)",
+ "chunkOverlapDesc": "Sobreposição de tokens entre fragmentos consecutivos."
+ },
+ "dialogs": {
+ "changeDataFolder": {
+ "title": "Alterar Localização da Pasta de Dados",
+ "description": "Tem certeza de que deseja alterar a localização da pasta de dados? Isso moverá todos os seus dados para a nova localização e reiniciará a aplicação.",
+ "currentLocation": "Localização Atual:",
+ "newLocation": "Nova Localização:",
+ "cancel": "Cancelar",
+ "changeLocation": "Alterar Localização"
+ }
+ },
+ "backendUpdater": {
+ "newBackendVersion": "Nova Versão Llamacpp {{version}}",
+ "backendUpdateAvailable": "Atualização Llamacpp Disponível",
+ "remindMeLater": "Lembre-me Mais Tarde",
+ "updating": "Atualizando...",
+ "updateNow": "Atualizar Agora",
+ "updateSuccess": "Llamacpp atualizado com sucesso",
+ "updateError": "Falha ao atualizar Llamacpp"
+ },
+ "backendInstallSuccess": "Backend instalado com sucesso",
+ "backendInstallError": "Falha ao instalar backend"
+}
diff --git a/web-app/src/locales/pt-BR/setup.json b/web-app/src/locales/pt-BR/setup.json
new file mode 100644
index 0000000000..795d219b86
--- /dev/null
+++ b/web-app/src/locales/pt-BR/setup.json
@@ -0,0 +1,6 @@
+{
+ "welcome": "Bem-vindo ao Jan",
+ "description": "Para começar, você precisará baixar um modelo de IA local ou conectar-se a um modelo em nuvem usando uma chave de API",
+ "localModel": "Configurar modelo local",
+ "remoteProvider": "Configurar provedor remoto"
+}
\ No newline at end of file
diff --git a/web-app/src/locales/pt-BR/system-monitor.json b/web-app/src/locales/pt-BR/system-monitor.json
new file mode 100644
index 0000000000..54d41771a6
--- /dev/null
+++ b/web-app/src/locales/pt-BR/system-monitor.json
@@ -0,0 +1,28 @@
+{
+ "title": "Monitor do Sistema",
+ "cpuUsage": "Uso da CPU",
+ "model": "Modelo",
+ "cores": "Núcleos",
+ "architecture": "Arquitetura",
+ "currentUsage": "Uso Atual",
+ "memoryUsage": "Uso da Memória",
+ "totalRam": "RAM Total",
+ "availableRam": "RAM Disponível",
+ "usedRam": "RAM Usada",
+ "runningModels": "Modelos em Execução",
+ "noRunningModels": "Nenhum modelo está executando atualmente",
+ "provider": "Provedor",
+ "uptime": "Tempo de Atividade",
+ "actions": "Ações",
+ "stop": "Parar",
+ "activeGpus": "GPUs Ativas",
+ "noGpus": "Nenhuma GPU detectada",
+ "noActiveGpus": "Nenhuma GPU ativa. Todas as GPUs estão atualmente desabilitadas.",
+ "vramUsage": "Uso da VRAM",
+ "driverVersion": "Versão do Driver:",
+ "computeCapability": "Capacidade de Computação:",
+ "active": "Ativo",
+ "performance": "Desempenho",
+ "resources": "Recursos",
+ "refresh": "Atualizar"
+}
\ No newline at end of file
diff --git a/web-app/src/locales/pt-BR/tool-approval.json b/web-app/src/locales/pt-BR/tool-approval.json
new file mode 100644
index 0000000000..0c0678b12c
--- /dev/null
+++ b/web-app/src/locales/pt-BR/tool-approval.json
@@ -0,0 +1,12 @@
+{
+ "title": "Solicitação de Chamada de Ferramenta",
+ "description": "O assistente quer usar a ferramenta: {{toolName}}",
+ "securityNotice": "Aviso de Segurança: Ferramentas maliciosas ou conteúdo de conversa podem potencialmente enganar o assistente para tentar ações prejudiciais. Revise cada chamada de ferramenta cuidadosamente antes de aprovar.",
+ "deny": "Negar",
+ "allowOnce": "Permitir Uma Vez",
+ "alwaysAllow": "Permitir na conversa",
+ "permissions": "Permissões",
+ "approve": "Aprovar",
+ "reject": "Rejeitar",
+ "parameters": "Parâmetros da Ferramenta"
+}
diff --git a/web-app/src/locales/pt-BR/tools.json b/web-app/src/locales/pt-BR/tools.json
new file mode 100644
index 0000000000..41305ca579
--- /dev/null
+++ b/web-app/src/locales/pt-BR/tools.json
@@ -0,0 +1,12 @@
+{
+ "toolApproval": {
+ "title": "Aprovação de Ferramenta Necessária",
+ "description": "O assistente quer usar a ferramenta: {{toolName}}",
+ "securityNotice": "Aviso de Segurança: Ferramentas maliciosas ou conteúdo de conversa podem potencialmente enganar o assistente para tentar ações prejudiciais. Revise cada chamada de ferramenta cuidadosamente antes de aprovar.",
+ "deny": "Negar",
+ "allowOnce": "Permitir Uma Vez",
+ "alwaysAllow": "Permitir na conversa",
+ "parameters": "Parâmetros da Ferramenta",
+ "permissionScope": "Permissões concedidas aplicam-se apenas a esta conversa."
+ }
+}
diff --git a/web-app/src/locales/pt-BR/updater.json b/web-app/src/locales/pt-BR/updater.json
new file mode 100644
index 0000000000..d99c7ea2a3
--- /dev/null
+++ b/web-app/src/locales/pt-BR/updater.json
@@ -0,0 +1,10 @@
+{
+ "newVersion": "Nova Versão {{version}}",
+ "updateAvailable": "Atualização Disponível",
+ "nightlyBuild": "Build Noturno",
+ "showReleaseNotes": "Mostrar Notas de Versão",
+ "hideReleaseNotes": "Ocultar Notas de Versão",
+ "remindMeLater": "Lembre-me Mais Tarde",
+ "downloading": "Baixando...",
+ "updateNow": "Atualizar Agora"
+}
\ No newline at end of file