Browse Source

Merge pull request #3308 from yuri-filipe/main

Yifei Zhang 1 year ago
parent
commit
4f8a0b7711
2 changed files with 469 additions and 0 deletions
  1. 3 0
      app/locales/index.ts
  2. 466 0
      app/locales/pt.ts

+ 3 - 0
app/locales/index.ts

@@ -1,5 +1,6 @@
 import cn from "./cn";
 import en from "./en";
+import pt from "./pt";
 import tw from "./tw";
 import id from "./id";
 import fr from "./fr";
@@ -23,6 +24,7 @@ export type { LocaleType, PartialLocaleType } from "./cn";
 const ALL_LANGS = {
   cn,
   en,
+  pt,
   tw,
   jp,
   ko,
@@ -47,6 +49,7 @@ export const AllLangs = Object.keys(ALL_LANGS) as Lang[];
 export const ALL_LANG_OPTIONS: Record<Lang, string> = {
   cn: "简体中文",
   en: "English",
+  pt: "Português",
   tw: "繁體中文",
   jp: "日本語",
   ko: "한국어",

+ 466 - 0
app/locales/pt.ts

@@ -0,0 +1,466 @@
+import { SubmitKey } from "../store/config";
+import { LocaleType } from "../locales/index";
+import { getClientConfig } from "../config/client";
+
+const isApp = !!getClientConfig()?.isApp;
+
+const pt: LocaleType = {
+  WIP: "Em breve...",
+  Error: {
+    Unauthorized: isApp
+      ? "Chave API inválida, por favor verifique em [Configurações](/#/settings)."
+      : "Acesso não autorizado, por favor insira o código de acesso em [auth](/#/auth) ou insira sua Chave API OpenAI.",
+  },
+  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",
+  },
+  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",
+    },
+    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) => {
+      var 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: "Idioma",
+      All: "Todos os Idiomas",
+    },
+    Avatar: "Avatar",
+    FontSize: {
+      Title: "Tamanho da Fonte",
+      SubTitle: "Ajustar o tamanho da fonte do conteúdo do chat",
+    },
+    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: {
+      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",
+        },
+      },
+      CustomModel: {
+        Title: "Modelos Personalizados",
+        SubTitle: "Opções de modelo personalizado, separados por vírgula",
+      },
+    },
+
+    Model: "Modelo",
+    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",
+  },
+  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;