config: add env schema and localization foundation

This commit is contained in:
2026-05-10 22:51:52 +03:00
parent 986d4aca46
commit 28f67aefc2
6 changed files with 1912 additions and 29 deletions
+249
View File
@@ -0,0 +1,249 @@
{
"language": {
"default": "По умолчанию",
"en": "Английский",
"ru": "Русский",
"ua": "Украинский",
"instructionName": "Russian"
},
"providerChoice.default": "По умолчанию",
"errorText": "⚠️ Произошла ошибка.",
"waitThinkText": "⏳ Думаю...",
"analyzingPictureText": "🔍 Анализирую изображение...",
"analyzingPicturesText": "🔍 Анализирую изображения...",
"reasoningText": "🤔 Рассуждаю...",
"transcribingAudioText": "🦻 Распознаю аудио...",
"genImageText": "👨‍🎨 Генерирую изображение...",
"cancelText": "❌ Отмена",
"regenerateText": "🔄 Сгенерировать заново",
"aiCancelCallbackText": "Отменить генерацию ИИ",
"aiRegenerateCallbackText": "Сгенерировать ответ ИИ заново",
"userSettingsCallbackText": "Настройки пользователя",
"noAccessText": "Нет доступа",
"notBotCreatorText": "Вы не создатель бота.",
"notBotAdministratorText": "Вы не администратор бота.",
"notAChatText": "Это не чат.",
"notChatAdministratorText": "Вы не администратор чата.",
"botNotChatAdministratorText": "Бот не является администратором чата.",
"replyRequiredText": "Нужно ответить на сообщение.",
"onlyOriginalAuthorText": "Это действие доступно только автору исходного сообщения.",
"dockerContainerLabelText": "Docker-контейнер",
"processLabelText": "Процесс",
"systemLabelText": "Система",
"systemInfoOsLabelText": "ОС",
"systemInfoRuntimeLabelText": "RUNTIME",
"systemInfoDockerLabelText": "DOCKER",
"systemInfoCpuLabelText": "CPU",
"systemInfoRamLabelText": "RAM",
"systemInfoCpuCoresText": "ядер",
"systemInfoCpuThreadsText": "потоков",
"idChatLabelText": "id чата",
"idFromLabelText": "id пользователя",
"idReplyLabelText": "id ответа",
"runtimeProviderLabelText": "провайдер",
"runtimeModelLabelText": "модель",
"runtimeCapabilitiesLabelText": "возможности",
"runtimeExternalLabelText": "внешний",
"infoAiBlockLabelText": "AI",
"infoSupportedProvidersLabelText": "поддерживаемые провайдеры",
"infoToolsBlockLabelText": "инструменты",
"infoCountLabelText": "количество",
"infoCommandsBlockLabelText": "команды",
"infoPublicLabelText": "публичные",
"infoPrivateLabelText": "приватные",
"infoChatLabelText": "чат",
"infoCallbackLabelText": "колбэки",
"commandsHeaderText": "Команды:\n\n",
"sentCommandsInDmText": "Отправил команды в личные сообщения 😎",
"couldNotSendCommandsInDmText": "Не получилось отправить команды в личные сообщения ☹️\nОтправляю их сюда",
"administratorsHeaderText": "*Администраторы*:\n\n",
"noUserInfoText": "Нет информации о пользователе",
"useLeaveCommandText": "Используйте /leave",
"databaseBackupCaption": "Резервная копия базы данных",
"databaseBackupSentText": "Успешно отправил создателю в личные сообщения!",
"noChoicesText": "Не из чего выбирать",
"qrCodeMissingTextText": "Не найден текст для генерации QR-кода.",
"quoteMissingTextText": "Не удалось найти текст в сообщении 😢",
"quoteBuildFailedText": "Не удалось собрать цитату 😢",
"speechToTextInstructionText": "Отправьте аудио/voice/video-note или ответьте /stt на сообщение с аудио.",
"speechToTextEmptyResultText": "Распознавание речи не вернуло текст.",
"textToSpeechInstructionText": "Отправьте текст после команды или ответьте /tts на сообщение с текстом.",
"titleMissingText": "Не удалось найти заголовок...",
"betterFallbackText": "Лучше",
"pongText": "понг",
"modelListHeaderText": "Доступные модели:\n\n",
"modelListLoadFailedText": "Не удалось загрузить список моделей",
"noCurrentModelText": "Модель не задана. Используйте одно из значений из списка.",
"unsupportedAttachmentText": "Этот тип вложения не поддерживается.",
"attachmentMissingFromCacheText": "Файл вложения отсутствует в кэше.",
"noSupportedTranscriptionProviderText": "Не настроен ни один провайдер распознавания речи.",
"noSupportedTextToSpeechProviderText": "Не настроен ни один провайдер синтеза речи.",
"noSpeechToTextProviderForAccessText": "Для вашего уровня доступа не настроены провайдеры распознавания речи.",
"noTextToSpeechProviderForAccessText": "Для вашего уровня доступа не настроены провайдеры синтеза речи.",
"noTextToSynthesizeText": "Нет текста для синтеза речи.",
"speechFileTooLargeText": "Файл речи больше 50 МБ и не может быть отправлен.",
"userSettingsTitle": "Настройки пользователя",
"userSettingsAiProviderSelectionTitle": "Выбор AI-провайдера",
"userSettingsInterfaceLanguageSelectionTitle": "Выбор языка интерфейса",
"userSettingsResponseLanguageSelectionTitle": "Выбор языка ответов",
"userSettingsContextSizeSelectionTitle": "Выбор размера контекста",
"userSettingsVoiceModeSelectionTitle": "Режим голосовых сообщений",
"userSettingsTierLabel": "Уровень",
"userSettingsAiProviderLabel": "AI-провайдер",
"userSettingsInterfaceLanguageLabel": "Язык интерфейса",
"userSettingsResponseLanguageLabel": "Язык ответов LLM",
"userSettingsContextSizeLabel": "Размер контекста",
"userSettingsVoiceModeLabel": "Голосовые сообщения",
"userSettingsBackButtonText": "Назад",
"userSettingsAiProviderButtonPrefix": "AI-провайдер",
"userSettingsInterfaceLanguageButtonPrefix": "Язык интерфейса",
"userSettingsResponseLanguageButtonPrefix": "Язык ответов",
"userSettingsContextSizeButtonPrefix": "Контекст",
"userSettingsVoiceModeButtonPrefix": "Голосовые",
"userSettingsCreatorTierText": "Создатель",
"userSettingsAdminTierText": "Админ",
"userSettingsUserTierText": "Пользователь",
"userSettingsSelectedPrefix": "✓ ",
"userSettingsContextSizeDefaultText": "По умолчанию",
"userSettingsVoiceModeExecuteText": "Выполнять через ИИ",
"userSettingsVoiceModeTranscriptText": "Только расшифровка",
"startingImageGenText": "🌈 Запускаю генерацию изображения...",
"imageGenText": "🌈 Генерирую изображение...",
"finalizingImageGenText": "🌈 Завершаю генерацию изображения...",
"botCannotMakeItselfAdminText": "Бот не может назначить себя администратором",
"botCreatorAlreadyAdminText": "Создатель бота уже администратор",
"botCannotRemoveItselfFromAdminsText": "Бот не может удалить себя из администраторов",
"botCreatorCannotStopBeingAdminText": "Создатель бота не может перестать быть администратором",
"botWillNotBanCreatorText": "Бот не будет банить своего создателя.",
"botWillNotBanAdminsText": "Бот не будет банить своих администраторов.",
"botIsNotBannedByItselfText": "Бот и так не забанен сам собой.",
"botCreatorNeverBannedText": "Создатель бота не забанен и никогда не будет.",
"botAdminsNotBannedText": "Администраторы бота и так не забанены.",
"botWillNotIgnoreItselfText": "Бот не будет игнорировать себя.",
"botWillNotIgnoreCreatorText": "Бот не будет игнорировать своего создателя.",
"botWillNotIgnoreAdminsText": "Бот не будет игнорировать своих администраторов.",
"botIsNotIgnoredByItselfText": "Бот и так не игнорирует сам себя.",
"botCreatorNotIgnoredText": "Создатель бота не игнорируется и никогда не будет.",
"botAdminsNotIgnoredText": "Администраторы бота и так не игнорируются.",
"botAlreadyAlwaysListensToItselfText": "Бот и так всегда слушает сам себя",
"botAlwaysListensToCreatorText": "Бот всегда слушает своего создателя",
"coinHeadsText": "Орёл",
"coinTailsText": "Решка",
"distortReplyInstructionText": "Ответьте /distort на сообщение с изображением (фото, документ или стикер).\nПример: /distort 16 80",
"distortMissingImageText": "Не вижу изображения в ответе. Отправьте фото или файл изображения.",
"shutdownFallbackText": "...",
"shutdownSequenceTexts": [
"ну что ж, народ",
"было приятно пообщаться",
"но мне пора отдохнуть",
"всем добра"
],
"shutdownDoneText": "*R.I.P*",
"whenNowText": "прямо сейчас",
"whenNeverText": "никогда",
"whenYearUnitText": "год",
"whenDayUnitText": "день",
"whenWeekUnitText": "неделя",
"whenMonthUnitText": "месяц",
"whenHourUnitText": "час",
"whenMinuteUnitText": "минута",
"whenSecondUnitText": "секунда",
"getCancelledText": "{provider}\n❌ Генерация отменена.",
"getPartialImageGenText": "🌈 Генерирую изображение ({iteration}/{total})...",
"getImageGenDoneText.withModel": "👨‍🎨 Изображение сгенерировано. Модель: `{model}`.",
"getImageGenDoneText.default": "👨‍🎨 Изображение сгенерировано.",
"getErrorText.withReason": "{errorText} Причина:\n{reason}",
"getUseToolText.python": "👨‍💻 Запускаю `Python`",
"getUseToolText.default": "🔧 Использую инструмент `{name}`",
"getAnalyzingDocumentText.default": "🔍 Анализирую документ...",
"getAnalyzingDocumentText.single": "🔍 Анализирую документ: `{name}`",
"getAnalyzingDocumentText.many": "🔍 Анализирую документы: {names}",
"getPreparingRAGText.default": "🔍 Готовлю RAG для документа...",
"getPreparingRAGText.single": "🔍 Готовлю RAG для документа: `{name}`",
"getPreparingRAGText.many": "🔍 Готовлю RAG для документов: {names}",
"getBuildingRAGIndexText.default": "🧠 Строю RAG-индекс...",
"getBuildingRAGIndexText.withModel": "🧠 Строю RAG-индекс: `{modelName}`.",
"queueNoneText": "нет",
"getAiQueueText.queued": "⏳ Запрос к {provider} поставлен в очередь.",
"getAiQueueText.ahead": "Запросов впереди: {count}.",
"getTelegramFileTooLargeText": "Файл {fileName} больше {maxSizeMb} МБ и не может быть отправлен.",
"getUserIsNowAdminText": "{name} теперь администратор!",
"getUserAlreadyAdminText": "{name} уже администратор 🤔",
"getUserNoLongerAdminText": "{name} больше не администратор!",
"getUserWasNotAdminText": "{name} не был администратором 🤔",
"getUserBannedText": "{name} забанен 🚫",
"getUserBanFailedText": "Не удалось забанить {name} ☹️",
"getUserUnbannedText": "{name} разбанен ⛓️‍💥",
"getUserUnbanFailedText": "Не удалось разбанить {name} ☹️",
"getUserIgnoredText": "{name} заглушён! 🔇",
"getUserAlreadyIgnoredText": "{name} уже заглушён 🤔",
"getUserIgnoreFailedText": "Не удалось заглушить {name} ☹️",
"getUserUnignoredText": "{name} больше не заглушён! 🔈",
"getUserWasNotIgnoredText": "{name} не был заглушён 🤔",
"getUserUnignoreFailedText": "Не удалось включить {name} обратно ☹️",
"getChoiceText": "Выбрал *{choice}*",
"getCoinResultText": "Выпало: *{result}*",
"getLoadedModelsText": "Загруженные модели: {models}",
"getSelectedModelText": "Выбрана модель: `{model}`",
"getCurrentModelText": "Текущая модель: `{model}`",
"getLoadingModelText": "Загружаю модель `{model}`...",
"getUserSettingsContextSizeText": "{size} токенов",
"getQrCodeTextTooLongText": "Текст слишком длинный для QR ({actualLength} символов). Обрежу до {maxLength} символов.",
"getQrCodeReadyText": "QR-код готов ✅\nСодержимое:\n<blockquote expandable>{content}</blockquote>",
"getQrCodeFailedText": "Не удалось сгенерировать QR: {reason}",
"getWhenPrefixText": "через ",
"getWhenPluralUnitText": "{unit}",
"getWhenDurationText": "{prefix}{value} {unit}",
"commandDescriptions": {
"ae": "вычисление",
"adminsAdd": "Добавить пользователя в администраторы",
"adminsRemove": "Удалить пользователя из администраторов",
"ban": "забанить пользователя в чате",
"choice": "Выбрать случайное значение",
"coin": "Орёл или решка",
"debug": "Вернуть msg или reply в JSON",
"dice": "Отправить случайный или конкретный дайс",
"distort": "Искажение изображения",
"geminiChat": "Чат с AI (Gemini)",
"geminiGetModel": "Показать текущую модель Gemini",
"geminiListModels": "Показать все модели Gemini",
"geminiSetModel": "Установить модель Gemini",
"help": "Показать список команд",
"id": "ID чата, пользователя и ответа",
"ignore": "Бот будет игнорировать пользователя",
"info": "Информация о боте",
"leave": "Бот покинет текущий чат",
"mistralChat": "Чат с AI (Mistral)",
"mistralGetModel": "Показать текущую модель Mistral",
"mistralListModels": "Показать все модели Mistral",
"mistralSetModel": "Установить модель Mistral",
"ollamaChat": "Чат с AI (Ollama)",
"ollamaGetModel": "Показать текущую модель Ollama",
"ollamaListModels": "Показать все модели Ollama",
"ollamaSearch": "Веб-поиск через Ollama",
"ollamaSetModel": "Установить модель Ollama",
"openAiChat": "Чат с AI (OpenAI)",
"openAiGetModel": "Показать текущую модель OpenAI",
"openAiListModels": "Показать все модели OpenAI",
"openAiSetModel": "Установить модель OpenAI",
"ping": "Задержка между получением и отправкой сообщения",
"qr": "Сгенерировать QR-код из текста",
"quote": "Сделать цитату из текста",
"randomInt": "Случайное число из диапазона",
"randomString": "Случайная строка до 4096 символов",
"settings": "Настройки пользователя",
"shutdown": "Выключить бота",
"speechToText": "Распознать речь в текст",
"start": "Запустить бота",
"systemInfo": "Информация о системе",
"textToSpeech": "Сгенерировать речь из текста",
"title": "Изменить название группы",
"test": "Проверка системной функциональности",
"transliteration": "Транслитерация EN <--> RU",
"unban": "разбанить пользователя в чате",
"unignore": "Бот снова будет отвечать пользователю",
"uptime": "Время работы бота",
"whatBetter": "случайно выбрать a или b",
"when": "случайная дата"
}
}