diff --git a/src/assets/locale/pt-BR/common.json b/src/assets/locale/pt-BR/common.json
new file mode 100644
index 0000000..f2af56a
--- /dev/null
+++ b/src/assets/locale/pt-BR/common.json
@@ -0,0 +1,88 @@
+{
+ "pageAssist": "Page Assist",
+ "selectAModel": "Selecione um Modelo",
+ "save": "Salvar",
+ "saved": "Salvo",
+ "cancel": "Cancelar",
+ "retry": "Tentar Novamente",
+ "share": {
+ "tooltip": {
+ "share": "Compartilhar"
+ },
+ "modal": {
+ "title": "Compartilhar link para o Chat"
+ },
+ "form": {
+ "defaultValue": {
+ "name": "Anônimo",
+ "title": "Chat sem título"
+ },
+ "title": {
+ "label": "Título do Chat",
+ "placeholder": "Digite o título do Chat",
+ "required": "O título do Chat é obrigatório"
+ },
+ "name": {
+ "label": "Seu nome",
+ "placeholder": "Digite seu nome",
+ "required": "Seu nome é obrigatório"
+ },
+ "btn": {
+ "save": "Gerar Link",
+ "saving": "Gerando Link..."
+ }
+ },
+ "notification": {
+ "successGenerate": "Link copiado para a área de transferência",
+ "failGenerate": "Falha ao gerar link"
+ }
+ },
+ "copyToClipboard": "Copiar para a área de transferência",
+ "webSearch": "Pesquisando na web",
+ "regenerate": "Regenerar",
+ "edit": "Editar",
+ "saveAndSubmit": "Salvar e Enviar",
+ "editMessage": {
+ "placeholder": "Digite uma mensagem..."
+ },
+ "submit": "Enviar",
+ "noData": "Sem dados",
+ "noHistory": "Sem histórico de chat",
+ "chatWithCurrentPage": "Conversar com a página atual",
+ "beta": "Beta",
+ "tts": "Ler em voz alta",
+ "currentChatModelSettings": "Configurações do Modelo de Chat Atual",
+ "modelSettings": {
+ "label": "Configurações do Modelo",
+ "description": "Defina as opções do modelo globalmente para todos os chats",
+ "form": {
+ "keepAlive": {
+ "label": "Manter Vivo",
+ "help": "controla quanto tempo o modelo permanecerá carregado na memória após a solicitação (padrão: 5m)",
+ "placeholder": "Digite a duração do Manter Vivo (ex: 5m, 10m, 1h)"
+ },
+ "temperature": {
+ "label": "Temperatura",
+ "placeholder": "Digite o valor da Temperatura (ex: 0.7, 1.0)"
+ },
+ "numCtx": {
+ "label": "Janela de contexto",
+ "placeholder": "Digite o valor do tamanho da janela de contexto (padrão: 2048)"
+ },
+ "seed": {
+ "label": "Semente",
+ "placeholder": "Digite o valor da Semente (ex: 1234)",
+ "help": "Reprodutibilidade da saída do modelo"
+ },
+ "topK": {
+ "label": "Top K",
+ "placeholder": "Digite o valor do Top K (ex: 40, 100)"
+ },
+ "topP": {
+ "label": "Top P",
+ "placeholder": "Digite o valor do Top P (ex: 0.9, 0.95)"
+ }
+ },
+ "advanced": "Mais Configurações do Modelo"
+ }
+}
\ No newline at end of file
diff --git a/src/assets/locale/pt-BR/knowledge.json b/src/assets/locale/pt-BR/knowledge.json
new file mode 100644
index 0000000..3ac43e6
--- /dev/null
+++ b/src/assets/locale/pt-BR/knowledge.json
@@ -0,0 +1,42 @@
+{
+ "addBtn": "Adicionar Novo Conhecimento",
+ "columns": {
+ "title": "Título",
+ "status": "Status",
+ "embeddings": "Modelo de Embedding",
+ "createdAt": "Criado Em",
+ "action": "Ações"
+ },
+ "expandedColumns": {
+ "name": "Nome"
+ },
+ "tooltip": {
+ "delete": "Excluir"
+ },
+ "confirm": {
+ "delete": "Você tem certeza que deseja excluir este conhecimento?"
+ },
+ "deleteSuccess": "Conhecimento excluído com sucesso",
+ "status": {
+ "pending": "Pendente",
+ "finished": "Concluído",
+ "processing": "Processando"
+ },
+ "addKnowledge": "Adicionar Conhecimento",
+ "form": {
+ "title": {
+ "label": "Título do Conhecimento",
+ "placeholder": "Insira o título do conhecimento",
+ "required": "Título do conhecimento é obrigatório"
+ },
+ "uploadFile": {
+ "label": "Upload de Arquivo",
+ "uploadText": "Arraste e solte um arquivo aqui ou clique para upload",
+ "uploadHint": "Tipos de arquivo suportados: .pdf, .csv, .txt, .md, .docx",
+ "required": "Arquivo é obrigatório"
+ },
+ "submit": "Enviar",
+ "success": "Conhecimento adicionado com sucesso"
+ },
+ "noEmbeddingModel": "Por favor, adicione um modelo de embedding primeiro na página de configurações do Ollama"
+}
\ No newline at end of file
diff --git a/src/assets/locale/pt-BR/option.json b/src/assets/locale/pt-BR/option.json
new file mode 100644
index 0000000..9fab1b3
--- /dev/null
+++ b/src/assets/locale/pt-BR/option.json
@@ -0,0 +1,12 @@
+{
+ "newChat": "Novo Chat",
+ "selectAPrompt": "Selecione um Prompt",
+ "githubRepository": "Repositório do GitHub",
+ "settings": "Configurações",
+ "sidebarTitle": "Histórico de Chat",
+ "error": "Erro",
+ "somethingWentWrong": "Algo deu errado",
+ "validationSelectModel": "Selecione um modelo para continuar",
+ "deleteHistoryConfirmation": "Você tem certeza de que deseja excluir este histórico?",
+ "editHistoryTitle": "Insira um novo título"
+}
diff --git a/src/assets/locale/pt-BR/playground.json b/src/assets/locale/pt-BR/playground.json
new file mode 100644
index 0000000..f0cdfe3
--- /dev/null
+++ b/src/assets/locale/pt-BR/playground.json
@@ -0,0 +1,29 @@
+{
+ "ollamaState": {
+ "searching": "Buscando seu Ollama 🦙",
+ "running": "O Ollama está rodando 🦙",
+ "notRunning": "Não foi possível conectar ao Ollama 🦙",
+ "connectionError": "Parece que você está tendo um erro de conexão. Por favor, consulte a documentação para solucionar o problema."
+ },
+ "formError": {
+ "noModel": "Por favor, selecione um modelo",
+ "noEmbeddingModel": "Por favor, defina um modelo de embedding na página de configurações > Ollama"
+ },
+ "form": {
+ "textarea": {
+ "placeholder": "Insira um mensagem..."
+ },
+ "webSearch": {
+ "on": "On",
+ "off": "Off"
+ }
+ },
+ "tooltip": {
+ "searchInternet": "Pesquisar Internet",
+ "speechToText": "Fala para Texto",
+ "uploadImage": "Carregar Imagem",
+ "stopStreaming": "Parar Transmissão",
+ "knowledge": "Conhecimento"
+ },
+ "sendWhenEnter": "Enviar quando pressionar Enter"
+}
diff --git a/src/assets/locale/pt-BR/settings.json b/src/assets/locale/pt-BR/settings.json
new file mode 100644
index 0000000..1c2aae9
--- /dev/null
+++ b/src/assets/locale/pt-BR/settings.json
@@ -0,0 +1,286 @@
+{
+ "generalSettings": {
+ "title": "Configurações Gerais",
+ "settings": {
+ "heading": "Configurações da Interface Web",
+ "speechRecognitionLang": {
+ "label": "Linguagem de Reconhecimento de Fala",
+ "placeholder": "Selecione uma linguagem"
+ },
+ "language": {
+ "label": "Linguagem",
+ "placeholder": "Selecione uma linguagem"
+ },
+ "darkMode": {
+ "label": "Alterar Tema",
+ "options": {
+ "light": "Claro",
+ "dark": "Escuro"
+ }
+ },
+ "copilotResumeLastChat": {
+ "label": "Retomar o último chat ao abrir o Painel Lateral (Copilot)"
+ },
+ "hideCurrentChatModelSettings": {
+ "label": "Ocultar Configurações do Modelo de Chat Atual"
+ }
+ },
+ "webSearch": {
+ "heading": "Gerenciar Pesquisa na Web",
+ "searchMode": {
+ "label": "Realizar Pesquisa Simples na Internet"
+ },
+ "provider": {
+ "label": "Motor de Busca",
+ "placeholder": "Selecione um motor de busca"
+ },
+ "totalSearchResults": {
+ "label": "Resultados de Pesquisa Totais",
+ "placeholder": "Insira Resultados de Pesquisa Totais"
+ }
+ },
+ "system": {
+ "heading": "Configurações do Sistema",
+ "deleteChatHistory": {
+ "label": "Excluir Histórico de Chat",
+ "button": "Excluir",
+ "confirm": "Você tem certeza de que deseja excluir seu histórico de chat? Esta ação não pode ser desfeita."
+ },
+ "export": {
+ "label": "Exportar Histórico de Chat, Base de Conhecimento e Prompts",
+ "button": "Exportar Dados",
+ "success": "Exportação Bem-Sucedida"
+ },
+ "import": {
+ "label": "Importar Histórico de Chat, Base de Conhecimento e Prompts",
+ "button": "Importar Dados",
+ "success": "Importação Bem-Sucedida",
+ "error": "Erro de Importação"
+ }
+ },
+ "tts": {
+ "heading": "Configurações de Fala",
+ "ttsEnabled": {
+ "label": "Habilitar Fala"
+ },
+ "ttsProvider": {
+ "label": "Fornecedor de Fala",
+ "placeholder": "Selecione um fornecedor"
+ },
+ "ttsVoice": {
+ "label": "Voz de Fala",
+ "placeholder": "Selecione uma voz"
+ },
+ "ssmlEnabled": {
+ "label": "Habilitar SSML (Linguagem de Marcação de Sintese de Fala)"
+ }
+ }
+ },
+ "manageModels": {
+ "title": "Gerenciar Modelos",
+ "addBtn": "Adicionar Novo Modelo",
+ "columns": {
+ "name": "Nome",
+ "digest": "Resumo",
+ "modifiedAt": "Modificado Em",
+ "size": "Tamanho",
+ "actions": "Ações"
+ },
+ "expandedColumns": {
+ "parentModel": "Modelo Pai",
+ "format": "Formato",
+ "family": "Família",
+ "parameterSize": "Tamanho de Parâmetro",
+ "quantizationLevel": "Nível de Quantização"
+ },
+ "tooltip": {
+ "delete": "Excluir Modelo",
+ "repull": "Re-Puxar Modelo"
+ },
+ "confirm": {
+ "delete": "Você tem certeza de que deseja excluir este modelo?",
+ "repull": "Você tem certeza de que deseja re-puxar este modelo?"
+ },
+ "modal": {
+ "title": "Adicionar Novo Modelo",
+ "placeholder": "Insira o nome do modelo",
+ "pull": "Puxar Modelo"
+ },
+ "notification": {
+ "pullModel": "Puxando Modelo",
+ "pullModelDescription": "Puxando modelo {{modelName}}. Para mais detalhes, verifique o ícone da extensão.",
+ "success": "Sucesso",
+ "error": "Erro",
+ "successDescription": "Modelo puxado com sucesso",
+ "successDeleteDescription": "Modelo excluído com sucesso",
+ "someError": "Algo deu errado. Tente novamente mais tarde"
+ }
+ },
+ "managePrompts": {
+ "title": "Gerenciar Prompts",
+ "addBtn": "Adicionar Novo Prompt",
+ "option1": "Normal",
+ "option2": "RAG",
+ "questionPrompt": "Prompt de Pergunta",
+ "columns": {
+ "title": "Título",
+ "prompt": "Prompt",
+ "type": "Tipo de Prompt",
+ "actions": "Ações"
+ },
+ "systemPrompt": "Prompt do Sistema",
+ "quickPrompt": "Prompt Rápido",
+ "tooltip": {
+ "delete": "Excluir Prompt",
+ "edit": "Editar Prompt"
+ },
+ "confirm": {
+ "delete": "Você tem certeza de que deseja excluir este prompt? Esta ação não pode ser desfeita."
+ },
+ "modal": {
+ "addTitle": "Adicionar Novo Prompt",
+ "editTitle": "Editar Prompt"
+ },
+ "form": {
+ "title": {
+ "label": "Título",
+ "placeholder": "Meu Prompt Incrível",
+ "required": "Por favor, insira um título"
+ },
+ "prompt": {
+ "label": "Prompt",
+ "placeholder": "Insira o prompt",
+ "required": "Por favor, insira um prompt",
+ "help": "Você pode usar {key} como variável em seu prompt."
+ },
+ "isSystem": {
+ "label": "É um Prompt do Sistema"
+ },
+ "btnSave": {
+ "saving": "Adicionando Prompt...",
+ "save": "Adicionar Prompt"
+ },
+ "btnEdit": {
+ "saving": "Atualizando Prompt...",
+ "save": "Atualizar Prompt"
+ }
+ },
+ "notification": {
+ "addSuccess": "Prompt Adicionado",
+ "addSuccessDesc": "Prompt adicionado com sucesso",
+ "error": "Erro",
+ "someError": "Algo deu errado. Tente novamente mais tarde",
+ "updatedSuccess": "Prompt Atualizado",
+ "updatedSuccessDesc": "Prompt atualizado com sucesso",
+ "deletedSuccess": "Prompt Excluído",
+ "deletedSuccessDesc": "Prompt excluído com sucesso"
+ }
+ },
+ "manageShare": {
+ "title": "Gerenciar Compartilhamento",
+ "heading": "Configurar URL de Compartilhamento de Página",
+ "form": {
+ "url": {
+ "label": "URL de Compartilhamento de Página",
+ "placeholder": "Insira a URL de Compartilhamento de Página",
+ "required": "Por favor, insira a URL de Compartilhamento de Página!",
+ "help": "Por motivos de privacidade, você pode hospedar a página de compartilhamento e fornecer a URL aqui. Saiba mais."
+ }
+ },
+ "webshare": {
+ "heading": "Compartilhamento na Web",
+ "columns": {
+ "title": "Título",
+ "url": "URL",
+ "actions": "Ações"
+ },
+ "tooltip": {
+ "delete": "Excluir Compartilhamento"
+ },
+ "confirm": {
+ "delete": "Você tem certeza de que deseja excluir este compartilhamento? Esta ação não pode ser desfeita."
+ },
+ "label": "Gerenciar Compartilhamento de Página",
+ "description": "Habilitar ou desabilitar o recurso de compartilhamento de página"
+ },
+ "notification": {
+ "pageShareSuccess": "URL de Compartilhamento de Página atualizada com sucesso",
+ "someError": "Algo deu errado. Tente novamente mais tarde",
+ "webShareDeleteSuccess": "Compartilhamento na Web excluído com sucesso"
+ }
+ },
+ "ollamaSettings": {
+ "title": "Configurações do Ollama",
+ "heading": "Configurar Ollama",
+ "settings": {
+ "ollamaUrl": {
+ "label": "URL do Ollama",
+ "placeholder": "Insira a URL do Ollama"
+ },
+ "ragSettings": {
+ "label": "Configurações do RAG",
+ "model": {
+ "label": "Modelo de Incorporação",
+ "required": "Por favor, selecione um modelo",
+ "help": "É altamente recomendável usar modelos de incorporação como `nomic-embed-text`.",
+ "placeholder": "Selecione um modelo"
+ },
+ "chunkSize": {
+ "label": "Tamanho do Chunk",
+ "placeholder": "Insira o tamanho do chunk",
+ "required": "Por favor, insira o tamanho do chunk"
+ },
+ "chunkOverlap": {
+ "label": "Sobreposição do Chunk",
+ "placeholder": "Insira a sobreposição do chunk",
+ "required": "Por favor, insira a sobreposição do chunk"
+ }
+ },
+ "prompt": {
+ "label": "Configurar Prompt do RAG",
+ "option1": "Normal",
+ "option2": "Web",
+ "alert": "Configurar o prompt do sistema aqui está depreciado. Por favor, use a seção Gerenciar Prompts para adicionar ou editar prompts. Esta seção será removida em uma versão futura",
+ "systemPrompt": "Prompt do Sistema",
+ "systemPromptPlaceholder": "Insira o prompt do sistema",
+ "webSearchPrompt": "Prompt de Pesquisa na Web",
+ "webSearchPromptHelp": "Não remova `{search_results}` do prompt.",
+ "webSearchPromptError": "Por favor, insira um prompt de pesquisa na web",
+ "webSearchPromptPlaceholder": "Insira o prompt de pesquisa na web",
+ "webSearchFollowUpPrompt": "Prompt de Seguimento de Pesquisa na Web",
+ "webSearchFollowUpPromptHelp": "Não remova `{chat_history}` e `{question}` do prompt.",
+ "webSearchFollowUpPromptError": "Por favor, insira o prompt de seguimento de pesquisa na web",
+ "webSearchFollowUpPromptPlaceholder": "Seu prompt de seguimento de pesquisa na web"
+ },
+ "advanced": {
+ "label": "Configuração Avançada da URL do Ollama",
+ "urlRewriteEnabled": {
+ "label": "Habilitar ou Desabilitar URL de Origem Personalizada"
+ },
+ "rewriteUrl": {
+ "label": "URL de Origem Personalizada",
+ "placeholder": "Insira a URL de Origem Personalizada"
+ },
+ "help": "Se você tiver problemas de conexão com o Ollama no Page Assist, você pode configurar uma URL de origem personalizada. Para saber mais sobre a configuração, clique aqui."
+ }
+ }
+ },
+ "manageSearch": {
+ "title": "Gerenciar Pesquisa na Web",
+ "heading": "Configurar Pesquisa na Web"
+ },
+ "about": {
+ "title": "Sobre",
+ "heading": "Sobre",
+ "chromeVersion": "Versão do Page Assist",
+ "ollamaVersion": "Versão do Ollama",
+ "support": "Você pode apoiar o projeto Page Assist fazendo doações ou patrocínios através das seguintes plataformas:",
+ "koFi": "Apoiador no Ko-fi",
+ "githubSponsor": "Patrocinador no GitHub",
+ "githubRepo": "Repositório do GitHub"
+ },
+ "manageKnowledge": {
+ "title": "Gerenciar Conhecimento",
+ "heading": "Configurar Base de Conhecimento"
+ }
+}
diff --git a/src/assets/locale/pt-BR/sidepanel.json b/src/assets/locale/pt-BR/sidepanel.json
new file mode 100644
index 0000000..5da0b1f
--- /dev/null
+++ b/src/assets/locale/pt-BR/sidepanel.json
@@ -0,0 +1,7 @@
+{
+ "tooltip": {
+ "embed": "Pode demorar alguns minutos para embedear a página. Por favor, aguarde...",
+ "clear": "Excluir histórico de conversa",
+ "history": "Histórico de conversa"
+ }
+}
\ No newline at end of file
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
index 3a28a6e..057be7b 100644
--- a/src/i18n/index.ts
+++ b/src/i18n/index.ts
@@ -1,6 +1,7 @@
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import { en } from "./lang/en";
+import { pt } from "./lang/pt";
import { ru } from "./lang/ru";
import { ml } from "./lang/ml";
import { zh } from "./lang/zh";
@@ -14,6 +15,7 @@ i18n
resources: {
en: en,
ml: ml,
+ "pt-BR": pt,
"zh-CN": zh,
ru: ru,
"ru-RU": ru,
diff --git a/src/i18n/lang/pt.ts b/src/i18n/lang/pt.ts
new file mode 100644
index 0000000..c29f8f9
--- /dev/null
+++ b/src/i18n/lang/pt.ts
@@ -0,0 +1,15 @@
+import option from "@/assets/locale/pt-BR/option.json";
+import playground from "@/assets/locale/pt-BR/playground.json";
+import common from "@/assets/locale/pt-BR/common.json";
+import sidepanel from "@/assets/locale/pt-BR/sidepanel.json";
+import settings from "@/assets/locale/pt-BR/settings.json";
+import knowledge from "@/assets/locale/pt-BR/knowledge.json";
+
+export const pt = {
+ option,
+ playground,
+ common,
+ sidepanel,
+ settings,
+ knowledge
+}
\ No newline at end of file
diff --git a/src/i18n/support-language.ts b/src/i18n/support-language.ts
index af7db40..2fd8948 100644
--- a/src/i18n/support-language.ts
+++ b/src/i18n/support-language.ts
@@ -7,6 +7,10 @@ export const supportLanguage = [
{
label: "Russian",
value: "ru"
+ },
+ {
+ label: "Português",
+ value: "pt-BR"
},
{
label: "മലയാളം",