530 lines
16 KiB
TypeScript
530 lines
16 KiB
TypeScript
import type { PartialLocaleType } from '../locales/index';
|
||
import { SAAS_CHAT_UTM_URL } from '@/app/constant';
|
||
import { getClientConfig } from '../config/client';
|
||
import { SubmitKey } from '../store/config';
|
||
|
||
const isApp = !!getClientConfig()?.isApp;
|
||
|
||
const pt: PartialLocaleType = {
|
||
WIP: 'Em breve...',
|
||
Error: {
|
||
Unauthorized: isApp
|
||
? `😆 A conversa encontrou alguns problemas, não se preocupe:
|
||
\\ 1️⃣ Se você quiser começar sem configuração, [clique aqui para começar a conversar imediatamente 🚀](${SAAS_CHAT_UTM_URL})
|
||
\\ 2️⃣ Se você deseja usar seus próprios recursos OpenAI, clique [aqui](/#/settings) para modificar as configurações ⚙️`
|
||
: `😆 A conversa encontrou alguns problemas, não se preocupe:
|
||
\ 1️⃣ Se você quiser começar sem configuração, [clique aqui para começar a conversar imediatamente 🚀](${SAAS_CHAT_UTM_URL})
|
||
\ 2️⃣ Se você estiver usando uma versão de implantação privada, clique [aqui](/#/auth) para inserir a chave de acesso 🔑
|
||
\ 3️⃣ Se você deseja usar seus próprios recursos OpenAI, clique [aqui](/#/settings) para modificar as configurações ⚙️
|
||
`,
|
||
},
|
||
Auth: {
|
||
Title: 'Necessário Código de Acesso',
|
||
Tips: 'Por favor, insira o código de acesso abaixo',
|
||
SubTips: 'Ou insira sua Chave API OpenAI',
|
||
Input: 'código de acesso',
|
||
Confirm: 'Confirmar',
|
||
Later: 'Depois',
|
||
Return: 'Voltar',
|
||
SaasTips: 'A configuração é muito complicada, quero usá-la imediatamente',
|
||
TopTips:
|
||
'🥳 Oferta de Lançamento do NextChat AI, desbloqueie o OpenAI o1, GPT-4o, Claude-3.5 e os mais recentes grandes modelos agora',
|
||
},
|
||
ChatItem: {
|
||
ChatItemCount: (count: number) => `${count} mensagens`,
|
||
},
|
||
Chat: {
|
||
SubTitle: (count: number) => `${count} mensagens`,
|
||
EditMessage: {
|
||
Title: 'Editar Todas as Mensagens',
|
||
Topic: {
|
||
Title: 'Tópico',
|
||
SubTitle: 'Mudar o tópico atual',
|
||
},
|
||
},
|
||
Actions: {
|
||
ChatList: 'Ir Para Lista de Chat',
|
||
CompressedHistory: 'Prompt de Memória Histórica Comprimida',
|
||
Export: 'Exportar Todas as Mensagens como Markdown',
|
||
Copy: 'Copiar',
|
||
Stop: 'Parar',
|
||
Retry: 'Tentar Novamente',
|
||
Pin: 'Fixar',
|
||
PinToastContent: 'Fixada 1 mensagem para prompts contextuais',
|
||
PinToastAction: 'Visualizar',
|
||
Delete: 'Deletar',
|
||
Edit: 'Editar',
|
||
RefreshTitle: 'Atualizar Título',
|
||
RefreshToast: 'Solicitação de atualização de título enviada',
|
||
},
|
||
Commands: {
|
||
new: 'Iniciar um novo chat',
|
||
newm: 'Iniciar um novo chat com máscara',
|
||
next: 'Próximo Chat',
|
||
prev: 'Chat Anterior',
|
||
clear: 'Limpar Contexto',
|
||
del: 'Deletar Chat',
|
||
},
|
||
InputActions: {
|
||
Stop: 'Parar',
|
||
ToBottom: 'Para o Mais Recente',
|
||
Theme: {
|
||
auto: 'Automático',
|
||
light: 'Tema Claro',
|
||
dark: 'Tema Escuro',
|
||
},
|
||
Prompt: 'Prompts',
|
||
Masks: 'Máscaras',
|
||
Clear: 'Limpar Contexto',
|
||
Settings: 'Configurações',
|
||
},
|
||
Rename: 'Renomear Chat',
|
||
Typing: 'Digitando…',
|
||
Input: (submitKey: string) => {
|
||
let inputHints = `${submitKey} para enviar`;
|
||
if (submitKey === String(SubmitKey.Enter)) {
|
||
inputHints += ', Shift + Enter para quebrar linha';
|
||
}
|
||
return `${inputHints}, / para buscar prompts, : para usar comandos`;
|
||
},
|
||
Send: 'Enviar',
|
||
Config: {
|
||
Reset: 'Redefinir para Padrão',
|
||
SaveAs: 'Salvar como Máscara',
|
||
},
|
||
IsContext: 'Prompt Contextual',
|
||
},
|
||
Export: {
|
||
Title: 'Exportar Mensagens',
|
||
Copy: 'Copiar Tudo',
|
||
Download: 'Baixar',
|
||
MessageFromYou: 'Mensagem De Você',
|
||
MessageFromChatGPT: 'Mensagem De ChatGPT',
|
||
Share: 'Compartilhar para ShareGPT',
|
||
Format: {
|
||
Title: 'Formato de Exportação',
|
||
SubTitle: 'Markdown ou Imagem PNG',
|
||
},
|
||
IncludeContext: {
|
||
Title: 'Incluindo Contexto',
|
||
SubTitle: 'Exportar prompts de contexto na máscara ou não',
|
||
},
|
||
Steps: {
|
||
Select: 'Selecionar',
|
||
Preview: 'Pré-visualizar',
|
||
},
|
||
Image: {
|
||
Toast: 'Capturando Imagem...',
|
||
Modal:
|
||
'Pressione longamente ou clique com o botão direito para salvar a imagem',
|
||
},
|
||
},
|
||
Select: {
|
||
Search: 'Buscar',
|
||
All: 'Selecionar Tudo',
|
||
Latest: 'Selecionar Mais Recente',
|
||
Clear: 'Limpar',
|
||
},
|
||
Memory: {
|
||
Title: 'Prompt de Memória',
|
||
EmptyContent: 'Nada ainda.',
|
||
Send: 'Enviar Memória',
|
||
Copy: 'Copiar Memória',
|
||
Reset: 'Resetar Sessão',
|
||
ResetConfirm:
|
||
'Resetar irá limpar o histórico de conversa atual e a memória histórica. Você tem certeza que quer resetar?',
|
||
},
|
||
Home: {
|
||
NewChat: 'Novo Chat',
|
||
DeleteChat: 'Confirmar para deletar a conversa selecionada?',
|
||
DeleteToast: 'Chat Deletado',
|
||
Revert: 'Reverter',
|
||
},
|
||
Settings: {
|
||
Title: 'Configurações',
|
||
SubTitle: 'Todas as Configurações',
|
||
Danger: {
|
||
Reset: {
|
||
Title: 'Resetar Todas as Configurações',
|
||
SubTitle: 'Resetar todos os itens de configuração para o padrão',
|
||
Action: 'Resetar',
|
||
Confirm: 'Confirmar para resetar todas as configurações para o padrão?',
|
||
},
|
||
Clear: {
|
||
Title: 'Limpar Todos os Dados',
|
||
SubTitle: 'Limpar todas as mensagens e configurações',
|
||
Action: 'Limpar',
|
||
Confirm: 'Confirmar para limpar todas as mensagens e configurações?',
|
||
},
|
||
},
|
||
Lang: {
|
||
Name: 'Language',
|
||
All: 'Todos os Idiomas',
|
||
},
|
||
Avatar: 'Avatar',
|
||
FontSize: {
|
||
Title: 'Tamanho da Fonte',
|
||
SubTitle: 'Ajustar o tamanho da fonte do conteúdo do chat',
|
||
},
|
||
FontFamily: {
|
||
Title: 'Fonte do Chat',
|
||
SubTitle:
|
||
'Fonte do conteúdo do chat, deixe vazio para aplicar a fonte padrão global',
|
||
Placeholder: 'Nome da Fonte',
|
||
},
|
||
InjectSystemPrompts: {
|
||
Title: 'Inserir Prompts de Sistema',
|
||
SubTitle: 'Inserir um prompt de sistema global para cada requisição',
|
||
},
|
||
InputTemplate: {
|
||
Title: 'Modelo de Entrada',
|
||
SubTitle: 'A mensagem mais recente será preenchida neste modelo',
|
||
},
|
||
|
||
Update: {
|
||
Version: (x: string) => `Versão: ${x}`,
|
||
IsLatest: 'Última versão',
|
||
CheckUpdate: 'Verificar Atualização',
|
||
IsChecking: 'Verificando atualização...',
|
||
FoundUpdate: (x: string) => `Nova versão encontrada: ${x}`,
|
||
GoToUpdate: 'Atualizar',
|
||
},
|
||
SendKey: 'Tecla de Envio',
|
||
Theme: 'Tema',
|
||
TightBorder: 'Borda Ajustada',
|
||
SendPreviewBubble: {
|
||
Title: 'Bolha de Pré-visualização de Envio',
|
||
SubTitle: 'Pré-visualizar markdown na bolha',
|
||
},
|
||
AutoGenerateTitle: {
|
||
Title: 'Gerar Título Automaticamente',
|
||
SubTitle: 'Gerar um título adequado baseado no conteúdo da conversa',
|
||
},
|
||
Sync: {
|
||
CloudState: 'Última Atualização',
|
||
NotSyncYet: 'Ainda não sincronizado',
|
||
Success: 'Sincronização bem sucedida',
|
||
Fail: 'Falha na sincronização',
|
||
|
||
Config: {
|
||
Modal: {
|
||
Title: 'Configurar Sincronização',
|
||
Check: 'Verificar Conexão',
|
||
},
|
||
SyncType: {
|
||
Title: 'Tipo de Sincronização',
|
||
SubTitle: 'Escolha seu serviço de sincronização favorito',
|
||
},
|
||
Proxy: {
|
||
Title: 'Habilitar Proxy CORS',
|
||
SubTitle: 'Habilitar um proxy para evitar restrições de cross-origin',
|
||
},
|
||
ProxyUrl: {
|
||
Title: 'Endpoint de Proxy',
|
||
SubTitle: 'Apenas aplicável ao proxy CORS embutido para este projeto',
|
||
},
|
||
|
||
WebDav: {
|
||
Endpoint: 'Endpoint WebDAV',
|
||
UserName: 'Nome de Usuário',
|
||
Password: 'Senha',
|
||
},
|
||
|
||
UpStash: {
|
||
Endpoint: 'URL REST Redis UpStash',
|
||
UserName: 'Nome do Backup',
|
||
Password: 'Token REST Redis UpStash',
|
||
},
|
||
},
|
||
|
||
LocalState: 'Dados Locais',
|
||
Overview: (overview: any) => {
|
||
return `${overview.chat} chats,${overview.message} mensagens,${overview.prompt} prompts,${overview.mask} máscaras`;
|
||
},
|
||
ImportFailed: 'Falha ao importar do arquivo',
|
||
},
|
||
Mask: {
|
||
Splash: {
|
||
Title: 'Tela de Início da Máscara',
|
||
SubTitle:
|
||
'Mostrar uma tela de início da máscara antes de iniciar novo chat',
|
||
},
|
||
Builtin: {
|
||
Title: 'Esconder Máscaras Embutidas',
|
||
SubTitle: 'Esconder máscaras embutidas na lista de máscaras',
|
||
},
|
||
},
|
||
Prompt: {
|
||
Disable: {
|
||
Title: 'Desabilitar auto-completar',
|
||
SubTitle: 'Digite / para acionar auto-completar',
|
||
},
|
||
List: 'Lista de Prompts',
|
||
ListCount: (builtin: number, custom: number) =>
|
||
`${builtin} embutidos, ${custom} definidos pelo usuário`,
|
||
Edit: 'Editar',
|
||
Modal: {
|
||
Title: 'Lista de Prompts',
|
||
Add: 'Adicionar Um',
|
||
Search: 'Buscar Prompts',
|
||
},
|
||
EditModal: {
|
||
Title: 'Editar Prompt',
|
||
},
|
||
},
|
||
HistoryCount: {
|
||
Title: 'Contagem de Mensagens Anexadas',
|
||
SubTitle: 'Número de mensagens enviadas anexadas por requisição',
|
||
},
|
||
CompressThreshold: {
|
||
Title: 'Limite de Compressão de Histórico',
|
||
SubTitle:
|
||
'Irá comprimir se o comprimento das mensagens não comprimidas exceder o valor',
|
||
},
|
||
|
||
Usage: {
|
||
Title: 'Saldo da Conta',
|
||
SubTitle(used: any, total: any) {
|
||
return `Usado este mês ${used}, assinatura ${total}`;
|
||
},
|
||
IsChecking: 'Verificando...',
|
||
Check: 'Verificar',
|
||
NoAccess: 'Insira a Chave API para verificar o saldo',
|
||
},
|
||
Access: {
|
||
SaasStart: {
|
||
Title: 'Usar NextChat AI',
|
||
Label: '(A solução mais econômica)',
|
||
SubTitle:
|
||
'Mantido oficialmente pelo NextChat, pronto para uso sem configuração, suporta os mais recentes grandes modelos como OpenAI o1, GPT-4o e Claude-3.5',
|
||
ChatNow: 'Conversar agora',
|
||
},
|
||
|
||
AccessCode: {
|
||
Title: 'Código de Acesso',
|
||
SubTitle: 'Controle de Acesso Habilitado',
|
||
Placeholder: 'Insira o Código',
|
||
},
|
||
CustomEndpoint: {
|
||
Title: 'Endpoint Personalizado',
|
||
SubTitle: 'Use serviço personalizado Azure ou OpenAI',
|
||
},
|
||
Provider: {
|
||
Title: 'Provedor do Modelo',
|
||
SubTitle: 'Selecione Azure ou OpenAI',
|
||
},
|
||
OpenAI: {
|
||
ApiKey: {
|
||
Title: 'Chave API OpenAI',
|
||
SubTitle: 'Usar Chave API OpenAI personalizada',
|
||
Placeholder: 'sk-xxx',
|
||
},
|
||
|
||
Endpoint: {
|
||
Title: 'Endpoint OpenAI',
|
||
SubTitle:
|
||
'Deve começar com http(s):// ou usar /api/openai como padrão',
|
||
},
|
||
},
|
||
Azure: {
|
||
ApiKey: {
|
||
Title: 'Chave API Azure',
|
||
SubTitle: 'Verifique sua chave API do console Azure',
|
||
Placeholder: 'Chave API Azure',
|
||
},
|
||
|
||
Endpoint: {
|
||
Title: 'Endpoint Azure',
|
||
SubTitle: 'Exemplo: ',
|
||
},
|
||
|
||
ApiVerion: {
|
||
Title: 'Versão API Azure',
|
||
SubTitle: 'Verifique sua versão API do console Azure',
|
||
},
|
||
},
|
||
Anthropic: {
|
||
ApiKey: {
|
||
Title: 'Chave API Anthropic',
|
||
SubTitle: 'Verifique sua chave API do console Anthropic',
|
||
Placeholder: 'Chave API Anthropic',
|
||
},
|
||
|
||
Endpoint: {
|
||
Title: 'Endpoint Address',
|
||
SubTitle: 'Exemplo: ',
|
||
},
|
||
|
||
ApiVerion: {
|
||
Title: 'Versão API (Versão api claude)',
|
||
SubTitle: 'Verifique sua versão API do console Anthropic',
|
||
},
|
||
},
|
||
CustomModel: {
|
||
Title: 'Modelos Personalizados',
|
||
SubTitle: 'Opções de modelo personalizado, separados por vírgula',
|
||
},
|
||
},
|
||
|
||
Model: 'Modelo',
|
||
CompressModel: {
|
||
Title: 'Modelo de Compressão',
|
||
SubTitle: 'Modelo usado para comprimir o histórico',
|
||
},
|
||
Temperature: {
|
||
Title: 'Temperatura',
|
||
SubTitle: 'Um valor maior torna a saída mais aleatória',
|
||
},
|
||
TopP: {
|
||
Title: 'Top P',
|
||
SubTitle: 'Não altere este valor junto com a temperatura',
|
||
},
|
||
MaxTokens: {
|
||
Title: 'Máximo de Tokens',
|
||
SubTitle: 'Comprimento máximo de tokens de entrada e tokens gerados',
|
||
},
|
||
PresencePenalty: {
|
||
Title: 'Penalidade de Presença',
|
||
SubTitle:
|
||
'Um valor maior aumenta a probabilidade de falar sobre novos tópicos',
|
||
},
|
||
FrequencyPenalty: {
|
||
Title: 'Penalidade de Frequência',
|
||
SubTitle:
|
||
'Um valor maior diminui a probabilidade de repetir a mesma linha',
|
||
},
|
||
},
|
||
Store: {
|
||
DefaultTopic: 'Nova Conversa',
|
||
BotHello: 'Olá! Como posso ajudá-lo hoje?',
|
||
Error: 'Algo deu errado, por favor tente novamente mais tarde.',
|
||
Prompt: {
|
||
History: (content: string) =>
|
||
`Este é um resumo do histórico de chat como um recapitulativo: ${
|
||
content}`,
|
||
Topic:
|
||
'Por favor, gere um título de quatro a cinco palavras resumindo nossa conversa sem qualquer introdução, pontuação, aspas, períodos, símbolos ou texto adicional. Remova as aspas que o envolvem.',
|
||
Summarize:
|
||
'Resuma a discussão brevemente em 200 palavras ou menos para usar como um prompt para o contexto futuro.',
|
||
},
|
||
},
|
||
Copy: {
|
||
Success: 'Copiado para a área de transferência',
|
||
Failed:
|
||
'Falha na cópia, por favor conceda permissão para acessar a área de transferência',
|
||
},
|
||
Download: {
|
||
Success: 'Conteúdo baixado para seu diretório.',
|
||
Failed: 'Falha no download.',
|
||
},
|
||
Context: {
|
||
Toast: (x: any) => `Com ${x} prompts contextuais`,
|
||
Edit: 'Configurações do Chat Atual',
|
||
Add: 'Adicionar um Prompt',
|
||
Clear: 'Contexto Limpo',
|
||
Revert: 'Reverter',
|
||
},
|
||
Plugin: {
|
||
Name: 'Plugin',
|
||
},
|
||
FineTuned: {
|
||
Sysmessage: 'Você é um assistente que',
|
||
},
|
||
SearchChat: {
|
||
Name: 'Pesquisar',
|
||
Page: {
|
||
Title: 'Pesquisar histórico de chat',
|
||
Search: 'Digite palavras-chave para pesquisa',
|
||
NoResult: 'Nenhum resultado encontrado',
|
||
NoData: 'Sem dados',
|
||
Loading: 'Carregando',
|
||
|
||
SubTitle: (count: number) => `Encontrado ${count} resultados`,
|
||
},
|
||
Item: {
|
||
View: 'Ver',
|
||
},
|
||
},
|
||
Mask: {
|
||
Name: 'Máscara',
|
||
Page: {
|
||
Title: 'Template de Prompt',
|
||
SubTitle: (count: number) => `${count} templates de prompt`,
|
||
Search: 'Buscar Templates',
|
||
Create: 'Criar',
|
||
},
|
||
Item: {
|
||
Info: (count: number) => `${count} prompts`,
|
||
Chat: 'Chat',
|
||
View: 'Visualizar',
|
||
Edit: 'Editar',
|
||
Delete: 'Deletar',
|
||
DeleteConfirm: 'Confirmar para deletar?',
|
||
},
|
||
EditModal: {
|
||
Title: (readonly: boolean) =>
|
||
`Editar Template de Prompt ${readonly ? '(somente leitura)' : ''}`,
|
||
Download: 'Baixar',
|
||
Clone: 'Clonar',
|
||
},
|
||
Config: {
|
||
Avatar: 'Avatar do Bot',
|
||
Name: 'Nome do Bot',
|
||
Sync: {
|
||
Title: 'Usar Configuração Global',
|
||
SubTitle: 'Usar configuração global neste chat',
|
||
Confirm:
|
||
'Confirmar para substituir a configuração personalizada pela configuração global?',
|
||
},
|
||
HideContext: {
|
||
Title: 'Esconder Prompts de Contexto',
|
||
SubTitle: 'Não mostrar prompts de contexto no chat',
|
||
},
|
||
Share: {
|
||
Title: 'Compartilhar Esta Máscara',
|
||
SubTitle: 'Gerar um link para esta máscara',
|
||
Action: 'Copiar Link',
|
||
},
|
||
},
|
||
},
|
||
NewChat: {
|
||
Return: 'Retornar',
|
||
Skip: 'Apenas Começar',
|
||
Title: 'Escolher uma Máscara',
|
||
SubTitle: 'Converse com a Alma por trás da Máscara',
|
||
More: 'Encontre Mais',
|
||
NotShow: 'Nunca Mostrar Novamente',
|
||
ConfirmNoShow:
|
||
'Confirmar para desabilitar?Você pode habilitar nas configurações depois.',
|
||
},
|
||
|
||
UI: {
|
||
Confirm: 'Confirmar',
|
||
Cancel: 'Cancelar',
|
||
Close: 'Fechar',
|
||
Create: 'Criar',
|
||
Edit: 'Editar',
|
||
Export: 'Exportar',
|
||
Import: 'Importar',
|
||
Sync: 'Sincronizar',
|
||
Config: 'Configurar',
|
||
},
|
||
Exporter: {
|
||
Description: {
|
||
Title: 'Apenas mensagens após a limpeza do contexto serão exibidas',
|
||
},
|
||
Model: 'Modelo',
|
||
Messages: 'Mensagens',
|
||
Topic: 'Tópico',
|
||
Time: 'Tempo',
|
||
},
|
||
|
||
URLCommand: {
|
||
Code: 'Código de acesso detectado a partir da url, confirmar para aplicar? ',
|
||
Settings:
|
||
'Configurações detectadas a partir da url, confirmar para aplicar?',
|
||
},
|
||
};
|
||
|
||
export default pt;
|