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
+223
View File
@@ -0,0 +1,223 @@
{
"language": {
"default": "Default",
"en": "English",
"ru": "Russian",
"ua": "Ukrainian",
"instructionName": "English"
},
"providerChoice.default": "Default",
"errorText": "⚠️ An error occurred.",
"waitThinkText": "⏳ Let me think...",
"analyzingPictureText": "🔍 Analyzing the image...",
"analyzingPicturesText": "🔍 Analyzing the images...",
"reasoningText": "🤔 Reasoning...",
"transcribingAudioText": "🦻 Transcribing audio...",
"genImageText": "👨‍🎨 Generating an image...",
"cancelText": "❌ Cancel",
"regenerateText": "🔄 Regenerate",
"aiCancelCallbackText": "Cancel AI generation",
"aiRegenerateCallbackText": "Regenerate AI response",
"userSettingsCallbackText": "User settings",
"noAccessText": "No access",
"notBotCreatorText": "You are not the bot creator.",
"notBotAdministratorText": "You are not a bot administrator.",
"notAChatText": "This is not a chat.",
"notChatAdministratorText": "You are not a chat administrator.",
"botNotChatAdministratorText": "The bot is not a chat administrator.",
"replyRequiredText": "A reply to a message is required.",
"onlyOriginalAuthorText": "Only the author of the original message can perform this action.",
"commandsHeaderText": "Commands:\n\n",
"sentCommandsInDmText": "Sent commands in DM 😎",
"couldNotSendCommandsInDmText": "Could not send commands in DM ☹️\nSending them here instead",
"administratorsHeaderText": "*Administrators*:\n\n",
"noUserInfoText": "No user information",
"useLeaveCommandText": "Use /leave",
"databaseBackupCaption": "Database backup",
"databaseBackupSentText": "Successfully sent to the creator in DM!",
"noChoicesText": "Nothing to choose from",
"qrCodeMissingTextText": "No text found for QR code generation.",
"quoteMissingTextText": "Could not find text in the message 😢",
"quoteBuildFailedText": "Could not build the quote 😢",
"speechToTextInstructionText": "Send audio/voice/video-note or reply with /stt to a message containing audio.",
"speechToTextEmptyResultText": "Speech-to-text did not return transcription text.",
"textToSpeechInstructionText": "Send text after the command or reply with /tts to a message containing text.",
"titleMissingText": "Could not find a title...",
"betterFallbackText": "Better",
"pongText": "pong",
"modelListHeaderText": "Available models:\n\n",
"modelListLoadFailedText": "Could not load the model list",
"noCurrentModelText": "Model is not set. Use one of the listed values.",
"unsupportedAttachmentText": "This attachment type is not supported.",
"attachmentMissingFromCacheText": "Attachment file is missing from cache.",
"noSupportedTranscriptionProviderText": "No supported speech-to-text provider is configured.",
"noSupportedTextToSpeechProviderText": "No supported text-to-speech provider is configured.",
"noSpeechToTextProviderForAccessText": "No speech-to-text providers are configured for your access level.",
"noTextToSpeechProviderForAccessText": "No text-to-speech providers are configured for your access level.",
"noTextToSynthesizeText": "No text to synthesize.",
"speechFileTooLargeText": "The speech file is larger than 50 MB and cannot be sent.",
"userSettingsTitle": "User Settings",
"userSettingsAiProviderSelectionTitle": "AI Provider Selection",
"userSettingsInterfaceLanguageSelectionTitle": "Interface Language Selection",
"userSettingsResponseLanguageSelectionTitle": "Response Language Selection",
"userSettingsContextSizeSelectionTitle": "Context Size Selection",
"userSettingsVoiceModeSelectionTitle": "Voice Message Mode Selection",
"userSettingsTierLabel": "Tier",
"userSettingsAiProviderLabel": "AI provider",
"userSettingsInterfaceLanguageLabel": "Interface language",
"userSettingsResponseLanguageLabel": "LLM response language",
"userSettingsContextSizeLabel": "Context size",
"userSettingsVoiceModeLabel": "Voice messages",
"userSettingsBackButtonText": "Back",
"userSettingsAiProviderButtonPrefix": "AI provider",
"userSettingsInterfaceLanguageButtonPrefix": "Interface language",
"userSettingsResponseLanguageButtonPrefix": "Response language",
"userSettingsContextSizeButtonPrefix": "Context",
"userSettingsVoiceModeButtonPrefix": "Voice",
"userSettingsCreatorTierText": "Creator",
"userSettingsAdminTierText": "Admin",
"userSettingsUserTierText": "User",
"userSettingsSelectedPrefix": "✓ ",
"userSettingsContextSizeDefaultText": "Default",
"userSettingsVoiceModeExecuteText": "Run through AI",
"userSettingsVoiceModeTranscriptText": "Show transcript only",
"startingImageGenText": "🌈 Starting image generation...",
"imageGenText": "🌈 Generating image...",
"finalizingImageGenText": "🌈 Finalizing image generation...",
"botCannotMakeItselfAdminText": "The bot cannot make itself an admin",
"botCreatorAlreadyAdminText": "The bot creator is already an admin",
"botCannotRemoveItselfFromAdminsText": "The bot cannot remove itself from admins",
"botCreatorCannotStopBeingAdminText": "The bot creator cannot stop being an admin",
"botWillNotBanCreatorText": "The bot will not ban its creator.",
"botWillNotBanAdminsText": "The bot will not ban its administrators.",
"botIsNotBannedByItselfText": "The bot is not banned by itself anyway.",
"botCreatorNeverBannedText": "The bot creator is not banned and never will be.",
"botAdminsNotBannedText": "Bot administrators are not banned anyway.",
"botWillNotIgnoreItselfText": "The bot will not ignore itself.",
"botWillNotIgnoreCreatorText": "The bot will not ignore its creator.",
"botWillNotIgnoreAdminsText": "The bot will not ignore its administrators.",
"botIsNotIgnoredByItselfText": "The bot is not ignored by itself anyway.",
"botCreatorNotIgnoredText": "The bot creator is not ignored and never will be.",
"botAdminsNotIgnoredText": "Bot administrators are not ignored anyway.",
"botAlreadyAlwaysListensToItselfText": "The bot already always listens to itself",
"botAlwaysListensToCreatorText": "The bot always listens to its creator",
"coinHeadsText": "Heads",
"coinTailsText": "Tails",
"distortReplyInstructionText": "Reply with /distort to a message containing an image (photo, document, or sticker).\nExample: /distort 16 80",
"distortMissingImageText": "I do not see an image in the reply. Send a photo or image file.",
"shutdownFallbackText": "...",
"shutdownSequenceTexts": [
"well then, everyone",
"it was nice talking to you",
"but it is time for me to rest",
"all the best"
],
"shutdownDoneText": "*R.I.P*",
"whenNowText": "right now",
"whenNeverText": "never",
"whenYearUnitText": "year",
"whenDayUnitText": "day",
"whenWeekUnitText": "week",
"whenMonthUnitText": "month",
"whenHourUnitText": "hour",
"whenMinuteUnitText": "minute",
"whenSecondUnitText": "second",
"getCancelledText": "{provider}\n❌ Generation cancelled.",
"getPartialImageGenText": "🌈 Generating image ({iteration}/{total})...",
"getImageGenDoneText.withModel": "👨‍🎨 Image generated. Model: `{model}`.",
"getImageGenDoneText.default": "👨‍🎨 Image generated.",
"getErrorText.withReason": "{errorText} Reason:\n{reason}",
"getUseToolText.python": "👨‍💻 Running `Python`",
"getUseToolText.default": "🔧 Using tool `{name}`",
"getAnalyzingDocumentText.default": "🔍 Analyzing the document...",
"getAnalyzingDocumentText.single": "🔍 Analyzing document: `{name}`",
"getAnalyzingDocumentText.many": "🔍 Analyzing documents: {names}",
"getPreparingRAGText.default": "🔍 Preparing RAG for the document...",
"getPreparingRAGText.single": "🔍 Preparing RAG for document: `{name}`",
"getPreparingRAGText.many": "🔍 Preparing RAG for documents: {names}",
"getBuildingRAGIndexText.default": "🧠 Building RAG index...",
"getBuildingRAGIndexText.withModel": "🧠 Building RAG index: `{modelName}`.",
"queueNoneText": "none",
"getAiQueueText.queued": "⏳ Request to {provider} is queued.",
"getAiQueueText.ahead": "Requests ahead: {count}.",
"getTelegramFileTooLargeText": "File {fileName} is larger than {maxSizeMb} MB and cannot be sent.",
"getUserIsNowAdminText": "{name} is now an admin!",
"getUserAlreadyAdminText": "{name} is already an admin 🤔",
"getUserNoLongerAdminText": "{name} is no longer an admin!",
"getUserWasNotAdminText": "{name} was not an admin 🤔",
"getUserBannedText": "{name} banned 🚫",
"getUserBanFailedText": "Could not ban {name} ☹️",
"getUserUnbannedText": "{name} unbanned ⛓️‍💥",
"getUserUnbanFailedText": "Could not unban {name} ☹️",
"getUserIgnoredText": "{name} is muted! 🔇",
"getUserAlreadyIgnoredText": "{name} is already muted 🤔",
"getUserIgnoreFailedText": "Could not mute {name} ☹️",
"getUserUnignoredText": "{name} is no longer muted! 🔈",
"getUserWasNotIgnoredText": "{name} was not muted 🤔",
"getUserUnignoreFailedText": "Could not unmute {name} ☹️",
"getChoiceText": "Chose *{choice}*",
"getCoinResultText": "It landed on *{result}*",
"getLoadedModelsText": "Loaded models: {models}",
"getSelectedModelText": "Selected model: `{model}`",
"getCurrentModelText": "Current model: `{model}`",
"getLoadingModelText": "Loading model `{model}`...",
"getUserSettingsContextSizeText": "{size} tokens",
"getQrCodeTextTooLongText": "Text is too long for QR ({actualLength} characters). It will be trimmed to {maxLength} characters.",
"getQrCodeReadyText": "QR code ready ✅\nContent:\n<blockquote expandable>{content}</blockquote>",
"getQrCodeFailedText": "Could not generate QR: {reason}",
"getWhenPrefixText": "in ",
"getWhenPluralUnitText": "{unit}s",
"getWhenDurationText": "{prefix}{value} {unit}",
"commandDescriptions": {
"ae": "evaluation",
"adminsAdd": "Add user to admins",
"adminsRemove": "Remove user from admins",
"ban": "ban user from chat",
"choice": "Choose a random value",
"coin": "Heads or tails",
"debug": "Returns msg (or reply) as json",
"dice": "Sends random or specific dice",
"distort": "Distortion of picture",
"geminiChat": "Chat with AI (Gemini)",
"geminiGetModel": "Get current Gemini model",
"geminiListModels": "List all Gemini models",
"geminiSetModel": "Set Gemini model",
"help": "Show list of commands",
"id": "ID of chat, user and reply (if replied to any message)",
"ignore": "Bot will ignore user",
"info": "Info about bot",
"leave": "Bot will leave current chat",
"mistralChat": "Chat with AI (Mistral)",
"mistralGetModel": "Get current Mistral model",
"mistralListModels": "List all Mistral models",
"mistralSetModel": "Set Mistral model",
"ollamaChat": "Chat with AI (Ollama)",
"ollamaGetModel": "Get current Ollama model",
"ollamaListModels": "List all Ollama models",
"ollamaSearch": "Web search via Ollama",
"ollamaSetModel": "Set Ollama model",
"openAiChat": "Chat with AI (OpenAI)",
"openAiGetModel": "Get current OpenAI model",
"openAiListModels": "List all OpenAI models",
"openAiSetModel": "Set OpenAI model",
"ping": "Ping between received and sent message",
"qr": "Generates QR-code from text you sent or replied to.",
"quote": "Make quote from text (or quote)",
"randomInt": "Ranged random integer from parameters",
"randomString": "literally random string (up to 4096 symbols)",
"settings": "User settings",
"shutdown": "Self-destruction sequence for bot (shutdown)",
"speechToText": "Transcribe speech to text",
"start": "Start the bot",
"systemInfo": "System information",
"textToSpeech": "Generate speech from text",
"title": "Change group title",
"test": "System functionality check",
"transliteration": "Transliteration EN <--> RU",
"unban": "unban user from chat",
"unignore": "Bot will start responding to the user",
"uptime": "Bot's uptime",
"whatBetter": "either a or b randomly (50% chance)",
"when": "random date"
}
}