From a24cd65891643f418697735e96ff0a771a75f516 Mon Sep 17 00:00:00 2001 From: ViniciusCestarii Date: Sun, 5 Oct 2025 16:03:00 -0300 Subject: [PATCH 1/2] feat: add pt-BR internationalization --- brand-config.example-banana.json | 9 +- brand-config.template.json | 15 +- electron-builder-macx64.yml | 2 + electron-builder.yml | 2 + scripts/rebrand.js | 4 +- src/main/presenter/configPresenter/index.ts | 3 +- .../components/settings/DisplaySettings.vue | 3 +- src/renderer/src/i18n/index.ts | 5 +- src/renderer/src/i18n/pt-BR/about.json | 19 + src/renderer/src/i18n/pt-BR/artifacts.json | 48 + src/renderer/src/i18n/pt-BR/chat.json | 68 ++ src/renderer/src/i18n/pt-BR/common.json | 79 ++ src/renderer/src/i18n/pt-BR/components.json | 41 + src/renderer/src/i18n/pt-BR/contextMenu.json | 17 + src/renderer/src/i18n/pt-BR/dialog.json | 44 + src/renderer/src/i18n/pt-BR/index.ts | 54 ++ src/renderer/src/i18n/pt-BR/mcp.json | 271 ++++++ src/renderer/src/i18n/pt-BR/model.json | 30 + src/renderer/src/i18n/pt-BR/newThread.json | 4 + .../src/i18n/pt-BR/promptSetting.json | 92 ++ src/renderer/src/i18n/pt-BR/routes.json | 16 + src/renderer/src/i18n/pt-BR/settings.json | 838 ++++++++++++++++++ src/renderer/src/i18n/pt-BR/sync.json | 17 + src/renderer/src/i18n/pt-BR/thread.json | 35 + src/renderer/src/i18n/pt-BR/toolCall.json | 12 + src/renderer/src/i18n/pt-BR/update.json | 16 + src/renderer/src/i18n/pt-BR/welcome.json | 37 + src/shared/i18n.ts | 43 +- 28 files changed, 1810 insertions(+), 14 deletions(-) create mode 100644 src/renderer/src/i18n/pt-BR/about.json create mode 100644 src/renderer/src/i18n/pt-BR/artifacts.json create mode 100644 src/renderer/src/i18n/pt-BR/chat.json create mode 100644 src/renderer/src/i18n/pt-BR/common.json create mode 100644 src/renderer/src/i18n/pt-BR/components.json create mode 100644 src/renderer/src/i18n/pt-BR/contextMenu.json create mode 100644 src/renderer/src/i18n/pt-BR/dialog.json create mode 100644 src/renderer/src/i18n/pt-BR/index.ts create mode 100644 src/renderer/src/i18n/pt-BR/mcp.json create mode 100644 src/renderer/src/i18n/pt-BR/model.json create mode 100644 src/renderer/src/i18n/pt-BR/newThread.json create mode 100644 src/renderer/src/i18n/pt-BR/promptSetting.json create mode 100644 src/renderer/src/i18n/pt-BR/routes.json create mode 100644 src/renderer/src/i18n/pt-BR/settings.json create mode 100644 src/renderer/src/i18n/pt-BR/sync.json create mode 100644 src/renderer/src/i18n/pt-BR/thread.json create mode 100644 src/renderer/src/i18n/pt-BR/toolCall.json create mode 100644 src/renderer/src/i18n/pt-BR/update.json create mode 100644 src/renderer/src/i18n/pt-BR/welcome.json diff --git a/brand-config.example-banana.json b/brand-config.example-banana.json index af0590117..3c120950d 100644 --- a/brand-config.example-banana.json +++ b/brand-config.example-banana.json @@ -23,7 +23,8 @@ "ko-KR": "바나나 AI 어시스턴트", "ru-RU": "Банановый ИИ Помощник", "fr-FR": "Assistant IA Banane", - "fa-IR": "دستیار هوش مصنوعی موز" + "fa-IR": "دستیار هوش مصنوعی موز", + "pt-BR": "Assistente de IA Banana" }, "appDescription": { "en-US": "Banana AI Assistant is your intelligent work partner", @@ -34,7 +35,8 @@ "ko-KR": "바나나 AI 어시스턴트는 당신의 지능형 업무 파트너입니다", "ru-RU": "Банановый ИИ Помощник - ваш умный рабочий партнер", "fr-FR": "L'Assistant IA Banane est votre partenaire de travail intelligent", - "fa-IR": "دستیار هوش مصنوعی موز شریک هوشمند کاری شماست" + "fa-IR": "دستیار هوش مصنوعی موز شریک هوشمند کاری شماست", + "pt-BR": "O Assistente de IA Banana é seu parceiro de trabalho inteligente" }, "websiteText": { "en-US": "Visit Banana Website", @@ -45,7 +47,8 @@ "ko-KR": "바나나 웹사이트 방문", "ru-RU": "Посетить сайт Банана", "fr-FR": "Visitez le site Banane", - "fa-IR": "وبسایت موز را ببینید" + "fa-IR": "وبسایت موز را ببینید", + "pt-BR": "Visite o site da Banana" } }, "github": { diff --git a/brand-config.template.json b/brand-config.template.json index 57a280b9e..eea4b5df5 100644 --- a/brand-config.template.json +++ b/brand-config.template.json @@ -23,7 +23,8 @@ "ko-KR": "DeepChat", "ru-RU": "DeepChat", "fr-FR": "DeepChat", - "fa-IR": "DeepChat" + "fa-IR": "DeepChat", + "pt-BR": "DeepChat" }, "appDescription": { "en-US": "DeepChat is a cross-platform AI client, dedicated to making AI accessible to more people.", @@ -34,7 +35,8 @@ "ko-KR": "DeepChat은 더 많은 사람들이 AI에 접근할 수 있도록 하는 크로스 플랫폼 AI 클라이언트입니다。", "ru-RU": "DeepChat - это кроссплатформенный AI-клиент, предназначенный для того, чтобы сделать AI доступным для большего количества людей.", "fr-FR": "DeepChat est un client IA multiplateforme, dédié à rendre l'IA accessible à plus de personnes.", - "fa-IR": "دیپ چت یک کلاینت هوش مصنوعی چندپلتفرمه که هدفش در دسترس قرار دادن هوش مصنوعی برای افراد بیشتری است." + "fa-IR": "دیپ چت یک کلاینت هوش مصنوعی چندپلتفرمه که هدفش در دسترس قرار دادن هوش مصنوعی برای افراد بیشتری است.", + "pt-BR": "DeepChat é um cliente de IA multiplataforma, dedicado a tornar a IA acessível a mais pessoas." }, "websiteText": { "en-US": "Visit Our Website", @@ -45,7 +47,8 @@ "ko-KR": "웹사이트 방문", "ru-RU": "Посетить наш сайт", "fr-FR": "Visitez notre site web", - "fa-IR": "وبسایت ما را ببینید" + "fa-IR": "وبسایت ما را ببینید", + "pt-BR": "Visite nosso site" }, "welcomeTitle": { "en-US": "Welcome to MyApp", @@ -56,7 +59,8 @@ "ko-KR": "MyApp에 오신 것을 환영합니다", "ru-RU": "Добро пожаловать в MyApp", "fr-FR": "Bienvenue sur MyApp", - "fa-IR": "به MyApp خوش آمدید" + "fa-IR": "به MyApp خوش آمدید", + "pt-BR": "Bem-vindo ao MyApp" }, "welcomeSetupDescription": { "en-US": "Let's start setting up MyApp", @@ -67,7 +71,8 @@ "ko-KR": "MyApp 설정을 시작합시다", "ru-RU": "Начнем настройку MyApp", "fr-FR": "Commençons la configuration de MyApp", - "fa-IR": "بیایید تنظیم MyApp را شروع کنیم" + "fa-IR": "بیایید تنظیم MyApp را شروع کنیم", + "pt-BR": "Vamos começar a configurar o MyApp" } }, "github": { diff --git a/electron-builder-macx64.yml b/electron-builder-macx64.yml index 0ff6fa151..e69609be5 100644 --- a/electron-builder-macx64.yml +++ b/electron-builder-macx64.yml @@ -50,6 +50,8 @@ electronLanguages: - fr - fa-IR - fa + - pt-BR + - pt mac: entitlementsInherit: build/entitlements.mac.plist extendInfo: diff --git a/electron-builder.yml b/electron-builder.yml index 0bf43aa68..ca9cc6c4d 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -49,6 +49,8 @@ electronLanguages: - fr - fa-IR - fa + - pt-BR + - pt win: executableName: DeepChat nsis: diff --git a/scripts/rebrand.js b/scripts/rebrand.js index 287c91ac1..797ce4984 100644 --- a/scripts/rebrand.js +++ b/scripts/rebrand.js @@ -204,7 +204,7 @@ function updateI18nFiles(config) { } // 支持的语言 - const locales = ['en-US', 'zh-CN', 'zh-TW', 'zh-HK', 'ja-JP', 'ko-KR', 'ru-RU', 'fr-FR', 'fa-IR'] + const locales = ['en-US', 'zh-CN', 'zh-TW', 'zh-HK', 'ja-JP', 'ko-KR', 'ru-RU', 'fr-FR', 'fa-IR', 'pt-BR'] for (const locale of locales) { // 更新 about.json @@ -299,7 +299,7 @@ function updateAllI18nDeepChatReferences(config) { } // 支持的语言 - const locales = ['en-US', 'zh-CN', 'zh-TW', 'zh-HK', 'ja-JP', 'ko-KR', 'ru-RU', 'fr-FR', 'fa-IR'] + const locales = ['en-US', 'zh-CN', 'zh-TW', 'zh-HK', 'ja-JP', 'ko-KR', 'ru-RU', 'fr-FR', 'fa-IR', 'pt-BR'] // 需要处理的文件列表 const filesToProcess = [ diff --git a/src/main/presenter/configPresenter/index.ts b/src/main/presenter/configPresenter/index.ts index 423fe9a81..019f676a8 100644 --- a/src/main/presenter/configPresenter/index.ts +++ b/src/main/presenter/configPresenter/index.ts @@ -793,7 +793,8 @@ export class ConfigPresenter implements IConfigPresenter { 'ru-RU', 'ja-JP', 'fr-FR', - 'fa-IR' + 'fa-IR', + 'pt-BR' ] // Exact match diff --git a/src/renderer/src/components/settings/DisplaySettings.vue b/src/renderer/src/components/settings/DisplaySettings.vue index ed7688ef1..9ffcb2c5a 100644 --- a/src/renderer/src/components/settings/DisplaySettings.vue +++ b/src/renderer/src/components/settings/DisplaySettings.vue @@ -196,7 +196,8 @@ const languageOptions = [ { value: 'ru-RU', label: 'Русский' }, { value: 'ja-JP', label: '日本語' }, { value: 'fr-FR', label: 'Français' }, - { value: 'fa-IR', label: 'فارسی (ایران)' } + { value: 'fa-IR', label: 'فارسی (ایران)' }, + { value: 'pt-BR' , label: 'Português (Brasil)' } ] watch(selectedLanguage, async (newValue) => { diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index dd6292e29..81e8493e8 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -7,6 +7,7 @@ import zhTW from './zh-TW' import ruRU from './ru-RU' import frFR from './fr-FR' import faIR from './fa-IR' +import ptBR from './pt-BR' const locales = { 'zh-CN': zhCN, @@ -18,9 +19,11 @@ const locales = { 'ru-RU': ruRU, 'fr-FR': frFR, 'fa-IR': faIR, + 'pt-BR': ptBR, zh: zhCN, en: enUS, - fr: frFR + fr: frFR, + pt: ptBR } console.log('locales', locales) export default locales diff --git a/src/renderer/src/i18n/pt-BR/about.json b/src/renderer/src/i18n/pt-BR/about.json new file mode 100644 index 000000000..e1e02d593 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/about.json @@ -0,0 +1,19 @@ +{ + "title": "DeepChat", + "description": "DeepChat é um cliente de IA multiplataforma, dedicado a tornar a IA acessível a mais pessoas.", + "website": "Visite Nosso Site", + "deviceInfo": { + "title": "Informações do Dispositivo", + "platform": "Plataforma", + "arch": "Arquitetura", + "cpuModel": "Modelo da CPU", + "totalMemory": "Memória Total", + "osVersion": "Versão do Sistema" + }, + "disclaimerButton": "Aviso Legal", + "disclaimerTitle": "Declaração de Termos de Uso", + "checkUpdateButton": "Verificar Atualizações", + "updateChannel": "Canal de Atualização", + "stableChannel": "Estável", + "canaryChannel": "Canary" +} diff --git a/src/renderer/src/i18n/pt-BR/artifacts.json b/src/renderer/src/i18n/pt-BR/artifacts.json new file mode 100644 index 000000000..1ea0bf061 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/artifacts.json @@ -0,0 +1,48 @@ +{ + "clickToOpen": "Clique para Abrir", + "codeSnippet": "Trecho de Código", + "function": "Função", + "class": "Classe", + "reactComponent": "Componente React", + "moduleImport": "Importação de Módulo", + "variableDefinition": "Definição da Variável {name}", + "markdownDocument": "Documento Markdown", + "htmlDocument": "Documento HTML", + "svgImage": "Imagem SVG", + "flowchart": "Fluxograma", + "sequenceDiagram": "Diagrama de Sequência", + "classDiagram": "Diagrama de Classes", + "stateDiagram": "Diagrama de Estados", + "erDiagram": "Diagrama ER", + "ganttChart": "Gráfico de Gantt", + "pieChart": "Gráfico de Pizza", + "mermaidDiagram": "Diagrama Mermaid", + "flowchartOf": "Fluxograma de {name}", + "sequenceDiagramBetween": "Diagrama de Sequência entre {participants}", + "classDiagramOf": "Diagrama de Classes de {name}", + "stateDiagramOf": "Diagrama de Estados de {name}", + "erDiagramOf": "Diagrama ER de {name}", + "pieChartOf": "Gráfico de Pizza de {name}", + "unknownDocument": "Documento Desconhecido", + "preview": "Visualização", + "code": "Código", + "export": "Exportar", + "htmlPreviewTitle": "Visualização HTML", + "svgPreviewTitle": "Visualização SVG", + "copy": "Copiar", + "copySuccess": "Copiado", + "copySuccessDesc": "Conteúdo copiado para a área de transferência", + "copyFailed": "Falha ao Copiar", + "copyFailedDesc": "Falha ao copiar conteúdo para a área de transferência", + "copyAsImage": "Copiar como Imagem", + "copyImageSuccessDesc": "Imagem copiada para a área de transferência", + "copyImageFailedDesc": "Não foi possível copiar a imagem para a área de transferência.", + "desktop": "Desktop", + "tablet": "Tablet", + "mobile": "Celular", + "width": "Largura", + "height": "Altura", + "sanitizingSvg": "Sanitizando conteúdo SVG...", + "svgSanitizationFailed": "O conteúdo SVG falhou na validação de segurança", + "noSvgContent": "Nenhum conteúdo SVG disponível" +} diff --git a/src/renderer/src/i18n/pt-BR/chat.json b/src/renderer/src/i18n/pt-BR/chat.json new file mode 100644 index 000000000..8e189b0e4 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/chat.json @@ -0,0 +1,68 @@ +{ + "input": { + "placeholder": "Pergunte algo? Você pode citar ferramentas, arquivos, recursos usando {'@'}...", + "fileArea": "Área de Arquivos", + "inputArea": "Área de Entrada", + "functionSwitch": "Alternar Função", + "fileSelect": "Selecionar Arquivo", + "pasteFiles": "Colar arquivos da área de transferência", + "dropFiles": "Solte os arquivos aqui", + "promptFilesAdded": "Arquivos de Prompt Adicionados", + "promptFilesAddedDesc": "{count} arquivos adicionados com sucesso", + "promptFilesError": "Erro no Processamento de Arquivos", + "promptFilesErrorDesc": "Falha ao processar {count} arquivos", + "historyPlaceholder": "(Pressione Tab para autocompletar)", + "rateLimitQueue": "Fila {count}", + "rateLimitWait": "Aguarde {seconds}s", + "rateLimitQueueTooltip": "{count} requisições na fila, intervalo de {interval}s", + "rateLimitReadyTooltip": "Pronto para enviar, intervalo de {interval}s", + "rateLimitWaitingTooltip": "Aguarde mais {seconds}s, intervalo de {interval}s" + }, + "features": { + "webSearch": "Busca na Web", + "thoughtForSeconds": "Pensou por {seconds}s", + "thoughtForSecondsLoading": "Pensando por {seconds}s...", + "artifactThinking": "Processando Artefato" + }, + "search": { + "results": "Encontradas {0} páginas web", + "searching": "Buscando...", + "title": "Resultados da Busca", + "description": "Encontrados {0} resultados relacionados", + "optimizing": "Otimizando consulta de busca...", + "reading": "Buscando e lendo páginas web...", + "error": "Falha na busca" + }, + "messages": { + "thinking": "Pensando...", + "rateLimitWaiting": "Limite de taxa atingido, aguardando na fila...", + "rateLimitTitle": "Limite de Taxa Ativo", + "rateLimitQueue": "Posição na Fila", + "rateLimitEstimated": "Tempo Estimado", + "rateLimitQuickSettings": "Ajustar Limite", + "rateLimitSwitchProvider": "Trocar Provedor", + "rateLimitImmediately": "Agora", + "rateLimitSeconds": "s", + "rateLimitMinutes": "m" + }, + "rateLimit": { + "queueTooltip": "{count} requisições na fila, intervalo de {interval}s", + "readyTooltip": "Pronto para enviar, intervalo de {interval}s", + "waitingTooltip": "Aguarde mais {seconds}s, intervalo de {interval}s" + }, + "notify": { + "generationComplete": "Geração concluída", + "generationError": "Falha na geração" + }, + "navigation": { + "title": "Navegação de Mensagens", + "searchPlaceholder": "Buscar mensagens...", + "noResults": "Nenhuma mensagem encontrada", + "noMessages": "Nenhuma mensagem ainda", + "totalMessages": "Total de {count} mensagens", + "searchResults": "Encontrados {count} resultados em {total} mensagens", + "userMessage": "Mensagem do usuário", + "assistantMessage": "Resposta do assistente", + "unknownMessage": "Mensagem desconhecida" + } +} diff --git a/src/renderer/src/i18n/pt-BR/common.json b/src/renderer/src/i18n/pt-BR/common.json new file mode 100644 index 000000000..4eb035182 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/common.json @@ -0,0 +1,79 @@ +{ + "enabled": "Ativado", + "disabled": "Desativado", + "loading": "Carregando...", + "copySuccess": "Copiado com Sucesso", + "copySuccessDesc": "Conteúdo copiado para a área de transferência", + "copyImageSuccess": "Imagem Copiada", + "copyImageSuccessDesc": "Imagem copiada para a área de transferência", + "copyFailed": "Falha ao Copiar", + "copyFailedDesc": "Falha ao copiar conteúdo para a área de transferência", + "copyCode": "Copiar Código", + "copy": "Copiar", + "copied": "Copiado", + "paste": "Colar", + "export": "Exportar", + "newChat": "Nova Conversa", + "newTopic": "Novo Tópico", + "cancel": "Cancelar", + "confirm": "Confirmar", + "close": "Fechar", + "error": { + "requestFailed": "Falha na requisição...", + "createChatFailed": "Falha ao criar conversa", + "selectChatFailed": "Falha ao selecionar conversa", + "renameChatFailed": "Falha ao renomear conversa", + "deleteChatFailed": "Falha ao excluir conversa", + "cleanMessagesFailed": "Falha ao limpar mensagens", + "userCanceledGeneration": "Usuário cancelou a geração", + "sessionInterrupted": "A sessão foi interrompida inesperadamente, a geração está incompleta", + "noModelResponse": "O modelo não retornou nenhum conteúdo, pode ter excedido o tempo limite", + "invalidJson": "Formato JSON inválido", + "maximumToolCallsReached": "Número Máximo de Chamadas de Ferramentas Atingido", + "causeOfError": "Possíveis causas do erro:", + "error400": "Requisição inválida, possivelmente um problema de parâmetro ou compatibilidade", + "error401": "Falha na autenticação, possivelmente Chave API ou domínio incorretos", + "error403": "Acesso ao modelo proibido, possivelmente saldo insuficiente ou sem permissão", + "error404": "URL solicitada não encontrada, possivelmente domínio ou nome do modelo incorreto", + "error429": "Muitas requisições, possivelmente limitado pela taxa do serviço", + "error500": "Erro do servidor, o serviço pode estar instável, tente novamente mais tarde", + "error502": "Erro de gateway, o serviço pode estar instável, tente novamente mais tarde", + "error503": "Serviço indisponível, o serviço pode estar instável, tente novamente mais tarde", + "error504": "Tempo limite da requisição, o serviço pode estar instável ou pode haver problemas de rede, verifique as configurações de proxy e tente novamente", + "operationFailed": "Operação falhou" + }, + "resetDataConfirmTitle": "Redefinir Todos os Dados?", + "resetDataConfirmDescription": "Isso redefinirá todos os seus dados para as configurações padrão. Esta ação não pode ser desfeita.", + "proxyMode": "Modo de Proxy", + "proxyModeSelect": "Selecionar Modo de Proxy", + "proxyModeSystem": "Proxy do Sistema", + "proxyModeNone": "Sem Proxy", + "proxyModeCustom": "Proxy Personalizado", + "customProxyUrl": "URL do Proxy Personalizado", + "customProxyUrlPlaceholder": "Exemplo: http://127.0.0.1:7890", + "invalidProxyUrl": "URL de proxy inválida, por favor insira uma URL http/https válida", + "disclaimer": "Aviso Legal", + "resetData": "Redefinir dados", + "searchAssistantModel": "Modelo de Assistente", + "searchEngine": "Mecanismo de Busca", + "searchEngineSelect": "Selecione um mecanismo de busca", + "searchPreview": "Visualização da busca", + "language": "Idioma", + "languageSelect": "Selecione um idioma", + "selectModel": "Selecione um modelo", + "title": "Configurações gerais", + "languageSystem": "Seguir o sistema", + "watermarkTip": "Gerado por IA", + "collapse": "Recolher", + "expand": "Expandir", + "image": "imagem", + "add": "Adicionar", + "reset": "Redefinir", + "format": "Formatar", + "edit": "Editar", + "delete": "Excluir", + "save": "Salvar", + "clear": "Limpar", + "saved": "Salvo", + "newTab": "Nova Aba" +} diff --git a/src/renderer/src/i18n/pt-BR/components.json b/src/renderer/src/i18n/pt-BR/components.json new file mode 100644 index 000000000..880bfd469 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/components.json @@ -0,0 +1,41 @@ +{ + "emojiPicker": { + "search": "Buscar Emojis", + "smileys": "Sorrisos & Emoções", + "people": "Pessoas & Corpo", + "animals": "Animais & Natureza", + "food": "Comidas & Bebidas", + "travel": "Viagens & Lugares", + "activities": "Atividades", + "objects": "Objetos", + "symbols": "Símbolos", + "flags": "Bandeiras" + }, + "messageBlockAction": { + "continue": "Continuar", + "continued": "Continuado" + }, + "messageBlockPermissionRequest": { + "title": "Permissão Necessária", + "allow": "Permitir", + "deny": "Negar", + "rememberChoice": "Lembrar esta escolha", + "granted": "Permissão concedida", + "denied": "Permissão negada", + "type": { + "read": "Acesso de Leitura", + "write": "Acesso de Escrita", + "all": "Acesso Total" + }, + "description": { + "read": "Permitir que '{toolName}' de '{serverName}' realize operações de leitura?", + "write": "Permitir que '{toolName}' de '{serverName}' realize operações de escrita?", + "all": "Permitir que '{toolName}' de '{serverName}' realize operações de leitura e escrita?" + } + }, + "promptParamsDialog": { + "title": "Configurações de Parâmetros de {name}", + "description": "Por favor, preencha os parâmetros abaixo. Campos marcados com * são obrigatórios.", + "required": "Este campo é obrigatório." + } +} diff --git a/src/renderer/src/i18n/pt-BR/contextMenu.json b/src/renderer/src/i18n/pt-BR/contextMenu.json new file mode 100644 index 000000000..435118afc --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/contextMenu.json @@ -0,0 +1,17 @@ +{ + "translate": { + "title": "Traduzir", + "original": "Original", + "translated": "Tradução", + "error": "Falha na tradução" + }, + "askAI": { + "title": "Perguntar à IA", + "question": "Pergunta", + "answer": "Resposta", + "error": "Falha na resposta da IA" + }, + "copy": "Copiar", + "paste": "Colar", + "cut": "Recortar" +} diff --git a/src/renderer/src/i18n/pt-BR/dialog.json b/src/renderer/src/i18n/pt-BR/dialog.json new file mode 100644 index 000000000..41a361f0d --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/dialog.json @@ -0,0 +1,44 @@ +{ + "cancel": "Cancelar", + "confirm": "Confirmar", + "close": "Fechar", + "ok": "OK", + "delete": { + "title": "Tem certeza que deseja excluir esta conversa?", + "description": "Esta ação não pode ser desfeita.", + "confirm": "Excluir" + }, + "rename": { + "title": "Renomear Conversa", + "description": "Por favor, insira um novo nome para a conversa." + }, + "cleanMessages": { + "title": "Limpar Todas as Mensagens", + "description": "Isso excluirá todas as mensagens e arquivos desta conversa. Tem certeza que deseja continuar?", + "confirm": "Limpar" + }, + "fork": { + "title": "Criar Ramificação", + "description": "Isso copiará todas as mensagens desde a primeira mensagem até a mensagem atual em uma nova conversa onde você pode continuar o diálogo.", + "confirm": "Criar Ramificação", + "tag": "Ramificação" + }, + "error": { + "title": "Erro" + }, + "mutualExclusive": { + "title": { + "reasoning": "Confirmar Ativação do Raciocínio", + "functionCall": "Confirmar Ativação de Chamadas de Função" + }, + "message": { + "reasoning": "Ativar o raciocínio desativará automaticamente as chamadas de função. Esta é uma limitação dos modelos DeepSeek-V3.1, e ambos os recursos não podem ser usados simultaneamente. Continuar?", + "functionCall": "Ativar as chamadas de função desativará automaticamente o raciocínio. Esta é uma limitação dos modelos DeepSeek-V3.1, e ambos os recursos não podem ser usados simultaneamente. Continuar?" + }, + "warningText": { + "reasoning": "Nota: Ativar o raciocínio desativará automaticamente as chamadas de função, o que é um requisito dos modelos DeepSeek-V3.1.", + "functionCall": "Nota: Ativar as chamadas de função desativará automaticamente o raciocínio, o que é um requisito dos modelos DeepSeek-V3.1." + }, + "confirmEnable": "Confirmar Ativação" + } +} diff --git a/src/renderer/src/i18n/pt-BR/index.ts b/src/renderer/src/i18n/pt-BR/index.ts new file mode 100644 index 000000000..4c1c39233 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/index.ts @@ -0,0 +1,54 @@ +import common from './common.json' +import update from './update.json' +import routes from './routes.json' +import chat from './chat.json' +import model from './model.json' +import thread from './thread.json' +import dialog from './dialog.json' +import settings from './settings.json' +import mcp from './mcp.json' +import welcome from './welcome.json' +import artifacts from './artifacts.json' +import sync from './sync.json' +import toolCall from './toolCall.json' +import components from './components.json' +import newThread from './newThread.json' +import about from './about.json' +import contextMenu from './contextMenu.json' +import promptSetting from './promptSetting.json' + +// Individual top-level keys +const others = { + Silicon: 'SiliconFlow', + Qiniu: 'Qiniu', + QwenLM: 'Modelo Qwen', + Doubao: 'Doubao', + PPIO: 'PPIO Cloud', + Moonshot: 'Moonshot AI', + DashScope: 'Alibaba Bailian', + Hunyuan: 'Hunyuan', + searchDisclaimer: + 'O DeepChat é apenas uma ferramenta auxiliar que organiza e resume dados públicos retornados por mecanismos de busca quando os usuários iniciam buscas ativamente, ajudando-os a visualizar e entender os resultados de busca de maneira mais conveniente.\n1. Uso de Dados Públicos\nEste software processa apenas dados que estão publicamente disponíveis em sites ou mecanismos de busca de destino sem necessidade de login. Antes de usar, certifique-se de revisar e cumprir os termos de serviço do site ou mecanismo de busca de destino para garantir que seu uso seja legal e em conformidade.\n2. Precisão e Responsabilidade da Informação\nO conteúdo organizado e gerado por este software é apenas para referência e não constitui qualquer forma de aconselhamento legal, comercial ou outro. Os desenvolvedores não oferecem garantias quanto à precisão, completude, atualidade ou legalidade dos resultados de busca, e quaisquer consequências decorrentes do uso deste software são de responsabilidade exclusiva do usuário.\n3. Cláusula de Isenção de Responsabilidade\nEste software é fornecido "como está", e os desenvolvedores não assumem qualquer garantia ou responsabilidade expressa ou implícita por seu desempenho, estabilidade ou aplicabilidade. No processo de uso deste software, os desenvolvedores não assumem responsabilidade por quaisquer disputas, perdas ou responsabilidades legais decorrentes de violações de leis e regulamentos relevantes ou das regras do site de destino.\n4. Autodisciplina do Usuário\nAntes de usar este software, os usuários devem entender e confirmar plenamente que seu uso não infringirá os direitos de propriedade intelectual, segredos comerciais ou outros direitos legítimos de terceiros. Quaisquer disputas legais e consequências decorrentes do uso inadequado deste software pelos usuários são de responsabilidade exclusiva dos usuários.\nO uso deste software indica que o usuário leu, entendeu e concordou com todos os termos desta isenção de responsabilidade. Se você tiver alguma dúvida, consulte um assessor jurídico profissional.' +} + +export default { + common, + update, + routes, + chat, + model, + thread, + dialog, + settings, + mcp, + welcome, + artifacts, + sync, + toolCall, + components, + newThread, + about, + contextMenu, + promptSetting, + ...others +} diff --git a/src/renderer/src/i18n/pt-BR/mcp.json b/src/renderer/src/i18n/pt-BR/mcp.json new file mode 100644 index 000000000..897e90e0a --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/mcp.json @@ -0,0 +1,271 @@ +{ + "tools": { + "searchPlaceholder": "Buscar ferramentas...", + "noToolsAvailable": "Nenhuma ferramenta disponível", + "selectToolToDebug": "Selecione uma ferramenta para depurar", + "dialogDescription": "Depurar e testar ferramentas fornecidas pelos servidores MCP", + "toolsCount": "{count} ferramentas", + "availableTools": "Ferramentas Disponíveis", + "toolList": "Lista de Ferramentas", + "functionDescription": "Descrição da Função", + "invalidJson": "Formato JSON inválido", + "inputHint": "Por favor, insira os parâmetros em formato JSON", + "required": "Obrigatório", + "noDescription": "Sem descrição", + "input": "Argumentos", + "path": "Caminho", + "pathPlaceholder": "Digite o caminho do arquivo", + "searchPattern": "Padrão de busca", + "searchPatternPlaceholder": "Digite a expressão regular", + "filePattern": "Padrão de arquivo", + "filePatternPlaceholder": "Digite o padrão de arquivo, ex.: *.md", + "executeButton": "Executar Ferramenta", + "resultTitle": "Resultado", + "runningTool": "Executando ferramenta...", + "loading": "Carregando...", + "error": "Falha ao carregar", + "available": "{count} disponíveis", + "none": "Nenhuma ferramenta disponível", + "title": "Ferramentas MCP", + "description": "Ferramentas fornecidas pelo servidor MCP", + "loadError": "Falha ao carregar ferramentas", + "parameters": "Parâmetros", + "refresh": "Atualizar", + "disabled": "MCP está desativado", + "enableToUse": "Por favor, ative o MCP para usar as ferramentas", + "enabled": "Ativar MCP", + "enabledDescription": "Ativar funcionalidade MCP para usar chamadas de ferramentas", + "empty": "Vazio", + "jsonInputPlaceholder": "Digite os parâmetros em formato JSON", + "type": "Tipo", + "annotations": "Anotações", + "invalidJsonFormat": "O formato JSON está incorreto", + "allowedValues": "Valores permitidos", + "arrayItemValues": "Valores dos itens do array" + }, + "addServer": "Adicionar Servidor", + "addServerDialog": { + "description": "Configurar um novo servidor MCP", + "title": "Adicionar Servidor" + }, + "confirmDelete": { + "cancel": "Cancelar", + "confirm": "Excluir", + "description": "Tem certeza que deseja excluir o servidor {name}? \nEsta operação não pode ser cancelada.", + "title": "Confirmar exclusão" + }, + "confirmRemoveServer": "Tem certeza que deseja excluir o servidor {name}? \nEsta operação não pode ser cancelada.", + "default": "padrão", + "deleteServer": "Excluir Servidor", + "description": "Gerenciar e configurar servidores e ferramentas MCP (Model Context Protocol)", + "editServer": "Editar Servidor", + "editServerDialog": { + "description": "Editar configuração do servidor MCP", + "title": "Editar Servidor" + }, + "enableToAccess": "Por favor, ative o MCP para acessar as opções de configuração.", + "enabledDescription": "Ativar ou desativar funcionalidade e ferramentas MCP.", + "enabledTitle": "Ativar MCP", + "isDefault": "Servidor padrão", + "noServersFound": "Servidor não encontrado", + "removeDefault": "Remover padrão", + "removeServer": "Remover Servidor", + "removeServerDialog": { + "title": "Excluir Servidor" + }, + "resetConfirm": "Restaurar", + "resetConfirmDescription": "Esta ação restaura todos os servidores padrão mantendo seus servidores personalizados. \nQuaisquer modificações no servidor padrão serão perdidas.", + "resetConfirmTitle": "Restaurar serviço padrão", + "resetToDefault": "Restaurar serviço padrão", + "running": "Em execução", + "serverForm": { + "add": "Adicionar", + "args": "Argumentos", + "argsPlaceholder": "Digite os parâmetros, separados por espaços", + "argsRequired": "Os parâmetros não podem estar vazios", + "autoApprove": "Aprovação automática", + "autoApproveAll": "Todos", + "autoApproveHelp": "Selecione o tipo de operação que requer autorização automática e execute sem confirmação do usuário", + "autoApproveRead": "Leitura", + "autoApproveWrite": "Escrita", + "baseUrl": "URL Base", + "baseUrlPlaceholder": "Digite a URL básica do servidor (por exemplo: http://localhost:3000)", + "cancel": "Cancelar", + "command": "Comando", + "commandPlaceholder": "Digite um comando", + "commandRequired": "O comando não pode estar vazio", + "configImported": "Importação de configuração bem-sucedida", + "description": "Descrição", + "descriptionPlaceholder": "Digite a descrição do servidor", + "descriptions": "Descrição", + "descriptionsPlaceholder": "Digite a descrição do servidor", + "env": "Variáveis de Ambiente", + "envInvalid": "As variáveis de ambiente devem estar em formato JSON válido", + "envPlaceholder": "Digite as variáveis de ambiente em formato JSON", + "icon": "Ícone", + "iconPlaceholder": "Digite o ícone", + "icons": "Ícones", + "iconsPlaceholder": "Digite os ícones", + "jsonConfig": "Configuração JSON", + "jsonConfigExample": "Exemplo de configuração JSON", + "jsonConfigIntro": "Você pode colar diretamente a configuração JSON ou escolher configurar o servidor manualmente.", + "jsonConfigPlaceholder": "Cole a configuração em formato JSON do servidor MCP", + "name": "Nome do Servidor", + "namePlaceholder": "Digite o nome do servidor", + "nameRequired": "O nome do servidor não pode estar vazio", + "parseAndContinue": "Analisar e Continuar", + "parseError": "Erro de análise", + "parseSuccess": "Configuração analisada com sucesso", + "skipToManual": "Pular para configuração manual", + "submit": "Enviar", + "folders": "Lista de Pastas", + "addFolder": "Adicionar Pasta", + "selectFolder": "Selecionar Pasta", + "selectFolderError": "Falha ao selecionar pasta", + "noFoldersSelected": "Nenhuma pasta selecionada", + "type": "Tipo de Servidor", + "typeInMemory": "Memória", + "typePlaceholder": "Selecione um tipo de servidor", + "typeSse": "Server-Sent Events (SSE)", + "typeStdio": "Entrada e saída padrão", + "update": "Atualizar" + }, + "serverList": "Lista de servidores", + "setAsDefault": "Definir como servidor padrão", + "setDefault": "Definir como padrão", + "startServer": "Iniciar servidor", + "stopServer": "Parar servidor", + "stopped": "Parado", + "tabs": { + "servers": "Servidores", + "tools": "Ferramentas" + }, + "title": "Configurações MCP", + "inmemory": { + "Artifacts": { + "desc": "Produzir Artifacts mais ricos no DeepChat", + "name": "Artifacts" + }, + "bochaSearch": { + "desc": "API de Pesquisa Bocha https://open.bochaai.com/", + "name": "Pesquisa Bocha" + }, + "buildInFileSystem": { + "desc": "Permitir que o DeepChat interaja com o sistema de arquivos local.", + "name": "Sistema de Arquivos" + }, + "imageServer": { + "desc": "Permite que qualquer modelo no DeepChat entenda e gere imagens.", + "name": "Serviço de Imagem" + }, + "braveSearch": { + "desc": "API de Pesquisa Brave https://brave.com/search/api/", + "name": "Pesquisa Brave" + }, + "powerpack": { + "desc": "Fornecer aos modelos consultas de tempo, navegação na web e execução segura de código.", + "name": "Power Pack" + }, + "difyKnowledge": { + "desc": "Serviço de Pesquisa da Base de Conhecimento Dify, que pode recuperar conteúdo na Base de Conhecimento Dify", + "name": "Pesquisa na Base de Conhecimento Dify" + }, + "ragflowKnowledge": { + "name": "Pesquisa na Base de Conhecimento RAGFlow", + "desc": "Serviço de pesquisa da base de conhecimento RAGFlow, pode pesquisar conteúdo da base de conhecimento RAGFlow" + }, + "fastGptKnowledge": { + "name": "Pesquisa na Base de Conhecimento FastGPT", + "desc": "Serviço de pesquisa da base de conhecimento FastGPT, pode pesquisar conteúdo da base de conhecimento FastGPT" + }, + "deepchat-inmemory/custom-prompts-server": { + "desc": "Serviço de prompts personalizados integrado ao DeepChat", + "name": "Prompts Personalizados" + }, + "deepchat-inmemory/deep-research-server": { + "desc": "Pesquisa profunda integrada ao DeepChat alimentada pela Pesquisa Bocha. Modelos de contexto longo são recomendados.", + "name": "DeepResearch" + }, + "deepchat-inmemory/auto-prompting-server": { + "name": "Prompting de Modelo Automático", + "desc": "Seleciona automaticamente o melhor prompt personalizado com base na entrada e preenche o modelo de forma inteligente." + }, + "deepchat-inmemory/conversation-search-server": { + "name": "Pesquisa no Histórico de Conversas", + "desc": "Pesquisa integrada ao DeepChat para histórico de conversas e mensagens anteriores." + }, + "builtinKnowledge": { + "desc": "Pesquisa na base de conhecimento integrada do DeepChat para documentação e guias.", + "name": "Pesquisa na base de conhecimento integrada" + }, + "deepchat-inmemory/meeting-server": { + "name": "Reuniões Multi-Agente", + "desc": "Reuniões integradas ao DeepChat para hospedar discussões multi-agente." + }, + "deepchat/apple-server": { + "desc": "Permite que os modelos operem aplicativos do macOS como Calendário, Contatos, Mail, Mapas, Notas e Lembretes.", + "name": "Assistente do Sistema macOS" + } + }, + "prompts": { + "noPromptsAvailable": "Nenhum Prompt Disponível", + "noDescription": "Ainda sem descrição", + "selectPrompt": "Os detalhes do prompt selecionado serão exibidos aqui.", + "parameters": "Parâmetros", + "input": "Parâmetros", + "runningPrompt": "Buscando prompt...", + "executeButton": "Obter Prompt", + "resultTitle": "Detalhes do Prompt", + "invalidJson": "Formato JSON inválido", + "parametersHint": "Por favor, insira os parâmetros em formato JSON, suporta formatação automática", + "resetToDefault": "Restaurar parâmetros padrão", + "dialogDescription": "Depurar e testar prompts fornecidos pelos servidores MCP" + }, + "resources": { + "noResourcesAvailable": "Nenhum Recurso Disponível", + "selectResource": "Selecione um recurso para ver seu conteúdo.", + "loading": "Carregando...", + "loadContent": "Carregar Conteúdo", + "pleaseSelect": "Clique para ver os detalhes do recurso.", + "dialogDescription": "Navegar e visualizar recursos fornecidos pelos servidores MCP" + }, + "errors": { + "loadConfigFailed": "Falha ao carregar configuração MCP", + "setEnabledFailed": "Falha ao definir estado de ativação do MCP", + "getServerStatusFailed": "Falha ao obter status do servidor {serverName}", + "addServerFailed": "Falha ao adicionar servidor", + "updateServerFailed": "Falha ao atualizar servidor", + "removeServerFailed": "Falha ao remover servidor", + "maxDefaultServersReached": "Número máximo de servidores padrão (30) atingido", + "toggleDefaultServerFailed": "Falha ao alternar status do servidor padrão", + "resetToDefaultFailed": "Falha ao restaurar servidores padrão", + "toggleServerFailed": "Falha ao alternar servidor {serverName}", + "loadToolsFailed": "Falha ao carregar ferramentas", + "loadPromptsFailed": "Falha ao carregar prompts", + "loadResourcesFailed": "Falha ao carregar recursos", + "callToolFailed": "Falha ao chamar ferramenta {toolName}", + "toolCallError": "Erro na chamada da ferramenta: {error}", + "mcpDisabled": "MCP está desativado", + "getPromptFailed": "Falha ao obter prompt", + "readResourceFailed": "Falha ao ler recurso" + }, + "market": { + "browseBuiltin": "Navegar no Mercado MCP Integrado", + "builtinTitle": "Mercado MCP", + "poweredBy": "Desenvolvido por MCPRouter", + "keyGuide": "Obter Chave API", + "keyHelpText": "Por favor, acesse", + "keyHelpEnd": "para solicitar uma Chave API e preencha-a na caixa de entrada acima", + "apiKeyPlaceholder": "Digite a Chave API do MCPRouter", + "apiKeyRequiredTitle": "Chave API Necessária", + "apiKeyRequiredDesc": "Por favor, preencha a Chave API do MCPRouter antes da instalação", + "install": "Instalar", + "installed": "Instalado", + "installSuccess": "Instalação bem-sucedida", + "installFailed": "Falha na instalação", + "noMore": "Não há mais", + "empty": "Sem serviços", + "loadMore": "Carregar Mais", + "pullDownToLoad": "Continue puxando para baixo para carregar mais" + } +} diff --git a/src/renderer/src/i18n/pt-BR/model.json b/src/renderer/src/i18n/pt-BR/model.json new file mode 100644 index 000000000..9b3993f0f --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/model.json @@ -0,0 +1,30 @@ +{ + "search": { + "placeholder": "Buscar modelos..." + }, + "error": { + "loadFailed": "Falha ao carregar modelos" + }, + "type": { + "custom": "Modelo Personalizado", + "official": "Modelo Oficial" + }, + "add": { + "namePlaceholder": "Nome do Modelo", + "idPlaceholder": "ID do Modelo", + "contextLengthPlaceholder": "Comprimento do Contexto", + "maxTokensPlaceholder": "Máximo de Tokens" + }, + "actions": { + "add": "Adicionar Modelo", + "enableAll": "Ativar Todos", + "disableAll": "Desativar Todos" + }, + "tags": { + "reasoning": "Raciocínio", + "chat": "Chat", + "code": "Código", + "writing": "Escrita", + "analysis": "Análise" + } +} diff --git a/src/renderer/src/i18n/pt-BR/newThread.json b/src/renderer/src/i18n/pt-BR/newThread.json new file mode 100644 index 000000000..0a600da09 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/newThread.json @@ -0,0 +1,4 @@ +{ + "greeting": "Olá!", + "prompt": "Em que posso ajudar?" +} diff --git a/src/renderer/src/i18n/pt-BR/promptSetting.json b/src/renderer/src/i18n/pt-BR/promptSetting.json new file mode 100644 index 000000000..42bd439f9 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/promptSetting.json @@ -0,0 +1,92 @@ +{ + "title": "Gerenciamento de Prompts", + "addTitle": "Adicionar Prompt", + "addDescription": "Criar um novo modelo de prompt personalizado", + "editTitle": "Editar Prompt", + "editDescription": "Modificar o modelo de prompt selecionado", + "name": "Nome", + "namePlaceholder": "Digite um nome para seu prompt", + "description": "Descrição", + "descriptionPlaceholder": "Por favor, digite a descrição (opcional)", + "promptContent": "Prompt", + "contentPlaceholder": "Por favor, digite o conteúdo do prompt", + "basicInfo": "Informações Básicas", + "contentTip": "Suporta espaços reservados para variáveis como {openBrace}{openBrace}variável{closeBrace}{closeBrace}, você pode definir os parâmetros correspondentes na seção de parâmetros", + "noPrompt": "Nenhum Prompt Ainda", + "noPromptDesc": "Clique no botão \"+\" no canto superior direito para criar seu primeiro prompt.", + "active": "Ativo", + "noDescription": "Sem descrição", + "customDate": "Personalizado", + "showMore": "Mostrar Mais", + "showLess": "Mostrar Menos", + "export": "Exportar", + "import": "Importar", + "exportSuccess": "Exportação bem-sucedida", + "exportFailed": "Falha na exportação", + "importSuccess": "Importação bem-sucedida", + "importFailed": "Falha na importação", + "importStats": "Adicionados {added}, atualizados {updated} prompts", + "parameters": "Parâmetros", + "addParameter": "Adicionar Parâmetro", + "noParameters": "Sem parâmetros", + "noParametersDesc": "Clique no botão acima para adicionar parâmetros, que podem ser usados para criar espaços reservados variáveis nos prompts", + "parameterName": "Nome do Parâmetro", + "parameterDescription": "Descrição do Parâmetro", + "parameterNamePlaceholder": "Por favor, digite o nome do parâmetro", + "parameterDescriptionPlaceholder": "Por favor, digite a descrição do parâmetro", + "required": "Obrigatório", + "characters": "Caracteres", + "fileManagement": "Gerenciamento de Arquivos", + "uploadFromDevice": "Enviar do dispositivo", + "uploadFromDeviceDesc": "Suporta texto, documentos, CSV e mais.", + "uploadedFiles": "Arquivos Enviados", + "noFiles": "Nenhum arquivo", + "noFilesUploadDesc": "Clique acima para enviar arquivos", + "uploadSuccess": "Envio bem-sucedido", + "uploadedCount": "Enviados {count} arquivos", + "confirmDelete": "Tem certeza que deseja excluir o prompt \"{name}\"?", + "confirmDeleteDescription": "Esta ação não pode ser desfeita. O prompt será excluído permanentemente.", + "confirmDeleteSystemPrompt": "Tem certeza que deseja excluir o prompt do sistema \"{name}\"?", + "confirmDeleteSystemPromptDescription": "Esta ação não pode ser desfeita. O prompt do sistema será excluído permanentemente.", + "deleteSuccess": "Prompt Excluído", + "deleteFailed": "Falha ao Excluir Prompt", + "inactive": "Inativo", + "clickToEnable": "Clique para ativar", + "clickToDisable": "Clique para desativar", + "enableSuccess": "Prompt Ativado", + "disableSuccess": "Prompt Desativado", + "toggleFailed": "Falha ao Alterar Status", + "enablePrompt": "Ativar este prompt", + "sourceLocal": "Local", + "sourceImported": "Importado", + "sourceBuiltin": "Integrado", + "defaultSystemPrompt": "Prompt do Sistema Padrão", + "defaultSystemPromptPlaceholder": "Digite o prompt do sistema padrão que será usado para todas as novas conversas...", + "defaultSystemPromptDescription": "Este prompt será aplicado a todas as novas conversas. Você pode modificá-lo ao criar uma conversa. Note que esta configuração entrará em vigor na próxima vez que você criar uma nova conversa.", + "typing": "Digitando...", + "saving": "Salvando...", + "saved": "Salvo", + "saveDefaultPromptFailed": "Falha ao salvar o prompt do sistema padrão", + "systemPrompts": "Prompts do Sistema", + "customPrompts": "Prompts Personalizados", + "addSystemPrompt": "Adicionar Prompt do Sistema", + "addCustomPrompt": "Adicionar Prompt Personalizado", + "editSystemPrompt": "Editar Prompt do Sistema", + "addSystemPromptDesc": "Criar um novo prompt do sistema", + "editSystemPromptDesc": "Modificar o prompt do sistema selecionado", + "selectSystemPrompt": "Selecionar Prompt do Sistema", + "systemPromptDescription": "O prompt do sistema selecionado será usado como padrão para novas conversas", + "preview": "Visualização", + "systemPromptChanged": "Prompt do sistema alterado com sucesso", + "systemPromptChangeFailed": "Falha ao alterar prompt do sistema", + "systemPromptAdded": "Prompt do sistema adicionado com sucesso", + "systemPromptAddedAndSwitched": "Prompt do sistema adicionado e automaticamente definido como padrão", + "systemPromptUpdated": "Prompt do sistema atualizado com sucesso", + "systemPromptSaveFailed": "Falha ao salvar prompt do sistema", + "systemPromptDeleted": "Prompt do sistema excluído com sucesso", + "systemPromptDeleteFailed": "Falha ao excluir prompt do sistema", + "systemPromptEditTip": "Salva automaticamente quando o foco é perdido após a edição", + "resetToDefault": "Redefinir para Padrão", + "resetToDefaultSuccess": "Redefinido para o conteúdo padrão com sucesso", + "resetToDefaultFailed": "Falha ao redefinir para o padrão" +} diff --git a/src/renderer/src/i18n/pt-BR/routes.json b/src/renderer/src/i18n/pt-BR/routes.json new file mode 100644 index 000000000..2bb8aef8d --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/routes.json @@ -0,0 +1,16 @@ +{ + "chat": "Chat", + "welcome": "Bem-vindo", + "playground": "Playground", + "settings": "Configurações", + "settings-common": "Configurações Comuns", + "settings-provider": "Provedores", + "settings-mcp": "Configurações MCP", + "settings-database": "Dados", + "settings-about": "Sobre", + "settings-shortcut": "Atalhos", + "settings-display": "Exibição", + "settings-knowledge-base": "Base de Conhecimento", + "settings-prompt": "Prompts", + "settings-mcp-market": "Mercado MCP" +} diff --git a/src/renderer/src/i18n/pt-BR/settings.json b/src/renderer/src/i18n/pt-BR/settings.json new file mode 100644 index 000000000..fc8766067 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/settings.json @@ -0,0 +1,838 @@ +{ + "title": "Configurações", + "common": { + "title": "Configurações Comuns", + "resetData": "Redefinir Dados", + "language": "Idioma", + "languageSelect": "Selecionar idioma", + "searchEngine": "Mecanismo de Busca", + "searchEngineSelect": "Selecionar mecanismo de busca", + "searchPreview": "Pré-visualização de Busca", + "searchAssistantModel": "Modelo Assistente", + "selectModel": "Selecionar Modelo", + "proxyMode": "Modo Proxy", + "proxyModeSelect": "Selecionar modo proxy", + "proxyModeSystem": "Proxy do Sistema", + "proxyModeNone": "Sem Proxy", + "proxyModeCustom": "Proxy Personalizado", + "customProxyUrl": "URL de Proxy Personalizado", + "customProxyUrlPlaceholder": "Exemplo: http://127.0.0.1:7890", + "invalidProxyUrl": "URL de proxy inválida, insira uma URL http/https válida", + "addCustomSearchEngine": "Adicionar Mecanismo de Busca Personalizado", + "addCustomSearchEngineDesc": "Adicione um novo mecanismo de busca fornecendo um nome e a URL de busca. A URL deve incluir {query} como placeholder da consulta.", + "searchEngineName": "Nome do Mecanismo de Busca", + "searchEngineNamePlaceholder": "Digite o nome do mecanismo de busca", + "searchEngineUrl": "URL de Busca", + "searchEngineUrlPlaceholder": "Ex: https://a.com/search?q={'{'}query{'}'}", + "searchEngineUrlError": "A URL deve incluir {'{'}query{'}'} como placeholder da consulta", + "deleteCustomSearchEngine": "Excluir Mecanismo de Busca Personalizado", + "deleteCustomSearchEngineDesc": "Tem certeza de que deseja excluir o mecanismo de busca personalizado \"{name}\"? Esta ação não pode ser desfeita.", + "testSearchEngine": "Testar Mecanismo de Busca", + "testSearchEngineDesc": "Uma busca de teste por \"tempo\" será realizada usando o mecanismo de busca {engine}.", + "testSearchEngineNote": "Se a página de busca exigir login ou outras ações, você pode realizá-las na janela de teste. Por favor, feche a janela de teste quando terminar.", + "theme": "Tema", + "themeSelect": "Selecionar tema", + "closeToQuit": "Sair do aplicativo ao fechar a janela", + "contentProtectionDialogTitle": "Confirmar Mudança na Proteção de Tela", + "contentProtectionEnableDesc": "Evita que aplicativos de compartilhamento de tela capturem a janela do DeepChat para ajudar a proteger sua privacidade. Nem todos os aplicativos respeitam essa configuração; em alguns ambientes, uma janela preta pode permanecer.", + "contentProtectionDisableDesc": "Permite que aplicativos de compartilhamento de tela capturem a janela do DeepChat.", + "contentProtectionRestartNotice": "Alterar esta configuração reiniciará o aplicativo. Deseja continuar?", + "soundEnabled": "Habilitar Efeitos Sonoros", + "copyWithCotEnabled": "Copiar Detalhes COT", + "loggingEnabled": "Habilitar Registro (Logging)", + "loggingDialogTitle": "Confirmar Mudança na Configuração de Registro", + "loggingEnableDesc": "Habilitar o registro ajudará a diagnosticar problemas e melhorar o aplicativo. Os arquivos de registro podem conter informações confidenciais.", + "loggingDisableDesc": "Desabilitar o registro interromperá a coleta de logs do aplicativo.", + "webContentLengthLimit": "Limite de Comprimento do Conteúdo Web", + "webContentLengthLimitHint": "(Defina para 0 para sem limite)", + "webContentLengthLimitTooltip": "Defina o comprimento máximo do conteúdo de texto extraído de páginas web (contagem de caracteres), intervalo: 0-50000. Definir como 0 significa sem limite e recupera o conteúdo web completo; valores mais altos fornecem conteúdo web mais completo, mas podem aumentar o tempo de processamento e o uso de tokens.", + "loggingRestartNotice": "Alterar esta configuração reiniciará o aplicativo. Deseja continuar?", + "openLogFolder": "Abrir Pasta de Log", + "shortcut": { + "newChat": "Criar um novo chat", + "title": "Configurações de tecla de atalho" + }, + "notifications": "Notificações do Sistema", + "notificationsDesc": "Quando o DeepChat não estiver em primeiro plano, se uma sessão for gerada, uma notificação do sistema será enviada", + "contentProtection": "Proteção contra captura de tela" + }, + "data": { + "title": "Configurações de Dados", + "syncEnable": "Habilitar Sincronização de Dados", + "syncFolder": "Pasta de Sincronização", + "openSyncFolder": "Abrir Pasta de Sincronização", + "lastSyncTime": "Última Sincronização", + "never": "Nunca", + "startBackup": "Fazer Backup Agora", + "backingUp": "Fazendo backup...", + "importData": "Importar Dados", + "incrementImport": "Importação Incremental", + "overwriteImport": "Substituir Importação", + "importConfirmTitle": "Confirmar Importação de Dados", + "importConfirmDescription": "A importação substituirá todos os dados atuais, incluindo histórico de chat e configurações. Certifique-se de ter feito backup de dados importantes. Você precisará reiniciar o aplicativo após a importação.", + "importing": "Importando...", + "confirmImport": "Confirmar Importação", + "importSuccessTitle": "Importação Bem-sucedida", + "importErrorTitle": "Falha na Importação", + "resetData": "Redefinir Dados", + "resetConfirmTitle": "Confirmar Redefinição de Dados", + "resetConfirmDescription": "Por favor, selecione o tipo de dados a ser redefinido. Esta operação não pode ser desfeita e o aplicativo será reiniciado automaticamente após a redefinição.", + "resetChatData": "Redefinir Dados de Chat", + "resetChatDataDesc": "Excluir todo o histórico de chat e registros de conversa", + "resetKnowledgeData": "Redefinir Dados da Base de Conhecimento", + "resetKnowledgeDataDesc": "Excluir todos os arquivos de base de conhecimento e dados vetoriais", + "resetConfig": "Redefinir Configuração", + "resetConfigDesc": "Excluir todas as configurações do aplicativo, configurações de modelo e prompts personalizados", + "resetAll": "Redefinição Completa", + "resetAllDesc": "Excluir todos os dados, incluindo histórico de chat, configurações e arquivos de cache", + "resetting": "Redefinindo...", + "confirmReset": "Confirmar Redefinição", + "resetCompleteDevTitle": "Redefinição de Dados Concluída", + "resetCompleteDevMessage": "Por favor, reinicie manualmente o aplicativo no modo de desenvolvimento. Pare o processo atual e execute pnpm run dev novamente" + }, + "model": { + "title": "Configurações do Modelo", + "systemPrompt": { + "label": "Prompt do Sistema", + "placeholder": "Por favor, insira o prompt do sistema...", + "description": "Defina o prompt do sistema para o assistente de IA definir seu comportamento e função" + }, + "temperature": { + "label": "Temperatura do Modelo", + "description": "Controla a aleatoriedade da saída; valores mais altos produzem respostas mais criativas" + }, + "contextLength": { + "label": "Comprimento do Contexto", + "description": "Defina o comprimento máximo do contexto da conversa" + }, + "responseLength": { + "label": "Comprimento da Resposta", + "description": "Defina o comprimento máximo da resposta da IA" + }, + "artifacts": { + "description": "Habilitar o recurso Artefatos permite que a IA gere conteúdo mais rico", + "title": "Artefatos" + }, + "addModel": "Adicionar Modelo", + "configureModel": "Configurar Modelo", + "modelList": "Lista de Modelos", + "provider": "Provedor de serviço", + "providerSetting": "Configurações do provedor de serviço", + "selectModel": "Selecionar um modelo", + "modelConfig": { + "cancel": "Cancelar", + "contextLength": { + "description": "Defina o comprimento do contexto que o modelo pode lidar", + "label": "Comprimento do Contexto" + }, + "description": "Observe que esta configuração é válida apenas para o modelo atual e não afetará outros modelos. Modifique com cautela. Parâmetros incorretos podem fazer com que o modelo não funcione corretamente.", + "functionCall": { + "description": "Se o modelo suporta chamadas de função nativamente (o DeepChat simulará automaticamente chamadas de função após desativar esta opção)", + "label": "Chamadas de Função" + }, + "maxTokens": { + "description": "Defina o número máximo de tokens para uma única saída do modelo", + "label": "Comprimento máximo de saída" + }, + "reasoning": { + "description": "O modelo suporta capacidade de raciocínio?", + "label": "Capacidade de raciocínio" + }, + "enableSearch": { + "label": "Busca na Web", + "description": "Habilitar o modelo para buscar na web pelas informações mais recentes" + }, + "forcedSearch": { + "label": "Busca Forçada", + "description": "Forçar o modelo a realizar busca na web, quando desabilitado o modelo decide automaticamente" + }, + "searchStrategy": { + "label": "Estratégia de Busca", + "description": "Escolha o modo de desempenho de busca: turbo equilibra velocidade e eficácia, max fornece resultados de busca ideais", + "placeholder": "Selecionar estratégia de busca", + "options": { + "turbo": "Turbo - Equilibra velocidade de resposta e eficácia de busca (Recomendado)", + "max": "Max - Modo de alto desempenho, fornece resultados de busca ideais" + } + }, + "thinkingBudget": { + "label": "Orçamento de Pensamento", + "range": "Intervalo: {min} - {max}", + "gemini": { + "description": "Limitar o comprimento do pensamento do modelo", + "dynamic": "Pensamento Dinâmico", + "onlySupported": "Suportado apenas em Gemini 2.5 Flash, 2.5 Pro e 2.5 Flash-Lite", + "valueLabel": "Valor do Orçamento de Pensamento", + "placeholder": "Insira o valor do orçamento de pensamento", + "forceEnabled": "Modelos da série Gemini 2.5 forçam a ativação do orçamento de pensamento", + "dynamicPrefix": "-1 = Pensamento Dinâmico", + "notice": "Aviso: ", + "warnings": { + "proNoDisable": "Este modelo não suporta desativar o pensamento, valor mínimo 128", + "proCannotDisable": "Gemini 2.5 Pro não pode desativar a função de pensamento", + "flashLiteCannotSetZero": "Gemini 2.5 Flash-Lite não pode ser definido como 0, o valor mínimo é 512", + "modelCannotDisable": "Este modelo não pode desativar a função de pensamento", + "flashLiteMinValue": "O orçamento de pensamento não pode ser inferior a 512 quando definido para um valor específico (ou use 0 para desativar o pensamento, -1 para habilitar o pensamento dinâmico)", + "belowMin": "O orçamento de pensamento não pode ser inferior a {min}{hint}", + "aboveMax": "O orçamento de pensamento não pode ser maior que {max}" + }, + "hints": { + "flashLiteDisable": ", 0 = desativar pensamento, valor específico mínimo 512", + "normalDisable": ", 0 = desativar pensamento", + "withZeroAndDynamic": "(ou use 0 para desativar o pensamento, -1 para habilitar o pensamento dinâmico)", + "withDynamic": "(ou use -1 para habilitar o pensamento dinâmico)" + } + }, + "qwen3": { + "description": "Defina o comprimento máximo de tokens para o processo de pensamento para controlar a profundidade do raciocínio do modelo", + "valueLabel": "Valor do Orçamento de Pensamento", + "placeholder": "Insira o valor do orçamento de pensamento", + "validation": { + "required": "Por favor, insira o valor do orçamento de pensamento", + "minValue": "O valor do orçamento de pensamento deve ser maior ou igual a 1", + "maxValue": "O valor do orçamento de pensamento não pode exceder {max}" + } + } + }, + "resetConfirm": { + "confirm": "Confirmar redefinição", + "message": "Tem certeza de que deseja redefinir a configuração deste modelo para o padrão? \nEsta operação é irrevogável.", + "title": "Confirmar redefinição" + }, + "reasoningEffort": { + "label": "Esforço de Raciocínio", + "description": "Controla a profundidade do raciocínio do modelo; esforço mais alto produz resultados melhores, mas respostas mais lentas", + "placeholder": "Selecionar esforço de raciocínio", + "options": { + "minimal": "Mínimo - Resposta mais rápida", + "low": "Baixo - Baixo esforço", + "medium": "Médio - Esforço moderado", + "high": "Alto - Alto esforço" + } + }, + "verbosity": { + "label": "Verbosidade", + "description": "Controla o nível de detalhe e o comprimento das respostas do modelo", + "placeholder": "Selecionar nível de verbosidade", + "options": { + "low": "Baixo - Respostas concisas", + "medium": "Médio - Detalhe equilibrado", + "high": "Alto - Respostas detalhadas" + } + }, + "resetToDefault": "Redefinir para o padrão", + "saveConfig": "Salvar configuração", + "useModelDefault": "Usar configuração padrão do modelo", + "currentUsingModelDefault": "Usando a configuração padrão do modelo atualmente", + "temperature": { + "description": "Controla a aleatoriedade da saída. A maioria dos modelos é de 0 a 1, e alguns suportam entre 0 e 2. Valores mais altos aumentam a aleatoriedade.", + "label": "Temperatura" + }, + "title": "Parâmetros personalizados do modelo", + "type": { + "description": "Selecionar o tipo de modelo", + "label": "Tipo de Modelo", + "options": { + "chat": "Modelo de Linguagem", + "embedding": "Modelo de Embedding (Incrustação)", + "imageGeneration": "Modelo de Geração de Imagem", + "rerank": "Modelo de Rerank (Reclassificação)" + } + }, + "validation": { + "contextLengthMax": "O comprimento do contexto não pode exceder 10000000", + "contextLengthMin": "O comprimento do contexto deve ser maior que 0", + "contextLengthRequired": "O comprimento do contexto não pode estar vazio", + "maxTokensMax": "O comprimento máximo de saída não pode exceder 1000000", + "maxTokensMin": "O comprimento máximo de saída deve ser maior que 0", + "maxTokensRequired": "O comprimento máximo de saída não pode estar vazio", + "temperatureMax": "A temperatura deve ser menor ou igual a 2", + "temperatureMin": "A temperatura deve ser maior ou igual a 0", + "temperatureRequired": "A temperatura não pode estar vazia" + }, + "vision": { + "description": "O modelo suporta capacidade visual?", + "label": "Capacidade visual" + }, + "searchLimit": { + "label": "Limitação de busca", + "description": "Limitação do modelo: Habilitar a busca na web desabilitará as chamadas de função de ferramenta" + } + } + }, + "provider": { + "search": "Buscar plataformas de provedores…", + "enable": "Habilitar Serviço", + "enabled": "Habilitado", + "disabled": "Desabilitado", + "urlPlaceholder": "Por favor, insira a URL da API", + "keyPlaceholder": "Por favor, insira a Chave da API", + "accessKeyIdPlaceholder": "Por favor, insira o ID da Chave de Acesso da AWS", + "secretAccessKeyPlaceholder": "Por favor, insira a Chave de Acesso Secreta da AWS", + "regionPlaceholder": "Por favor, insira a região da AWS", + "verifyKey": "Verificar Chave", + "howToGet": "Como obter", + "getKeyTip": "Por favor, visite", + "getKeyTipEnd": "para obter a Chave da API", + "urlFormat": "Exemplo de API: {defaultUrl}", + "modelList": "Lista de Modelos", + "enableModels": "Habilitar Modelos", + "disableAllModels": "Desabilitar Todos os Modelos", + "modelsEnabled": "Modelos foram habilitados", + "noModelsEnabled": { + "title": "Nenhum modelo habilitado", + "description": "Por favor, clique no botão \"Habilitar Modelos\" para selecionar manualmente os modelos que você deseja usar." + }, + "verifyLink": "Verificar Link", + "syncModelsFailed": "Falha ao sincronizar modelos...", + "addCustomProvider": "Adicionar Provedor Personalizado", + "delete": "Excluir", + "stopModel": "Parar Modelo", + "pulling": "Baixando...", + "runModel": "Executar Modelo", + "dialog": { + "disableModel": { + "title": "Confirmar Desativação do Modelo", + "content": "Tem certeza de que deseja desativar o modelo \"{name}\"?", + "confirm": "Desativar" + }, + "disableAllModels": { + "title": "Confirmar Desativação de Todos os Modelos", + "content": "Tem certeza de que deseja desativar todos os modelos?", + "confirm": "Desativar Todos" + }, + "configModels": { + "title": "Configurar Lista de Modelos", + "description": "Selecionar modelos para habilitar ou desabilitar" + }, + "verify": { + "missingFields": "Por favor, insira a Chave da API e a URL da API", + "failed": "Falha na verificação", + "success": "Verificação bem-sucedida", + "failedDesc": "Falha na verificação da chave ou configuração da API, verifique sua configuração", + "successDesc": "Chave e configuração da API verificadas com sucesso, prontas para uso", + "connectionError": "Erro de conexão, verifique a conexão de rede e o endereço da API", + "serverError": "Erro do servidor, tente novamente mais tarde", + "unauthorized": "Falha na autenticação, a Chave da API é inválida ou expirou" + }, + "addCustomProvider": { + "title": "Adicionar Provedor Personalizado", + "description": "Por favor, preencha as informações necessárias para o provedor", + "name": "Nome", + "namePlaceholder": "Por favor, insira o nome do provedor", + "apiType": "Tipo de API", + "apiTypePlaceholder": "Por favor, selecione o tipo de API", + "apiKey": "Chave da API", + "apiKeyPlaceholder": "Por favor, insira a chave da API", + "baseUrl": "URL Base da API", + "baseUrlPlaceholder": "Por favor, insira a URL base da API", + "enable": "Habilitar Provedor" + }, + "deleteProvider": { + "title": "Confirmar Exclusão do Provedor", + "content": "Tem certeza de que deseja excluir o provedor \"{name}\"? Esta ação não pode ser desfeita.", + "confirm": "Excluir" + }, + "deleteModel": { + "title": "Confirmar Exclusão do Modelo", + "content": "Tem certeza de que deseja excluir o modelo \"{name}\"? Esta ação não pode ser desfeita.", + "confirm": "Excluir" + }, + "pullModel": { + "title": "Baixar Modelo", + "description": "Selecionar modelos para baixar localmente", + "pull": "Baixar" + }, + "modelCheck": { + "title": "Verificação do Modelo", + "description": "Selecionar um modelo para testar a conectividade e disponibilidade", + "model": "Selecionar Modelo", + "modelPlaceholder": "Por favor, selecione um modelo para testar", + "test": "Iniciar Teste", + "checking": "Testando...", + "success": "Teste do modelo bem-sucedido", + "failed": "Falha no teste do modelo", + "noModels": "Nenhum modelo disponível para este provedor" + } + }, + "pullModels": "Baixar Modelos", + "refreshModels": "Atualizar Modelos", + "modelsRunning": "Modelos em Execução", + "runningModels": "Modelos em Execução", + "noRunningModels": "Nenhum Modelo em Execução", + "deleteModel": "Excluir Modelo", + "deleteModelConfirm": "Tem certeza de que deseja excluir o modelo \"{name}\"? Esta ação não pode ser desfeita.", + "noLocalModels": "Nenhum Modelo Local", + "localModels": "Modelos Locais", + "azureApiVersion": "Versão da API", + "safety": { + "title": "Configurações de segurança", + "blockHighest": "Bloquear risco alto", + "blockMost": "Bloquear riscos médios", + "blockNone": "Não bloqueado", + "blockSome": "Bloquear risco baixo" + }, + "serverList": "Lista de Servidores", + "totalServers": "Total de Servidores", + "addServer": "Adicionar Servidor", + "autoStart": "Início Automático", + "githubCopilotAuth": "Autenticação do GitHub Copilot", + "githubCopilotConnected": "GitHub Copilot Conectado", + "githubCopilotNotConnected": "GitHub Copilot Não Conectado", + "loginWithGitHub": "Entrar com GitHub", + "loggingIn": "Entrando...", + "githubCopilotLoginTip": "Autorize o DeepChat a acessar sua assinatura do GitHub Copilot. As permissões 'read:user' e 'read:org' são necessárias para acessar a API do Copilot.", + "loginSuccess": "Login bem-sucedido", + "loginFailed": "Falha no login", + "tokenValid": "Token é válido", + "tokenInvalid": "Token é inválido", + "disconnect": "Desconectar", + "disconnected": "Desconectado com sucesso", + "disconnectFailed": "Falha ao desconectar", + "keyStatus": { + "remaining": "Cota Restante", + "usage": "Usado" + }, + "refreshingModels": "Atualizando...", + "toast": { + "modelRunning": "O modelo está em execução", + "modelRunningDesc": "Por favor, pare o modelo {model} primeiro e depois o exclua." + }, + "modelscope": { + "mcpSync": { + "title": "Sincronizar Serviços MCP", + "description": "Sincronize servidores MCP do ModelScope para a configuração local, permitindo a adição rápida de ferramentas MCP comuns.", + "sync": "Iniciar Sincronização", + "syncing": "Sincronizando...", + "pageSize": "Tamanho da Página", + "imported": "{count} serviços importados", + "skipped": "{count} serviços ignorados", + "errors": "{count} erros", + "errorDetails": "Detalhes do Erro", + "noApiKey": "Por favor, configure a Chave da API do ModelScope primeiro", + "noServersFound": "Nenhum serviço MCP disponível encontrado", + "authenticationFailed": "Falha na autenticação, verifique a Chave da API", + "convertingServers": "Convertendo configuração do servidor...", + "fetchingServers": "Obtendo a lista de servidores MCP...", + "importingServers": "Importando configuração do servidor...", + "noOperationalUrls": "Nenhum endereço operacional disponível encontrado", + "pageNumber": "número da página", + "pageNumberPlaceholder": "Por favor, insira o número da página", + "serverAlreadyExists": "O servidor já existe, pular importação", + "syncComplete": "Conclusão da sincronização", + "invalidServerData": "Dados do servidor inválidos" + }, + "apiKey": "Chave da API", + "apiKeyHelper": "Obtenha sua Chave da API no console do ModelScope", + "apiKeyPlaceholder": "Por favor, insira a Chave da API do ModelScope", + "baseUrl": "Endereço da API", + "baseUrlHelper": "Endereço do serviço de API do ModelScope", + "connected": "Conectado", + "connecting": "Conectando...", + "description": "ModelScope é uma plataforma de compartilhamento de modelo como serviço lançada pela Alibaba Damo Academy", + "details": { + "apiConfig": "Configuração da API", + "mcpSync": "Sincronização MCP", + "modelManagement": "Gerenciamento de Modelo", + "operationalDescription": "Sincronize servidores MCP que podem ser usados diretamente na plataforma ModelScope", + "operationalServers": "Operando um servidor", + "rateLimitConfig": "Configuração de limite de taxa", + "safetySettings": "Configurações de segurança", + "specialConfig": "Configuração especial", + "syncFromModelScope": "Sincronizar do ModelScope", + "title": "Detalhes das configurações do provedor" + }, + "invalidKey": "Chave da API inválida", + "keyRequired": "Por favor, insira a Chave da API", + "name": "ModelScope", + "networkError": "Erro de conexão de rede", + "notConnected": "Não conectado", + "verifyFailed": "Falha na verificação", + "verifySuccess": "Verificação bem-sucedida" + }, + "anthropicApiKeyTip": "Por favor, vá para o Console Anthropic para obter sua Chave da API", + "anthropicConnected": "Anthropic conectado", + "anthropicNotConnected": "Anthropic não conectado", + "anthropicOAuthTip": "Clique para autorizar o DeepChat a acessar sua conta Anthropic", + "oauthLogin": "Login OAuth", + "authMethod": "Método de Autenticação", + "authMethodPlaceholder": "Selecionar método de autenticação", + "apiKeyLabel": "Chave da API", + "apiUrlLabel": "URL da API", + "anthropicOAuthFlowTip": "O sistema abrirá automaticamente a janela de autorização. Por favor, volte e insira o código de autorização após a autorização.", + "anthropicBrowserOpened": "Navegador externo está aberto", + "anthropicCodeInstruction": "Por favor, complete a autorização em um navegador externo e cole o código de autorização obtido na caixa de entrada abaixo", + "browserOpenedSuccess": "O navegador externo está aberto, por favor, complete a autorização", + "codeRequired": "Por favor, insira o código de autorização", + "inputOAuthCode": "Inserir o código de autorização", + "codeExchangeFailed": "Falha na troca do código de autorização", + "invalidCode": "Código de autorização inválido", + "oauthCodeHint": "Por favor, cole o código de autorização aqui após completar a autorização em um navegador externo", + "oauthCodePlaceholder": "Por favor, insira o código de autorização...", + "verifyConnection": "Verificar Conexão", + "manageModels": "Gerenciar Modelos", + "anthropicOAuthActiveTip": "A autenticação OAuth está habilitada, você pode usar os serviços Anthropic diretamente", + "oauthVerifySuccess": "Conexão OAuth verificada com sucesso", + "oauthVerifyFailed": "Falha na verificação da conexão OAuth", + "configurationSaved": "Configuração salva", + "configurationUpdated": "Configuração atualizada", + "dataRefreshed": "Dados foram atualizados", + "operationFailed": "Falha na operação", + "operationSuccess": "Operação bem-sucedida", + "settingsApplied": "Configurações aplicadas", + "bedrockLimitTip": "* Apenas Anthropic Claude suportado (incluindo modelos Opus, Sonnet, Haiku)", + "bedrockVerifyTip": "O DeepChat usa Claude 3.5 Sonnet para verificação. Se você não tiver permissão para invocar, a verificação falhará. Isso não afetará o uso de outros modelos." + }, + "knowledgeBase": { + "title": "Configurações da Base de Conhecimento", + "addKnowledgeBase": "Adicionar Base de Conhecimento", + "selectKnowledgeBaseType": "Por favor, selecione o tipo de base de conhecimento a adicionar", + "difyDescription": "A base de conhecimento Dify ajuda você a gerenciar e usar dados de documentos", + "comingSoon": "Em Breve", + "featureNotAvailable": "Este recurso ainda não está disponível", + "addDifyConfig": "Adicionar Configuração Dify", + "apiKey": "Chave da API", + "datasetId": "ID do Conjunto de Dados", + "endpoint": "Endpoint da API", + "configAdded": "Configuração Adicionada", + "configAddedDesc": "A configuração {name} foi adicionada com sucesso", + "addConfig": "Adicionar Configuração", + "moreComingSoon": "Mais tipos de base de conhecimento em breve", + "configUpdated": "Configuração Atualizada", + "configUpdatedDesc": "A configuração {name} foi atualizada com sucesso", + "descriptionPlaceholder": "Exemplo: Base de conhecimento de documentação de produtos da empresa", + "ragflowTitle": "Base de Conhecimento RAGFlow", + "ragflowDescription": "RAGFlow é um poderoso sistema de gerenciamento de base de conhecimento que suporta múltiplos métodos de recuperação e recursos de gerenciamento de documentos.", + "addRagflowConfig": "Adicionar Configuração RAGFlow", + "editRagflowConfig": "Editar Configuração RAGFlow", + "dify": "Base de Conhecimento Dify", + "editDifyConfig": "Modificar a configuração Dify", + "fastgptTitle": "Base de Conhecimento FastGPT", + "fastgptDescription": "FastGPT é um poderoso sistema de gerenciamento de base de conhecimento que suporta múltiplos métodos de recuperação e recursos de gerenciamento de documentos.", + "addFastGptConfig": "Adicionar Configuração FastGPT", + "editFastGptConfig": "Editar Configuração FastGPT", + "builtInKnowledgeDescription": "A base de conhecimento integrada fornece algumas implementações simples que habilitam algumas funções básicas em um ambiente offline.", + "builtInKnowledgeTitle": "Base de conhecimento integrada", + "addBuiltinKnowledgeConfig": "Adicionar configuração de base de conhecimento integrada", + "editBuiltinKnowledgeConfig": "Editar a configuração de base de conhecimento integrada", + "chunkSize": "Tamanho do bloco", + "chunkSizeHelper": "Cortar o documento em segmentos, o tamanho de cada segmento não pode exceder o limite de contexto do modelo", + "chunkOverlap": "Tamanho da sobreposição", + "chunkOverlapHelper": "A quantidade de conteúdo repetido entre blocos de texto adjacentes garante que ainda haja uma conexão contextual entre blocos de texto segmentados, melhorando o efeito geral do processamento de textos longos pelo modelo", + "selectEmbeddingModel": "Selecionar um modelo de embedding", + "modelNotFound": "Provedor de Serviço {provider} ou modelo {model} não encontrado", + "modelNotFoundDesc": "Certifique-se de que o modelo está configurado corretamente e que o modelo está habilitado. \nVocê pode verificar a configuração do modelo nas configurações do provedor de serviço.", + "removeBuiltinKnowledgeConfirmDesc": "Excluir a configuração da base de conhecimento integrada excluirá todos os dados relevantes e não poderá ser restaurada. Por favor, seja cauteloso.", + "removeBuiltinKnowledgeConfirmTitle": "Confirmar a exclusão da base de conhecimento integrada {name}?", + "descriptionDesc": "Descrição da base de conhecimento para que a IA decida se deve recuperar esta base de conhecimento", + "advanced": "Opções Avançadas", + "autoDetectDimensions": "Detectar automaticamente as dimensões de embedding", + "autoDetectHelper": "Detectar automaticamente as dimensões de embedding, consome uma pequena quantidade de Tokens", + "chunkOverlapPlaceholder": "Valor padrão, não é recomendável modificar", + "chunkSizePlaceholder": "Valor padrão, não é recomendável modificar", + "dimensions": "Dimensões de embedding", + "dimensionsPlaceholder": "Tamanho da dimensão de embedding, como 1024", + "selectEmbeddingModelHelper": "Modelos de embedding são proibidos após a criação da base de conhecimento", + "dimensionsHelper": "Certifique-se de que o modelo suporta o tamanho da dimensão de embedding definido", + "autoDetectDimensionsError": "Falha na detecção automática da dimensão de embedding", + "fragmentsNumber": "Número de fragmentos de documento solicitados", + "fragmentsNumberHelper": "Quanto mais fragmentos de documento solicitados, mais informações ele contém, mas mais tokens precisam ser consumidos", + "selectRerankModel": "Selecionar o modelo de rerank", + "rerankModel": "Modelo de Reordenação", + "embeddingModel": "Modelo de Embedding", + "return": "retornar", + "uploadHelper": "Clique para enviar ou arraste o arquivo para cá", + "fileSupport": "Suporta {accept} e {count} outros formatos", + "searchKnowledge": "Buscar na Base de Conhecimento", + "searchKnowledgePlaceholder": "Por favor, insira o conteúdo da consulta", + "noData": "Ainda sem dados", + "file": "documento", + "uploadProcessing": "Enviando", + "uploadCompleted": "Envio concluído", + "reAdd": "Reenviar", + "uploadError": "Falha no envio", + "delete": "excluir", + "reason": "razão", + "deleteSuccess": "Excluído com sucesso", + "copy": "copiar", + "copySuccess": "Copiado com sucesso", + "source": "fonte", + "normalized": "Normalização L2", + "normalizedHelper": "Por favor, confirme se o modelo suporta a normalização L2 de vetores de saída", + "dialog": { + "beforequit": { + "cancel": "Cancelar", + "confirm": "confirmar", + "title": "Confirmação de saída", + "description": "Há uma tarefa da base de conhecimento em execução. Tem certeza de que deseja sair do software? \nTarefas abortadas podem ser restauradas após reiniciar o software." + } + }, + "searchError": "Falha na consulta", + "processing": "Enviando", + "paused": "Envio pausado", + "unknown": "Status desconhecido", + "reAddFile": { + "title": "Confirmação de reenvio", + "content": "Tem certeza de que deseja reenviar o arquivo \"{fileName}\"?" + }, + "deleteFile": { + "title": "Confirmação de exclusão de arquivo", + "content": "Tem certeza de que deseja excluir o arquivo \"{fileName}\"? \nEsta operação não é restaurável." + }, + "resumeAllPausedTasks": "Recuperação com um clique", + "pauseAllRunningTasks": "Pausa com um clique", + "separators": "Separador de bloco", + "separatorsHelper": "Delimitador de segmentação de documento, um único delimitador é envolto em aspas duplas (\"\"), e os delimitadores são separados por vírgulas (,)", + "invalidSeparators": "Separador inválido", + "selectLanguage": "Selecionar um pré-ajuste", + "separatorsPreset": "Carregando pré-ajustes" + }, + "mcp": { + "title": "Configurações MCP", + "description": "Gerenciar e configurar servidores e ferramentas MCP (Model Context Protocol)", + "enabledTitle": "Habilitar MCP", + "enabledDescription": "Habilitar ou desabilitar a funcionalidade e ferramentas MCP", + "enableToAccess": "Por favor, habilite o MCP para acessar as opções de configuração", + "marketplace": "Ir para o Mercado MCP para instalação com um clique", + "technicalDetails": "Detalhes Técnicos", + "httpServer": "Servidor HTTP", + "localProcess": "Processo Local", + "restartServer": "Reiniciar Servidor", + "viewLogs": "Visualizar Logs", + "starting": "Iniciando", + "error": "Erro", + "tabs": { + "servers": "Servidores", + "tools": "Ferramentas", + "prompts": "Prompts", + "resources": "Recursos" + }, + "serverList": "Lista de Servidores", + "totalServers": "Total de Servidores", + "addServer": "Adicionar Servidor", + "running": "Em Execução", + "stopped": "Parado", + "stopServer": "Parar Servidor", + "startServer": "Iniciar Servidor", + "noServersFound": "Nenhum Servidor Encontrado", + "addServerDialog": { + "title": "Adicionar Servidor", + "description": "Configurar um novo MCP server" + }, + "editServerDialog": { + "title": "Editar Servidor", + "description": "Editar configuração do servidor MCP" + }, + "serverForm": { + "name": "Nome do Servidor", + "namePlaceholder": "Digite o nome do servidor", + "nameRequired": "O nome do servidor é obrigatório", + "type": "Tipo de Servidor", + "typePlaceholder": "Selecionar tipo de servidor", + "typeStdio": "Entrada e saída padrão (Stdio)", + "typeSse": "Eventos Enviados pelo Servidor (SSE)", + "typeInMemory": "Em Memória", + "typeHttp": "Solicitações HTTP de Streaming (HTTP)", + "baseUrl": "URL Base", + "baseUrlPlaceholder": "Digite a URL base do servidor (ex: http://localhost:3000)", + "command": "Comando", + "commandPlaceholder": "Digite o comando", + "commandRequired": "O comando é obrigatório", + "args": "Argumentos", + "argsPlaceholder": "Digite os argumentos separados por espaços", + "argsRequired": "Argumentos são obrigatórios", + "env": "Variáveis de Ambiente", + "envPlaceholder": "Digite as variáveis de ambiente em formato JSON", + "envInvalid": "As variáveis de ambiente devem ser um JSON válido", + "description": "Descrição", + "descriptionPlaceholder": "Digite a descrição do servidor", + "descriptions": "Descrição", + "descriptionsPlaceholder": "Digite a descrição do servidor", + "icon": "Ícone", + "iconPlaceholder": "Digite o ícone", + "icons": "Ícone", + "iconsPlaceholder": "Digite o ícone", + "autoApprove": "Aprovação Automática", + "autoApproveAll": "Todos", + "autoApproveRead": "Leitura", + "autoApproveWrite": "Escrita", + "autoApproveHelp": "Selecione os tipos de operação para aprovação automática sem confirmação do usuário", + "submit": "Enviar", + "add": "Adicionar", + "update": "Atualizar", + "cancel": "Cancelar", + "jsonConfigIntro": "Você pode colar uma configuração JSON diretamente ou optar por configurar o servidor manualmente.", + "jsonConfig": "Configuração JSON", + "jsonConfigPlaceholder": "Cole sua configuração do servidor MCP em formato JSON", + "jsonConfigExample": "Exemplo de Configuração JSON", + "parseSuccess": "Configuração Analisada", + "configImported": "Configuração importada com sucesso", + "parseError": "Erro de Análise", + "skipToManual": "Pular para Configuração Manual", + "parseAndContinue": "Analisar e Continuar", + "jsonParseError": "Falha na análise do JSON", + "browseMarketplace": "Navegar no Mercado MCP", + "imageModel": "Escolha um modelo de visão", + "customHeadersParseError": "Falha na análise do Cabeçalho Personalizado", + "customHeaders": "Cabeçalhos de Solicitação Personalizados", + "clickToEdit": "Clique para editar e visualizar o conteúdo completo", + "invalidKeyValueFormat": "Formato de cabeçalho de solicitação incorreto, verifique se a entrada está correta.", + "npmRegistry": "Registro NPM Personalizado", + "npmRegistryPlaceholder": "Configurar um Registro NPM personalizado, deixe para o sistema selecionar automaticamente o mais rápido", + "browseHigress": "Visualizar Mercado MCP Higress", + "selectFolderError": "Erro de seleção de pasta", + "folders": "Pastas Permitidas", + "addFolder": "Adicionar Pasta", + "noFoldersSelected": "Nenhuma pasta foi selecionada", + "useE2B": "Habilitar Sandbox E2B", + "e2bDescription": "Executar código Python usando o sandbox E2B", + "e2bApiKey": "Chave da API E2B", + "e2bApiKeyPlaceholder": "Insira suas Chaves da API E2B aqui, como e2b_1111xx*******", + "e2bApiKeyHelp": "Vá para e2b.dev para obter sua Chave da API", + "e2bApiKeyRequired": "A Chave da API deve ser inserida para habilitar a função E2B" + }, + "deleteServer": "Excluir Servidor", + "editServer": "Editar Servidor", + "setDefault": "Definir como Padrão", + "removeDefault": "Remover Padrão", + "isDefault": "Servidor Padrão", + "default": "Padrão", + "setAsDefault": "Definir como Padrão", + "removeServer": "Remover Servidor", + "autoStart": "Início Automático", + "confirmRemoveServer": "Tem certeza de que deseja excluir o servidor {name}? Esta ação não pode ser desfeita.", + "removeServerDialog": { + "title": "Excluir Servidor" + }, + "confirmDelete": { + "title": "Confirmar Exclusão", + "description": "Tem certeza de que deseja excluir o servidor {name}? Esta ação não pode ser desfeita.", + "confirm": "Excluir", + "cancel": "Cancelar" + }, + "resetToDefault": "Redefinir para Padrão", + "resetConfirmTitle": "Redefinir para Servidores Padrão", + "resetConfirmDescription": "Isso restaurará todos os servidores padrão, mantendo seus servidores personalizados. Quaisquer modificações nos servidores padrão serão perdidas.", + "resetConfirm": "Redefinir", + "builtInServers": "Servidores Integrados", + "customServers": "Servidores Personalizados", + "builtIn": "Integrado", + "cannotRemoveBuiltIn": "Não é Possível Remover Servidor Integrado", + "builtInServerCannotBeRemoved": "Servidores integrados não podem ser removidos, apenas parâmetros e variáveis de ambiente podem ser modificados", + "maxDefaultServersReached": "Apenas 3 servidores padrão podem ser definidos no máximo", + "removeDefaultFirst": "Por favor, remova alguns servidores padrão primeiro", + "higressMarket": "Ir para Instalação MCP Higress", + "npmRegistry": { + "title": "Configuração do Registro NPM", + "currentSource": "Fonte Atual", + "cached": "Armazenado em Cache", + "lastChecked": "Última Verificação", + "refresh": "Atualizar", + "advanced": "Avançado", + "advancedSettings": "Configurações Avançadas", + "advancedSettingsDesc": "Configure opções avançadas do registro NPM, incluindo detecção automática e configurações de fonte personalizada", + "autoDetect": "Detecção automática da fonte ideal", + "autoDetectDesc": "Detectar e usar automaticamente o registro NPM mais rápido na inicialização", + "customSource": "Fonte Personalizada", + "customSourcePlaceholder": "Insira a URL do registro NPM personalizado", + "currentCustom": "Fonte personalizada atual", + "justNow": "Agora mesmo", + "minutesAgo": "Há {minutes} minutos", + "hoursAgo": "Há {hours} horas", + "daysAgo": "Há {days} dias", + "refreshSuccess": "Registro NPM atualizado com sucesso", + "refreshSuccessDesc": "Registro NPM ideal re-detectado e atualizado", + "refreshFailed": "Falha na atualização do registro NPM", + "autoDetectUpdated": "Configuração de detecção automática atualizada", + "autoDetectEnabled": "Detecção automática do registro NPM ideal habilitada", + "autoDetectDisabled": "Detecção automática desabilitada, usará o registro padrão", + "updateFailed": "Falha na atualização da configuração", + "customSourceSet": "Fonte personalizada definida", + "customSourceSetDesc": "Registro NPM personalizado definido: {registry}", + "customSourceCleared": "Fonte personalizada limpa", + "customSourceClearedDesc": "Registro NPM personalizado limpo, usará detecção automática", + "invalidUrl": "URL inválida", + "invalidUrlDesc": "Por favor, insira um endereço HTTP ou HTTPS válido", + "testing": "Testando registro NPM", + "testingDesc": "Testando conectividade com {registry}...", + "testFailed": "Falha no teste do registro NPM", + "testFailedDesc": "Não foi possível conectar a {registry}, erro: {error}. Verifique se a URL está correta ou a conexão de rede.", + "redetectingOptimal": "Re-detectando registro NPM ideal...", + "redetectComplete": "Re-detecção concluída", + "redetectCompleteDesc": "Detectado e definido o registro NPM ideal atual", + "redetectFailed": "Falha na re-detecção", + "redetectFailedDesc": "Não foi possível re-detectar o registro ideal, usará a configuração padrão" + } + }, + "about": { + "title": "Sobre Nós", + "version": "Versão", + "checkUpdate": "Verificar Atualização", + "checking": "Verificando...", + "latestVersion": "Versão Mais Recente" + }, + "display": { + "fontSize": "Tamanho do texto", + "text-sm": "Pequeno", + "text-base": "Médio", + "text-lg": "Grande", + "text-xl": "X-Grande", + "text-2xl": "XX-Grande", + "floatingButton": "Botão Flutuante", + "floatingButtonDesc": "Exibir um botão flutuante na área de trabalho para ativar rapidamente a janela do aplicativo" + }, + "shortcuts": { + "title": "Configurações de Teclas de Atalho", + "pressKeys": "Pressione as teclas", + "pressEnterToSave": "Pressione Enter para salvar, Esc para cancelar", + "noModifierOnly": "Não é possível usar tecla modificadora sozinha como atalho", + "keyConflict": "Conflito de tecla de atalho, por favor, escolha outra combinação", + "clearShortcut": "Limpar atalho", + "cleanHistory": "Limpar histórico de chat", + "deleteConversation": "Excluir Conversa", + "goSettings": "Abrir Configurações", + "hideWindow": "Ocultar janela", + "quitApp": "Sair do app", + "zoomIn": "Ampliar ", + "zoomOut": "Reduzir ", + "zoomReset": "Redefinir zoom", + "closeTab": "Fechar a guia atual", + "newTab": "Criar uma nova guia", + "newWindow": "Abrir uma nova janela", + "showHideWindow": "Mostrar/Ocultar janela", + "newConversation": "Nova conversa", + "nextTab": "Mudar para a próxima guia", + "previousTab": "Mudar para a guia anterior", + "specificTab": "Mudar para guia específica (1-8)", + "lastTab": "Mudar para a última guia" + }, + "rateLimit": { + "title": "Limite de Taxa", + "description": "Controlar o intervalo de solicitação para evitar exceder os limites da API", + "intervalLimit": "Intervalo de Solicitação", + "intervalUnit": "segundos", + "intervalHelper": "Intervalo mínimo entre as solicitações, desabilite o limite de taxa se não for necessário", + "lastRequestTime": "Última Solicitação", + "queueLength": "Tamanho da Fila", + "nextAllowedTime": "Próximo Permitido", + "never": "Nunca", + "justNow": "Agora mesmo", + "secondsAgo": "s atrás", + "minutesAgo": "m atrás", + "immediately": "Agora", + "secondsLater": "s depois", + "confirmDisableTitle": "Confirmar Desativação do Limite de Taxa", + "confirmDisableMessage": "O valor não pode ser menor ou igual a 0. Deseja desativar o limite de taxa?", + "confirmDisable": "Desativar Limite", + "disabled": "Limite de Taxa Desativado", + "disabledDescription": "O limite de taxa foi desativado" + }, + "promptSetting": { + "resetToDefault": "Redefinir para o prompt padrão", + "clear": "Limpar palavras do prompt", + "resetToDefaultSuccess": "Redefinido para o prompt do sistema padrão com sucesso", + "resetToDefaultFailed": "Falha ao redefinir, tente novamente", + "clearSuccess": "Prompt do sistema limpo com sucesso", + "clearFailed": "Falha ao limpar, tente novamente" + } +} diff --git a/src/renderer/src/i18n/pt-BR/sync.json b/src/renderer/src/i18n/pt-BR/sync.json new file mode 100644 index 000000000..5699995d8 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/sync.json @@ -0,0 +1,17 @@ +{ + "success": { + "importComplete": "Importação concluída. O aplicativo será reiniciado agora." + }, + "error": { + "notEnabled": "A sincronização não está ativada", + "folderNotExists": "A pasta de sincronização não existe", + "noValidBackup": "Nenhum arquivo de backup válido encontrado na pasta de sincronização.", + "dbNotExists": "O arquivo de banco de dados não existe", + "configNotExists": "O arquivo de configuração não existe", + "tempDbFailed": "Falha ao criar arquivo de backup temporário do banco de dados", + "tempConfigFailed": "Falha ao criar arquivo de backup temporário da configuração", + "importFailed": "Falha na importação, os dados originais foram restaurados", + "importProcess": "Ocorreu um erro durante o processo de importação", + "unknown": "Erro desconhecido" + } +} diff --git a/src/renderer/src/i18n/pt-BR/thread.json b/src/renderer/src/i18n/pt-BR/thread.json new file mode 100644 index 000000000..e2bc09a6c --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/thread.json @@ -0,0 +1,35 @@ +{ + "actions": { + "rename": "Renomear", + "delete": "Excluir", + "cleanMessages": "Limpar Mensagens", + "pin": "Fixar", + "unpin": "Desafixar", + "export": "Exportar", + "exportText": "Texto Simples" + }, + "toolbar": { + "save": "Salvar", + "cancel": "Cancelar", + "previousVariant": "Variante Anterior", + "nextVariant": "Próxima Variante", + "copy": "Copiar como Markdown", + "copyImage": "Copiar como Imagem", + "copyImageWithLongPress": "Copiar como Imagem (pressione longamente para capturar do topo)", + "copyFromTopSuccess": "Imagem completa da conversa copiada", + "capturing": "Capturando...", + "retry": "Regenerar", + "fork": "Ramificar para Novo Chat", + "edit": "Editar mensagem", + "delete": "Excluir mensagem" + }, + "message": { + "toolbar": { + "save": "Salvar" + } + }, + "export": { + "failed": "Falha na exportação", + "failedDesc": "Ocorreu um erro durante o processo de exportação, por favor tente novamente" + } +} diff --git a/src/renderer/src/i18n/pt-BR/toolCall.json b/src/renderer/src/i18n/pt-BR/toolCall.json new file mode 100644 index 000000000..58fcecb0c --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/toolCall.json @@ -0,0 +1,12 @@ +{ + "calling": "Chamando...", + "response": "Executando...", + "end": "Concluído", + "error": "Erro", + "title": "Chamada de Ferramenta", + "clickToView": "Clique para ver detalhes", + "functionName": "Nome da Função", + "permission": "Solicitando permissão...", + "params": "Parâmetros da Função", + "responseData": "Resposta" +} diff --git a/src/renderer/src/i18n/pt-BR/update.json b/src/renderer/src/i18n/pt-BR/update.json new file mode 100644 index 000000000..b95fe9f3d --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/update.json @@ -0,0 +1,16 @@ +{ + "newVersion": "Nova Versão Encontrada", + "version": "Versão", + "releaseDate": "Data de Lançamento", + "releaseNotes": "Notas da Versão", + "later": "Depois", + "githubDownload": "Download do GitHub", + "netdiskDownload": "Download na Nuvem", + "checkUpdate": "Verificar Atualizações", + "downloading": "Baixando", + "installNow": "Instalar Agora", + "autoUpdate": "Atualização Automática", + "restarting": "Reiniciando", + "alreadyUpToDate": "Já Atualizado", + "alreadyUpToDateDesc": "Seu DeepChat já está atualizado para a versão mais recente, nenhuma atualização é necessária." +} diff --git a/src/renderer/src/i18n/pt-BR/welcome.json b/src/renderer/src/i18n/pt-BR/welcome.json new file mode 100644 index 000000000..25b171559 --- /dev/null +++ b/src/renderer/src/i18n/pt-BR/welcome.json @@ -0,0 +1,37 @@ +{ + "steps": { + "welcome": { + "title": "Bem-vindo", + "description": "Vamos começar a configurar o DeepChat" + }, + "provider": { + "title": "Provedor", + "description": "Escolha seu provedor de modelo preferido" + }, + "configuration": { + "title": "Configuração", + "description": "Configure os modelos que você deseja usar" + }, + "complete": { + "title": "Concluído", + "description": "Tudo configurado e pronto para começar!" + } + }, + "title": "Bem-vindo ao DeepChat", + "description": "Vamos guiá-lo através da configuração.", + "provider": { + "select": "Selecione um Provedor", + "apiUrl": "URL da API", + "apiKey": "Chave da API", + "verifyLink": "Verificar Link" + }, + "complete": { + "title": "Tudo Pronto!", + "description": "Está tudo configurado. Vamos começar!" + }, + "buttons": { + "getStarted": "Começar", + "next": "Próximo", + "back": "Voltar" + } +} diff --git a/src/shared/i18n.ts b/src/shared/i18n.ts index d74c00ca4..4c664ac33 100644 --- a/src/shared/i18n.ts +++ b/src/shared/i18n.ts @@ -4,7 +4,7 @@ export interface TranslationMap { } // Define supported languages -export const supportedLocales = ['zh-CN', 'zh-TW', 'en-US', 'ja', 'ko', 'fr', 'de', 'es'] +export const supportedLocales = ['zh-CN', 'zh-TW', 'en-US', 'ja', 'ko', 'fr', 'de', 'es', 'pt-BR'] // Context menu translations export const contextMenuTranslations: Record = { @@ -127,6 +127,21 @@ export const contextMenuTranslations: Record = { quit: 'Salir', translate: 'Traducir', askAI: 'Preguntar a la AI' + }, + 'pt-BR': { + copy: 'Copiar', + paste: 'Colar', + cut: 'Recortar', + selectAll: 'Selecionar Tudo', + undo: 'Desfazer', + redo: 'Refazer', + saveImage: 'Salvar Imagem...', + copyImage: 'Copiar Imagem', + open: 'Abrir/Esconder', + checkForUpdates: 'Verificar por atualizações', + quit: 'Sair', + translate: 'Traduzir', + askAI: 'Perguntar à IA' } } @@ -322,6 +337,32 @@ export const errorMessageTranslations: Record = { needDifyEndpoint: 'Se debe proporcionar el punto de acceso de Dify', needKnowledgeBaseDescription: 'Se debe proporcionar una descripción de esta base de conocimientos para ayudar a la IA a decidir si debe recuperar esta base de conocimientos' + }, + 'pt-BR': { + mcpConnectionErrorTitle: 'Erro de Conexão MCP', + mcpConnectionErrorMessage: 'Falha ao conectar ao servidor MCP', + addMcpServerErrorTitle: 'Falha ao Adicionar Servidor', + addMcpServerDuplicateMessage: + 'O nome do servidor "{serverName}" já existe. Por favor, escolha um nome diferente.', + getMcpToolListErrorTitle: 'Falha ao Obter Definições de Ferramentas', + getMcpToolListErrorMessage: + "Não foi possível recuperar a lista de ferramentas do servidor '{serverName}': {errorMessage}", + genericErrorTitle: 'Erro', + genericErrorMessage: 'Ocorreu um erro', + needRagflowConfig: 'É necessário fornecer a configuração da base de conhecimento RAGFlow', + needDifyConfig: 'É necessário fornecer a configuração da base de conhecimento Dify', + needAtLeastOneRagflowConfig: + 'É necessário fornecer pelo menos uma configuração da base de conhecimento RAGFlow', + needAtLeastOneDifyConfig: + 'É necessário fornecer pelo menos uma configuração da base de conhecimento Dify', + needRagflowApiKey: 'É necessário fornecer a chave API do RAGFlow', + needDifyApiKey: 'É necessário fornecer a chave API do Dify', + needRagflowDatasetIds: 'É necessário fornecer pelo menos um ID de conjunto de dados do RAGFlow', + needDifyDatasetId: 'É necessário fornecer o ID do conjunto de dados do Dify', + needRagflowEndpoint: 'É necessário fornecer o endpoint do RAGFlow', + needDifyEndpoint: 'É necessário fornecer o endpoint do Dify', + needKnowledgeBaseDescription: + 'É necessário fornecer uma descrição para esta base de conhecimento para ajudar a IA a decidir se deve recuperar esta base de conhecimento' } } From 9a09628f188404f466b954a06666398aa846ef25 Mon Sep 17 00:00:00 2001 From: zerob13 Date: Mon, 6 Oct 2025 11:30:49 +0800 Subject: [PATCH 2/2] chore: format code --- src/renderer/src/components/settings/DisplaySettings.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/src/components/settings/DisplaySettings.vue b/src/renderer/src/components/settings/DisplaySettings.vue index 9ffcb2c5a..c64a3eb2c 100644 --- a/src/renderer/src/components/settings/DisplaySettings.vue +++ b/src/renderer/src/components/settings/DisplaySettings.vue @@ -197,7 +197,7 @@ const languageOptions = [ { value: 'ja-JP', label: '日本語' }, { value: 'fr-FR', label: 'Français' }, { value: 'fa-IR', label: 'فارسی (ایران)' }, - { value: 'pt-BR' , label: 'Português (Brasil)' } + { value: 'pt-BR', label: 'Português (Brasil)' } ] watch(selectedLanguage, async (newValue) => {