diff --git a/app/locales/cn.ts b/app/locales/cn.ts index 112b3b5cfc0d..c6f5d67fa6fe 100644 --- a/app/locales/cn.ts +++ b/app/locales/cn.ts @@ -67,7 +67,7 @@ const cn = { ConfirmClearAll: "确认清除所有数据?", }, Lang: { - Name: "Language", + Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` All: "所有语言", Options: { cn: "简体中文", @@ -79,6 +79,7 @@ const cn = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "头像", diff --git a/app/locales/de.ts b/app/locales/de.ts index 56202722d318..7c0b94db6863 100644 --- a/app/locales/de.ts +++ b/app/locales/de.ts @@ -71,7 +71,7 @@ const de: LocaleType = { }, Lang: { Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` - All: "All Languages", + All: "Alle Sprachen", Options: { cn: "简体中文", en: "English", @@ -82,6 +82,7 @@ const de: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "Avatar", diff --git a/app/locales/en.ts b/app/locales/en.ts index cb97c51cef02..ba64825741de 100644 --- a/app/locales/en.ts +++ b/app/locales/en.ts @@ -81,6 +81,7 @@ const en: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "Avatar", diff --git a/app/locales/es.ts b/app/locales/es.ts index df28075ebb5c..9997752e808a 100644 --- a/app/locales/es.ts +++ b/app/locales/es.ts @@ -69,11 +69,11 @@ const es: LocaleType = { ConfirmClearAll: "Are you sure you want to reset all chat?", }, Lang: { - Name: "Language", - All: "All Languages", + Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + All: "Todos los idiomas", Options: { cn: "简体中文", - en: "Inglés", + en: "English", tw: "繁體中文", es: "Español", it: "Italiano", @@ -81,6 +81,7 @@ const es: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "Avatar", diff --git a/app/locales/index.ts b/app/locales/index.ts index dee6f795bfd8..757c1719d5b8 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -7,6 +7,7 @@ import TR from "./tr"; import JP from "./jp"; import DE from "./de"; import VI from "./vi"; +import RU from "./ru"; export type { LocaleType } from "./cn"; @@ -20,6 +21,7 @@ export const AllLangs = [ "jp", "de", "vi", + "ru", ] as const; export type Lang = (typeof AllLangs)[number]; @@ -82,4 +84,5 @@ export default { jp: JP, de: DE, vi: VI, + ru: RU, }[getLang()] as typeof CN; diff --git a/app/locales/it.ts b/app/locales/it.ts index abf655f0daa1..ddb85c948f1d 100644 --- a/app/locales/it.ts +++ b/app/locales/it.ts @@ -69,8 +69,8 @@ const it: LocaleType = { ConfirmClearAll: "Sei sicuro vuoi cancellare tutte le chat?", }, Lang: { - Name: "Lingue", - All: "All Languages", + Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + All: "Tutte le lingue", Options: { cn: "简体中文", en: "English", @@ -81,6 +81,7 @@ const it: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "Avatar", diff --git a/app/locales/jp.ts b/app/locales/jp.ts index de03f9fdca10..d34ee68a6a06 100644 --- a/app/locales/jp.ts +++ b/app/locales/jp.ts @@ -69,7 +69,7 @@ const jp: LocaleType = { ConfirmClearAll: "すべてのチャットをリセットしてもよろしいですか?", }, Lang: { - Name: "Language", + Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` All: "所有语言", Options: { cn: "简体中文", @@ -81,6 +81,7 @@ const jp: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "アバター", diff --git a/app/locales/ru.ts b/app/locales/ru.ts new file mode 100644 index 000000000000..dc0b149be677 --- /dev/null +++ b/app/locales/ru.ts @@ -0,0 +1,244 @@ +import { SubmitKey } from "../store/config"; +import type { LocaleType } from "./index"; + +const ru: LocaleType = { + WIP: "Скоро...", + Error: { + Unauthorized: + "Несанкционированный доступ. Пожалуйста, введите код доступа на странице настроек.", + }, + ChatItem: { + ChatItemCount: (count: number) => `${count} сообщений`, + }, + Chat: { + SubTitle: (count: number) => `${count} сообщений с ChatGPT`, + Actions: { + ChatList: "Перейти к списку чатов", + CompressedHistory: "Сжатая история памяти", + Export: "Экспортировать все сообщения в формате Markdown", + Copy: "Копировать", + Stop: "Остановить", + Retry: "Повторить", + Delete: "Удалить", + }, + Rename: "Переименовать чат", + Typing: "Печатает…", + Input: (submitKey: string) => { + var inputHints = `${submitKey} для отправки сообщения`; + if (submitKey === String(SubmitKey.Enter)) { + inputHints += ", Shift + Enter для переноса строки"; + } + return inputHints + ", / для поиска подсказок"; + }, + Send: "Отправить", + Config: { + Reset: "Сбросить настройки", + SaveAs: "Сохранить как маску", + }, + }, + Export: { + Title: "Все сообщения", + Copy: "Копировать все", + Download: "Скачать", + MessageFromYou: "Сообщение от вас", + MessageFromChatGPT: "Сообщение от ChatGPT", + }, + Memory: { + Title: "Память", + EmptyContent: "Пусто.", + Send: "Отправить память", + Copy: "Копировать память", + Reset: "Сбросить сессию", + ResetConfirm: + "При сбросе текущая история переписки и историческая память будут удалены. Вы уверены, что хотите сбросить?", + }, + Home: { + NewChat: "Новый чат", + DeleteChat: "Вы действительно хотите удалить выбранный разговор?", + DeleteToast: "Чат удален", + Revert: "Отмена", + }, + Settings: { + Title: "Настройки", + SubTitle: "Все настройки", + Actions: { + ClearAll: "Очистить все данные", + ResetAll: "Сбросить все настройки", + Close: "Закрыть", + ConfirmResetAll: "Вы уверены, что хотите сбросить все настройки?", + ConfirmClearAll: "Вы уверены, что хотите очистить все данные?", + }, + Lang: { + Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` + All: "Все языки", + Options: { + cn: "简体中文", + en: "English", + tw: "繁體中文", + es: "Español", + it: "Italiano", + tr: "Türkçe", + jp: "日本語", + de: "Deutsch", + vi: "Vietnamese", + ru: "Русский", + }, + }, + Avatar: "Аватар", + FontSize: { + Title: "Размер шрифта", + SubTitle: "Настроить размер шрифта контента чата", + }, + Update: { + Version: (x: string) => `Версия: ${x}`, + IsLatest: "Последняя версия", + CheckUpdate: "Проверить обновление", + IsChecking: "Проверка обновления...", + FoundUpdate: (x: string) => `Найдена новая версия: ${x}`, + GoToUpdate: "Обновить", + }, + SendKey: "Клавиша отправки", + Theme: "Тема", + TightBorder: "Узкая граница", + SendPreviewBubble: { + Title: "Отправить предпросмотр", + SubTitle: "Предварительный просмотр markdown в пузыре", + }, + Mask: { + Title: "Экран заставки маски", + SubTitle: "Показывать экран заставки маски перед началом нового чата", + }, + Prompt: { + Disable: { + Title: "Отключить автозаполнение", + SubTitle: "Ввод / для запуска автозаполнения", + }, + List: "Список подсказок", + ListCount: (builtin: number, custom: number) => + `${builtin} встроенных, ${custom} пользовательских`, + Edit: "Редактировать", + Modal: { + Title: "Список подсказок", + Add: "Добавить", + Search: "Поиск подсказок", + }, + EditModal: { + Title: "Редактировать подсказку", + }, + }, + HistoryCount: { + Title: "Количество прикрепляемых сообщений", + SubTitle: "Количество отправляемых сообщений, прикрепляемых к каждому запросу", + }, + CompressThreshold: { + Title: "Порог сжатия истории", + SubTitle: + "Будет сжимать, если длина несжатых сообщений превышает указанное значение", + }, + Token: { + Title: "API ключ", + SubTitle: "Используйте свой ключ, чтобы игнорировать лимит доступа", + Placeholder: "API ключ OpenAI", + }, + Usage: { + Title: "Баланс аккаунта", + SubTitle(used: any, total: any) { + return `Использовано в этом месяце $${used}, подписка $${total}`; + }, + IsChecking: "Проверка...", + Check: "Проверить", + NoAccess: "Введите API ключ, чтобы проверить баланс", + }, + AccessCode: { + Title: "Код доступа", + SubTitle: "Контроль доступа включен", + Placeholder: "Требуется код доступа", + }, + Model: "Модель", + Temperature: { + Title: "Температура", + SubTitle: "Чем выше значение, тем более случайный вывод", + }, + MaxTokens: { + Title: "Максимальное количество токенов", + SubTitle: "Максимальная длина вводных и генерируемых токенов", + }, + PresencePenlty: { + Title: "Штраф за повторения", + SubTitle: + "Чем выше значение, тем больше вероятность общения на новые темы", + }, + }, + Store: { + DefaultTopic: "Новый разговор", + BotHello: "Здравствуйте! Как я могу вам помочь сегодня?", + Error: "Что-то пошло не так. Пожалуйста, попробуйте еще раз позже.", + Prompt: { + History: (content: string) => + "Это краткое содержание истории чата между ИИ и пользователем: " + + content, + Topic: + "Пожалуйста, создайте заголовок из четырех или пяти слов, который кратко описывает нашу беседу, без введения, знаков пунктуации, кавычек, точек, символов или дополнительного текста. Удалите кавычки.", + Summarize: + "Кратко изложите нашу дискуссию в 200 словах или менее для использования в будущем контексте.", + }, + }, + Copy: { + Success: "Скопировано в буфер обмена", + Failed: "Не удалось скопировать, пожалуйста, предоставьте разрешение на доступ к буферу обмена", + }, + Context: { + Toast: (x: any) => `С ${x} контекстными подсказками`, + Edit: "Контекстные и памятные подсказки", + Add: "Добавить подсказку", + }, + Plugin: { + Name: "Плагин", + }, + Mask: { + Name: "Маска", + Page: { + Title: "Шаблон подсказки", + SubTitle: (count: number) => `${count} шаблонов подсказок`, + Search: "Поиск шаблонов", + Create: "Создать", + }, + Item: { + Info: (count: number) => `${count} подсказок`, + Chat: "Чат", + View: "Просмотр", + Edit: "Редактировать", + Delete: "Удалить", + DeleteConfirm: "Подтвердить удаление?", + }, + EditModal: { + Title: (readonly: boolean) => + `Редактирование шаблона подсказки ${readonly ? "(только для чтения)" : ""}`, + Download: "Скачать", + Clone: "Клонировать", + }, + Config: { + Avatar: "Аватар бота", + Name: "Имя бота", + }, + }, + NewChat: { + Return: "Вернуться", + Skip: "Пропустить", + Title: "Выберите маску", + SubTitle: "Общайтесь с душой за маской", + More: "Найти еще", + NotShow: "Не показывать снова", + ConfirmNoShow: "Подтвердите отключение? Вы можете включить это позже в настройках.", + }, + + UI: { + Confirm: "Подтвердить", + Cancel: "Отмена", + Close: "Закрыть", + Create: "Создать", + Edit: "Редактировать", + }, +}; + +export default ru; diff --git a/app/locales/tr.ts b/app/locales/tr.ts index 6793beb95c36..80d2bae71852 100644 --- a/app/locales/tr.ts +++ b/app/locales/tr.ts @@ -70,7 +70,7 @@ const tr: LocaleType = { }, Lang: { Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` - All: "All Languages", + All: "Tüm Diller", Options: { cn: "简体中文", en: "English", @@ -81,6 +81,7 @@ const tr: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "Avatar", diff --git a/app/locales/tw.ts b/app/locales/tw.ts index c541e9724170..ba54e8356dfa 100644 --- a/app/locales/tw.ts +++ b/app/locales/tw.ts @@ -67,7 +67,7 @@ const tw: LocaleType = { ConfirmClearAll: "您確定要清除所有数据嗎?", }, Lang: { - Name: "Language", + Name: "Language", // ATTENTION: if you wanna add a new translation, please do not translate this value, leave it as `Language` All: "所有语言", Options: { cn: "简体中文", @@ -79,6 +79,7 @@ const tw: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "大頭貼", diff --git a/app/locales/vi.ts b/app/locales/vi.ts index 66d4a4d58fb6..516f57927254 100644 --- a/app/locales/vi.ts +++ b/app/locales/vi.ts @@ -81,6 +81,7 @@ const vi: LocaleType = { jp: "日本語", de: "Deutsch", vi: "Vietnamese", + ru: "Русский", }, }, Avatar: "Ảnh đại diện",