Merge branch 'main' into feat/search-history

This commit is contained in:
heweikang
2024-08-17 10:15:49 +08:00
22 changed files with 5795 additions and 1694 deletions

View File

@@ -1,75 +1,157 @@
import { SubmitKey } from "../store/config";
import type { PartialLocaleType } from "./index";
import { PartialLocaleType } from "../locales/index";
import { getClientConfig } from "../config/client";
const isApp = !!getClientConfig()?.isApp;
const ru: PartialLocaleType = {
WIP: "Скоро...",
Error: {
Unauthorized:
"Несанкционированный доступ. Пожалуйста, введите код доступа на [странице](/#/auth) настроек.",
Unauthorized: isApp
? "Обнаружен недействительный API-ключ. Пожалуйста, перейдите на страницу [Настройки](/#/settings), чтобы проверить правильность конфигурации API-ключа."
: "Неверный или пустой пароль доступа. Пожалуйста, перейдите на страницу [Вход](/#/auth), чтобы ввести правильный пароль доступа, или на страницу [Настройки](/#/settings), чтобы ввести ваш собственный API-ключ OpenAI.",
},
Auth: {
Title: "Требуется пароль",
Tips: "Администратор включил проверку пароля. Пожалуйста, введите код доступа ниже",
SubTips: "Или введите ваш API-ключ OpenAI или Google",
Input: "Введите код доступа здесь",
Confirm: "Подтвердить",
Later: "Позже",
},
ChatItem: {
ChatItemCount: (count: number) => `${count} сообщений`,
ChatItemCount: (count: number) => `${count} бесед`,
},
Chat: {
SubTitle: (count: number) => `${count} сообщений с ChatGPT`,
SubTitle: (count: number) => `Всего ${count} бесед`,
EditMessage: {
Title: "Редактировать сообщение",
Topic: {
Title: "Тема чата",
SubTitle: "Изменить текущую тему чата",
},
},
Actions: {
ChatList: ерейти к списку чатов",
CompressedHistory: "Сжатая история памяти",
Export: "Экспортировать все сообщения в формате Markdown",
ChatList: росмотреть список сообщений",
CompressedHistory: "Просмотреть сжатую историю подсказок",
Export: "Экспортировать чат",
Copy: "Копировать",
Stop: "Остановить",
Retry: "Повторить",
Pin: "Закрепить",
PinToastContent: "1 беседа закреплена в предустановленных подсказках",
PinToastAction: "Просмотреть",
Delete: "Удалить",
Edit: "Редактировать",
},
Commands: {
new: "Новый чат",
newm: "Создать чат из маски",
next: "Следующий чат",
prev: "Предыдущий чат",
clear: "Очистить контекст",
del: "Удалить чат",
},
InputActions: {
Stop: "Остановить ответ",
ToBottom: "Перейти к последнему",
Theme: {
auto: "Автоматическая тема",
light: "Светлая тема",
dark: "Темная тема",
},
Prompt: "Быстрая команда",
Masks: "Все маски",
Clear: "Очистить чат",
Settings: "Настройки чата",
UploadImage: "Загрузить изображение",
},
Rename: "Переименовать чат",
Typing: "Печатает…",
Input: (submitKey: string) => {
var inputHints = `${submitKey} для отправки сообщения`;
var inputHints = `${submitKey} Отправить`;
if (submitKey === String(SubmitKey.Enter)) {
inputHints += ", Shift + Enter для переноса строки";
inputHints += "Shift + Enter для новой строки";
}
return inputHints + ", / для поиска подсказок";
return inputHints + "/ для автозаполнения,: для команд";
},
Send: "Отправить",
Config: {
Reset: "Сбросить настройки",
Reset: "Очистить память",
SaveAs: "Сохранить как маску",
},
IsContext: "Предустановленные подсказки",
},
Export: {
Title: "Все сообщения",
Title: "Поделиться историей чата",
Copy: "Копировать все",
Download: "Скачать",
MessageFromYou: "Сообщение от вас",
MessageFromChatGPT: "Сообщение от ChatGPT",
Download: "Скачать файл",
Share: "Поделиться в ShareGPT",
MessageFromYou: "Пользователь",
MessageFromChatGPT: "ChatGPT",
Format: {
Title: "Формат экспорта",
SubTitle: "Можно экспортировать как Markdown текст или PNG изображение",
},
IncludeContext: {
Title: "Включить контекст маски",
SubTitle: "Показывать ли контекст маски в сообщениях",
},
Steps: {
Select: "Выбрать",
Preview: "Предпросмотр",
},
Image: {
Toast: "Создание скриншота",
Modal: "Длительное нажатие или правый клик для сохранения изображения",
},
},
Select: {
Search: "Поиск сообщений",
All: "Выбрать все",
Latest: "Последние сообщения",
Clear: "Очистить выбор",
},
Memory: {
Title: "Память",
EmptyContent: "Пусто.",
Send: "Отправить память",
Copy: "Копировать память",
Reset: "Сбросить сессию",
ResetConfirm:
"При сбросе текущая история переписки и историческая память будут удалены. Вы уверены, что хотите сбросить?",
Title: "Историческое резюме",
EmptyContent: "Содержимое чата слишком короткое, чтобы суммировать",
Send: "Автоматически сжать историю чата и отправить как контекст",
Copy: "Копировать резюме",
Reset: "[не используется]",
ResetConfirm: "Подтвердить очистку исторического резюме?",
},
Home: {
NewChat: "Новый чат",
DeleteChat: "Вы действительно хотите удалить выбранный разговор?",
DeleteToast: "Чат удален",
Revert: "Отмена",
DeleteChat: "Подтвердить удаление выбранного чата?",
DeleteToast: "Беседа удалена",
Revert: "Отменить",
},
Settings: {
Title: "Настройки",
SubTitle: "Все настройки",
SubTitle: "Все параметры настроек",
Danger: {
Reset: {
Title: "Сброс всех настроек",
SubTitle: "Сброс всех параметров до значений по умолчанию",
Action: "Сбросить сейчас",
Confirm: "Подтвердить сброс всех настроек?",
},
Clear: {
Title: "Очистить все данные",
SubTitle: "Очистить все чаты и данные настроек",
Action: "Очистить сейчас",
Confirm: "Подтвердить очистку всех чатов и данных настроек?",
},
},
Lang: {
Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language`
Name: "Language", // ATTENTION: если вы хотите добавить новый перевод, не переводите это значение, оставьте его как `Language`
All: "Все языки",
},
Avatar: "Аватар",
FontSize: {
Title: "Размер шрифта",
SubTitle: "Настроить размер шрифта контента чата",
SubTitle: "Размер шрифта в чате",
},
FontFamily: {
Title: "Шрифт чата",
@@ -80,117 +162,314 @@ const ru: PartialLocaleType = {
InjectSystemPrompts: {
Title: "Вставить системные подсказки",
SubTitle:
"Принудительно добавить симулированную системную подсказку ChatGPT в начало списка сообщений для каждого запроса",
"Принудительно добавлять системную подсказку, имитирующую ChatGPT, в начале каждого запроса",
},
InputTemplate: {
Title: "Предварительная обработка пользовательского ввода",
SubTitle:
"Последнее сообщение пользователя будет подставлено в этот шаблон",
},
Update: {
Version: (x: string) => `Версия: ${x}`,
IsLatest: "Последняя версия",
CheckUpdate: "Проверить обновление",
IsChecking: "Проверка обновления...",
FoundUpdate: (x: string) => `Найдена новая версия: ${x}`,
GoToUpdate: "Обновить",
Version: (x: string) => `Текущая версия: ${x}`,
IsLatest: "Установлена последняя версия",
CheckUpdate: "Проверить обновления",
IsChecking: "Проверка обновлений...",
FoundUpdate: (x: string) => `Найдено новое обновление: ${x}`,
GoToUpdate: "Перейти к обновлению",
},
SendKey: "Клавиша отправки",
SendKey: "Кнопка отправки",
Theme: "Тема",
TightBorder: "Узкая граница",
TightBorder: "Режим без границ",
SendPreviewBubble: {
Title: "Отправить предпросмотр",
SubTitle: "Предварительный просмотр markdown в пузыре",
Title: "Предварительный просмотр пузырьков",
SubTitle:
"Просмотр содержимого Markdown в пузырьках предварительного просмотра",
},
AutoGenerateTitle: {
Title: "Автоматическое создание заголовка",
SubTitle: "Создание подходящего заголовка на основе содержания беседы",
},
Sync: {
CloudState: "Облачные данные",
NotSyncYet: "Синхронизация еще не проводилась",
Success: "Синхронизация успешна",
Fail: "Не удалось синхронизировать",
Config: {
Modal: {
Title: "Настройки облачной синхронизации",
Check: "Проверить доступность",
},
SyncType: {
Title: "Тип синхронизации",
SubTitle: "Выберите предпочитаемый сервер синхронизации",
},
Proxy: {
Title: "Включить прокси",
SubTitle:
"При синхронизации в браузере необходимо включить прокси для предотвращения ограничений кросс-домена",
},
ProxyUrl: {
Title: "Адрес прокси",
SubTitle: "Только для встроенного прокси в проекте",
},
WebDav: {
Endpoint: "WebDAV адрес",
UserName: "Имя пользователя",
Password: "Пароль",
},
UpStash: {
Endpoint: "UpStash Redis REST Url",
UserName: "Имя резервной копии",
Password: "UpStash Redis REST Token",
},
},
LocalState: "Локальные данные",
Overview: (overview: any) => {
return `${overview.chat} бесед, ${overview.message} сообщений, ${overview.prompt} подсказок, ${overview.mask} масок`;
},
ImportFailed: "Не удалось импортировать",
},
Mask: {
Splash: {
Title: "Экран заставки маски",
SubTitle: "Показывать экран заставки маски перед началом нового чата",
Title: "Стартовая страница масок",
SubTitle:
"При создании нового чата отображать стартовую страницу масок",
},
Builtin: {
Title: "Скрыть встроенные маски",
SubTitle: "Скрыть встроенные маски во всех списках масок",
},
},
Prompt: {
Disable: {
Title: "Отключить автозаполнение",
SubTitle: "Ввод / для запуска автозаполнения",
Title: "Отключить автозаполнение подсказок",
SubTitle: "Введите / в начале строки для активации автозаполнения",
},
List: "Список подсказок",
List: "Список пользовательских подсказок",
ListCount: (builtin: number, custom: number) =>
`${builtin} встроенных, ${custom} пользовательских`,
`Встроенные ${builtin}, пользовательские ${custom}`,
Edit: "Редактировать",
Modal: {
Title: "Список подсказок",
Add: "Добавить",
Add: "Создать",
Search: "Поиск подсказок",
},
EditModal: {
Title: "Редактировать подсказку",
Title: "Редактировать подсказки",
},
},
HistoryCount: {
Title: "Количество прикрепляемых сообщений",
SubTitle:
"Количество отправляемых сообщений, прикрепляемых к каждому запросу",
Title: "Количество истории сообщений",
SubTitle: "Количество историй сообщений, отправляемых с каждым запросом",
},
CompressThreshold: {
Title: "Порог сжатия истории",
Title: "Порог сжатия длины истории сообщений",
SubTitle:
"Будет сжимать, если длина несжатых сообщений превышает указанное значение",
"Когда не сжатая история сообщений превышает это значение, происходит сжатие",
},
Usage: {
Title: "Баланс аккаунта",
Title: "Проверка баланса",
SubTitle(used: any, total: any) {
return `Использовано в этом месяце $${used}, подписка $${total}`;
return `Использовано в этом месяце $${used}, всего по подписке $${total}`;
},
IsChecking: "Проверка…",
Check: "Проверить снова",
NoAccess: "Введите API-ключ или пароль доступа для просмотра баланса",
},
Access: {
AccessCode: {
Title: "Пароль доступа",
SubTitle: "Администратор включил защиту паролем",
Placeholder: "Введите пароль доступа",
},
CustomEndpoint: {
Title: "Пользовательский интерфейс",
SubTitle: "Использовать ли пользовательский Azure или OpenAI сервис",
},
Provider: {
Title: "Провайдер модели",
SubTitle: "Переключиться на другого провайдера",
},
OpenAI: {
ApiKey: {
Title: "API-ключ",
SubTitle:
"Использовать пользовательский OpenAI-ключ для обхода ограничений пароля",
Placeholder: "OpenAI API-ключ",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle: "Кроме адреса по умолчанию, должен содержать http(s)://",
},
},
Azure: {
ApiKey: {
Title: "Ключ интерфейса",
SubTitle:
"Использовать пользовательский Azure-ключ для обхода ограничений пароля",
Placeholder: "Azure API-ключ",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle: "Пример:",
},
ApiVerion: {
Title: "Версия интерфейса (azure api version)",
SubTitle: "Выберите конкретную версию",
},
},
Anthropic: {
ApiKey: {
Title: "Ключ интерфейса",
SubTitle:
"Использовать пользовательский Anthropic-ключ для обхода ограничений пароля",
Placeholder: "Anthropic API-ключ",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle: "Пример:",
},
ApiVerion: {
Title: "Версия интерфейса (claude api version)",
SubTitle: "Выберите конкретную версию API",
},
},
Google: {
ApiKey: {
Title: "API-ключ",
SubTitle: "Получите ваш API-ключ Google AI",
Placeholder: "Введите ваш API-ключ Google AI Studio",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle: "Пример:",
},
ApiVersion: {
Title: "Версия API (только для gemini-pro)",
SubTitle: "Выберите конкретную версию API",
},
GoogleSafetySettings: {
Title: "Уровень фильтрации Google",
SubTitle: "Настроить уровень фильтрации контента",
},
},
Baidu: {
ApiKey: {
Title: "API-ключ",
SubTitle: "Использовать пользовательский Baidu API-ключ",
Placeholder: "Baidu API-ключ",
},
SecretKey: {
Title: "Секретный ключ",
SubTitle: "Использовать пользовательский Baidu Secret Key",
Placeholder: "Baidu Secret Key",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle:
"Не поддерживает пользовательскую настройку, перейдите в .env",
},
},
ByteDance: {
ApiKey: {
Title: "Ключ интерфейса",
SubTitle: "Использовать пользовательский ByteDance API-ключ",
Placeholder: "ByteDance API-ключ",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle: "Пример:",
},
},
Alibaba: {
ApiKey: {
Title: "Ключ интерфейса",
SubTitle: "Использовать пользовательский Alibaba Cloud API-ключ",
Placeholder: "Alibaba Cloud API-ключ",
},
Endpoint: {
Title: "Адрес интерфейса",
SubTitle: "Пример:",
},
},
CustomModel: {
Title: "Название пользовательской модели",
SubTitle:
"Добавьте варианты пользовательских моделей, разделяя запятыми",
},
IsChecking: "Проверка...",
Check: "Проверить",
NoAccess: "Введите API ключ, чтобы проверить баланс",
},
Model: "Модель",
Temperature: {
Title: "Температура",
SubTitle: "Чем выше значение, тем более случайный вывод",
Title: "Случайность (temperature)",
SubTitle: "Чем больше значение, тем более случайные ответы",
},
TopP: {
Title: "Ядро выборки (top_p)",
SubTitle: "Похожие на случайность, но не изменяйте вместе с случайностью",
},
MaxTokens: {
Title: "Максимальное количество токенов",
SubTitle: "Максимальная длина вводных и генерируемых токенов",
Title: "Ограничение на количество токенов за один раз (max_tokens)",
SubTitle: "Максимальное количество токенов на одно взаимодействие",
},
PresencePenalty: {
Title: "Штраф за повторения",
Title: "Наказание за новизну тем (presence_penalty)",
SubTitle:
"Чем выше значение, тем больше вероятность общения на новые темы",
"Чем больше значение, тем выше вероятность расширения на новые темы",
},
FrequencyPenalty: {
Title: "Штраф за частоту",
Title: "Наказание за частоту (frequency_penalty)",
SubTitle:
"Большее значение снижает вероятность повторения одной и той же строки",
"Чем больше значение, тем выше вероятность уменьшения повторяющихся слов",
},
},
Store: {
DefaultTopic: "Новый разговор",
BotHello: "Здравствуйте! Как я могу вам помочь сегодня?",
Error: "Что-то пошло не так. Пожалуйста, попробуйте еще раз позже.",
DefaultTopic: "Новый чат",
BotHello: "Чем могу помочь?",
Error: "Произошла ошибка, попробуйте позже",
Prompt: {
History: (content: string) =>
"Это краткое содержание истории чата между ИИ и пользователем: " +
content,
"Это резюме истории чата как предыстория: " + content,
Topic:
"Пожалуйста, создайте заголовок из четырех или пяти слов, который кратко описывает нашу беседу, без введения, знаков пунктуации, кавычек, точек, символов или дополнительного текста. Удалите кавычки.",
"Укажите краткую тему этого сообщения в четырех-пяти словах, без объяснений, знаков препинания, междометий, лишнего текста или выделения. Если темы нет, просто напишите 'Болтовня'",
Summarize:
"Кратко изложите нашу дискуссию в 200 словах или менее для использования в будущем контексте.",
"Кратко подведите итоги содержимого беседы для использования в качестве последующего контекстного запроса, не более 200 слов",
},
},
Copy: {
Success: "Скопировано в буфер обмена",
Failed:
"Не удалось скопировать, пожалуйста, предоставьте разрешение на доступ к буферу обмена",
Failed: "Не удалось скопировать, предоставьте доступ к буферу обмена",
},
Download: {
Success: "Содержимое успешно загружено в вашу директорию.",
Failed: "Не удалось загрузить.",
},
Context: {
Toast: (x: any) => `С ${x} контекстными подсказками`,
Edit: "Контекстные и памятные подсказки",
Add: "Добавить подсказку",
Toast: (x: any) => `Содержит ${x} предустановленных подсказок`,
Edit: "Текущие настройки чата",
Add: "Добавить новый чат",
Clear: "Контекст очищен",
Revert: "Восстановить контекст",
},
Plugin: {
Name: "Плагин",
Name: "Плагины",
},
FineTuned: {
Sysmessage: "Вы - ассистент, который",
Sysmessage: "Вы - помощник",
},
SearchChat: {
Name: "Поиск",
@@ -210,41 +489,64 @@ const ru: PartialLocaleType = {
Mask: {
Name: "Маска",
Page: {
Title: "Шаблон подсказки",
SubTitle: (count: number) => `${count} шаблонов подсказок`,
Search: "Поиск шаблонов",
Title: "Предустановленные роли",
SubTitle: (count: number) => `${count} предустановленных ролей`,
Search: "Поиск ролей",
Create: "Создать",
},
Item: {
Info: (count: number) => `${count} подсказок`,
Chat: "Чат",
View: "Просмотр",
Info: (count: number) => `Содержит ${count} предустановленных диалогов`,
Chat: "Диалог",
View: "Просмотреть",
Edit: "Редактировать",
Delete: "Удалить",
DeleteConfirm: "Подтвердить удаление?",
},
EditModal: {
Title: (readonly: boolean) =>
`Редактирование шаблона подсказки ${
readonly ? "(только для чтения)" : ""
`Редактирование предустановленной маски ${
readonly ? "только для чтения" : ""
}`,
Download: "Скачать",
Clone: "Клонировать",
Download: "Скачать предустановку",
Clone: "Клонировать предустановку",
},
Config: {
Avatar: "Аватар бота",
Name: "Имя бота",
Avatar: "Аватар роли",
Name: "Название роли",
Sync: {
Title: "Использовать глобальные настройки",
SubTitle:
"Будет ли текущий чат использовать глобальные настройки модели",
Confirm:
"Пользовательские настройки текущего чата будут автоматически заменены, подтвердите активацию глобальных настроек?",
},
HideContext: {
Title: "Скрыть предустановленные диалоги",
SubTitle:
"После скрытия предустановленные диалоги не будут отображаться в чате",
},
Share: {
Title: "Поделиться этой маской",
SubTitle: "Создать прямую ссылку на эту маску",
Action: "Скопировать ссылку",
},
},
},
NewChat: {
Return: "Вернуться",
Skip: "Пропустить",
Title: "Выберите маску",
SubTitle: "Общайтесь с душой за маской",
More: "Найти еще",
NotShow: "Не показывать снова",
Skip: "Начать сразу",
NotShow: "Больше не показывать",
ConfirmNoShow:
"Подтвердите отключение? Вы можете включить это позже в настройках.",
"Подтвердить отключение? После отключения вы всегда сможете включить его снова в настройках.",
Title: "Выберите маску",
SubTitle: "Начните сейчас, столкнитесь с мыслями за маской",
More: "Показать все",
},
URLCommand: {
Code: "Обнаружен код доступа в ссылке, автоматически заполнить?",
Settings:
"Обнаружены предустановленные настройки в ссылке, автоматически заполнить?",
},
UI: {
@@ -253,8 +555,15 @@ const ru: PartialLocaleType = {
Close: "Закрыть",
Create: "Создать",
Edit: "Редактировать",
Export: "Экспортировать",
Import: "Импортировать",
Sync: "Синхронизировать",
Config: "Настройки",
},
Exporter: {
Description: {
Title: "Только сообщения после очистки контекста будут отображаться",
},
Model: "Модель",
Messages: "Сообщения",
Topic: "Тема",