diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index b622901be2..9b7640d48f 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -22,34 +22,34 @@ "disabled": "Отключено", "active": "Активный", "inactive": "Неактивный", - "noData": "Нет доступных данных", - "nothingHere": "Nothing here yet", + "noData": "Нет данных", + "nothingHere": "Здесь пока ничего нет", "configure": "Настроить", - "manage": "Управление", + "manage": "Управлять", "name": "Имя", "actions": "Действия", "status": "Статус", "type": "Тип", "model": "Модель", "models": "модели", - "provider": "Поставщик", + "provider": "Провайдер", "account": "Аккаунт", "time": "Время", - "details": "Подробности", + "details": "Подробнее", "created": "Создано", "lastUsed": "Последнее обновление", - "loadMore": "Загрузить больше", - "noResults": "Результаты не найдены", + "loadMore": "Загрузить ещё", + "noResults": "Ничего не найдено", "reloadPage": "Обновить страницу", "connected": "Подключено", "disconnected": "Отключено", "notConfigured": "Не настроено", - "testConnection": "Тестовое соединение", + "testConnection": "Проверить подключение", "enable": "Включить", "disable": "Отключить", - "columns": "Столбцы", - "newest": "Новейший", - "oldest": "Самый старый", + "columns": "Колонки", + "newest": "Новые", + "oldest": "Старые", "all": "Все", "none": "Нет", "yes": "Да", @@ -57,7 +57,7 @@ "warning": "Предупреждение", "note": "Примечание", "free": "Бесплатно", - "skipToContent": "Перейти к содержимому", + "skipToContent": "Перейти к содержанию", "maintenanceServerIssues": "На сервере возникли проблемы. Некоторые функции могут быть недоступны.", "maintenanceServerUnreachable": "Сервер недоступен. Повторное подключение...", "accept": "accept", @@ -110,7 +110,7 @@ "oauth": "oauth", "auth_token": "auth_token", "crypto": "crypto", - "hours": "hours", + "hours": "часы", "selfsigned": "selfsigned", "proxy_id": "proxy_id", "proxyId": "proxyId", @@ -138,51 +138,51 @@ "Failed to reset pricing": "Не удалось сбросить цены.", "apikey": "API-ключ", "http": "HTTP", - "goToDashboard": "Go to Dashboard", - "checkSystemStatus": "Check System Status", - "selectModel": "Select Model", + "goToDashboard": "Перейти на главную", + "checkSystemStatus": "Проверить состояние системы", + "selectModel": "Выберите модель", "combos": "Combos", - "noModelsFound": "No models found", - "clear": "Clear", - "done": "Done", - "errorOccurred": "Error Occurred", + "noModelsFound": "Модели не найдены", + "clear": "Очистить", + "done": "Готово", + "errorOccurred": "Произошла ошибка", "comboDeleted": "Combo Deleted", - "hide": "Hide", - "creating": "Creating", + "hide": "Скрыть", + "creating": "Создание...", "comboCreated": "Combo Created", - "swapFormats": "Swap Formats", - "daysAgo": "Days Ago", - "retries": "Retries", + "swapFormats": "Поменять форматы", + "daysAgo": "дней назад", + "retries": "Повторы", "errorDuringRestore": "Error During Restore", "eventsAppearHint": "Events Appear Hint", "noLockouts": "No Lockouts", "webSearchDesc": "Web Search Desc", "audioProvidersHeading": "Audio Providers Heading", - "cloudAgentProviders": "__MISSING__:Cloud Agent Providers", - "minutesAgo": "Minutes Ago", + "cloudAgentProviders": "Провайдеры облачных агентов", + "minutesAgo": "минут назад", "a": "A", - "liveAutoRefreshing": "Live Auto Refreshing", - "webSearch": "Web Search", + "liveAutoRefreshing": "Автообновление", + "webSearch": "Поиск в интернете", "anthropicPrefixPlaceholder": "Anthropic Prefix Placeholder", - "addModelToCombo": "Add Model To Combo", - "failedToLoad": "Failed To Load", + "addModelToCombo": "Добавить модель в комбо", + "failedToLoad": "Не удалось загрузить", "categoryMedia": "Category Media", "enableCloud": "Enable Cloud", "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon", - "retry": "Retry", + "retry": "Повторить", "embeddings": "Embeddings", - "errorCount": "Error Count", + "errorCount": "Количество ошибок", "backupReasonManual": "Backup Reason Manual", "safeSearchModerate": "Safe Search Moderate", - "activeLimiters": "Active Limiters", + "activeLimiters": "Активные лимитеры", "a2aCardTitle": "A2A Card Title", "cloudWorkerUnreachable": "Cloud Worker Unreachable", - "testFailed": "Test Failed", + "testFailed": "Тест не пройден", "compatibleBaseUrlHint": "Compatible Base Url Hint", - "usageTracking": "Usage Tracking", + "usageTracking": "Отслеживание использования", "disableCloudTitle": "Disable Cloud Title", - "noConnections": "No Connections", - "providerHealth": "Provider Health", + "noConnections": "Нет подключений", + "providerHealth": "Здоровье провайдера", "confirmDbImport": "Confirm Db Import", "notAvailableSymbol": "Not Available Symbol", "backupsAvailable": "Backups Available", @@ -190,30 +190,30 @@ "newProviderNamePlaceholder": "New Provider Name Placeholder", "a2aQuickStartStep2": "A2A Quick Start Step2", "ok": "Ok", - "available": "Available", - "noBackupYet": "No Backup Yet", - "more": "More", + "available": "Доступно", + "noBackupYet": "Резервных копий пока нет", + "more": "Ещё", "noCompatibleYet": "No Compatible Yet", "multiProvider": "Multi Provider", "repairEnvHint": "Repair Env Hint", "disablingCloud": "Disabling Cloud", "testBench": "Test Bench", - "valid": "Valid", + "valid": "Действителен", "cloudBenefitShare": "Cloud Benefit Share", "mcpCardTitle": "Mcp Card Title", "disableConfirm": "Disable Confirm", - "filters": "Filters", + "filters": "Фильтры", "expirationBannerExpiredDesc": "Expiration Banner Expired Desc", "saveComboDefaults": "Save Combo Defaults", "cloudConnectedVerified": "Cloud Connected Verified", - "uptime": "Uptime", + "uptime": "Время работы", "compatibleProdPlaceholder": "Compatible Prod Placeholder", "fallbackChainsTitle": "Fallback Chains Title", "oauthLabel": "Oauth Label", "a2aCardDescription": "A2A Card Description", "okShort": "Ok Short", - "maintenance": "Maintenance", - "formatConverter": "Format Converter", + "maintenance": "Обслуживание", + "formatConverter": "Конвертер форматов", "zedImportNetworkError": "Zed Import Network Error", "apiKeyLabel": "Api Key Label", "noModelsForProvider": "No Models For Provider", @@ -221,26 +221,26 @@ "apiTypeLabel": "Api Type Label", "configuredProvidersLabel": "Configured Providers Label", "maxRetriesLabel": "Max Retries Label", - "title": "Title", - "output": "Output", + "title": "Название", + "output": "Вывод", "prefixHint": "Prefix Hint", "skipWizard": "Skip Wizard", - "failedCount": "Failed Count", + "failedCount": "Неудачных", "confirmDbImportDesc": "Confirm Db Import Desc", - "entries": "Entries", - "until": "Until", + "entries": "Записей", + "until": "До", "disableCombo": "Disable Combo", "liveMonitorDescriptionPrefix": "Live Monitor Description Prefix", - "runningCount": "Running Count", + "runningCount": "Активных", "noActiveConnectionsInGroup": "No Active Connections In Group", - "savedSuccessfully": "Saved Successfully", + "savedSuccessfully": "Успешно сохранено", "systemStorage": "System Storage", "videoDesc": "Video Desc", - "maxResults": "Max Results", + "maxResults": "Макс. результатов", "timeRangeMonth": "Time Range Month", - "testSummary": "Test Summary", + "testSummary": "Сводка теста", "failedSetPassword": "Failed Set Password", - "audio": "Audio", + "audio": "Аудио", "restore": "Restore", "disableWarning": "Disable Warning", "moderationsDesc": "Moderations Desc", @@ -309,7 +309,7 @@ "testDesc": "Test Desc", "chatDesc": "Chat Desc", "importSuccess": "Import Success", - "chat": "Chat", + "chat": "Чат", "a2aQuickStartStep1": "A2A Quick Start Step1", "importFailed": "Import Failed", "inputPlaceholder": "Input Placeholder", @@ -365,10 +365,10 @@ "apiKeyForCheck": "Api Key For Check", "cloudRequestTimeout": "Cloud Request Timeout", "showConfiguredOnly": "Show Configured Only", - "showFreeOnly": "__MISSING__:Free only", - "addFirstProvider": "__MISSING__:Add your first provider", - "addFirstProviderDesc": "__MISSING__:Connect an AI provider to start routing requests through OmniRoute. You can use free providers, API keys, or OAuth accounts.", - "learnMore": "__MISSING__:Learn more", + "showFreeOnly": "Только бесплатные", + "addFirstProvider": "Добавьте первого провайдера", + "addFirstProviderDesc": "Подключите AI-провайдера, чтобы начать маршрутизировать запросы через OmniRoute", + "learnMore": "Узнать больше", "includeDomains": "Include Domains", "promptCache": "Prompt Cache", "cloudConnected": "Cloud Connected", @@ -452,7 +452,7 @@ "chatPathHint": "Chat Path Hint", "defaultStrategyDesc": "Default Strategy Desc", "latencyP95": "Latency P95", - "textToSpeech": "Text To Speech", + "textToSpeech": "Озвучивание текста", "searchType": "Search Type", "messages": "Messages", "aggregatorsGateways": "Aggregators Gateways", @@ -598,9 +598,9 @@ "syncingData": "Syncing Data", "cloudBenefitPorts": "Cloud Benefit Ports", "compatibleProviders": "Compatible Providers", - "freeTierProviders": "__MISSING__:Free Tier Providers", - "freeTierLabel": "__MISSING__:Free tier available", - "freeTierProvidersDesc": "__MISSING__:Providers with free tiers — some require an API key signup, others need no credentials at all.", + "freeTierProviders": "Бесплатные провайдеры", + "freeTierLabel": "Бесплатно", + "freeTierProvidersDesc": "Провайдеры с бесплатным доступом", "clearCache": "Clear Cache", "reqs": "Reqs", "addAnthropicCompatible": "Add Anthropic Compatible", @@ -622,7 +622,7 @@ "whatYouGet": "What You Get", "signatureSession": "Signature Session", "errorCountNoCode": "Error Count No Code", - "testing": "Testing", + "testing": "Тестирование...", "providersCommaSeparated": "Providers Comma Separated", "exportDatabase": "Export Database", "hitRate": "Hit Rate", @@ -657,55 +657,95 @@ "learnedFromHeaders": "Learned From Headers", "totalRequests": "Total Requests", "cloudUnstableNote": "Cloud Unstable Note", - "gamificationAdmin": "__MISSING__:Gamification Admin", - "monitorAnomaliesAndHealth": "__MISSING__:Monitor anomalies and system health", - "flaggedAnomalies": "__MISSING__:Flagged Anomalies", - "noAnomaliesDetected": "__MISSING__:No anomalies detected", - "apiKey": "__MISSING__:API Key", - "xpLastHour": "__MISSING__:XP (1h)", - "zScore": "__MISSING__:Z-Score", - "tokensCommunityServers": "__MISSING__:Community Servers", - "tokensServerNamePlaceholder": "__MISSING__:Server name", - "tokensApiKeyPlaceholder": "__MISSING__:API key", - "tokensTokenBalance": "__MISSING__:Token Balance", - "tokensSendTokens": "__MISSING__:Send Tokens", - "tokensRecipientApiKeyId": "__MISSING__:Recipient API Key ID", - "tokensRecipientApiKeyIdPlaceholder": "__MISSING__:Enter recipient API key ID", - "tokensReasonOptional": "__MISSING__:Reason (optional)", - "tokensReasonPlaceholder": "__MISSING__:e.g. bonus, reward", - "tokensTransactionHistory": "__MISSING__:Transaction History", - "tokensNoTransactionsYet": "__MISSING__:No transactions yet", - "tokensInviteCodes": "__MISSING__:Invite Codes", - "tokensMaxUses": "__MISSING__:Max Uses", - "tokensRedeemCode": "__MISSING__:Redeem Code", - "tokensRedeemCodePlaceholder": "__MISSING__:Enter invite code", - "tokensYourActiveInvites": "__MISSING__:Your Active Invites", - "tierCoverageTitle": "__MISSING__:Tier coverage", - "tierCoverageSubtitle": "__MISSING__:Providers configured per fallback tier", - "batchDetailCopyId": "__MISSING__:Copy ID", - "batchDetailClose": "__MISSING__:Close", - "batchDetailEndpoint": "__MISSING__:Endpoint", - "batchDetailModel": "__MISSING__:Model", - "batchDetailWindow": "__MISSING__:Window", - "batchDetailCreated": "__MISSING__:Created", - "providerTopologyEmpty": "__MISSING__:No providers connected yet", - "badgeToastUnlocked": "__MISSING__:Badge Unlocked!", - "batchListSearchPlaceholder": "__MISSING__:Search by ID, endpoint, model…", - "batchListDeleteAllCompletedTitle": "__MISSING__:Delete all completed batches", - "batchListBatchesTable": "__MISSING__:Batches", - "changelogViewerLoading": "__MISSING__:Loading changelog from GitHub...", - "profileLoading": "__MISSING__:Loading profile...", - "profileHowToEarn": "__MISSING__:How to earn", - "bootstrapBannerDismiss": "__MISSING__:Dismiss", - "batchListDeleteBatchTitle": "__MISSING__:Delete batch and its files", - "leaderboardYourRank": "__MISSING__:Your Rank", - "leaderboardLoading": "__MISSING__:Loading leaderboard...", - "batchFileDetailCopyId": "__MISSING__:Copy ID", - "batchFileDetailClose": "__MISSING__:Close", - "batchFileDetailFailedToLoad": "__MISSING__:Failed to load file contents", - "batchFilesListSearchPlaceholder": "__MISSING__:Search by ID or filename…", - "batchFilesListFilesTable": "__MISSING__:Files", - "batchPageLoadingMore": "__MISSING__:Loading more…" + "gamificationAdmin": "Геймификация", + "monitorAnomaliesAndHealth": "Monitor anomalies and system health", + "flaggedAnomalies": "Flagged Anomalies", + "noAnomaliesDetected": "No anomalies detected", + "apiKey": "Ключ API", + "xpLastHour": "Опыт за час", + "zScore": "Z-оценка", + "tokensCommunityServers": "Серверы сообщества", + "tokensServerNamePlaceholder": "Название сервера", + "tokensApiKeyPlaceholder": "ID ключа API", + "tokensTokenBalance": "Баланс токенов", + "tokensSendTokens": "Отправить токены", + "tokensRecipientApiKeyId": "ID ключа получателя", + "tokensRecipientApiKeyIdPlaceholder": "Вставьте ID ключа API получателя", + "tokensReasonOptional": "Причина (необязательно)", + "tokensReasonPlaceholder": "Назначение перевода", + "tokensTransactionHistory": "История транзакций", + "tokensNoTransactionsYet": "Транзакций пока нет", + "tokensInviteCodes": "Коды приглашений", + "tokensMaxUses": "Макс. использований", + "tokensRedeemCode": "Активировать код", + "tokensRedeemCodePlaceholder": "Введите код", + "tokensYourActiveInvites": "Ваши активные приглашения", + "tierCoverageTitle": "Покрытие тарифов", + "tierCoverageSubtitle": "Распределение провайдеров по тарифам", + "batchDetailCopyId": "Копировать ID", + "batchDetailClose": "Закрыть", + "batchDetailEndpoint": "Эндпоинт", + "batchDetailModel": "Модель", + "batchDetailWindow": "Window", + "batchDetailCreated": "Создано", + "providerTopologyEmpty": "Провайдеры не настроены", + "badgeToastUnlocked": "Badge Unlocked!", + "batchListSearchPlaceholder": "Поиск пакетов...", + "batchListDeleteAllCompletedTitle": "Удалить все завершённые", + "batchListBatchesTable": "Таблица пакетов", + "changelogViewerLoading": "Загрузка изменений...", + "profileLoading": "Loading profile...", + "profileHowToEarn": "How to earn", + "bootstrapBannerDismiss": "Dismiss", + "batchListDeleteBatchTitle": "Delete batch and its files", + "leaderboardYourRank": "Ваше место", + "leaderboardLoading": "Загрузка рейтинга...", + "batchFileDetailCopyId": "Копировать ID", + "batchFileDetailClose": "Закрыть", + "batchFileDetailFailedToLoad": "Не удалось загрузить файл", + "batchFilesListSearchPlaceholder": "Поиск файлов...", + "batchFilesListFilesTable": "Таблица файлов", + "batchPageLoadingMore": "Загрузка...", + "default": "По умолчанию", + "video": "Видео", + "speech": "Речь", + "fastest": "Самый быстрый", + "record": "Запись", + "searchEngine": "Поисковая система", + "userAgent": "User-Agent", + "sync": "Синхронизация", + "healthCheck": "Проверка здоровья", + "mcpServer": "MCP-сервер", + "timeout": "Тайм-аут", + "parameters": "Параметры", + "codeInterpreter": "Интерпретатор кода", + "fileSearch": "Поиск файлов", + "functionCall": "Вызов функции", + "enableAutoRouting": "Включить автоматическую маршрутизацию", + "autoRouting": "Автомаршрутизация", + "autoRoutingDesc": "Автоматически выбирает лучшего провайдера для каждого запроса", + "objectDetection": "Обнаружение объектов", + "backgroundRemoval": "Удаление фона", + "temporaryChat": "Временный чат", + "tokenConsumption": "Потребление токенов", + "avg": "Среднее", + "total": "Всего", + "p50": "p50", + "p95": "p95", + "p99": "p99", + "minutes": "минуты", + "days": "дни", + "enableStreaming": "Включить потоковую передачу", + "download": "Скачать", + "upload": "Загрузить", + "preview": "Предпросмотр", + "incoming": "Входящие", + "outgoing": "Исходящие", + "requestMethod": "Метод запроса", + "requestUrl": "URL запроса", + "responseTime": "Время ответа", + "responseStatus": "Статус ответа", + "charset": "Кодировка" }, "sidebar": { "home": "Главная", @@ -725,24 +765,24 @@ "playground": "Площадка", "searchTools": "Инструменты поиска", "agents": "Агенты", - "cloudAgents": "__MISSING__:Cloud Agents", + "cloudAgents": "Cloud Agents", "memory": "Память", "skills": "Навыки", - "omniSkills": "__MISSING__:OmniSkills", - "agentSkills": "__MISSING__:AgentSkills", + "omniSkills": "OmniSkills", + "agentSkills": "AgentSkills", "docs": "Документы", "issues": "Проблемы", "endpoints": "Конечные точки", - "endpointsSubtitle": "__MISSING__:Your AI connection URLs", + "endpointsSubtitle": "URL-адреса для подключения к AI", "apiManager": "Менеджер API", - "apiManagerSubtitle": "__MISSING__:Manage API keys and access", + "apiManagerSubtitle": "Управление ключами API и доступом", "logs": "Журналы", - "webhooks": "__MISSING__:Webhooks", - "webhooksSubtitle": "__MISSING__:Get notified of events", - "combosSubtitle": "__MISSING__:Group providers for failover", - "batchSubtitle": "__MISSING__:Process multiple requests", - "contextCavemanSubtitle": "__MISSING__:Prompt compression", - "contextRtkSubtitle": "__MISSING__:Output filtering", + "webhooks": "Вебхуки", + "webhooksSubtitle": "Уведомления о событиях системы", + "combosSubtitle": "Группировка провайдеров для отказоустойчивости", + "batchSubtitle": "Пакетная обработка запросов", + "contextCavemanSubtitle": "Сжатие промптов", + "contextRtkSubtitle": "Фильтрация вывода", "auditLog": "Журнал аудита", "shutdown": "Выключить", "restart": "Перезапуск", @@ -775,261 +815,261 @@ "cliToolsShort": "Инструменты", "cache": "Кэш", "cacheShort": "Кэш", - "batch": "Batch Jobs", - "themeSystem": "Theme System", - "whitelabelingDesc": "Whitelabeling Desc", - "switchThemes": "Switch Themes", - "themeAccentDesc": "Theme Accent Desc", - "uploadFavicon": "Upload Favicon", - "themeDark": "Theme Dark", - "customLogoDesc": "Custom Logo Desc", - "sidebarVisibilityToggle": "Sidebar Visibility Toggle", - "themeAccent": "Theme Accent", - "resetFavicon": "Reset Favicon", - "whitelabeling": "Whitelabeling", - "darkMode": "Dark Mode", - "uploadLogo": "Upload Logo", - "themeLight": "Theme Light", - "appName": "App Name", - "appNameDesc": "App Name Desc", - "resetLogo": "Reset Logo", - "customFavicon": "Custom Favicon", - "hideHealthLogs": "Hide Health Logs", - "customLogo": "Custom Logo", - "appearance": "Appearance", - "themeSelectionAria": "Theme Selection Aria", - "themeCreate": "Theme Create", - "customFaviconDesc": "Custom Favicon Desc", - "logoPreview": "Logo Preview", - "themeCustom": "Theme Custom", - "hideHealthLogsDesc": "Hide Health Logs Desc", - "faviconPreview": "Favicon Preview", - "changelog": "Changelog", - "contextSection": "Context & Cache", + "batch": "Пакетные задания", + "themeSystem": "Системная тема", + "whitelabelingDesc": "Настройка брендирования", + "switchThemes": "Переключить тему", + "themeAccentDesc": "Цвет акцента интерфейса", + "uploadFavicon": "Загрузить иконку", + "themeDark": "Тёмная", + "customLogoDesc": "Загрузите свой логотип", + "sidebarVisibilityToggle": "Показать/скрыть боковую панель", + "themeAccent": "Акцентный цвет", + "resetFavicon": "Сбросить иконку", + "whitelabeling": "Белый лейбл", + "darkMode": "Тёмный режим", + "uploadLogo": "Загрузить логотип", + "themeLight": "Светлая", + "appName": "Название приложения", + "appNameDesc": "Отображаемое название приложения", + "resetLogo": "Сбросить логотип", + "customFavicon": "Своя иконка", + "hideHealthLogs": "Скрыть логи здоровья", + "customLogo": "Свой логотип", + "appearance": "Оформление", + "themeSelectionAria": "Выбор темы оформления", + "themeCreate": "Создать тему", + "customFaviconDesc": "Загрузите свою иконку сайта", + "logoPreview": "Предпросмотр логотипа", + "themeCustom": "Пользовательская", + "hideHealthLogsDesc": "Скрыть сообщения о проверке здоровья провайдеров", + "faviconPreview": "Предпросмотр иконки", + "changelog": "Что нового", + "contextSection": "Контекст и кэш", "contextCaveman": "Caveman", "contextRtk": "RTK", - "contextCombos": "Engine Combos", - "routingSection": "Routing", - "protocolsSection": "Protocols", - "agentsAiSection": "Agents & AI", - "cacheContextSection": "Cache & Context", - "analyticsSection": "Analytics", - "costsSection": "Costs", - "monitoringSection": "Monitoring", - "auditSecuritySection": "Audit & Security", - "devtoolsSection": "Dev Tools", - "configurationSection": "Configuration", - "aiFeaturesSection": "AI Features", + "contextCombos": "Комбинации движков", + "routingSection": "Маршрутизация", + "protocolsSection": "Протоколы", + "agentsAiSection": "Агенты и AI", + "cacheContextSection": "Кэш и контекст", + "analyticsSection": "Аналитика", + "costsSection": "Затраты", + "monitoringSection": "Мониторинг", + "auditSecuritySection": "Аудит и безопасность", + "devtoolsSection": "Инструменты разработчика", + "configurationSection": "Конфигурация", + "aiFeaturesSection": "AI-возможности", "mcp": "MCP", "a2a": "A2A", - "apiEndpoints": "API Endpoints", - "batchFiles": "Files", - "analyticsEvals": "Evals", - "analyticsSearch": "Search", - "analyticsUtilization": "Utilization", - "analyticsComboHealth": "Combo Health", - "analyticsCompression": "Compression", - "costsBudget": "Budget", - "costsQuotaShare": "Quota Sharing", - "costsPricing": "Pricing", - "logsProxy": "Proxy Logs", - "logsConsole": "Console", - "logsActivity": "Activity", - "auditMcp": "MCP Audit", - "auditA2a": "__MISSING__:A2A Audit", - "settingsGeneral": "General", - "settingsAppearance": "Appearance", - "settingsAi": "AI Settings", - "settingsSecurity": "Security", - "settingsFeatureFlags": "__MISSING__:Feature Flags", - "settingsRouting": "Routing", - "settingsResilience": "Resilience", - "settingsAdvanced": "Advanced", + "apiEndpoints": "API-эндпоинты", + "batchFiles": "Файлы", + "analyticsEvals": "Тестирование", + "analyticsSearch": "Поиск", + "analyticsUtilization": "Загрузка", + "analyticsComboHealth": "Здоровье комбо", + "analyticsCompression": "Сжатие", + "costsBudget": "Бюджет", + "costsQuotaShare": "Общие квоты", + "costsPricing": "Цены", + "logsProxy": "Логи прокси", + "logsConsole": "Консоль", + "logsActivity": "Активность", + "auditMcp": "MCP аудит", + "auditA2a": "A2A Аудит", + "settingsGeneral": "Основные", + "settingsAppearance": "Оформление", + "settingsAi": "Настройки AI", + "settingsSecurity": "Безопасность", + "settingsFeatureFlags": "Функциональные флаги", + "settingsRouting": "Маршрутизация", + "settingsResilience": "Отказоустойчивость", + "settingsAdvanced": "Продвинутые", "omniProxySection": "OmniProxy", "quotaTracker": "Provider Quota", - "providerQuota": "Provider Quota", + "providerQuota": "Квоты провайдеров", "runtime": "Runtime", - "consoleLogs": "Console Logs", - "globalRouting": "Global Routing", - "mitmProxy": "MITM Proxy", + "consoleLogs": "Консоль", + "globalRouting": "Глобальная маршрутизация", + "mitmProxy": "MITM-прокси", "oneProxy": "1Proxy", - "agenticFeaturesSection": "Agentic Features", - "otherFeaturesSection": "Other Features", - "compressionContextGroup": "Compression Context", - "toolsGroup": "Tools", - "integrationsGroup": "Integrations", - "proxyGroup": "Proxy", - "costsParametersGroup": "Costs Parameters", - "auditGroup": "Audit", - "batchGroup": "Batch", - "homeSubtitle": "Dashboard overview", - "providersSubtitle": "Manage AI providers", - "quotaTrackerSubtitle": "Track usage limits", - "providerQuotaSubtitle": "Track provider usage limits", - "runtimeSubtitle": "Realtime resilience & sessions", - "contextCombosSubtitle": "Combine compression engines", - "cliToolsSubtitle": "Configure CLI runtimes", - "agentsSubtitle": "Manage local agents", - "cloudAgentsSubtitle": "Manage cloud-based agents", - "apiEndpointsSubtitle": "Expose custom endpoints", - "proxySubtitle": "HTTP proxy settings", - "mitmProxySubtitle": "MITM interception", - "oneProxySubtitle": "Public proxy gateway", - "usageSubtitle": "Traffic and usage stats", - "analyticsComboHealthSubtitle": "Combo target reliability", - "analyticsUtilizationSubtitle": "Provider utilization", - "costsSubtitle": "Spend breakdown", - "cacheSubtitle": "Cache hit rates", - "analyticsCompressionSubtitle": "Token savings stats", - "analyticsSearchSubtitle": "Search tool analytics", - "analyticsEvalsSubtitle": "Eval suite results", - "logsSubtitle": "Application logs", - "logsProxySubtitle": "Proxy traffic logs", - "consoleLogsSubtitle": "Console output", - "logsActivitySubtitle": "User activity log", - "healthSubtitle": "System health check", - "costsPricingSubtitle": "Per-model pricing rules", - "costsBudgetSubtitle": "Budget limits", - "costsQuotaShareSubtitle": "Share provider quotas across keys", - "auditLogSubtitle": "Authorization audit", - "auditMcpSubtitle": "MCP server audit", - "auditA2aSubtitle": "A2A protocol audit", - "translatorSubtitle": "Format conversion", - "playgroundSubtitle": "Test prompts live", - "searchToolsSubtitle": "Search tool registry", - "memorySubtitle": "Persistent agent memory", - "omniSkillsSubtitle": "Sandbox skill registry", - "agentSkillsSubtitle": "A2A skill registry", - "mcpSubtitle": "MCP server controls", - "a2aSubtitle": "A2A protocol server", - "mediaSubtitle": "Cached media files", - "batchFilesSubtitle": "Batch input/output files", - "settingsSubtitle": "All settings", - "settingsGeneralSubtitle": "App basics", - "settingsAppearanceSubtitle": "Theme and layout", - "settingsAiSubtitle": "AI behavior defaults", - "globalRoutingSubtitle": "Global routing rules", - "settingsResilienceSubtitle": "Retries and breakers", - "settingsAdvancedSubtitle": "Power user options", - "settingsSecuritySubtitle": "Auth and encryption", - "settingsFeatureFlagsSubtitle": "__MISSING__:Toggle system capabilities", - "docsSubtitle": "Documentation", - "issuesSubtitle": "Report a bug", - "changelogSubtitle": "Release notes" + "agenticFeaturesSection": "Агентные возможности", + "otherFeaturesSection": "Прочие возможности", + "compressionContextGroup": "Сжатие контекста", + "toolsGroup": "Инструменты", + "integrationsGroup": "Интеграции", + "proxyGroup": "Прокси", + "costsParametersGroup": "Параметры затрат", + "auditGroup": "Аудит", + "batchGroup": "Пакетная обработка", + "homeSubtitle": "Обзор панели управления", + "providersSubtitle": "Управление провайдерами AI", + "quotaTrackerSubtitle": "Отслеживание лимитов", + "providerQuotaSubtitle": "Квоты провайдеров", + "runtimeSubtitle": "Мониторинг отказоустойчивости в реальном времени", + "contextCombosSubtitle": "Комбинация движков сжатия", + "cliToolsSubtitle": "Настройка CLI-инструментов", + "agentsSubtitle": "Локальные AI-агенты", + "cloudAgentsSubtitle": "Облачные AI-агенты", + "apiEndpointsSubtitle": "Создание собственных эндпоинтов", + "proxySubtitle": "Настройки HTTP-прокси", + "mitmProxySubtitle": "MITM-перехват трафика", + "oneProxySubtitle": "Публичный прокси-шлюз", + "usageSubtitle": "Статистика трафика", + "analyticsComboHealthSubtitle": "Надёжность целей комбо", + "analyticsUtilizationSubtitle": "Загрузка провайдеров", + "costsSubtitle": "Детализация расходов", + "cacheSubtitle": "Попадания в кэш", + "analyticsCompressionSubtitle": "Экономия токенов", + "analyticsSearchSubtitle": "Аналитика поисковых инструментов", + "analyticsEvalsSubtitle": "Результаты тестов", + "logsSubtitle": "Логи приложения", + "logsProxySubtitle": "Логи прокси-трафика", + "consoleLogsSubtitle": "Вывод консоли", + "logsActivitySubtitle": "Журнал действий пользователей", + "healthSubtitle": "Проверка состояния системы", + "costsPricingSubtitle": "Цены на модели", + "costsBudgetSubtitle": "Бюджетные лимиты", + "costsQuotaShareSubtitle": "Общие квоты между ключами", + "auditLogSubtitle": "Аудит авторизации", + "auditMcpSubtitle": "Аудит MCP-сервера", + "auditA2aSubtitle": "Аудит A2A-протокола", + "translatorSubtitle": "Конвертация форматов", + "playgroundSubtitle": "Тестирование промптов в реальном времени", + "searchToolsSubtitle": "Реестр поисковых инструментов", + "memorySubtitle": "Постоянная память агента", + "omniSkillsSubtitle": "Песочница навыков", + "agentSkillsSubtitle": "Реестр A2A-навыков", + "mcpSubtitle": "Управление MCP-сервером", + "a2aSubtitle": "A2A-протокол", + "mediaSubtitle": "Кэшированные медиафайлы", + "batchFilesSubtitle": "Входные и выходные файлы", + "settingsSubtitle": "Все настройки", + "settingsGeneralSubtitle": "Базовые настройки", + "settingsAppearanceSubtitle": "Тема и расположение", + "settingsAiSubtitle": "Поведение AI по умолчанию", + "globalRoutingSubtitle": "Глобальные правила маршрутизации", + "settingsResilienceSubtitle": "Повторы и автоматические выключатели", + "settingsAdvancedSubtitle": "Настройки для опытных пользователей", + "settingsSecuritySubtitle": "Аутентификация и шифрование", + "settingsFeatureFlagsSubtitle": "Включение и отключение возможностей системы", + "docsSubtitle": "Документация", + "issuesSubtitle": "Сообщить об ошибке", + "changelogSubtitle": "Заметки о релизах" }, "webhooks": { - "title": "__MISSING__:Webhooks", - "description": "__MISSING__:Configure HTTP callbacks for system events.", - "configuredWebhooks": "__MISSING__:Configured Webhooks", - "configuredWebhooksDesc": "__MISSING__:Manage delivery endpoints, subscribed events, status, and test sends.", - "addWebhook": "__MISSING__:Add Webhook", - "editWebhook": "__MISSING__:Edit Webhook", - "name": "__MISSING__:Name", - "namePlaceholder": "__MISSING__:Production monitoring", - "unnamedWebhook": "__MISSING__:Unnamed webhook", - "url": "__MISSING__:Endpoint URL", - "events": "__MISSING__:Events", - "allEvents": "__MISSING__:All events", - "secret": "__MISSING__:Secret", - "secretPlaceholder": "__MISSING__:Leave blank to auto-generate a secret", - "secretEditPlaceholder": "__MISSING__:Leave blank to keep the current secret", - "status": "__MISSING__:Status", - "active": "__MISSING__:Active", - "inactive": "__MISSING__:Inactive", - "errored": "__MISSING__:Errored", - "total": "__MISSING__:Total", - "lastTriggered": "__MISSING__:Last Triggered", - "actions": "__MISSING__:Actions", - "enabled": "__MISSING__:Enabled", - "enabledDesc": "__MISSING__:Disabled webhooks remain saved but do not receive deliveries.", - "refresh": "__MISSING__:Refresh", - "loading": "__MISSING__:Loading webhooks...", - "never": "__MISSING__:Never", - "failureCount": "__MISSING__:{count, plural, =0 {no failures} one {# failure} other {# failures}}", - "testWebhook": "__MISSING__:Send Test", - "testSuccess": "__MISSING__:Test webhook sent successfully.", - "testFailed": "__MISSING__:Test webhook failed.", - "saveSuccess": "__MISSING__:Webhook saved successfully.", - "saveFailed": "__MISSING__:Failed to save webhook.", - "loadFailed": "__MISSING__:Failed to load webhooks.", - "delete": "__MISSING__:Delete", - "deleteConfirm": "__MISSING__:Are you sure you want to delete this webhook?", - "deleteSuccess": "__MISSING__:Webhook deleted successfully.", - "deleteFailed": "__MISSING__:Failed to delete webhook.", - "edit": "__MISSING__:Edit", - "enable": "__MISSING__:Enable", - "disable": "__MISSING__:Disable", - "noWebhooks": "__MISSING__:No webhooks configured yet.", - "signatureTitle": "__MISSING__:Webhook Signatures", - "signatureDescription": "__MISSING__:Each delivery includes an X-Webhook-Signature header signed with HMAC-SHA256 using the webhook secret. Verify the signature before trusting the payload." + "title": "Вебхуки", + "description": "HTTP-уведомления о событиях системы", + "configuredWebhooks": "Настроенные вебхуки", + "configuredWebhooksDesc": "Управление эндпоинтами, подписками на события и статусом доставки", + "addWebhook": "Добавить вебхук", + "editWebhook": "Редактировать вебхук", + "name": "Название", + "namePlaceholder": "Мой вебхук", + "unnamedWebhook": "Безымянный вебхук", + "url": "URL", + "events": "События", + "allEvents": "Все события", + "secret": "Секрет", + "secretPlaceholder": "Оставьте пустым для автогенерации", + "secretEditPlaceholder": "Оставьте пустым, чтобы не менять", + "status": "Статус", + "active": "Активен", + "inactive": "Неактивен", + "errored": "Ошибка", + "total": "Всего", + "lastTriggered": "Последний вызов", + "actions": "Действия", + "enabled": "Включён", + "enabledDesc": "Включить отправку уведомлений на этот эндпоинт", + "refresh": "Обновить", + "loading": "Загрузка...", + "never": "Никогда", + "failureCount": "Количество ошибок", + "testWebhook": "Тестовый запрос", + "testSuccess": "Тестовый запрос отправлен", + "testFailed": "Тестовый запрос не удался", + "saveSuccess": "Вебхук сохранён", + "saveFailed": "Не удалось сохранить вебхук", + "loadFailed": "Не удалось загрузить вебхуки", + "delete": "Удалить", + "deleteConfirm": "Удалить этот вебхук?", + "deleteSuccess": "Вебхук удалён", + "deleteFailed": "Не удалось удалить вебхук", + "edit": "Редактировать", + "enable": "Включить", + "disable": "Отключить", + "noWebhooks": "Вебхуки не настроены", + "signatureTitle": "Подпись", + "signatureDescription": "OmniRoute подписывает каждый запрос заголовком X-OmniRoute-Signature" }, "compliance": { - "auditTitle": "__MISSING__:Audit", - "auditDescription": "__MISSING__:Review compliance events and MCP tool calls from one operational view.", - "complianceTab": "__MISSING__:Compliance", - "mcpTab": "__MISSING__:MCP Audit", - "title": "__MISSING__:Compliance Audit", - "description": "__MISSING__:Policy, access, provider, and security events recorded by the compliance audit log.", - "eventType": "__MISSING__:Event Type", - "eventTypePlaceholder": "__MISSING__:Filter by action or event type", - "severity": "__MISSING__:Severity", - "allSeverities": "__MISSING__:All severities", - "info": "__MISSING__:Info", - "warning": "__MISSING__:Warning", - "critical": "__MISSING__:Critical", - "sourceIp": "__MISSING__:Source IP", - "userOrKey": "__MISSING__:User / Key", - "action": "__MISSING__:Action", - "result": "__MISSING__:Result", - "details": "__MISSING__:Details", - "timestamp": "__MISSING__:Timestamp", - "from": "__MISSING__:From", - "to": "__MISSING__:To", - "refresh": "__MISSING__:Refresh", - "export": "__MISSING__:Export", - "clearFilters": "__MISSING__:Clear filters", - "loading": "__MISSING__:Loading audit events...", - "showing": "__MISSING__:Showing {count} of {total} events", - "policyViolation": "__MISSING__:Policy Violation", - "accessDenied": "__MISSING__:Access Denied", - "injectionBlocked": "__MISSING__:Injection Blocked", - "noEvents": "__MISSING__:No compliance events recorded.", - "failedFetch": "__MISSING__:Failed to fetch compliance audit log.", - "viewDetails": "__MISSING__:View details", - "closeDetails": "__MISSING__:Close details", - "notAvailable": "__MISSING__:—", - "system": "__MISSING__:system", - "previous": "__MISSING__:Previous", - "next": "__MISSING__:Next", - "mcpAudit": "__MISSING__:MCP Audit", - "mcpAuditDesc": "__MISSING__:Tool call audit entries recorded by the MCP server.", - "failedFetchMcpAudit": "__MISSING__:Failed to fetch MCP audit log.", - "tool": "__MISSING__:Tool", - "toolPlaceholder": "__MISSING__:Filter by tool name", - "duration": "__MISSING__:Duration", - "apiKey": "__MISSING__:API Key", - "output": "__MISSING__:Output", - "allResults": "__MISSING__:All results", - "success": "__MISSING__:Success", - "failure": "__MISSING__:Failure", - "noMcpEvents": "__MISSING__:No MCP audit events recorded.", - "a2aAudit": "__MISSING__:A2A Audit", - "a2aAuditDesc": "__MISSING__:Task execution audit trail recorded by the A2A server.", - "a2aShowingTasks": "__MISSING__:Showing {count} of {total} tasks", - "a2aSkill": "__MISSING__:Skill", - "a2aSkillPlaceholder": "__MISSING__:Filter by skill name", - "a2aState": "__MISSING__:State", - "a2aAllStates": "__MISSING__:All states", - "a2aStateSubmitted": "__MISSING__:Submitted", - "a2aStateWorking": "__MISSING__:Working", - "a2aStateCompleted": "__MISSING__:Completed", - "a2aStateFailed": "__MISSING__:Failed", - "a2aStateCancelled": "__MISSING__:Cancelled", - "a2aTaskId": "__MISSING__:Task ID", - "a2aEvents": "__MISSING__:Events", - "a2aArtifacts": "__MISSING__:Artifacts", - "a2aNoTasks": "__MISSING__:No A2A tasks recorded.", - "a2aLoadingTasks": "__MISSING__:Loading A2A tasks..." + "auditTitle": "Аудит", + "auditDescription": "Просмотр событий безопасности и вызовов MCP-инструментов", + "complianceTab": "Комплаенс", + "mcpTab": "MCP аудит", + "title": "Аудит соответствия", + "description": "Журнал событий безопасности и MCP-инструментов", + "eventType": "Тип события", + "eventTypePlaceholder": "Все типы", + "severity": "Серьёзность", + "allSeverities": "Все", + "info": "Информация", + "warning": "Предупреждение", + "critical": "Критично", + "sourceIp": "IP-адрес", + "userOrKey": "Пользователь / Ключ", + "action": "Действие", + "result": "Результат", + "details": "Подробности", + "timestamp": "Время", + "from": "От", + "to": "До", + "refresh": "Обновить", + "export": "Экспорт", + "clearFilters": "Очистить фильтры", + "loading": "Загрузка...", + "showing": "Showing {count} of {total} events", + "policyViolation": "Нарушение политики", + "accessDenied": "Доступ запрещён", + "injectionBlocked": "Инъекция заблокирована", + "noEvents": "Событий не найдено", + "failedFetch": "Не удалось загрузить события", + "viewDetails": "Подробнее", + "closeDetails": "Закрыть", + "notAvailable": "Н/Д", + "system": "Система", + "previous": "Назад", + "next": "Вперёд", + "mcpAudit": "MCP аудит", + "mcpAuditDesc": "Журнал вызовов MCP-инструментов", + "failedFetchMcpAudit": "Не удалось загрузить MCP-аудит", + "tool": "Инструмент", + "toolPlaceholder": "Все инструменты", + "duration": "Длительность", + "apiKey": "Ключ API", + "output": "Вывод", + "allResults": "Все результаты", + "success": "Успешно", + "failure": "Ошибка", + "noMcpEvents": "MCP-событий не найдено", + "a2aAudit": "A2A аудит", + "a2aAuditDesc": "Журнал A2A-протокола", + "a2aShowingTasks": "Показано {count} задач", + "a2aSkill": "Навык", + "a2aSkillPlaceholder": "Все навыки", + "a2aState": "Состояние", + "a2aAllStates": "Все состояния", + "a2aStateSubmitted": "Отправлено", + "a2aStateWorking": "Выполняется", + "a2aStateCompleted": "Завершено", + "a2aStateFailed": "Ошибка", + "a2aStateCancelled": "Отменено", + "a2aTaskId": "ID задачи", + "a2aEvents": "События", + "a2aArtifacts": "Артефакты", + "a2aNoTasks": "Задач не найдено", + "a2aLoadingTasks": "Загрузка задач..." }, "themesPage": { "title": "Темы", @@ -1069,9 +1109,9 @@ "mediaDescription": "Создание изображений, видео и музыки", "themes": "Темы", "themesDescription": "Выберите цветовую тему для всей панели", - "costsDescription": "Track spending, analyze trends, and manage your AI budget across all providers", - "cacheDescription": "Monitor provider prompt cache efficiency and local semantic response reuse.", - "limitsDescription": "Configure rate limits and quotas per API key and provider", + "costsDescription": "Отслеживание расходов и управление бюджетом AI", + "cacheDescription": "Мониторинг эффективности кэша провайдеров", + "limitsDescription": "Настройка лимитов и квот для ключей API и провайдеров", "runtimeDescription": "Live runtime observability — circuit breakers, cooldowns, model lockouts, sessions and quota alerts", "apiManagerDescription": "Manage API keys and access control for your OmniRoute instance", "batchDescription": "Process large volumes of requests asynchronously with batched API calls", @@ -1105,35 +1145,35 @@ "logsConsoleDescription": "Application console output and debug logs", "logsActivityDescription": "Audit trail of user actions and system events", "auditMcpDescription": "MCP tool invocation audit trail and compliance records", - "auditA2a": "__MISSING__:A2A Audit", - "auditA2aDescription": "__MISSING__:A2A task execution audit trail, state transitions, and skill invocation records", + "auditA2a": "A2A аудит", + "auditA2aDescription": "Просмотр событий A2A-протокола", "settingsGeneralDescription": "Storage, database, and general instance configuration", "settingsAppearanceDescription": "Theme, branding, and visual customization", "settingsAiDescription": "AI behaviors, thinking budgets, vision, and memory settings", "settingsSecurityDescription": "Authentication, authorization, and access control settings", - "featureFlags": "__MISSING__:Feature Flags", - "featureFlagsDescription": "__MISSING__:Control system capabilities and experimental features", - "featureFlagsActive": "__MISSING__:{count} active", - "featureFlagsInactive": "__MISSING__:{count} inactive", - "featureFlagsOverrides": "__MISSING__:{count} DB overrides", - "featureFlagsSearch": "__MISSING__:Search flags...", - "featureFlagsCategoryAll": "__MISSING__:All", - "featureFlagsCategorySecurity": "__MISSING__:Security", - "featureFlagsCategoryNetwork": "__MISSING__:Network", - "featureFlagsCategoryPolicies": "__MISSING__:Policies", - "featureFlagsCategoryRuntime": "__MISSING__:Runtime", - "featureFlagsCategoryCli": "__MISSING__:CLI", - "featureFlagsCategoryHealth": "__MISSING__:Health", - "featureFlagsSourceDb": "__MISSING__:DB", - "featureFlagsSourceEnv": "__MISSING__:ENV", - "featureFlagsSourceDefault": "__MISSING__:DEF", - "featureFlagsReset": "__MISSING__:Reset", - "featureFlagsResetAll": "__MISSING__:Reset All Overrides", - "featureFlagsResetAllConfirm": "__MISSING__:Are you sure you want to reset all feature flag overrides? This will revert all flags to their ENV or default values.", - "featureFlagsRestartRequired": "__MISSING__:Restart required to apply", - "featureFlagsNoResults": "__MISSING__:No flags match your search", - "featureFlagsSaved": "__MISSING__:Flag updated", - "featureFlagsError": "__MISSING__:Failed to update flag", + "featureFlags": "Функциональные флаги", + "featureFlagsDescription": "Включение и отключение возможностей системы", + "featureFlagsActive": "Активные", + "featureFlagsInactive": "Неактивные", + "featureFlagsOverrides": "Переопределения", + "featureFlagsSearch": "Поиск флагов...", + "featureFlagsCategoryAll": "Все категории", + "featureFlagsCategorySecurity": "Безопасность", + "featureFlagsCategoryNetwork": "Сеть", + "featureFlagsCategoryPolicies": "Политики", + "featureFlagsCategoryRuntime": "Среда выполнения", + "featureFlagsCategoryCli": "CLI", + "featureFlagsCategoryHealth": "Здоровье", + "featureFlagsSourceDb": "База данных", + "featureFlagsSourceEnv": "Переменные окружения", + "featureFlagsSourceDefault": "По умолчанию", + "featureFlagsReset": "Сбросить", + "featureFlagsResetAll": "Сбросить все", + "featureFlagsResetAllConfirm": "Сбросить все флаги? Это действие нельзя отменить.", + "featureFlagsRestartRequired": "Требуется перезапуск", + "featureFlagsNoResults": "Флаги не найдены", + "featureFlagsSaved": "Флаги сохранены", + "featureFlagsError": "Ошибка сохранения флагов", "settingsRoutingDescription": "Routing rules, model aliases, combo defaults, and degradation settings", "settingsResilienceDescription": "Circuit breaker, retry, and fallback configuration", "settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings", @@ -1155,8 +1195,8 @@ "providersOverview": "Обзор провайдеров", "configuredOf": "{configured} настроен из {total} доступных поставщиков", "noModelsAvailable": "Нет доступных моделей для этого поставщика.", - "noProvidersConfigured": "__MISSING__:No providers configured yet", - "addProvider": "__MISSING__:Add a provider", + "noProvidersConfigured": "Провайдеры ещё не настроены", + "addProvider": "Добавить провайдера", "configureFirst": "Сначала настройте соединение в {providers}.", "configureProvider": "Настроить поставщика", "modelAvailable": "Доступна модель {count}", @@ -1178,8 +1218,8 @@ "updating": "Обновление...", "updateAvailableDesc": "Доступна новая версия. Нажмите для обновления.", "updateStarted": "Обновление начато...", - "reloadingPageAutomatically": "__MISSING__:Reloading page automatically...", - "providerTopology": "__MISSING__:Provider Topology" + "reloadingPageAutomatically": "Страница автоматически обновляется...", + "providerTopology": "Топология провайдеров" }, "analytics": { "title": "Аналитика", @@ -1189,58 +1229,58 @@ "evals": "Оценки", "utilization": "Использование", "utilizationDescription": "Тенденции использования квоты поставщика и отслеживание ограничений скорости", - "modelStatus": "__MISSING__:Model Status", - "modelStatusCooldown": "__MISSING__:Cooldown", - "modelStatusUnavailable": "__MISSING__:Unavailable", - "modelStatusError": "__MISSING__:Error", + "modelStatus": "Статус модели", + "modelStatusCooldown": "Остывание", + "modelStatusUnavailable": "Недоступна", + "modelStatusError": "Ошибка", "comboHealth": "Здоровье комбо", "comboHealthDescription": "Квота на уровне комбо, распределение использования и метрики производительности", "compressionAnalyticsTitle": "Compression Analytics", "compressionAnalyticsDescription": "Compression analytics — token savings, mode breakdown, and provider stats.", - "autoRoutingTotalAutoRequests": "__MISSING__:Total Auto Requests", - "autoRoutingAvgSelectionScore": "__MISSING__:Avg Selection Score", - "autoRoutingExplorationRate": "__MISSING__:Exploration Rate", - "autoRoutingLkgpHitRate": "__MISSING__:LKGP Hit Rate", - "autoRoutingRequestsByVariant": "__MISSING__:Requests by Variant", - "autoRoutingTopRoutedProviders": "__MISSING__:Top Routed Providers", - "comboHealthWorstQuotaLeft": "__MISSING__:Worst quota left", - "comboHealthUsageSkew": "__MISSING__:Usage skew", - "comboHealthSuccessRate": "__MISSING__:Success rate", - "comboHealthQuotaHealth": "__MISSING__:Quota health", - "comboHealthRequests": "__MISSING__:Requests", - "comboHealthTokens": "__MISSING__:Tokens", - "comboHealthAvgLatency": "__MISSING__:Avg latency", - "comboHealthTotalRequests": "__MISSING__:Total requests", - "comboHealthExecutionTargets": "__MISSING__:Execution targets", - "comboHealthSuccess": "__MISSING__:Success", - "comboHealthLatency": "__MISSING__:Latency", - "comboHealthQuota": "__MISSING__:Quota", - "comboHealthTitle": "__MISSING__:Combo health", - "comboHealthUnableToLoad": "__MISSING__:Unable to load combo health", - "comboHealthGettingStarted": "__MISSING__:Getting started", - "compressionAnalyticsTotalRequests": "__MISSING__:Total Requests", - "compressionAnalyticsTokensSaved": "__MISSING__:Tokens Saved", - "compressionAnalyticsAvgSavings": "__MISSING__:Avg Savings", - "compressionAnalyticsAvgDuration": "__MISSING__:Avg Duration", - "compressionAnalyticsReceipts": "__MISSING__:Receipts", - "compressionAnalyticsFallbacks": "__MISSING__:Fallbacks", - "compressionAnalyticsPromptTokens": "__MISSING__:Prompt tokens", - "compressionAnalyticsCompletionTokens": "__MISSING__:Completion tokens", - "compressionAnalyticsTotalTokens": "__MISSING__:Total tokens", - "compressionAnalyticsCacheTokens": "__MISSING__:Cache tokens", - "compressionAnalyticsNoDataYet": "__MISSING__:No compression data yet", - "searchAnalyticsTotalSearches": "__MISSING__:Total Searches", - "searchAnalyticsCacheHitRate": "__MISSING__:Cache Hit Rate", - "searchAnalyticsTotalCost": "__MISSING__:Total Cost", - "searchAnalyticsAvgResponse": "__MISSING__:Avg Response", - "searchAnalyticsNoSearchesYet": "__MISSING__:No searches yet", - "providerUtilizationTitle": "__MISSING__:Provider utilization", - "providerUtilizationFailedToLoad": "__MISSING__:Failed to load utilization data", - "providerUtilizationNoData": "__MISSING__:No utilization data available", - "providerUtilizationGettingStarted": "__MISSING__:Getting started", - "providerUtilizationLatestSnapshot": "__MISSING__:Latest quota snapshot", - "providerUtilizationRemainingCapacity": "__MISSING__:Remaining capacity", - "diversityScoreTitle": "__MISSING__:Provider Diversity" + "autoRoutingTotalAutoRequests": "Всего автоматических запросов", + "autoRoutingAvgSelectionScore": "Средний балл выбора", + "autoRoutingExplorationRate": "Доля разведывательных запросов", + "autoRoutingLkgpHitRate": "Доля LKGP попаданий", + "autoRoutingRequestsByVariant": "Запросы по вариантам", + "autoRoutingTopRoutedProviders": "Топ провайдеров по маршрутизации", + "comboHealthWorstQuotaLeft": "Худший остаток квоты", + "comboHealthUsageSkew": "Перекос использования", + "comboHealthSuccessRate": "Доля успеха", + "comboHealthQuotaHealth": "Здоровье квоты", + "comboHealthRequests": "Запросы", + "comboHealthTokens": "Токены", + "comboHealthAvgLatency": "Средняя задержка", + "comboHealthTotalRequests": "Всего запросов", + "comboHealthExecutionTargets": "Цели выполнения", + "comboHealthSuccess": "Успешно", + "comboHealthLatency": "Задержка", + "comboHealthQuota": "Квота", + "comboHealthTitle": "Здоровье комбо", + "comboHealthUnableToLoad": "Не удалось загрузить", + "comboHealthGettingStarted": "Начните с создания комбо", + "compressionAnalyticsTotalRequests": "Всего запросов", + "compressionAnalyticsTokensSaved": "Сэкономлено токенов", + "compressionAnalyticsAvgSavings": "Средняя экономия", + "compressionAnalyticsAvgDuration": "Средняя длительность", + "compressionAnalyticsReceipts": "Чеки", + "compressionAnalyticsFallbacks": "Fallback'и", + "compressionAnalyticsPromptTokens": "Токены промпта", + "compressionAnalyticsCompletionTokens": "Токены завершения", + "compressionAnalyticsTotalTokens": "Всего токенов", + "compressionAnalyticsCacheTokens": "Токены кэша", + "compressionAnalyticsNoDataYet": "Данных пока нет", + "searchAnalyticsTotalSearches": "Всего поисков", + "searchAnalyticsCacheHitRate": "Доля попаданий в кэш", + "searchAnalyticsTotalCost": "Общая стоимость", + "searchAnalyticsAvgResponse": "Среднее время ответа", + "searchAnalyticsNoSearchesYet": "Поисков пока нет", + "providerUtilizationTitle": "Загрузка провайдеров", + "providerUtilizationFailedToLoad": "Не удалось загрузить", + "providerUtilizationNoData": "Нет данных", + "providerUtilizationGettingStarted": "Начните с подключения провайдеров", + "providerUtilizationLatestSnapshot": "Последний снимок", + "providerUtilizationRemainingCapacity": "Оставшаяся ёмкость", + "diversityScoreTitle": "Оценка разнообразия" }, "apiManager": { "title": "API-ключи", @@ -1342,30 +1382,30 @@ "lastUsedOn": "Последний: {date}", "editPermissions": "Редактировать разрешения", "deleteKey": "Удалить ключ", - "regenerateKey": "__MISSING__:Regenerate key", - "regenerateConfirm": "__MISSING__:Are you sure you want to regenerate this API key? The old key will be immediately invalidated.", - "failedRegenerateKey": "__MISSING__:Failed to regenerate API key", - "failedRegenerateKeyRetry": "__MISSING__:Failed to regenerate API key. Please try again.", + "regenerateKey": "Перевыпустить ключ", + "regenerateConfirm": "Перевыпустить ключ? Старый ключ будет немедленно аннулирован.", + "failedRegenerateKey": "Не удалось перевыпустить ключ", + "failedRegenerateKeyRetry": "Не удалось перевыпустить ключ. Попробуйте снова.", "model": "{count} модель", "models": "{count} модели", "permissionsTitle": "Разрешения: {name}", "allowAllDesc": "Этот ключ дает доступ ко всем доступным моделям.", "restrictDesc": "Этот ключ может получить доступ к {selectedCount} из моделей {totalModels}.", "selectedCount": "{count} выбрано", - "maxActiveSessions": "__MISSING__:Max Active Sessions", - "apiManagerCustomRateLimits": "__MISSING__:Custom Rate Limits", - "apiManagerCustomRateLimitsDesc": "__MISSING__:Override global default limits. Leave empty to use defaults.", - "apiManagerRateLimitRequestsPlaceholder": "__MISSING__:Requests", - "apiManagerRateLimitReqPer": "__MISSING__:req /", - "apiManagerRateLimitSecondsPlaceholder": "__MISSING__:Seconds", - "apiManagerRemoveLimitTitle": "__MISSING__:Remove limit", - "apiManagerTimezonePlaceholder": "__MISSING__:America/Sao_Paulo", - "noLogPayloadPrivacy": "__MISSING__:No-Log Payload Privacy", - "bannedStatus": "__MISSING__:Banned Status", - "managementApiAccess": "__MISSING__:Management API Access", - "expirationDate": "__MISSING__:Expiration Date", - "managementAccess": "__MISSING__:Management Access", - "allowedConnections": "__MISSING__:Allowed Connections" + "maxActiveSessions": "Макс. активных сессий", + "apiManagerCustomRateLimits": "Свои лимиты", + "apiManagerCustomRateLimitsDesc": "Индивидуальные лимиты запросов для этого ключа", + "apiManagerRateLimitRequestsPlaceholder": "Количество запросов", + "apiManagerRateLimitReqPer": "запросов на", + "apiManagerRateLimitSecondsPlaceholder": "секунд", + "apiManagerRemoveLimitTitle": "Удалить лимит?", + "apiManagerTimezonePlaceholder": "Часовой пояс", + "noLogPayloadPrivacy": "Не логировать содержимое", + "bannedStatus": "Забанен", + "managementApiAccess": "Доступ к API управления", + "expirationDate": "Срок действия", + "managementAccess": "Управляющий доступ", + "allowedConnections": "Разрешённые подключения" }, "auditLog": { "title": "Журнал аудита", @@ -1454,8 +1494,8 @@ "rerankModel": "Модель rerank", "positionDelta": "Изменение позиции", "emptyState": "Отправьте поисковый запрос, чтобы увидеть результаты", - "copy": "__MISSING__:Copy", - "resetToDefault": "__MISSING__:Reset to default" + "copy": "Копировать", + "resetToDefault": "Сбросить на умолчания" }, "cliTools": { "title": "Инструменты интерфейса командной строки", @@ -1516,7 +1556,7 @@ "inactive": "Неактивный", "startMitm": "Запустить МИТМ", "stopMitm": "Остановить МИТМ", - "mitmStarted": "MITM стартовал успешно!", + "mitmStarted": "MITM запущен успешно!", "mitmStopped": "MITM успешно остановлен!", "failedStart": "Не удалось запустить MITM", "failedStop": "Не удалось остановить MITM", @@ -1624,8 +1664,8 @@ "copilot": "Используйте его, если вам нужен пользовательский интерфейс в стиле чата Copilot, одновременно обеспечивая соблюдение ключей OmniRoute и правил маршрутизации.", "amp": "Use when you want Amp CLI routed through OmniRoute with stable shorthand aliases and OpenAI-compatible setup.", "qwen": "Use when you want Qwen Code CLI with OmniRoute-managed provider settings and multi-provider model access.", - "hermes": "__MISSING__:Use when you need a lightweight terminal-native AI assistant for quick tasks.", - "custom": "__MISSING__:Use for custom tool implementations or generic OpenAI-compatible configurations." + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." }, "toolDescriptions": { "antigravity": "Google Antigravity IDE с MITM", @@ -1643,8 +1683,8 @@ "copilot": "Ассистент GitHub Copilot с ИИ", "qwen": "Alibaba Qwen Code CLI", "amp": "Sourcegraph Amp coding assistant CLI", - "hermes": "__MISSING__:Hermes AI Terminal Assistant", - "custom": "__MISSING__:Generic OpenAI-compatible CLI or SDK configuration generator" + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" }, "guides": { "cursor": { @@ -1774,45 +1814,45 @@ "allToolsTab": "All Tools Tab", "guidedClientsTab": "Guided Clients Tab", "mitmClientsTab": "Mitm Clients Tab", - "customCliTab": "__MISSING__:Custom CLI", + "customCliTab": "Custom CLI", "toolCategories": "Tool Categories", "visibleToolsCount": "Visible Tools Count", - "customCliBuilderTitle": "__MISSING__:OpenAI-compatible CLI builder", - "customCliBuilderDescription": "__MISSING__:Generate env vars and JSON snippets for any CLI or SDK that accepts an OpenAI-compatible base URL, API key, and model ID.", - "customCliNoModels": "__MISSING__:Connect at least one provider to populate the model selectors.", - "customCliNameLabel": "__MISSING__:CLI name", - "customCliNamePlaceholder": "__MISSING__:e.g. My Team CLI", - "customCliDefaultModelLabel": "__MISSING__:Default model", - "customCliDefaultModelHelp": "__MISSING__:Use any OmniRoute model ID or combo. Most OpenAI-compatible CLIs only need the /v1 base URL plus a model string.", - "customCliKeyHelper": "__MISSING__:For local installs OmniRoute can use sk_omniroute. In cloud mode, pick one of your management API keys.", - "customCliAliasMappingsLabel": "__MISSING__:Alias mappings", - "customCliAliasMappingsHelp": "__MISSING__:Optional helper aliases for wrapper scripts or config files that want stable shorthand names.", - "customCliAddAlias": "__MISSING__:Add alias", - "customCliNoMappings": "__MISSING__:No alias mappings yet. Add one if your wrapper or team scripts use stable short names.", - "customCliAliasPlaceholder": "__MISSING__:e.g. review", - "customCliTargetModelLabel": "__MISSING__:Target model", - "customCliEndpointHintLabel": "__MISSING__:How to wire the endpoint", - "customCliEndpointHint": "__MISSING__:Point any OpenAI-compatible client to the OmniRoute /v1 base URL. The raw chat completions endpoint is {endpoint}. Use the JSON block when the tool wants a provider object, or the env script when it reads OPENAI_* variables.", - "customCliEnvBlockTitle": "__MISSING__:Env / shell snippet", - "customCliJsonBlockTitle": "__MISSING__:Provider JSON block", - "copilotConfigGenerator": "__MISSING__:GitHub Copilot Config Generator", - "copilotApiKey": "__MISSING__:API Key", - "copilotFilterModelsPlaceholder": "__MISSING__:Filter models...", - "copilotMaxInputTokens": "__MISSING__:Max Input Tokens", - "copilotMaxOutputTokens": "__MISSING__:Max Output Tokens", - "copilotToolCalling": "__MISSING__:Tool Calling", - "copilotPasteInto": "__MISSING__:Paste into: ", - "wireApiChatCompletions": "__MISSING__:Chat Completions (/chat/completions)", - "wireApiResponses": "__MISSING__:Responses API (/responses)" + "customCliBuilderTitle": "OpenAI-compatible CLI builder", + "customCliBuilderDescription": "Generate env vars and JSON snippets for any CLI or SDK that accepts an OpenAI-compatible base URL, API key, and model ID.", + "customCliNoModels": "Connect at least one provider to populate the model selectors.", + "customCliNameLabel": "CLI name", + "customCliNamePlaceholder": "e.g. My Team CLI", + "customCliDefaultModelLabel": "Default model", + "customCliDefaultModelHelp": "Use any OmniRoute model ID or combo. Most OpenAI-compatible CLIs only need the /v1 base URL plus a model string.", + "customCliKeyHelper": "For local installs OmniRoute can use sk_omniroute. In cloud mode, pick one of your management API keys.", + "customCliAliasMappingsLabel": "Alias mappings", + "customCliAliasMappingsHelp": "Optional helper aliases for wrapper scripts or config files that want stable shorthand names.", + "customCliAddAlias": "Add alias", + "customCliNoMappings": "No alias mappings yet. Add one if your wrapper or team scripts use stable short names.", + "customCliAliasPlaceholder": "e.g. review", + "customCliTargetModelLabel": "Target model", + "customCliEndpointHintLabel": "How to wire the endpoint", + "customCliEndpointHint": "Point any OpenAI-compatible client to the OmniRoute /v1 base URL. The raw chat completions endpoint is {endpoint}. Use the JSON block when the tool wants a provider object, or the env script when it reads OPENAI_* variables.", + "customCliEnvBlockTitle": "Env / shell snippet", + "customCliJsonBlockTitle": "Provider JSON block", + "copilotConfigGenerator": "Генератор конфигурации Copilot", + "copilotApiKey": "Ключ API Copilot", + "copilotFilterModelsPlaceholder": "Filter models...", + "copilotMaxInputTokens": "Max Input Tokens", + "copilotMaxOutputTokens": "Max Output Tokens", + "copilotToolCalling": "Tool Calling", + "copilotPasteInto": "Paste into: ", + "wireApiChatCompletions": "Chat Completions (/chat/completions)", + "wireApiResponses": "Responses API (/responses)" }, "combos": { "title": "Комбо", "description": "Создавайте комбинации моделей с взвешенной маршрутизацией и поддержкой резервного варианта.", - "autoCatalogTitle": "__MISSING__:Auto-routing catalog", - "autoCatalogTemplateCount": "__MISSING__:{count} templates", - "autoCatalogDescription": "__MISSING__:Built-in auto/* combos resolved dynamically from connected providers. Use any of these IDs as the model field — no setup needed.", - "autoCatalogExpand": "__MISSING__:Expand auto-routing catalog", - "autoCatalogCollapse": "__MISSING__:Collapse auto-routing catalog", + "autoCatalogTitle": "Каталог авто-маршрутизации", + "autoCatalogTemplateCount": "{count} templates", + "autoCatalogDescription": "Встроенные auto/* комбо, динамически собираемые из подключённых провайдеров", + "autoCatalogExpand": "Развернуть", + "autoCatalogCollapse": "Свернуть", "createCombo": "Создать комбо", "editCombo": "Редактировать комбо", "deleteCombo": "Удалить комбо", @@ -1866,8 +1906,8 @@ "randomDesc": "Равномерный случайный выбор, затем возврат к оставшимся моделям", "leastUsedDesc": "Выбирает модель с наименьшим количеством запросов, балансируя нагрузку с течением времени.", "costOptimizedDesc": "Маршруты к самой дешевой модели в первую очередь на основе цены", - "resetAware": "__MISSING__:Reset-Aware RR", - "resetAwareDesc": "__MISSING__:Balances remaining quota against 5h and weekly resets, then round-robins similar scores", + "resetAware": "Сброс-ориентированная", + "resetAwareDesc": "Учитывает время сброса квоты", "strictRandom": "Строгий случайный", "strictRandomDesc": "Перемешивание колоды - каждая модель используется по одному разу перед новым перемешиванием", "models": "Модели", @@ -1884,9 +1924,9 @@ "contextRelaySummaryModelHelp": "Optional override model used only for generating the handoff summary. Leave empty to reuse the active combo model.", "contextRelayProviderNote": "Context Relay currently generates handoffs for Codex account rotation. Pair it with multiple accounts of the same provider for the best continuity.", "advancedHint": "Оставьте пустым, чтобы использовать глобальные значения по умолчанию. Они переопределяют настройки каждого провайдера.", - "failoverBeforeRetry": "__MISSING__:Failover Before Retry", - "maxSetRetries": "__MISSING__:Max Set Retries", - "setRetryDelayMs": "__MISSING__:Set Retry Delay (ms)", + "failoverBeforeRetry": "Failback до повтора", + "maxSetRetries": "Макс. повторов набора", + "setRetryDelayMs": "Задержка повтора (мс)", "moveUp": "Вверх", "moveDown": "Двигаться вниз", "removeModel": "Удалить", @@ -1930,9 +1970,9 @@ "example": "Фоновые или пакетные задачи, где важнее низкая стоимость." }, "reset-aware": { - "when": "__MISSING__:You route across multiple accounts with quota telemetry and different reset windows.", - "avoid": "__MISSING__:Quota telemetry is unavailable for most accounts.", - "example": "__MISSING__:Prefer a 60% weekly account resetting tomorrow over an 80% account resetting later." + "when": "You route across multiple accounts with quota telemetry and different reset windows.", + "avoid": "Quota telemetry is unavailable for most accounts.", + "example": "Prefer a 60% weekly account resetting tomorrow over an 80% account resetting later." }, "strict-random": { "when": "Используйте, когда нужен идеально ровный spread - каждая модель используется один раз перед повтором.", @@ -1950,24 +1990,24 @@ "example": "Example: Codex sessions that rotate across multiple accounts near quota exhaustion." }, "fill-first": { - "when": "__MISSING__:Use when you want to fully exhaust one provider's quota before moving to the next.", - "avoid": "__MISSING__:Avoid when you need request-level load balancing across providers.", - "example": "__MISSING__:Example: Use all $200 Deepgram credits before falling back to Groq." + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." }, "auto": { - "when": "__MISSING__:Use when you need multi-factor scoring routing based on cost, latency, and quality.", - "avoid": "__MISSING__:Avoid when you need strict priority ordering or historical persistence.", - "example": "__MISSING__:Example: Balance requests across models with different strengths." + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." }, "lkgp": { - "when": "__MISSING__:Use when you want to route based on historical success rates and performance.", - "avoid": "__MISSING__:Avoid when historical data is limited or unreliable.", - "example": "__MISSING__:Example: Route to models with a good track record on specific tasks." + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." }, "context-optimized": { - "when": "__MISSING__:Use when you need to optimize context window usage across models.", - "avoid": "__MISSING__:Avoid when models have similar context lengths or tasks are simple.", - "example": "__MISSING__:Example: Distribute long conversations across models with larger context windows." + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." } }, "advancedHelp": { @@ -1977,9 +2017,9 @@ "healthcheck": "Пропускает нездоровые модели и провайдеров при принятии решений маршрутизации.", "concurrencyPerModel": "Максимальное количество одновременных запросов, разрешенных для каждой модели в циклическом переборе.", "queueTimeout": "Как долго запрос может находиться в очереди до истечения времени ожидания.", - "failoverBeforeRetry": "__MISSING__:When enabled, any upstream error triggers immediate failover to the next combo target, skipping all retries and fallback URLs.", - "maxSetRetries": "__MISSING__:Number of times to retry the full target set when every target fails. 0 = no set-level retry.", - "setRetryDelayMs": "__MISSING__:Delay between set-level retry attempts, giving transient issues time to resolve." + "failoverBeforeRetry": "When enabled, any upstream error triggers immediate failover to the next combo target, skipping all retries and fallback URLs.", + "maxSetRetries": "Number of times to retry the full target set when every target fails. 0 = no set-level retry.", + "setRetryDelayMs": "Delay between set-level retry attempts, giving transient issues time to resolve." }, "templatesTitle": "Быстрые шаблоны", "templatesDescription": "Примените стартовый профиль, затем настройте модели и конфигурации.", @@ -2030,17 +2070,6 @@ "recommendationsApplied": "Рекомендации применены к этому комбо.", "intelligentPanelTitle": "Intelligent Routing Dashboard", "intelligentPanelDesc": "Real-time scoring and health status for this auto-routing combo.", - "configOnlyStatus": "Только конфигурация", - "configOnlyHint": "Здесь только входные параметры маршрутизации. Состояние circuit breaker — на странице Health.", - "routingInputs": "Параметры маршрутизации", - "routingInputsHint": "Mode pack и веса здесь; runtime circuit breaker — на странице Health.", - "emailVisibilityHint": "Email аккаунтов следует глобальному переключателю приватности.", - "emailVisibilityTooltip": "Иконка глаза скрывает или показывает email во всех разделах: combos, providers и quota.", - "manualModel": "Модель вручную", - "manualModelInvalid": "Введите модель как provider/model.", - "manualModelUnknownProvider": "Неизвестный префикс провайдера.", - "builderDynamicAccountShort": "Динамический аккаунт", - "builderNeedValidName": "Укажите корректное имя combo перед продолжением.", "statusOverview": "Status Overview", "normalOperation": "Normal Operation", "allProvidersHealthy": "Providers are reporting healthy routing conditions.", @@ -2121,11 +2150,11 @@ "tip3": "Подходит для пакетных и фоновых задач, где стоимость - главный KPI." }, "reset-aware": { - "title": "__MISSING__:Reset-aware account rotation", - "description": "__MISSING__:Balances remaining provider quota against reset timing.", - "tip1": "__MISSING__:Use explicit account steps or account-tag routing for providers with quota telemetry.", - "tip2": "__MISSING__:Tune session vs weekly weights when short-term exhaustion is more risky.", - "tip3": "__MISSING__:Keep the tie band small so equivalent accounts still rotate fairly." + "title": "Reset-aware account rotation", + "description": "Balances remaining provider quota against reset timing.", + "tip1": "Use explicit account steps or account-tag routing for providers with quota telemetry.", + "tip2": "Tune session vs weekly weights when short-term exhaustion is more risky.", + "tip3": "Keep the tie band small so equivalent accounts still rotate fairly." }, "strict-random": { "title": "Распределение по перемешиванию", @@ -2135,46 +2164,46 @@ "tip3": "Идеально для балансировки нагрузки между несколькими API-аккаунтами." }, "fill-first": { - "description": "__MISSING__:Exhaust provider quotas sequentially before falling back.", - "tip1": "__MISSING__:Use for quota-based routing with clear fallback chains.", - "tip2": "__MISSING__:Set quotas accurately to avoid premature fallback.", - "tip3": "__MISSING__:Works best with providers offering free tiers or credit buckets.", - "title": "__MISSING__:Quota Exhaustion" + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" }, "auto": { - "description": "__MISSING__:Route based on real-time scoring for cost, latency, quality, and health.", - "tip1": "__MISSING__:Let the engine balance multiple factors automatically.", - "tip2": "__MISSING__:Monitor which factors drive routing decisions in logs.", - "tip3": "__MISSING__:Use for complex workloads where no single factor dominates.", - "title": "__MISSING__:Multi-Factor Optimization" + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" }, "lkgp": { - "description": "__MISSING__:Route based on historical performance and success patterns.", - "tip1": "__MISSING__:Requires sufficient request history for accurate predictions.", - "tip2": "__MISSING__:Good for workloads with consistent model performance patterns.", - "tip3": "__MISSING__:Monitor prediction accuracy and adjust weights as needed.", - "title": "__MISSING__:History-Based Routing" + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" }, "context-optimized": { - "description": "__MISSING__:Optimize routing based on context window usage and token efficiency.", - "tip1": "__MISSING__:Route long conversations to models with larger context windows.", - "tip2": "__MISSING__:Monitor context utilization to avoid token waste.", - "tip3": "__MISSING__:Best for conversational AI requiring extensive context retention.", - "title": "__MISSING__:Context Optimization" + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" }, "context-relay": { - "description": "__MISSING__:Best when account rotation is expected and the next account must inherit a simplified task summary.", - "tip1": "__MISSING__:Use with providers rotating accounts for the same model family.", - "tip2": "__MISSING__:Set handoff threshold below hard quota cutoffs for summary generation time.", - "tip3": "__MISSING__:Only set a dedicated summary model if the primary is too expensive or unstable.", - "title": "__MISSING__:Session Continuity Priority" + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" }, "p2c": { - "description": "__MISSING__:Route to the provider with the lowest current load based on real-time metrics.", - "tip1": "__MISSING__:Monitor provider health metrics for accurate load assessment.", - "tip2": "__MISSING__:Works best with homogeneous provider pools.", - "tip3": "__MISSING__:Adjust sensitivity to avoid oscillation during traffic spikes.", - "title": "__MISSING__:Power of Two Choices" + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" } }, "templateFreeStack": "Бесплатный стек ($0)", @@ -2237,7 +2266,7 @@ "builderAccount": "Account", "builderPreview": "Preview", "builderAddStep": "Add step", - "builderDuplicateExact": "__MISSING__:This exact provider/model/account step is already in the combo.", + "builderDuplicateExact": "This exact provider/model/account step is already in the combo.", "builderComboRef": "Combo Ref", "builderAddComboRef": "Add combo reference", "builderComboRefStep": "Add combo reference", @@ -2253,55 +2282,55 @@ "reviewAgentFlags": "Agent Flags", "reviewSequence": "Model Sequence", "reviewNoSteps": "No steps configured", - "builderStagesDescription": "__MISSING__:Complete each stage in order to define combos, build steps, select routing strategy, and review results.", - "builderStepsDescription": "__MISSING__:Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", - "selectProvider": "__MISSING__:Select Provider", - "selectProviderPlaceholder": "__MISSING__:Select a provider", - "selectModel": "__MISSING__:Select Model", - "selectModelPlaceholder": "__MISSING__:Select a provider first", - "selectAccount": "__MISSING__:Select Account", - "selectComboToReference": "__MISSING__:Select combo to reference", - "comboReference": "__MISSING__:Combo Reference", - "addComboReference": "__MISSING__:Add Combo Reference", - "addStepBeforeContinue": "__MISSING__:Please add at least one step before proceeding to the next stage.", - "previewNextStep": "__MISSING__:Preview next step", - "autoSelectAccount": "__MISSING__:Automatically select account at runtime", - "modePackBalanced": "__MISSING__:Balanced", - "modePackBudget": "__MISSING__:Budget", - "modePackPerformance": "__MISSING__:Performance", - "modePackCustom": "__MISSING__:Custom", - "browseLegacyCatalog": "__MISSING__:Browse legacy combo catalog", - "agentFeaturesTitle": "__MISSING__:Agent Features", - "agentFeaturesDescription": "__MISSING__:Enable advanced features for agents using this combo", - "agentFeaturesSystemMessageOverride": "__MISSING__:Override system message", - "agentFeaturesSystemMessagePlaceholder": "__MISSING__:You are an expert assistant...", - "agentFeaturesSystemMessageHint": "__MISSING__:System message override for agents", - "agentFeaturesToolFilterRegex": "__MISSING__:/regex-pattern/", - "agentFeaturesToolFilterHint": "__MISSING__:Tool filter regex for agents", - "agentFeaturesContextCacheHint": "__MISSING__:Enable in-context cache for agent tools", - "agentFeaturesContextCacheProtection": "__MISSING__:Protect cache from agent tool mutations", - "agentFeaturesContextLength": "__MISSING__:Context length", - "agentFeaturesContextLengthPlaceholder": "__MISSING__:e.g. 128000", - "agentFeaturesContextLengthHint": "__MISSING__:Defines the context window for this combo in /v1/models.", - "agentFeaturesContextLengthErrorInteger": "__MISSING__:Context length must be a valid integer", - "agentFeaturesContextLengthErrorRange": "__MISSING__:Context length must be between 1000 and 2000000", - "compressionOverride": "__MISSING__:Compression Override", - "modePack": "__MISSING__:Mode Pack" + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Выберите провайдера", + "selectProviderPlaceholder": "Провайдер...", + "selectModel": "Выберите модель", + "selectModelPlaceholder": "Модель...", + "selectAccount": "Выберите аккаунт", + "selectComboToReference": "Выберите комбо для ссылки", + "comboReference": "Ссылка на комбо", + "addComboReference": "Добавить ссылку", + "addStepBeforeContinue": "Добавьте шаг перед продолжением", + "previewNextStep": "Предпросмотр следующего шага", + "autoSelectAccount": "Авто-выбор аккаунта", + "modePackBalanced": "Сбалансированный", + "modePackBudget": "Бюджетный", + "modePackPerformance": "Производительный", + "modePackCustom": "Пользовательский", + "browseLegacyCatalog": "Каталог (устаревший)", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations", + "agentFeaturesContextLength": "Context length", + "agentFeaturesContextLengthPlaceholder": "e.g. 128000", + "agentFeaturesContextLengthHint": "Defines the context window for this combo in /v1/models.", + "agentFeaturesContextLengthErrorInteger": "Context length must be a valid integer", + "agentFeaturesContextLengthErrorRange": "Context length must be between 1000 and 2000000", + "compressionOverride": "Compression Override", + "modePack": "Mode Pack" }, "costs": { "title": "Затраты", - "pageDescription": "__MISSING__:Track spending, analyze trends, and manage your AI budget across all providers", - "overview": "__MISSING__:Overview", + "pageDescription": "Отслеживание расходов, анализ трендов и управление AI-бюджетом", + "overview": "Обзор", "budget": "Бюджет", "totalCost": "Общая стоимость", "breakdown": "Распределение затрат", - "noData": "Нет данных о стоимости", + "noData": "Нет данных", "byModel": "По модели", "byProvider": "По поставщику", - "range7d": "__MISSING__:7 Days", - "range30d": "__MISSING__:30 Days", - "range90d": "__MISSING__:90 Days", - "rangeAll": "__MISSING__:All Time", + "range7d": "7 дней", + "range30d": "30 дней", + "range90d": "90 дней", + "rangeAll": "За всё время", "spend30d": "Spend30D", "activeModels": "Active Models", "selectedWindow": "Selected Window", @@ -2319,39 +2348,38 @@ "noCostDataTitle": "No Cost Data Title", "topModels": "Top Models", "requestsInWindow": "Requests In Window", - "tokenUsage": "__MISSING__:Token Usage", - "totalTokens": "__MISSING__:Total Tokens", - "inputTokens": "__MISSING__:Input Tokens", - "outputTokens": "__MISSING__:Output Tokens", - "inputOutputRatio": "__MISSING__:Input/Output Ratio", - "tokens": "__MISSING__:tokens", - "routingEfficiency": "__MISSING__:Routing Efficiency", - "fallbackCount": "__MISSING__:Fallback Requests", - "fallbackRate": "__MISSING__:Fallback Rate", - "modelCoverage": "__MISSING__:Model Coverage", - "modelCoverageDesc": "__MISSING__:% of requests with explicit model", - "outOfRequests": "__MISSING__:out of {total} requests", - "costByApiKey": "__MISSING__:Cost by API Key", - "costByAccount": "__MISSING__:Cost by Account", - "apiKeyName": "__MISSING__:API Key", - "account": "__MISSING__:Account", - "requests": "__MISSING__:Requests", - "cost": "__MISSING__:Cost", - "dayStreak": "__MISSING__:day streak", - "weeklyUsagePattern": "__MISSING__:Weekly Usage Pattern", - "activityHeatmap": "__MISSING__:Activity (365 days)", - "less": "__MISSING__:Less", - "more": "__MISSING__:More", - "monthlyForecast": "__MISSING__:Monthly Forecast", - "forecastBasis": "__MISSING__:Based on last {days} days", - "avgDailyCost": "__MISSING__:Avg. daily cost", - "daysRemaining": "__MISSING__:{days} days remaining", - "periodComparison": "__MISSING__:Period Comparison", - "previousPeriod": "__MISSING__:Previous Half", - "currentPeriod": "__MISSING__:Current Half", - "exportCSV": "__MISSING__:Export as CSV", - "exportJSON": "__MISSING__:Export as JSON", - "legacyFreeLabel": "Legacy / Free" + "tokenUsage": "Использование токенов", + "totalTokens": "Всего токенов", + "inputTokens": "Входящие токены", + "outputTokens": "Исходящие токены", + "inputOutputRatio": "Соотношение ввода/вывода", + "tokens": "Токены", + "routingEfficiency": "Эффективность маршрутизации", + "fallbackCount": "Количество fallback'ов", + "fallbackRate": "Доля fallback'ов", + "modelCoverage": "Покрытие моделей", + "modelCoverageDesc": "Распределение запросов по моделям", + "outOfRequests": "Не хватает данных", + "costByApiKey": "Расходы по ключам API", + "costByAccount": "Расходы по аккаунтам", + "apiKeyName": "Имя ключа", + "account": "Аккаунт", + "requests": "Запросы", + "cost": "Стоимость", + "dayStreak": "Дни подряд", + "weeklyUsagePattern": "Недельный паттерн", + "activityHeatmap": "Тепловая карта активности", + "less": "Меньше", + "more": "Больше", + "monthlyForecast": "Прогноз на месяц", + "forecastBasis": "Основание прогноза", + "avgDailyCost": "Средний дневной расход", + "daysRemaining": "Дней до конца периода", + "periodComparison": "Сравнение периодов", + "previousPeriod": "Предыдущий период", + "currentPeriod": "Текущий период", + "exportCSV": "Экспорт CSV", + "exportJSON": "Экспорт JSON" }, "endpoint": { "title": "Конечная точка API", @@ -2484,14 +2512,14 @@ "a2aQuickStartStep3": "Отслеживайте и управляйте задачами через `tasks/get` и `tasks/cancel`.", "completionsLegacy": "Завершения (устар.)", "completionsLegacyDesc": "Устаревшие текстовые завершения OpenAI — поддерживают и строку prompt, и массив messages", - "messagesApi": "__MISSING__:Messages", - "messagesApiDesc": "__MISSING__:Native Anthropic Messages API format for Claude-compatible providers", - "imageEdits": "__MISSING__:Image Edits", - "imageEditsDesc": "__MISSING__:Edit and modify existing images with AI (inpainting, outpainting, variations)", - "batchApi": "__MISSING__:Batch API", - "batchApiDesc": "__MISSING__:Process large batches of requests asynchronously (OpenAI-compatible)", - "filesApi": "__MISSING__:Files API", - "filesApiDesc": "__MISSING__:Upload and manage files for batch processing", + "messagesApi": "Messages API", + "messagesApiDesc": "API сообщений Anthropic-совместимых клиентов", + "imageEdits": "Редактирование изображений", + "imageEditsDesc": "Изменение изображений с помощью AI", + "batchApi": "Пакетный API", + "batchApiDesc": "Массовая обработка запросов в пакетном режиме", + "filesApi": "API файлов", + "filesApiDesc": "Загрузка и управление файлами", "videoGeneration": "Video Generation", "videoDesc": "Generate videos using AI models like ComfyUI and Stable Video Diffusion.", "tailscaleRequestFailed": "Failed to load Tailscale status", @@ -2526,35 +2554,35 @@ "tailscaleInstallPasswordHint": "On macOS and Linux, sudo may be required for the package install and daemon start.", "tailscaleSudoPlaceholder": "Optional sudo password", "tailscaleInstalling": "Installing", - "tailscaleSudoLabel": "__MISSING__:Sudo Password (required on macOS/Linux)", - "ngrokTitle": "__MISSING__:ngrok Tunnel", - "ngrokRunning": "__MISSING__:Running", - "ngrokStarting": "__MISSING__:Starting", - "ngrokStoppedState": "__MISSING__:Stopped", - "ngrokNeedsAuth": "__MISSING__:Needs Auth", - "ngrokNotInstalled": "__MISSING__:Not installed", - "ngrokUnsupported": "__MISSING__:Unsupported", - "ngrokError": "__MISSING__:Error", - "ngrokEnable": "__MISSING__:Enable Tunnel", - "ngrokDisable": "__MISSING__:Stop Tunnel", - "ngrokUrlNotice": "__MISSING__:Creates a public ngrok tunnel.", - "ngrokAuthTokenLabel": "__MISSING__:Authtoken (Required if NGROK_AUTHTOKEN not set)", - "ngrokAuthTokenPlaceholder": "__MISSING__:Enter your ngrok authtoken", - "ngrokLastError": "__MISSING__:Last error: {error}", - "ngrokStarted": "__MISSING__:ngrok tunnel started", - "ngrokStopped": "__MISSING__:ngrok tunnel stopped", - "ngrokRequestFailed": "__MISSING__:Failed to update ngrok tunnel", - "tokenSaverSubtitle": "__MISSING__:Spend less tokens on every request.", - "tokenSaverToolOutput": "__MISSING__:Tool output", - "tokenSaverLlmOutput": "__MISSING__:LLM output", - "tokenSaverInputCompression": "__MISSING__:Input compression", - "apiEndpointsCatalogUnavailable": "__MISSING__:API catalog unavailable", - "apiEndpointsSearchPlaceholder": "__MISSING__:Search endpoints...", - "apiEndpointsRequiresAuth": "__MISSING__:Requires auth", - "apiEndpointsNoMatch": "__MISSING__:No endpoints match your filter", - "localServer": "__MISSING__:Local Server", - "cloudOmniroute": "__MISSING__:Cloud OmniRoute", - "copyUrl": "__MISSING__:Copy URL" + "tailscaleSudoLabel": "Требуется sudo", + "ngrokTitle": "ngrok", + "ngrokRunning": "Запущен", + "ngrokStarting": "Запуск...", + "ngrokStoppedState": "Остановлен", + "ngrokNeedsAuth": "Требуется авторизация", + "ngrokNotInstalled": "Не установлен", + "ngrokUnsupported": "Не поддерживается", + "ngrokError": "Ошибка", + "ngrokEnable": "Включить", + "ngrokDisable": "Отключить", + "ngrokUrlNotice": "Публичный URL", + "ngrokAuthTokenLabel": "Токен аутентификации", + "ngrokAuthTokenPlaceholder": "Ваш ngrok auth token", + "ngrokLastError": "Последняя ошибка", + "ngrokStarted": "ngrok запущен", + "ngrokStopped": "ngrok остановлен", + "ngrokRequestFailed": "Запрос не удался", + "tokenSaverSubtitle": "Экономия токенов", + "tokenSaverToolOutput": "Вывод инструментов", + "tokenSaverLlmOutput": "Вывод LLM", + "tokenSaverInputCompression": "Сжатие ввода", + "apiEndpointsCatalogUnavailable": "Каталог недоступен", + "apiEndpointsSearchPlaceholder": "Поиск эндпоинтов...", + "apiEndpointsRequiresAuth": "Требуется аутентификация", + "apiEndpointsNoMatch": "Ничего не найдено", + "localServer": "Локальный сервер", + "cloudOmniroute": "OmniRoute Cloud", + "copyUrl": "Копировать URL" }, "endpoints": { "tabProxy": "Прокси конечных точек", @@ -2635,11 +2663,11 @@ "failed": "сбой", "previous": "Предыдущая", "next": "Следующая", - "apiKeyId": "Api Key Id", - "offset": "Offset", - "limit": "Limit", - "tool": "Tool", - "mcpDashboardCopyUrl": "__MISSING__:Copy URL" + "apiKeyId": "ID ключа API", + "offset": "Смещение", + "limit": "Лимит", + "tool": "Инструмент", + "mcpDashboardCopyUrl": "Копировать URL" }, "a2aDashboard": { "loading": "Загрузка панели A2A...", @@ -2694,16 +2722,16 @@ "metadata": "Метаданные", "events": "События", "artifacts": "Артефакты", - "tablePhase": "Table Phase", - "offset": "Offset", - "limit": "Limit", - "skill": "Skill", - "rpcEndpoint": "__MISSING__:POST /a2a", - "rpcMethodSend": "__MISSING__:message/send", - "rpcMethodStream": "__MISSING__:message/stream", - "rpcMethodGet": "__MISSING__:tasks/get", - "rpcMethodCancel": "__MISSING__:tasks/cancel", - "serviceLabel": "__MISSING__:A2A" + "tablePhase": "Фаза", + "offset": "Смещение", + "limit": "Лимит", + "skill": "Навык", + "rpcEndpoint": "RPC-эндпоинт", + "rpcMethodSend": "Отправить задачу", + "rpcMethodStream": "Потоковая передача", + "rpcMethodGet": "Получить задачу", + "rpcMethodCancel": "Отменить задачу", + "serviceLabel": "Сервис" }, "memory": { "title": "Память", @@ -2724,24 +2752,24 @@ "content": "Содержимое", "created": "Создано", "actions": "Действия", - "delete": "Delete", + "delete": "Удалить", "factual": "Фактическая", "episodic": "Эпизодическая", "procedural": "Процедурная", "semantic": "Семантическая", "a": "A", - "pipelineOk": "__MISSING__:Pipeline OK ({latencyMs}ms)", - "pipelineError": "__MISSING__:Pipeline error", - "healthUnknown": "__MISSING__:Health unknown", - "checkingHealth": "__MISSING__:Checking…", - "checkHealth": "__MISSING__:Check health", - "pageInfo": "__MISSING__:Page {page} of {totalPages} ({total} total)", - "previous": "__MISSING__:Previous", - "next": "__MISSING__:Next", - "cancel": "__MISSING__:Cancel", - "save": "__MISSING__:Save", - "keyPlaceholder": "__MISSING__:e.g. user.preferences.theme", - "contentPlaceholder": "__MISSING__:Value or JSON content to remember" + "pipelineOk": "Конвейер в порядке ({latencyMs}мс)", + "pipelineError": "Ошибка конвейера", + "healthUnknown": "Состояние неизвестно", + "checkingHealth": "Проверка состояния...", + "checkHealth": "Проверить состояние", + "pageInfo": "Страница {current} из {total}", + "previous": "Назад", + "next": "Вперёд", + "cancel": "Отмена", + "save": "Сохранить", + "keyPlaceholder": "Ключ", + "contentPlaceholder": "Содержимое" }, "skills": { "title": "Навыки", @@ -2769,12 +2797,12 @@ "timeoutDesc": "Максимальная длительность выполнения до принудительного завершения.", "networkAccess": "Доступ к сети", "networkAccessDesc": "Разрешить навыку сетевые запросы.", - "mode": "Mode", + "mode": "Режим", "q": "Q", - "filterSkillsPlaceholder": "__MISSING__:Filter skills by name, description, or tag", - "allModes": "__MISSING__:All modes", - "skillsMarketplace": "__MISSING__:Skills Marketplace", - "installSkill": "__MISSING__:Install Skill" + "filterSkillsPlaceholder": "Фильтр навыков по названию, описанию или тегу", + "allModes": "Все режимы", + "skillsMarketplace": "Маркетплейс навыков", + "installSkill": "Установить навык" }, "health": { "title": "Здоровье системы", @@ -2849,83 +2877,83 @@ "resetting": "Сброс...", "resetAll": "Сбросить все", "until": "До {time}", - "limitExhausted": "Exhausted", - "learnedFromHeaders": "Learned from headers", + "limitExhausted": "Исчерпан", + "learnedFromHeaders": "Из заголовков", "remainingOfLimit": "{remaining}/{limit} remaining", - "throttleStatus": "Throttle: {value}", - "lastHeaderUpdate": "Header update: {age}", - "databaseHealth": "__MISSING__:Database Health", - "stickyBoundSessions": "__MISSING__:Sticky-bound sessions", - "sessionsByApiKey": "__MISSING__:Sessions by API key", - "noActiveSessionsTracked": "__MISSING__:No active sessions tracked yet.", - "noSessionQuotaMonitorsActive": "__MISSING__:No session quota monitors active.", - "gracefulDegradationStatus": "__MISSING__:Graceful Degradation Status" + "throttleStatus": "Троттлинг: {value}", + "lastHeaderUpdate": "Обновление заголовка: {age}", + "databaseHealth": "Здоровье базы данных", + "stickyBoundSessions": "Привязанные сессии", + "sessionsByApiKey": "Сессии по ключам API", + "noActiveSessionsTracked": "Активные сессии не отслеживаются", + "noSessionQuotaMonitorsActive": "Мониторы квот сессий не активны", + "gracefulDegradationStatus": "Состояние плавной деградации" }, "telemetry": { - "title": "__MISSING__:System Telemetry", - "description": "__MISSING__:Rolling request, runtime, session, and memory signals from this OmniRoute process.", - "uptime": "__MISSING__:Uptime", - "totalRequests": "__MISSING__:Total Requests", - "avgLatency": "__MISSING__:Avg Latency", - "errorRate": "__MISSING__:Error Rate", - "activeConnections": "__MISSING__:Active Connections", - "memoryUsage": "__MISSING__:Memory Usage", - "latencyTrend": "__MISSING__:Latency trend", - "throughputTrend": "__MISSING__:Throughput trend", - "memoryTrend": "__MISSING__:Memory trend", - "refresh": "__MISSING__:Refresh", - "updatedAt": "__MISSING__:Updated {time}", - "loadFailed": "__MISSING__:Failed to load telemetry.", - "partialData": "__MISSING__:Telemetry is partially available: {error}" + "title": "Телеметрия системы", + "description": "Показатели запросов, времени работы, сессий и памяти в реальном времени", + "uptime": "Время работы", + "totalRequests": "Всего запросов", + "avgLatency": "Средняя задержка", + "errorRate": "Доля ошибок", + "activeConnections": "Активные подключения", + "memoryUsage": "Использование памяти", + "latencyTrend": "Тренд задержки", + "throughputTrend": "Тренд пропускной способности", + "memoryTrend": "Тренд памяти", + "refresh": "Обновить", + "updatedAt": "Обновлено", + "loadFailed": "Не удалось загрузить", + "partialData": "Частичные данные" }, "mitm": { - "title": "__MISSING__:MITM Proxy", - "description": "__MISSING__:Transparent proxy for intercepting and routing client requests.", - "enable": "__MISSING__:Enable MITM Proxy", - "enableDesc": "__MISSING__:Start or stop the local interception process and DNS override.", - "status": "__MISSING__:Status", - "running": "__MISSING__:Running", - "stopped": "__MISSING__:Stopped", - "start": "__MISSING__:Start", - "stop": "__MISSING__:Stop", - "refresh": "__MISSING__:Refresh", - "port": "__MISSING__:Proxy Port", - "apiKey": "__MISSING__:Router API Key", - "apiKeyPlaceholder": "__MISSING__:Optional; falls back to a local key", - "sudoPassword": "__MISSING__:Sudo Password", - "cachedPassword": "__MISSING__:Cached for this process", - "saveSettings": "__MISSING__:Save Settings", - "settingsSaved": "__MISSING__:MITM settings saved.", - "startedSuccess": "__MISSING__:MITM proxy started.", - "stoppedSuccess": "__MISSING__:MITM proxy stopped.", - "saveFailed": "__MISSING__:Failed to update MITM settings.", - "loadFailed": "__MISSING__:Failed to load MITM settings.", - "invalidPort": "__MISSING__:Transparent MITM interception currently requires port 443.", - "certificate": "__MISSING__:CA Certificate", - "certificateReady": "__MISSING__:Certificate is available for client trust installation.", - "certificateMissing": "__MISSING__:Certificate has not been generated yet.", - "available": "__MISSING__:Available", - "missing": "__MISSING__:Missing", - "downloadCert": "__MISSING__:Download CA Certificate", - "regenerateCert": "__MISSING__:Regenerate Certificate", - "regenerateConfirm": "__MISSING__:This will invalidate existing client trust. Continue?", - "regenerateSuccess": "__MISSING__:MITM certificate regenerated.", - "regenerateFailed": "__MISSING__:Failed to regenerate MITM certificate.", - "targetRoutes": "__MISSING__:Target Routes", - "interceptedRequests": "__MISSING__:Intercepted Requests", - "activeConnections": "__MISSING__:Active Connections", - "dnsConfigured": "__MISSING__:DNS Configured", - "pid": "__MISSING__:PID", - "lastIntercept": "__MISSING__:Last Intercept", - "target": "__MISSING__:Target", - "host": "__MISSING__:Host", - "localPort": "__MISSING__:Local Port", - "endpoints": "__MISSING__:Endpoints", - "enabled": "__MISSING__:Enabled", - "configured": "__MISSING__:Configured", - "yes": "__MISSING__:Yes", - "no": "__MISSING__:No", - "noTargets": "__MISSING__:No target routes configured." + "title": "MITM-прокси", + "description": "Прозрачный прокси для перехвата и маршрутизации запросов клиентов", + "enable": "Включить MITM", + "enableDesc": "Запуск и остановка локального процесса перехвата", + "status": "Статус", + "running": "Запущен", + "stopped": "Остановлен", + "start": "Запустить", + "stop": "Остановить", + "refresh": "Обновить", + "port": "Порт", + "apiKey": "Ключ API", + "apiKeyPlaceholder": "Ключ для подключений", + "sudoPassword": "Пароль sudo", + "cachedPassword": "Пароль сохранён в памяти", + "saveSettings": "Сохранить настройки", + "settingsSaved": "Настройки сохранены", + "startedSuccess": "MITM запущен", + "stoppedSuccess": "MITM остановлен", + "saveFailed": "Не удалось сохранить", + "loadFailed": "Не удалось загрузить", + "invalidPort": "Некорректный порт", + "certificate": "Сертификат", + "certificateReady": "Сертификат готов", + "certificateMissing": "Сертификат не найден", + "available": "Доступен", + "missing": "Отсутствует", + "downloadCert": "Скачать сертификат", + "regenerateCert": "Пересоздать сертификат", + "regenerateConfirm": "Пересоздать сертификат? Это может потребовать переустановки на клиентах.", + "regenerateSuccess": "Сертификат пересоздан", + "regenerateFailed": "Не удалось пересоздать сертификат", + "targetRoutes": "Целевые маршруты", + "interceptedRequests": "Перехваченные запросы", + "activeConnections": "Активные подключения", + "dnsConfigured": "DNS настроен", + "pid": "PID", + "lastIntercept": "Последний перехват", + "target": "Цель", + "host": "Хост", + "localPort": "Локальный порт", + "endpoints": "Эндпоинты", + "enabled": "Включён", + "configured": "Настроен", + "yes": "Да", + "no": "Нет", + "noTargets": "Целей не задано" }, "limits": { "title": "Лимиты и квоты", @@ -2964,11 +2992,11 @@ "noEntries": "Записи журнала аудита не найдены", "previous": "Предыдущий", "next": "Далее", - "providerWarningTitle": "Provider Warning Title", - "viewDetails": "View Details", - "eventMetadata": "Event Metadata", - "eventPayload": "Event Payload", - "requestId": "Request Id", + "providerWarningTitle": "Предупреждение провайдера", + "viewDetails": "Подробнее", + "eventMetadata": "Метаданные события", + "eventPayload": "Полезная нагрузка", + "requestId": "ID запроса", "providerWarningDesc": "Provider Warning Desc", "a": "A", "offset": "Offset", @@ -2981,8 +3009,8 @@ "close": "Close", "runningRequests": "Active Requests", "runningRequestsDesc": "Real-time view of currently running upstream requests", - "clearAll": "__MISSING__:Clear All", - "confirmClearActiveRequests": "__MISSING__:Clear all active requests?", + "clearAll": "Очистить все", + "confirmClearActiveRequests": "Очистить все активные запросы?", "model": "Model", "provider": "Provider", "account": "Account", @@ -3048,34 +3076,35 @@ "failedAddProvider": "Не удалось добавить поставщика. Попробуйте еще раз.", "connectionError": "Ошибка подключения. Пожалуйста, попробуйте еще раз.", "provider": "Поставщик", - "apiKeyHelp": "__MISSING__:An API key is a password for AI services. Get one from your provider's website (e.g., platform.openai.com, console.anthropic.com).", + "apiKeyHelp": "Ключ API — это пароль для AI-сервисов. Получите его у своего провайдера.", "tier": { - "subtitle": "__MISSING__:OmniRoute organises providers into three tiers so routing prefers the most reliable, lowest-cost path first.", + "subtitle": "OmniRoute организует провайдеров по трём уровням для удобной маршрутизации.", "tier1": { - "label": "__MISSING__:Premium clients", - "description": "__MISSING__:First-class CLIs with native auth flows and reasoning models." + "label": "Премиум-клиенты", + "description": "CLI первого класса с нативной аутентификацией и моделями рассуждений" }, "tier2": { - "label": "__MISSING__:Cost-optimised", - "description": "__MISSING__:Cheap, high-throughput providers used for everyday traffic." + "label": "Оптимизировано по цене", + "description": "Недорогие высокопроизводительные провайдеры для повседневного трафика." }, "tier3": { - "label": "__MISSING__:Fallback & specialty", - "description": "__MISSING__:Locally-hosted or specialty endpoints used as fallbacks." + "label": "Резерв и специализированные", + "description": "Локальные или специализированные эндпоинты для резерва." }, - "configure": "__MISSING__:Configure providers" + "configure": "Настроить", + "flowDiagramAlt": "Схема уровней провайдеров" }, - "tierFlowDiagramAlt": "__MISSING__:OmniRoute 3-tier fallback diagram" + "tierFlowDiagramAlt": "OmniRoute 3-tier fallback diagram" }, "providers": { "title": "Провайдеры", - "allProviders": "__MISSING__:All Providers", - "audioProviders": "__MISSING__:Audio Providers", - "showFreeOnly": "__MISSING__:Free only", + "allProviders": "Все провайдеры", + "audioProviders": "Аудиопровайдеры", + "showFreeOnly": "Только бесплатные", "addProvider": "Добавить поставщика", - "addFirstProvider": "__MISSING__:Add your first provider", - "addFirstProviderDesc": "__MISSING__:Connect an AI provider to start routing requests through OmniRoute. You can use free providers, API keys, or OAuth accounts.", - "learnMore": "__MISSING__:Learn more", + "addFirstProvider": "Добавьте первого провайдера", + "addFirstProviderDesc": "Подключите AI-провайдера для маршрутизации запросов через OmniRoute", + "learnMore": "Узнать больше", "editProvider": "Изменить поставщика", "deleteProvider": "Удалить поставщика", "noProviders": "Поставщики не настроены", @@ -3108,14 +3137,14 @@ "connected": "{count} подключено", "errorCount": "{count} Ошибка ({code})", "errorCountNoCode": "{count} Ошибка", - "warningCount": "__MISSING__:{count} Warning", + "warningCount": "{count} предупреждений", "noConnections": "Нет соединений", "expiredBadge": "Expired", "expiringSoonBadge": "Expiring Soon", - "freeTier": "__MISSING__:Free Tier", - "freeTierAvailable": "__MISSING__:Free tier available", - "deprecated": "__MISSING__:Deprecated", - "deprecatedProvider": "__MISSING__:This provider has been deprecated", + "freeTier": "Бесплатный тариф", + "freeTierAvailable": "Доступен бесплатный тариф", + "deprecated": "Устарел", + "deprecatedProvider": "Устаревший провайдер", "disabled": "Отключено", "enableProvider": "Включить провайдера", "disableProvider": "Отключить провайдера", @@ -3245,19 +3274,19 @@ "disableRateLimitProtection": "Нажмите, чтобы отключить защиту ограничения скорости", "productionKey": "Производственный ключ", "enterNewApiKey": "Введите новый ключ API", - "codexApplyModalTitle": "__MISSING__:Apply to Local Codex", - "codexApplyTargetLabel": "__MISSING__:Target path", - "codexApplyBackupLabel": "__MISSING__:Backups", - "codexApplyWarning": "__MISSING__:This will replace the existing auth.json. Continue?", - "codexApplyConfirmCheckbox": "__MISSING__:I confirm I want to replace the existing auth.json", - "codexApply": "__MISSING__:Apply", - "bulkTabSingle": "__MISSING__:Single", - "bulkTabBulkAdd": "__MISSING__:Bulk Add", - "bulkAddFormatHint": "__MISSING__:One key per line. Format: name|apiKey or just apiKey (auto-named by index).", - "bulkValidateKeys": "__MISSING__:Validate each key before saving (slower)", - "bulkAddAllKeys": "__MISSING__:Add All Keys", - "bulkAddedCount": "__MISSING__:{count, plural, one {# key added} other {# keys added}}", - "bulkFailedCount": "__MISSING__:{count, plural, one {# failed} other {# failed}}", + "codexApplyModalTitle": "Apply to Local Codex", + "codexApplyTargetLabel": "Target path", + "codexApplyBackupLabel": "Backups", + "codexApplyWarning": "This will replace the existing auth.json. Continue?", + "codexApplyConfirmCheckbox": "I confirm I want to replace the existing auth.json", + "codexApply": "Apply", + "bulkTabSingle": "По одному", + "bulkTabBulkAdd": "Массовое добавление", + "bulkAddFormatHint": "Формат: key=value, по одному на строку", + "bulkValidateKeys": "Проверить ключи", + "bulkAddAllKeys": "Добавить все ключи", + "bulkAddedCount": "Добавлено: {count}", + "bulkFailedCount": "С ошибками: {count}", "optional": "Необязательно", "anthropicCompatibleName": "Антропная совместимость", "openaiCompatibleName": "Совместимость с OpenAI", @@ -3358,7 +3387,7 @@ "compatBadgeUpstreamHeaders": "Заголовки", "perModelQuotaLabel": "Per Model Quota Label", "perModelQuotaDescription": "Per Model Quota Description", - "perModelQuotaToggle": "__MISSING__:Per-Model Quota Toggle", + "perModelQuotaToggle": "Квота на модель", "modelId": "Идентификатор модели", "customModelPlaceholder": "например gpt-4.5-турбо", "loading": "Загрузка...", @@ -3410,127 +3439,127 @@ "tokenRefreshFailed": "Не удалось обновить токен", "applyCodexAuthLocal": "Применить авторизацию", "exportCodexAuthFile": "Экспортировать авторизацию", - "applyClaudeAuthLocal": "__MISSING__:Apply auth", - "exportClaudeAuthFile": "__MISSING__:Export auth", - "importClaudeAuth": "__MISSING__:Import auth", - "claudeApplyModalTitle": "__MISSING__:Apply to Local Claude Code", - "claudeApplyTargetLabel": "__MISSING__:Target path", - "claudeApplyBackupLabel": "__MISSING__:Backups", - "claudeApplyMcpHint": "__MISSING__:Existing MCP OAuth state will be preserved.", - "claudeApplyWarning": "__MISSING__:This will replace the existing claudeAiOauth section. Continue?", - "claudeApplyConfirmCheckbox": "__MISSING__:I confirm I want to replace the existing claudeAiOauth section", - "claudeApply": "__MISSING__:Apply", - "claudeAuthAppliedLocal": "__MISSING__:Claude auth applied locally", - "claudeAuthApplyFailed": "__MISSING__:Failed to apply Claude auth locally", - "claudeAuthExported": "__MISSING__:Claude auth file exported", - "claudeAuthExportFailed": "__MISSING__:Failed to export Claude auth file", - "claudeImportModalTitle": "__MISSING__:Import Claude Auth", - "claudeImportTabSingle": "__MISSING__:Single", - "claudeImportTabBulk": "__MISSING__:Bulk", - "claudeImportTabUpload": "__MISSING__:Upload file", - "claudeImportTabPaste": "__MISSING__:Paste JSON", - "claudeImportFileLabel": "__MISSING__:Choose .credentials.json", - "claudeImportPasteLabel": "__MISSING__:Paste the JSON content", - "claudeImportEmailLabel": "__MISSING__:Account email", - "claudeImportNameLabel": "__MISSING__:Connection name (optional)", - "claudeImportOverwriteLabel": "__MISSING__:Replace existing connection if account already exists", - "claudeImportSubmit": "__MISSING__:Import", - "claudeImportSuccess": "__MISSING__:Claude connection imported successfully", - "claudeImportInvalidJson": "__MISSING__:Could not parse the file as JSON", - "claudeImportInvalidShape": "__MISSING__:The file is not a valid .credentials.json", - "claudeImportDuplicate": "__MISSING__:Account already exists — enable \"Replace existing\" to overwrite", - "claudeImportIdentityUnverified": "__MISSING__:Bootstrap could not verify the account. Enable \"Replace existing\" or provide an email.", - "claudeImportFailed": "__MISSING__:Failed to import Claude auth", - "claudeImportBulkModeUpload": "__MISSING__:Upload files", - "claudeImportBulkModePaste": "__MISSING__:Paste JSON array", - "claudeImportBulkModeZip": "__MISSING__:Upload ZIP", - "claudeImportBulkUploadHint": "__MISSING__:Drop or pick up to 50 .credentials.json files (256KB each, 10MB total).", - "claudeImportBulkPasteHint": "__MISSING__:Paste an array of objects: [{ json, name?, email? }, ...]", - "claudeImportBulkZipHint": "__MISSING__:ZIP containing .json entries. Max 50 entries, 10MB unpacked.", - "claudeImportBulkSubmit": "__MISSING__:Import all", - "claudeImportBulkSuccess": "__MISSING__:Imported {count} Claude connections", - "claudeImportBulkFailed": "__MISSING__:Some entries failed to import", - "claudeImportBulkZipExtracting": "__MISSING__:Extracting ZIP…", - "claudeImportBulkZipError": "__MISSING__:Failed to extract ZIP", - "applyGeminiAuthLocal": "__MISSING__:Apply auth", - "exportGeminiAuthFile": "__MISSING__:Export auth", - "importGeminiAuth": "__MISSING__:Import auth", - "geminiApplyModalTitle": "__MISSING__:Apply to Local Gemini CLI", - "geminiApplyTargetLabel": "__MISSING__:Target path", - "geminiApplyBackupLabel": "__MISSING__:Backups", - "geminiApplyAccountsHint": "__MISSING__:The google_accounts.json active account will be updated to match this connection.", - "geminiApplyWarning": "__MISSING__:This will replace the existing oauth_creds.json and update google_accounts.json. Continue?", - "geminiApplyConfirmCheckbox": "__MISSING__:I confirm I want to replace the existing oauth_creds.json", - "geminiApply": "__MISSING__:Apply", - "geminiAuthAppliedLocal": "__MISSING__:Gemini auth applied locally", - "geminiAuthApplyFailed": "__MISSING__:Failed to apply Gemini auth locally", - "geminiAuthExported": "__MISSING__:Gemini auth file exported", - "geminiAuthExportFailed": "__MISSING__:Failed to export Gemini auth file", - "geminiImportModalTitle": "__MISSING__:Import Gemini Auth", - "geminiImportTabSingle": "__MISSING__:Single", - "geminiImportTabBulk": "__MISSING__:Bulk", - "geminiImportTabUpload": "__MISSING__:Upload file", - "geminiImportTabPaste": "__MISSING__:Paste JSON", - "geminiImportFileLabel": "__MISSING__:Choose oauth_creds.json", - "geminiImportPasteLabel": "__MISSING__:Paste the JSON content", - "geminiImportEmailLabel": "__MISSING__:Account email", - "geminiImportNameLabel": "__MISSING__:Connection name (optional)", - "geminiImportOverwriteLabel": "__MISSING__:Replace existing connection if account already exists", - "geminiImportSubmit": "__MISSING__:Import", - "geminiImportSuccess": "__MISSING__:Gemini connection imported successfully", - "geminiImportInvalidJson": "__MISSING__:Could not parse the file as JSON", - "geminiImportInvalidShape": "__MISSING__:The file is not a valid oauth_creds.json", - "geminiImportDuplicate": "__MISSING__:Account already exists — enable \"Replace existing\" to overwrite", - "geminiImportIdentityUnverified": "__MISSING__:Could not verify identity from id_token. Enable \"Replace existing\" or provide an email.", - "geminiImportFailed": "__MISSING__:Failed to import Gemini auth", - "geminiImportBulkModeUpload": "__MISSING__:Upload files", - "geminiImportBulkModePaste": "__MISSING__:Paste JSON array", - "geminiImportBulkModeZip": "__MISSING__:Upload ZIP", - "geminiImportBulkUploadHint": "__MISSING__:Drop or pick up to 50 oauth_creds.json files (256KB each, 10MB total).", - "geminiImportBulkPasteHint": "__MISSING__:Paste an array of objects: [{ json, name?, email? }, ...]", - "geminiImportBulkZipHint": "__MISSING__:ZIP containing oauth_creds.json entries. Max 50 entries, 10MB unpacked.", - "geminiImportBulkSubmit": "__MISSING__:Import all", - "geminiImportBulkSuccess": "__MISSING__:Imported {count} Gemini connections", - "geminiImportBulkFailed": "__MISSING__:Some entries failed to import", - "geminiImportBulkZipExtracting": "__MISSING__:Extracting ZIP…", - "geminiImportBulkZipError": "__MISSING__:Failed to extract ZIP", + "applyClaudeAuthLocal": "Применить к Claude", + "exportClaudeAuthFile": "Экспортировать файл", + "importClaudeAuth": "Импорт из Claude", + "claudeApplyModalTitle": "Apply to Local Claude Code", + "claudeApplyTargetLabel": "Target path", + "claudeApplyBackupLabel": "Backups", + "claudeApplyMcpHint": "Existing MCP OAuth state will be preserved.", + "claudeApplyWarning": "This will replace the existing claudeAiOauth section. Continue?", + "claudeApplyConfirmCheckbox": "I confirm I want to replace the existing claudeAiOauth section", + "claudeApply": "Apply", + "claudeAuthAppliedLocal": "Claude auth applied locally", + "claudeAuthApplyFailed": "Failed to apply Claude auth locally", + "claudeAuthExported": "Claude auth file exported", + "claudeAuthExportFailed": "Failed to export Claude auth file", + "claudeImportModalTitle": "Import Claude Auth", + "claudeImportTabSingle": "Single", + "claudeImportTabBulk": "Bulk", + "claudeImportTabUpload": "Upload file", + "claudeImportTabPaste": "Paste JSON", + "claudeImportFileLabel": "Choose .credentials.json", + "claudeImportPasteLabel": "Paste the JSON content", + "claudeImportEmailLabel": "Account email", + "claudeImportNameLabel": "Connection name (optional)", + "claudeImportOverwriteLabel": "Replace existing connection if account already exists", + "claudeImportSubmit": "Import", + "claudeImportSuccess": "Claude connection imported successfully", + "claudeImportInvalidJson": "Could not parse the file as JSON", + "claudeImportInvalidShape": "The file is not a valid .credentials.json", + "claudeImportDuplicate": "Account already exists — enable \"Replace existing\" to overwrite", + "claudeImportIdentityUnverified": "Bootstrap could not verify the account. Enable \"Replace existing\" or provide an email.", + "claudeImportFailed": "Failed to import Claude auth", + "claudeImportBulkModeUpload": "Upload files", + "claudeImportBulkModePaste": "Paste JSON array", + "claudeImportBulkModeZip": "Upload ZIP", + "claudeImportBulkUploadHint": "Drop or pick up to 50 .credentials.json files (256KB each, 10MB total).", + "claudeImportBulkPasteHint": "Paste an array of objects: [{ json, name?, email? }, ...]", + "claudeImportBulkZipHint": "ZIP containing .json entries. Max 50 entries, 10MB unpacked.", + "claudeImportBulkSubmit": "Import all", + "claudeImportBulkSuccess": "Imported {count} Claude connections", + "claudeImportBulkFailed": "Some entries failed to import", + "claudeImportBulkZipExtracting": "Extracting ZIP…", + "claudeImportBulkZipError": "Failed to extract ZIP", + "applyGeminiAuthLocal": "Применить к Gemini", + "exportGeminiAuthFile": "Экспортировать файл", + "importGeminiAuth": "Импорт из Gemini", + "geminiApplyModalTitle": "Apply to Local Gemini CLI", + "geminiApplyTargetLabel": "Target path", + "geminiApplyBackupLabel": "Backups", + "geminiApplyAccountsHint": "The google_accounts.json active account will be updated to match this connection.", + "geminiApplyWarning": "This will replace the existing oauth_creds.json and update google_accounts.json. Continue?", + "geminiApplyConfirmCheckbox": "I confirm I want to replace the existing oauth_creds.json", + "geminiApply": "Apply", + "geminiAuthAppliedLocal": "Gemini auth applied locally", + "geminiAuthApplyFailed": "Failed to apply Gemini auth locally", + "geminiAuthExported": "Gemini auth file exported", + "geminiAuthExportFailed": "Failed to export Gemini auth file", + "geminiImportModalTitle": "Import Gemini Auth", + "geminiImportTabSingle": "Single", + "geminiImportTabBulk": "Bulk", + "geminiImportTabUpload": "Upload file", + "geminiImportTabPaste": "Paste JSON", + "geminiImportFileLabel": "Choose oauth_creds.json", + "geminiImportPasteLabel": "Paste the JSON content", + "geminiImportEmailLabel": "Account email", + "geminiImportNameLabel": "Connection name (optional)", + "geminiImportOverwriteLabel": "Replace existing connection if account already exists", + "geminiImportSubmit": "Import", + "geminiImportSuccess": "Gemini connection imported successfully", + "geminiImportInvalidJson": "Could not parse the file as JSON", + "geminiImportInvalidShape": "The file is not a valid oauth_creds.json", + "geminiImportDuplicate": "Account already exists — enable \"Replace existing\" to overwrite", + "geminiImportIdentityUnverified": "Could not verify identity from id_token. Enable \"Replace existing\" or provide an email.", + "geminiImportFailed": "Failed to import Gemini auth", + "geminiImportBulkModeUpload": "Upload files", + "geminiImportBulkModePaste": "Paste JSON array", + "geminiImportBulkModeZip": "Upload ZIP", + "geminiImportBulkUploadHint": "Drop or pick up to 50 oauth_creds.json files (256KB each, 10MB total).", + "geminiImportBulkPasteHint": "Paste an array of objects: [{ json, name?, email? }, ...]", + "geminiImportBulkZipHint": "ZIP containing oauth_creds.json entries. Max 50 entries, 10MB unpacked.", + "geminiImportBulkSubmit": "Import all", + "geminiImportBulkSuccess": "Imported {count} Gemini connections", + "geminiImportBulkFailed": "Some entries failed to import", + "geminiImportBulkZipExtracting": "Extracting ZIP…", + "geminiImportBulkZipError": "Failed to extract ZIP", "codexAuthAppliedLocal": "Codex auth.json применён локально", "codexAuthApplyFailed": "Не удалось применить Codex auth.json локально", "codexAuthExported": "Codex auth.json экспортирован", "codexAuthExportFailed": "Не удалось экспортировать Codex auth.json", - "importCodexAuth": "__MISSING__:Import auth", - "codexImportModalTitle": "__MISSING__:Import Codex Auth", - "codexImportTabSingle": "__MISSING__:Single", - "codexImportTabBulk": "__MISSING__:Bulk", - "codexImportTabUpload": "__MISSING__:Upload file", - "codexImportTabPaste": "__MISSING__:Paste JSON", - "codexImportFileLabel": "__MISSING__:Choose auth.json", - "codexImportFileHint": "__MISSING__:Select the auth.json file exported from Codex or from OmniRoute.", - "codexImportPasteLabel": "__MISSING__:Paste the JSON content", - "codexImportEmailLabel": "__MISSING__:Account email", - "codexImportEmailHint": "__MISSING__:Auto-detected from the file; edit if needed.", - "codexImportNameLabel": "__MISSING__:Connection name (optional)", - "codexImportOverwriteLabel": "__MISSING__:Replace existing connection if account already exists", - "codexImportSubmit": "__MISSING__:Import", - "codexImportSuccess": "__MISSING__:Codex connection imported successfully", - "codexImportInvalidJson": "__MISSING__:Could not parse the file as JSON", - "codexImportInvalidShape": "__MISSING__:The file is not a valid Codex auth.json", - "codexImportDuplicate": "__MISSING__:Account already exists — enable \"Replace existing\" to overwrite", - "codexImportFailed": "__MISSING__:Failed to import Codex auth", - "codexImportDetectedEmail": "__MISSING__:Detected: {email}", - "codexImportNoEmailDetected": "__MISSING__:No email detected in file", - "codexImportBulkModeUpload": "__MISSING__:Upload files", - "codexImportBulkModePaste": "__MISSING__:Paste list", - "codexImportBulkModeZip": "__MISSING__:ZIP archive", - "codexImportBulkUploadHint": "__MISSING__:Select multiple .json files or drag and drop", - "codexImportBulkPasteHint": "__MISSING__:JSON array [ {...}, {...} ] or multiple JSONs separated by --- on its own line", - "codexImportBulkZipHint": "__MISSING__:Upload a .zip containing auth.json files (max 50 files, 10 MB)", - "codexImportBulkSubmit": "__MISSING__:Import {count} accounts", - "codexImportBulkLimit": "__MISSING__:Max 50 files per import", - "codexImportBulkSuccess": "__MISSING__:{count} imported", - "codexImportBulkFailed": "__MISSING__:{count} failed", - "codexImportBulkZipExtracting": "__MISSING__:Extracting ZIP…", - "codexImportBulkZipError": "__MISSING__:Failed to extract ZIP", + "importCodexAuth": "Импорт из Codex", + "codexImportModalTitle": "Import Codex Auth", + "codexImportTabSingle": "Single", + "codexImportTabBulk": "Bulk", + "codexImportTabUpload": "Upload file", + "codexImportTabPaste": "Paste JSON", + "codexImportFileLabel": "Choose auth.json", + "codexImportFileHint": "Select the auth.json file exported from Codex or from OmniRoute.", + "codexImportPasteLabel": "Paste the JSON content", + "codexImportEmailLabel": "Account email", + "codexImportEmailHint": "Auto-detected from the file; edit if needed.", + "codexImportNameLabel": "Connection name (optional)", + "codexImportOverwriteLabel": "Replace existing connection if account already exists", + "codexImportSubmit": "Import", + "codexImportSuccess": "Codex connection imported successfully", + "codexImportInvalidJson": "Could not parse the file as JSON", + "codexImportInvalidShape": "The file is not a valid Codex auth.json", + "codexImportDuplicate": "Account already exists — enable \"Replace existing\" to overwrite", + "codexImportFailed": "Failed to import Codex auth", + "codexImportDetectedEmail": "Detected: {email}", + "codexImportNoEmailDetected": "No email detected in file", + "codexImportBulkModeUpload": "Upload files", + "codexImportBulkModePaste": "Paste list", + "codexImportBulkModeZip": "ZIP archive", + "codexImportBulkUploadHint": "Select multiple .json files or drag and drop", + "codexImportBulkPasteHint": "JSON array [ {...}, {...} ] or multiple JSONs separated by --- on its own line", + "codexImportBulkZipHint": "Upload a .zip containing auth.json files (max 50 files, 10 MB)", + "codexImportBulkSubmit": "Import {count} accounts", + "codexImportBulkLimit": "Max 50 files per import", + "codexImportBulkSuccess": "{count} imported", + "codexImportBulkFailed": "{count} failed", + "codexImportBulkZipExtracting": "Extracting ZIP…", + "codexImportBulkZipError": "Failed to extract ZIP", "advancedSettings": "Расширенные настройки", "chatPathLabel": "Путь чат-эндпоинта", "chatPathPlaceholder": "/chat/completions", @@ -3552,7 +3581,7 @@ "addAnotherApiKey": "Add another API key or paste multiple keys", "addCcCompatible": "Add Cc Compatible", "aggregatorsGateways": "Aggregators Gateways", - "enterpriseCloud": "__MISSING__:Enterprise & Cloud", + "enterpriseCloud": "Облако для Enterprise", "apiFormatLabel": "Api Format Label", "apiKeyOptionalHint": "Api Key Optional Hint", "apiKeyOptionalLabel": "Api Key Optional Label", @@ -3563,14 +3592,14 @@ "apikey": "Apikey", "audio": "Audio", "audioProvidersHeading": "Audio Providers Heading", - "cloudAgentProviders": "__MISSING__:Cloud Agent Providers", + "cloudAgentProviders": "Провайдеры облачных агентов", "audioShortLabel": "Audio Short Label", "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", "bailianBaseUrlHint": "Bailian Base Url Hint", "blackboxWebCookieHint": "Blackbox Web Cookie Hint", "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", - "t3ChatWebCookieHint": "__MISSING__:Open t3.chat → DevTools → Application → Local Storage → https://t3.chat, copy 'convex-session-id'. Then open DevTools → Network, copy the full Cookie header from any chat request. Paste both values in the fields below.", - "t3ChatWebCookiePlaceholder": "__MISSING__:convex-session-id=abc123...", + "t3ChatWebCookieHint": "Open t3.chat → DevTools → Application → Local Storage → https://t3.chat, copy 'convex-session-id'. Then open DevTools → Network, copy the full Cookie header from any chat request. Paste both values in the fields below.", + "t3ChatWebCookiePlaceholder": "convex-session-id=abc123...", "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}", @@ -3630,25 +3659,19 @@ "apiKeyWarningAlert": "{count} API key(s) in warning state due to elevated failure rate in connections: {connections}. Review to prevent rotation issues.", "apiKeyWarningAlertTitle": "API Key Warning", "googlePseInfo": "Google Pse Info", - "geminiCliProjectIdHint": "__MISSING__:Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", - "geminiCliProjectIdLabel": "__MISSING__:Google Cloud Project ID", - "geminiCliProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", - "antigravityProjectIdHint": "__MISSING__:Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", - "antigravityClientProfileLabel": "Профиль клиента", - "antigravityClientProfileHint": "Какой клиент Antigravity представляет OmniRoute при запросах к API.", - "antigravityClientProfileIde": "IDE", - "antigravityClientProfileHarness": "Harness / CLI", - "codexFastTierActiveChip": "Активен Codex Fast tier", - "tierFast": "__MISSING__:Fast", - "antigravityProjectIdLabel": "__MISSING__:Google Cloud Project ID", - "antigravityProjectIdPlaceholder": "__MISSING__:my-gcp-project-id", + "geminiCliProjectIdHint": "Your Google Cloud Project ID. Required for accounts with exceptions. Enter your GCP Project ID to use with Gemini CLI.", + "geminiCliProjectIdLabel": "Google Cloud Project ID", + "geminiCliProjectIdPlaceholder": "my-gcp-project-id", + "antigravityProjectIdHint": "Optional override for Antigravity Cloud Code requests. Leave blank to use the project discovered during Google OAuth.", + "antigravityProjectIdLabel": "Google Cloud Project ID", + "antigravityProjectIdPlaceholder": "my-gcp-project-id", "grokWebCookieHint": "Grok Web Cookie Hint", "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", "herokuBaseUrlHint": "Heroku Base Url Hint", "hideEmail": "Hide Email", "imageProviders": "Image Providers", - "videoProviders": "__MISSING__:Video Generation", - "embeddingRerankProviders": "__MISSING__:Embeddings & Rerank", + "videoProviders": "Видеопровайдеры", + "embeddingRerankProviders": "Эмбеддинги и переранжирование", "imagesShortLabel": "Images Short Label", "llmProviders": "Llm Providers", "localProviderApiKeyOptionalHint": "Local Provider Api Key Optional Hint", @@ -3721,22 +3744,22 @@ "zedImportNone": "Zed Import None", "zedImportSuccess": "Zed Import Success", "zedImporting": "Zed Importing", - "freeTierProviders": "__MISSING__:Free Tier Providers", - "freeTierLabel": "__MISSING__:Free tier available", - "freeTierProvidersDesc": "__MISSING__:Providers with free tiers — some require an API key signup, others need no credentials at all.", - "providerSummaryAll": "__MISSING__:Total", - "ideProviders": "__MISSING__:IDE Providers", - "ideProvidersDesc": "__MISSING__:Editors with built-in AI subscription. Use the provider page to import credentials directly from the IDE keychain.", - "noIdeProviders": "__MISSING__:No IDE providers match the current filters.", - "providerDetailFastTierTooltip": "__MISSING__:Apply Codex Fast tier to all Codex connections by default", - "providerDetailFastDefaultLabel": "__MISSING__:Fast default", - "providerDetailBrowserManualConnect": "__MISSING__:Browser/manual connect", - "providerDetailAuthUrl": "__MISSING__:Auth URL", - "providerDetailCallbackUrl": "__MISSING__:Callback URL", - "providerDetailValidClaudeCredentialsFile": "__MISSING__:Valid Claude credentials file", - "providerDetailPathAutoDetectedAllOs": "__MISSING__:Path is auto-detected per OS (Linux/Mac/Windows).", - "providerDetailMyClaudeAccountPlaceholder": "__MISSING__:My Claude account", - "providerDetailPathAutoDetected": "__MISSING__:Path is auto-detected per OS (Linux/Mac)." + "freeTierProviders": "Бесплатные провайдеры", + "freeTierLabel": "Бесплатно", + "freeTierProvidersDesc": "Провайдеры с бесплатным доступом", + "providerSummaryAll": "Сводка по всем провайдерам", + "ideProviders": "IDE-провайдеры", + "ideProvidersDesc": "Провайдеры для сред разработки", + "noIdeProviders": "Нет IDE-провайдеров", + "providerDetailFastTierTooltip": "Apply Codex Fast tier to all Codex connections by default", + "providerDetailFastDefaultLabel": "Fast default", + "providerDetailBrowserManualConnect": "Browser/manual connect", + "providerDetailAuthUrl": "Auth URL", + "providerDetailCallbackUrl": "Callback URL", + "providerDetailValidClaudeCredentialsFile": "Valid Claude credentials file", + "providerDetailPathAutoDetectedAllOs": "Path is auto-detected per OS (Linux/Mac/Windows).", + "providerDetailMyClaudeAccountPlaceholder": "My Claude account", + "providerDetailPathAutoDetected": "Path is auto-detected per OS (Linux/Mac)." }, "settings": { "title": "Настройки", @@ -3746,15 +3769,15 @@ "routing": "Маршрутизация", "cache": "Кэш", "resilience": "Устойчивость", - "routingSettingsIntro": "__MISSING__:Controls how your requests are routed, transformed, and sent to AI providers.", - "resilienceSettingsIntro": "__MISSING__:Automatic retry, cooldown, and fallback when providers fail.", - "aiSettingsIntro": "__MISSING__:AI-specific settings for thinking budget, model behavior, and compression.", + "routingSettingsIntro": "Управление маршрутизацией, трансформацией и отправкой запросов", + "resilienceSettingsIntro": "Автоматические повторы, остывание и fallback при сбоях провайдеров", + "aiSettingsIntro": "Настройки AI: бюджет мышления, поведение моделей и агентные возможности", "systemPrompt": "Системная подсказка", "thinkingBudget": "Думая о бюджете", "proxy": "Прокси", - "httpProxy": "HTTP Proxy", + "httpProxy": "HTTP-прокси", "1proxy": "1proxy", - "proxySubTabsAria": "Proxy sections", + "proxySubTabsAria": "Разделы прокси", "requestBodyLimitTitle": "Request Body Limit", "requestBodyLimitDescription": "Maximum API payload size accepted before a request body is parsed. Dedicated upload routes keep at least their built-in 100 MB limit.", "requestBodyLimitInputLabel": "Request body limit in MB", @@ -3768,7 +3791,7 @@ "requestBodyLimitSaving": "Saving...", "requestBodyLimitSave": "Save", "requestBodyLimitCurrent": "Current: {value}", - "mitmProxy": "__MISSING__:MITM Proxy", + "mitmProxy": "MITM-прокси", "pricing": "Цены", "storage": "Хранение", "policies": "Политика", @@ -3854,8 +3877,8 @@ "autoDisableDescription": "Навсегда помечать соединения провайдера как отключённые, если они возвращают сигнал окончательной блокировки (например, HTTP 403 'verify your account'). Это убирает их из ротации комбо.", "autoDisableThreshold": "Порог блокировки", "autoDisableThresholdDesc": "Количество подряд идущих сигналов блокировки, необходимых перед постоянным отключением.", - "resilienceStructureTitle": "__MISSING__:Resilience Structure", - "resilienceStructureDesc": "__MISSING__:This page only configures behavior. Live breaker state is shown on the Health page. Combo-specific retry and round-robin slot control remain on combo settings.", + "resilienceStructureTitle": "Структура отказоустойчивости", + "resilienceStructureDesc": "Три уровня: выключатели провайдеров → остывание подключений → блокировки моделей", "enableThinking": "Включить мышление", "maxThinkingTokens": "Максимальное количество жетонов мышления", "enableProxy": "Включить прокси", @@ -3892,14 +3915,14 @@ "themeLight": "Свет", "themeDark": "Темный", "themeSystem": "Система", - "endpointTunnelVisibility": "__MISSING__:Endpoint tunnel visibility", - "endpointTunnelVisibilityDesc": "__MISSING__:Hide tunnel controls from the Endpoint page without changing tunnel state.", - "showCloudflareTunnel": "__MISSING__:Cloudflare Quick Tunnel", - "showCloudflareTunnelDesc": "__MISSING__:Show Cloudflare Quick Tunnel controls on the Endpoint page.", - "showTailscaleFunnel": "__MISSING__:Tailscale Funnel", - "showTailscaleFunnelDesc": "__MISSING__:Show Tailscale Funnel controls on the Endpoint page.", - "showNgrokTunnel": "__MISSING__:ngrok Tunnel", - "showNgrokTunnelDesc": "__MISSING__:Show ngrok Tunnel controls on the Endpoint page.", + "endpointTunnelVisibility": "Видимость туннелей", + "endpointTunnelVisibilityDesc": "Показывать/скрывать опции туннелирования", + "showCloudflareTunnel": "Cloudflare Tunnel", + "showCloudflareTunnelDesc": "Показать опцию Cloudflare Tunnel на странице эндпоинтов", + "showTailscaleFunnel": "Tailscale Funnel", + "showTailscaleFunnelDesc": "Показать опцию Tailscale Funnel на странице эндпоинтов", + "showNgrokTunnel": "ngrok", + "showNgrokTunnelDesc": "Показать опцию ngrok на странице эндпоинтов", "sidebarVisibility": "Скрывать элементы боковой панели", "sidebarVisibilityDesc": "Скрывайте любые элементы навигации боковой панели, чтобы уменьшить визуальный шум.", "sidebarVisibilityHint": "Любой раздел боковой панели скрывается автоматически, когда...", @@ -3981,14 +4004,14 @@ "apiEndpointProtection": "Защита конечных точек API", "requireAuthModels": "Требовать ключ API для /models", "requireAuthModelsDesc": "Если включено, конечная точка /v1/models возвращает 404 для неаутентифицированных запросов. Предотвращает обнаружение модели неавторизованными пользователями.", - "authModelHeading": "__MISSING__:Active authorization model", - "authModelClient": "__MISSING__:Client API endpoints (/v1/*, /chat/*, /responses/*, /codex/*, /messages/*) require a Bearer API key.", - "authModelManagement": "__MISSING__:Management endpoints (/dashboard, /api/*) require a dashboard session or management credential.", - "authModelPublic": "__MISSING__:Only login, health, and bootstrap routes are public.", - "bruteForceProtection": "__MISSING__:Login brute-force protection", - "bruteForceProtectionDesc": "__MISSING__:Throttle and lock /api/auth/login after repeated failures from the same IP.", - "corsAllowedOrigins": "__MISSING__:CORS allowed origins", - "corsAllowedOriginsDesc": "__MISSING__:Comma-separated list of browser origins permitted to call this server. Empty list = no browser CORS access (server-to-server still works). Use CORS_ALLOW_ALL=true env var only for development.", + "authModelHeading": "Модель аутентификации", + "authModelClient": "Клиентская", + "authModelManagement": "Управляющая", + "authModelPublic": "Публичная", + "bruteForceProtection": "Защита от перебора", + "bruteForceProtectionDesc": "Блокировка после нескольких неудачных попыток входа", + "corsAllowedOrigins": "Разрешённые CORS-источники", + "corsAllowedOriginsDesc": "Список источников, которым разрешены кросс-доменные запросы", "blockedProviders": "Заблокированные провайдеры", "blockedProvidersDesc": "Скройте конкретных поставщиков из ответа /v1/models. Заблокированные поставщики не будут отображаться в списках моделей.", "providersBlocked": "Поставщик(и) {count} заблокирован в /models", @@ -3999,16 +4022,16 @@ "cliFingerprintEnabled": "{count} провайдер(ов) с активным CLI-отпечатком", "enableFingerprintTitle": "Включить отпечаток для {provider}", "disableFingerprintTitle": "Отключить отпечаток для {provider}", - "systemTransforms": "__MISSING__:System-block Transform Pipeline", - "systemTransformsDesc": "__MISSING__:Per-provider ordered pipeline of transforms applied to the request body before forwarding. Supports any provider ID.", - "systemTransformsAddProvider": "__MISSING__:Add provider", - "systemTransformsAddProviderPlaceholder": "__MISSING__:Select a provider…", - "systemTransformsAddProviderAllConfigured": "__MISSING__:All providers already configured", - "systemTransformsRemoveProvider": "__MISSING__:Remove provider", - "systemTransformsNoProviders": "__MISSING__:No providers configured. Add a provider to get started.", - "systemTransformsOpMoveUp": "__MISSING__:Move up", - "systemTransformsOpMoveDown": "__MISSING__:Move down", - "systemTransformsOpDelete": "__MISSING__:Delete op", + "systemTransforms": "Системные трансформации", + "systemTransformsDesc": "Автоматические преобразования запросов для выбранных провайдеров", + "systemTransformsAddProvider": "Add provider", + "systemTransformsAddProviderPlaceholder": "Select a provider…", + "systemTransformsAddProviderAllConfigured": "All providers already configured", + "systemTransformsRemoveProvider": "Remove provider", + "systemTransformsNoProviders": "No providers configured. Add a provider to get started.", + "systemTransformsOpMoveUp": "Move up", + "systemTransformsOpMoveDown": "Move down", + "systemTransformsOpDelete": "Delete op", "routingStrategy": "Стратегия маршрутизации", "routingAdvancedGuideTitle": "Расширенное руководство по маршрутизации", "routingAdvancedGuideHint1": "Используйте «Fill First» для предсказуемого приоритета, Round Robin для обеспечения справедливости и P2C для устойчивости к задержкам.", @@ -4025,8 +4048,8 @@ "leastUsedDesc": "Выберите наименее использованную учетную запись", "costOpt": "Опция стоимости", "costOptDesc": "Предпочитаю самый дешевый доступный аккаунт", - "resetAware": "__MISSING__:Reset-Aware RR", - "resetAwareDesc": "__MISSING__:Prefer accounts with healthy remaining quota and nearer resets", + "resetAware": "Сброс-ориентированная маршрутизация", + "resetAwareDesc": "Учитывает время сброса квоты провайдера для оптимального распределения", "strictRandom": "Строгий случайный", "strictRandomDesc": "Перемешивание колоды — каждый аккаунт используется один раз перед повторным перемешиванием", "stickyLimit": "Липкий лимит", @@ -4353,21 +4376,21 @@ "compressionModeAggressiveDesc": "Summarization + tool result compression + progressive aging for maximum savings", "compressionModeUltra": "Ultra", "compressionModeUltraDesc": "Maximum compression with all techniques including semantic deduplication", - "compressionAggressiveConfig": "__MISSING__:Aggressive Engine Configuration", - "compressionAggressiveConfigDesc": "__MISSING__:Fine-tune summarization, tool compression, and aging thresholds", - "compressionUltraConfig": "__MISSING__:Ultra Engine Configuration", - "compressionUltraConfigDesc": "__MISSING__:Fine-tune heuristic pruning, SLM fallback, and per-message thresholds", - "compressionUltraRate": "__MISSING__:Keep Rate", - "compressionUltraMinScore": "__MISSING__:Minimum Score Threshold", - "compressionUltraSlmFallback": "__MISSING__:Fallback to Aggressive", - "compressionUltraModelPath": "__MISSING__:SLM Model Path", - "compressionSummarizerEnabled": "__MISSING__:Enable Summarizer", - "compressionMaxTokensPerMessage": "__MISSING__:Max Tokens Per Message", - "compressionMinSavings": "__MISSING__:Min Savings Threshold", - "compressionAgingThresholds": "__MISSING__:Aging Thresholds", - "compressionAgingThresholdsDesc": "__MISSING__:Number of recent messages kept at each aging tier (higher = more preserved)", - "compressionToolStrategies": "__MISSING__:Tool Result Strategies", - "compressionToolStrategiesDesc": "__MISSING__:Toggle compression strategies for different tool result types", + "compressionAggressiveConfig": "Агрессивное сжатие", + "compressionAggressiveConfigDesc": "Настройки агрессивного режима сжатия", + "compressionUltraConfig": "Ультра-сжатие", + "compressionUltraConfigDesc": "Максимальное сжатие с использованием SLM", + "compressionUltraRate": "Keep Rate", + "compressionUltraMinScore": "Minimum Score Threshold", + "compressionUltraSlmFallback": "Fallback to Aggressive", + "compressionUltraModelPath": "SLM Model Path", + "compressionSummarizerEnabled": "Enable Summarizer", + "compressionMaxTokensPerMessage": "Max Tokens Per Message", + "compressionMinSavings": "Min Savings Threshold", + "compressionAgingThresholds": "Aging Thresholds", + "compressionAgingThresholdsDesc": "Number of recent messages kept at each aging tier (higher = more preserved)", + "compressionToolStrategies": "Tool Result Strategies", + "compressionToolStrategiesDesc": "Toggle compression strategies for different tool result types", "compressionGeneral": "General Settings", "compressionAutoTrigger": "Auto-Trigger Threshold", "compressionCacheTTL": "Cache TTL", @@ -4385,7 +4408,7 @@ "compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)", "compressionLogTitle": "Compression Log", "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.", - "minutes": "__MISSING__:minutes", + "minutes": "минуты", "compressionModeRtk": "RTK", "compressionModeRtkDesc": "Command-aware tool output filtering", "compressionModeStacked": "Stacked", @@ -4427,203 +4450,199 @@ "searching": "Searching...", "cleaning": "Cleaning...", "cleanNow": "Clean now", - "optional": "__MISSING__:Optional", - "current": "__MISSING__:Current", - "remove": "__MISSING__:Remove", - "search": "__MISSING__:Search", - "oneproxyTitle": "__MISSING__:1proxy Free Proxy Marketplace", - "oneproxyTotalProxies": "__MISSING__:Total Proxies", - "oneproxyAvgQuality": "__MISSING__:Avg Quality", - "resilienceScope": "__MISSING__:Scope:", - "resilienceTrigger": "__MISSING__:Trigger:", - "resilienceEffect": "__MISSING__:Effect:", - "resilienceRequestQueueTitle": "__MISSING__:Request Queue & Rate", - "resilienceAutoEnableApiKeyProviders": "__MISSING__:Auto-enable for API-key providers", - "resilienceRequestsPerMinute": "__MISSING__:Requests per minute", - "resilienceMinTimeBetweenRequests": "__MISSING__:Minimum time between requests", - "resilienceConcurrentRequests": "__MISSING__:Concurrent requests", - "resilienceMaxQueueWaitTime": "__MISSING__:Maximum queue wait time", - "resilienceBaseCooldown": "__MISSING__:Base cooldown", - "resilienceUseUpstreamRetryHints": "__MISSING__:Use upstream retry hints", - "resilienceDefaultPerProvider": "__MISSING__:Default (per provider)", - "resilienceAlwaysOn": "__MISSING__:Always on", - "resilienceAlwaysOff": "__MISSING__:Always off", - "routingRemoveEntry": "__MISSING__:Remove entry", - "routingNeedlesSubstrings": "__MISSING__:Needles (substrings to match)", - "routingCaseSensitive": "__MISSING__:Case sensitive", - "routingPrefixes": "__MISSING__:Prefixes", - "routingMatch": "__MISSING__:Match", - "routingReplacement": "__MISSING__:Replacement", - "routingReplaceAllOccurrences": "__MISSING__:Replace all occurrences", - "routingPatternRegex": "__MISSING__:Pattern (regex)", - "routingFlags": "__MISSING__:Flags", - "routingNeedles": "__MISSING__:Needles", - "routingBlockText": "__MISSING__:Block text", - "routingIdempotencyKey": "__MISSING__:Idempotency key", - "routingEntrypoint": "__MISSING__:Entrypoint", - "routingVersionFormat": "__MISSING__:Version format", - "routingCchAlgorithm": "__MISSING__:CCH algorithm", - "routingWordsToObfuscate": "__MISSING__:Words to obfuscate (ZWJ inserted after first char)", - "logsSettingsTitle": "__MISSING__:Logs Settings", - "detailedLogsLabel": "__MISSING__:Detailed Logs Enabled", - "detailedLogsDesc": "__MISSING__:Enable detailed request/response logging", - "callLogPipelineLabel": "__MISSING__:Call Log Pipeline", - "callLogPipelineDesc": "__MISSING__:Enable call log processing pipeline", - "maxDetailSizeLabel": "__MISSING__:Max Detail Size (KB)", - "maxDetailSizeDesc": "__MISSING__:Maximum size for detailed log entries", - "ringBufferSizeLabel": "__MISSING__:Ring Buffer Size", - "ringBufferSizeDesc": "__MISSING__:Size of the ring buffer for logs", - "semanticCacheEnabledLabel": "__MISSING__:Semantic Cache Enabled", - "semanticCacheMaxSizeLabel": "__MISSING__:Semantic Cache Max Size", - "semanticCacheMaxSizeDesc": "__MISSING__:Maximum number of semantic cache entries", - "semanticCacheTTLLabel": "__MISSING__:Semantic Cache TTL", - "promptCacheEnabledLabel": "__MISSING__:Prompt Cache Enabled", - "promptCacheEnabledDesc": "__MISSING__:Enable prompt caching", - "promptCacheStrategyLabel": "__MISSING__:Prompt Cache Strategy", - "promptCacheStrategyDesc": "__MISSING__:Strategy for prompt caching", - "alwaysPreserveClientCacheLabel": "__MISSING__:Always Preserve Client Cache", - "alwaysPreserveClientCacheDesc": "__MISSING__:Client cache preservation policy", - "logRetentionPolicyTitle": "__MISSING__:Log retention policy", - "resilienceUseUpstream429HintsForBreaker": "__MISSING__:Use upstream 429 hints (breaker)", - "appearanceLogoPreviewAlt": "__MISSING__:Logo preview", - "appearanceFaviconPreviewAlt": "__MISSING__:Favicon preview", - "oneproxyLastSync": "__MISSING__:Last Sync", - "oneproxyAllProtocols": "__MISSING__:All Protocols", - "oneproxyCountryCodePlaceholder": "__MISSING__:Country code (e.g. US)", - "oneproxyMinQualityPlaceholder": "__MISSING__:Min quality", - "oneproxyLoadingProxies": "__MISSING__:Loading proxies...", - "oneproxyLastSyncLabel": "__MISSING__:Last sync:", - "oneproxyProxiesFetched": "__MISSING__:Proxies fetched:", - "oneproxyConsecutiveFailures": "__MISSING__:Consecutive failures:", - "oneproxyErrorLabel": "__MISSING__:Error:", - "oneproxyNever": "__MISSING__:Never", - "oneproxySyncStatusTitle": "__MISSING__:Sync Status", - "oneproxySuccess": "__MISSING__:Success", - "oneproxyFailed": "__MISSING__:Failed", - "routingAntigravitySignatureTitle": "__MISSING__:Antigravity Signature Cache Mode", - "routingHeaderFingerprintTitle": "__MISSING__:Header fingerprint (per provider)", - "routingServerRejectedSave": "__MISSING__:⚠ Server rejected save:", - "routingAddTransformOp": "__MISSING__:Add a transform op", - "routingClientCacheControlTitle": "__MISSING__:Client Cache Control", - "visionBridge": "__MISSING__:Vision Bridge", - "routingZeroConfigTitle": "__MISSING__:Zero-Config Auto-Routing", - "routingDefaultAutoVariant": "__MISSING__:Default Auto Variant", - "visionBridgeModel": "__MISSING__:Bridge Model", - "resilienceMaxBackoffSteps": "__MISSING__:Max backoff steps", - "resilienceBaseCooldownLabel": "__MISSING__:Base cooldown", - "resilienceUseUpstreamRetryHintsLabel": "__MISSING__:Use upstream retry hints", - "resilienceYes": "__MISSING__:Yes", - "resilienceNo": "__MISSING__:No", - "resilienceUseUpstream429BreakerLabel": "__MISSING__:Use upstream 429 hints (breaker)", - "resilienceDefault": "__MISSING__:Default", - "resilienceMaxBackoffStepsLabel": "__MISSING__:Max backoff steps", - "visionBridgePrompt": "__MISSING__:Bridge Prompt", - "visionBridgeTimeoutMs": "__MISSING__:Timeout (ms)", - "resilienceConnectionCooldownTitle": "__MISSING__:Connection Cooldown", - "visionBridgeMaxImagesPerRequest": "__MISSING__:Max Images Per Request", - "resilienceFailureThreshold": "__MISSING__:Failure threshold", - "resilienceResetTimeout": "__MISSING__:Reset timeout", - "resilienceFailureThresholdLabel": "__MISSING__:Failure threshold", - "resilienceResetTimeoutLabel": "__MISSING__:Reset timeout", - "visionBridgeModelPlaceholder": "__MISSING__:openai/gpt-4o-mini", - "visionBridgePromptPlaceholder": "__MISSING__:Describe this image concisely.", - "resilienceProviderBreakerTitle": "__MISSING__:Circuit Breaker per Provider", - "storageDatabaseBackupRetention": "__MISSING__:Database backup retention", - "storagePurgeData": "__MISSING__:Purge Data", - "retentionQuotaSnapshots": "__MISSING__:Quota Snapshots (days)", - "retentionMcpAudit": "__MISSING__:MCP Audit (days)", - "retentionA2aEvents": "__MISSING__:A2A Events (days)", - "retentionCallLogs": "__MISSING__:Call Logs (days)", - "retentionUsageHistory": "__MISSING__:Usage History (days)", - "retentionMemoryEntries": "__MISSING__:Memory Entries (days)", - "storageAutoVacuumMode": "__MISSING__:Auto Vacuum Mode", - "storageScheduledVacuum": "__MISSING__:Scheduled Vacuum", - "storageVacuumHour": "__MISSING__:Vacuum Hour (0-23)", - "storagePageSize": "__MISSING__:Page Size (bytes)", - "storageDatabaseSize": "__MISSING__:Database Size", - "storagePageCount": "__MISSING__:Page Count", - "storageFreelistCount": "__MISSING__:Freelist Count", - "storageLastVacuum": "__MISSING__:Last Vacuum", - "storageLastOptimization": "__MISSING__:Last Optimization", - "storageIntegrityCheck": "__MISSING__:Integrity Check", - "storageIntegrityOk": "__MISSING__:✓ OK", - "storageIntegrityError": "__MISSING__:✗ Error", - "storageUsageTokenBuffer": "__MISSING__:Usage Token Buffer", - "compressionSettingsAutoTriggerMode": "__MISSING__:Auto trigger mode", - "compressionSettingsMcpDescriptionCompression": "__MISSING__:MCP description compression", - "compressionSettingsCavemanIntensity": "__MISSING__:Caveman intensity", - "compressionSettingsCavemanOutputMode": "__MISSING__:Caveman output mode", - "compressionSettingsOutputIntensity": "__MISSING__:Output intensity", - "compressionSettingsAutoClarityBypass": "__MISSING__:Auto clarity bypass", - "resilienceWaitForCooldown": "__MISSING__:Wait for Cooldown", - "resilienceEnableServerSideWait": "__MISSING__:Enable server-side wait", - "resilienceMaximumRetries": "__MISSING__:Maximum retries", - "resilienceMaximumWaitPerRetry": "__MISSING__:Maximum wait per retry", - "memorySkillsSkillsmpMarketplace": "__MISSING__:SkillsMP Marketplace", - "memorySkillsFailedToSave": "__MISSING__:Failed to save", - "memorySkillsApiKey": "__MISSING__:API Key", - "memorySkillsActiveSkillsProvider": "__MISSING__:Active Skills Provider", - "cliproxyapiFallback": "__MISSING__:CLIProxyAPI Fallback", - "cliproxyapiEnableFallback": "__MISSING__:Enable CLIProxyAPI Fallback", - "cliproxyapiUrl": "__MISSING__:CLIProxyAPI URL", - "cliproxyapiStatus": "__MISSING__:CLIProxyAPI Status", - "cliproxyapiNotDetected": "__MISSING__:Not detected", - "payloadRulesTitle": "__MISSING__:Payload Rules", - "modelCooldownsTitle": "__MISSING__:Models in cooldown", - "modelCooldownsEmpty": "__MISSING__:No models in cooldown right now.", - "codexFastTierTitle": "__MISSING__:Codex Fast Tier", - "codexFastTierDesc": "__MISSING__:Globally inject service_tier=priority for OpenAI Codex requests.", - "codexFastTierHint": "__MISSING__:When enabled, OmniRoute adds service_tier=priority to outbound Codex requests for connections that don't already specify a tier. Priority tier requires an OpenAI Enterprise API key or the ChatGPT-auth Codex path; other key types will receive a tier-related error from OpenAI. Per-connection settings on the Codex provider page take precedence.", - "codexFastTierSaveError": "__MISSING__:Failed to update Codex Fast Tier setting", - "codexFastTierTierLabel": "Уровень сервиса", - "codexFastTierTierPriority": "Priority", - "codexFastTierTierFlex": "Flex", - "codexFastTierTierDefault": "Default", - "codexFastTierModelsLabel": "Модели Fast Tier", - "codexFastTierModelsHint": "service_tier применяется только к отмеченным моделям при включённом Fast Tier.", - "codexFastTierModelCheckbox": "Включить Fast Tier для {model}", - "claudeFastModeTitle": "__MISSING__:Claude Fast Mode", - "claudeFastModeDesc": "__MISSING__:Opt selected Claude requests into Anthropic Fast Mode (speed:\"fast\").", - "claudeFastModeHint": "__MISSING__:Anthropic does not officially support Fast Mode for SDK-style clients. When enabled, OmniRoute forwards an X-CPA-Force-Fast-Mode header so a paired CLIProxyAPI build can opt-in spoof the entrypoint. Only the listed Opus models are gated by Anthropic's client-side check. Subscription tier, Max plan, and Fast Mode credit balance are still enforced server-side — Anthropic may return out_of_credits even when the toggle is on.", - "claudeFastModeModelsLabel": "__MISSING__:Applied to models ({count})", - "claudeFastModeModelCheckbox": "__MISSING__:Enable Fast Mode for {model}", - "claudeFastModeSaveError": "__MISSING__:Failed to update Claude Fast Mode setting" + "optional": "необязательно", + "current": "текущее", + "remove": "Удалить", + "search": "Поиск", + "oneproxyTitle": "1Proxy", + "oneproxyTotalProxies": "Всего прокси", + "oneproxyAvgQuality": "Среднее качество", + "resilienceScope": "Область", + "resilienceTrigger": "Триггер", + "resilienceEffect": "Эффект", + "resilienceRequestQueueTitle": "Очередь запросов", + "resilienceAutoEnableApiKeyProviders": "Auto-enable for API-key providers", + "resilienceRequestsPerMinute": "Requests per minute", + "resilienceMinTimeBetweenRequests": "Minimum time between requests", + "resilienceConcurrentRequests": "Concurrent requests", + "resilienceMaxQueueWaitTime": "Maximum queue wait time", + "resilienceBaseCooldown": "Base cooldown", + "resilienceUseUpstreamRetryHints": "Use upstream retry hints", + "resilienceDefaultPerProvider": "Default (per provider)", + "resilienceAlwaysOn": "Always on", + "resilienceAlwaysOff": "Always off", + "routingRemoveEntry": "Remove entry", + "routingNeedlesSubstrings": "Needles (substrings to match)", + "routingCaseSensitive": "Case sensitive", + "routingPrefixes": "Prefixes", + "routingMatch": "Match", + "routingReplacement": "Replacement", + "routingReplaceAllOccurrences": "Replace all occurrences", + "routingPatternRegex": "Pattern (regex)", + "routingFlags": "Flags", + "routingNeedles": "Needles", + "routingBlockText": "Block text", + "routingIdempotencyKey": "Idempotency key", + "routingEntrypoint": "Entrypoint", + "routingVersionFormat": "Version format", + "routingCchAlgorithm": "CCH algorithm", + "routingWordsToObfuscate": "Words to obfuscate (ZWJ inserted after first char)", + "logsSettingsTitle": "Logs Settings", + "detailedLogsLabel": "Детальные логи", + "detailedLogsDesc": "Включить подробное логирование запросов", + "callLogPipelineLabel": "Call Log Pipeline", + "callLogPipelineDesc": "Enable call log processing pipeline", + "maxDetailSizeLabel": "Max Detail Size (KB)", + "maxDetailSizeDesc": "Maximum size for detailed log entries", + "ringBufferSizeLabel": "Ring Buffer Size", + "ringBufferSizeDesc": "Size of the ring buffer for logs", + "semanticCacheEnabledLabel": "Семантический кэш", + "semanticCacheMaxSizeLabel": "Макс. размер кэша", + "semanticCacheMaxSizeDesc": "Maximum number of semantic cache entries", + "semanticCacheTTLLabel": "TTL кэша", + "promptCacheEnabledLabel": "Кэш промптов", + "promptCacheEnabledDesc": "Кэширование промптов на стороне провайдера", + "promptCacheStrategyLabel": "Prompt Cache Strategy", + "promptCacheStrategyDesc": "Strategy for prompt caching", + "alwaysPreserveClientCacheLabel": "Always Preserve Client Cache", + "alwaysPreserveClientCacheDesc": "Client cache preservation policy", + "logRetentionPolicyTitle": "Log retention policy", + "resilienceUseUpstream429HintsForBreaker": "Учитывать 429 от провайдера", + "appearanceLogoPreviewAlt": "Предпросмотр логотипа", + "appearanceFaviconPreviewAlt": "Предпросмотр иконки", + "oneproxyLastSync": "Last Sync", + "oneproxyAllProtocols": "All Protocols", + "oneproxyCountryCodePlaceholder": "Country code (e.g. US)", + "oneproxyMinQualityPlaceholder": "Min quality", + "oneproxyLoadingProxies": "Loading proxies...", + "oneproxyLastSyncLabel": "Last sync:", + "oneproxyProxiesFetched": "Proxies fetched:", + "oneproxyConsecutiveFailures": "Consecutive failures:", + "oneproxyErrorLabel": "Error:", + "oneproxyNever": "Never", + "oneproxySyncStatusTitle": "Sync Status", + "oneproxySuccess": "Success", + "oneproxyFailed": "Failed", + "routingAntigravitySignatureTitle": "Подпись Antigravity", + "routingHeaderFingerprintTitle": "Отпечаток заголовка", + "routingServerRejectedSave": "⚠ Server rejected save:", + "routingAddTransformOp": "Add a transform op", + "routingClientCacheControlTitle": "Кэш-контроль клиента", + "visionBridge": "Мост Vision", + "routingZeroConfigTitle": "Нулевая конфигурация", + "routingDefaultAutoVariant": "Вариант авто по умолчанию", + "visionBridgeModel": "Модель Vision", + "resilienceMaxBackoffSteps": "Макс. шагов отсрочки", + "resilienceBaseCooldownLabel": "Базовая задержка остывания", + "resilienceUseUpstreamRetryHintsLabel": "Учитывать подсказки о повторах", + "resilienceYes": "Да", + "resilienceNo": "Нет", + "resilienceUseUpstream429BreakerLabel": "Use upstream 429 hints (breaker)", + "resilienceDefault": "По умолчанию", + "resilienceMaxBackoffStepsLabel": "Максимум шагов отсрочки", + "visionBridgePrompt": "Промпт Vision", + "visionBridgeTimeoutMs": "Тайм-аут Vision (мс)", + "resilienceConnectionCooldownTitle": "Остывание подключений", + "visionBridgeMaxImagesPerRequest": "Макс. изображений на запрос", + "resilienceFailureThreshold": "Порог отказов", + "resilienceResetTimeout": "Тайм-аут сброса", + "resilienceFailureThresholdLabel": "Порог ошибок до срабатывания", + "resilienceResetTimeoutLabel": "Время до сброса состояния", + "visionBridgeModelPlaceholder": "Выберите модель", + "visionBridgePromptPlaceholder": "Опишите, как обрабатывать изображения", + "resilienceProviderBreakerTitle": "Выключатели провайдеров", + "storageDatabaseBackupRetention": "Хранение резервных копий", + "storagePurgeData": "Очистить данные", + "retentionQuotaSnapshots": "Снимки квот", + "retentionMcpAudit": "MCP аудит", + "retentionA2aEvents": "A2A события", + "retentionCallLogs": "Логи запросов", + "retentionUsageHistory": "История использования", + "retentionMemoryEntries": "Записи памяти", + "storageAutoVacuumMode": "Авто-VACUUM", + "storageScheduledVacuum": "VACUUM по расписанию", + "storageVacuumHour": "Час VACUUM", + "storagePageSize": "Размер страницы", + "storageDatabaseSize": "Размер БД", + "storagePageCount": "Страниц", + "storageFreelistCount": "Freelist", + "storageLastVacuum": "Последний VACUUM", + "storageLastOptimization": "Последняя оптимизация", + "storageIntegrityCheck": "Проверка целостности", + "storageIntegrityOk": "Целостность БД в порядке", + "storageIntegrityError": "Нарушение целостности", + "storageUsageTokenBuffer": "Буфер токенов", + "compressionSettingsAutoTriggerMode": "Auto trigger mode", + "compressionSettingsMcpDescriptionCompression": "MCP description compression", + "compressionSettingsCavemanIntensity": "Caveman intensity", + "compressionSettingsCavemanOutputMode": "Caveman output mode", + "compressionSettingsOutputIntensity": "Output intensity", + "compressionSettingsAutoClarityBypass": "Auto clarity bypass", + "resilienceWaitForCooldown": "Ждать остывания", + "resilienceEnableServerSideWait": "Ожидание на стороне сервера", + "resilienceMaximumRetries": "Максимум повторов", + "resilienceMaximumWaitPerRetry": "Макс. ожидание на повтор", + "memorySkillsSkillsmpMarketplace": "SkillsMP Marketplace", + "memorySkillsFailedToSave": "Failed to save", + "memorySkillsApiKey": "API Key", + "memorySkillsActiveSkillsProvider": "Active Skills Provider", + "cliproxyapiFallback": "CLIProxyAPI Fallback", + "cliproxyapiEnableFallback": "Enable CLIProxyAPI Fallback", + "cliproxyapiUrl": "CLIProxyAPI URL", + "cliproxyapiStatus": "CLIProxyAPI Status", + "cliproxyapiNotDetected": "Not detected", + "payloadRulesTitle": "Правила полезной нагрузки", + "modelCooldownsTitle": "Остывание моделей", + "modelCooldownsEmpty": "Нет активных остываний", + "codexFastTierTitle": "Codex Fast Tier", + "codexFastTierDesc": "Быстрый тариф для Codex", + "codexFastTierHint": "When enabled, OmniRoute adds service_tier=priority to outbound Codex requests for connections that don't already specify a tier. Priority tier requires an OpenAI Enterprise API key or the ChatGPT-auth Codex path; other key types will receive a tier-related error from OpenAI. Per-connection settings on the Codex provider page take precedence.", + "codexFastTierSaveError": "Failed to update Codex Fast Tier setting", + "claudeFastModeTitle": "Claude Fast Mode", + "claudeFastModeDesc": "Быстрый режим для Claude", + "claudeFastModeHint": "Anthropic does not officially support Fast Mode for SDK-style clients. When enabled, OmniRoute forwards an X-CPA-Force-Fast-Mode header so a paired CLIProxyAPI build can opt-in spoof the entrypoint. Only the listed Opus models are gated by Anthropic's client-side check. Subscription tier, Max plan, and Fast Mode credit balance are still enforced server-side — Anthropic may return out_of_credits even when the toggle is on.", + "claudeFastModeModelsLabel": "Applied to models ({count})", + "claudeFastModeModelCheckbox": "Enable Fast Mode for {model}", + "claudeFastModeSaveError": "Failed to update Claude Fast Mode setting", + "routingSettingsTitle": "Маршрутизация", + "logSettingsTitle": "Настройки логов", + "resilienceModelLockoutTitle": "Блокировки моделей" }, "contextRtk": { - "title": "RTK Engine", - "description": "Command-aware compression for tool output, terminal logs and build results.", - "enabled": "Enabled", + "title": "RTK", + "description": "Сжатие с учётом контекста для вывода инструментов, логов терминала и команд", + "enabled": "Включено", "intensity": "Intensity", - "intensityMinimal": "Minimal", + "intensityMinimal": "Минимальная", "intensityStandard": "Standard", "intensityAggressive": "Aggressive", "toolResults": "Tool results", "assistantMessages": "Assistant messages", "codeBlocks": "Code blocks", - "filterCatalog": "__MISSING__:Filter Catalog", - "filterCatalogDesc": "__MISSING__:Available output filters by category", - "guidedConfig": "__MISSING__:Configuration", - "guidedConfigDesc": "__MISSING__:Adjust how RTK filters your terminal output", + "filterCatalog": "Каталог фильтров", + "filterCatalogDesc": "Предустановленные фильтры для распространённых инструментов", + "guidedConfig": "Настроить", + "guidedConfigDesc": "Пошаговая настройка RTK", "maxLines": "Max lines", "maxChars": "Max chars", - "deduplicateThreshold": "__MISSING__:Deduplicate threshold", - "customFilters": "__MISSING__:Custom filters", - "detectedType": "__MISSING__:Detected type", - "confidence": "__MISSING__:Confidence", - "beforeAfter": "__MISSING__:Before / After", - "trustProjectFilters": "__MISSING__:Trust project filters", - "rawOutputRetention": "__MISSING__:Raw output retention", - "rawOutputNever": "__MISSING__:Never", - "rawOutputFailures": "__MISSING__:Failures", - "rawOutputAlways": "__MISSING__:Always", - "rawOutputMaxBytes": "__MISSING__:Raw output max bytes", + "deduplicateThreshold": "Порог дедупликации", + "customFilters": "Пользовательские фильтры", + "detectedType": "Обнаруженный тип", + "confidence": "Уверенность", + "beforeAfter": "До/После", + "trustProjectFilters": "Доверять фильтрам проекта", + "rawOutputRetention": "Хранение сырого вывода", + "rawOutputNever": "Никогда", + "rawOutputFailures": "При ошибках", + "rawOutputAlways": "Всегда", + "rawOutputMaxBytes": "Макс. байт", "filterTesting": "Filter Testing", "pasteOutput": "Paste tool output to test filtering...", - "presetHigh": "__MISSING__:Aggressive", - "presetLow": "__MISSING__:Light", - "presetMaxChars": "__MISSING__:Max output characters", - "presetMaxLines": "__MISSING__:Max output lines", - "presetMedium": "__MISSING__:Standard", + "presetHigh": "Высокий", + "presetLow": "Низкий", + "presetMaxChars": "Макс. символов", + "presetMaxLines": "Макс. строк", + "presetMedium": "Средний", "run": "Run", "result": "Result", "previewEmpty": "Run a sample to preview RTK output.", @@ -4632,19 +4651,19 @@ "filtersActive": "Filters active", "requests": "Requests", "avgSavings": "Avg savings", - "simpleMode": "__MISSING__:Simple", - "advancedMode": "__MISSING__:Advanced", - "searchFilters": "__MISSING__:Search filters...", - "tooltipDedup": "__MISSING__:How aggressively to remove repeated lines.", - "tooltipMaxChars": "__MISSING__:Maximum characters per output block.", - "tooltipMaxLines": "__MISSING__:Maximum lines to keep from command output. Excess is truncated." + "simpleMode": "Простой режим", + "advancedMode": "Расширенный режим", + "searchFilters": "Поиск фильтров...", + "tooltipDedup": "How aggressively to remove repeated lines.", + "tooltipMaxChars": "Maximum characters per output block.", + "tooltipMaxLines": "Maximum lines to keep from command output. Excess is truncated." }, "contextCombos": { - "title": "Compression Combos", - "description": "Define how engines are combined for different routing scenarios.", - "createCombo": "Create Compression Combo", - "editCombo": "Edit", - "deleteCombo": "Delete", + "title": "Комбинации сжатия", + "description": "Определение комбинаций движков для разных сценариев маршрутизации", + "createCombo": "Создать комбинацию", + "editCombo": "Редактировать", + "deleteCombo": "Удалить", "deleteConfirm": "Delete this compression combo?", "pipeline": "Pipeline", "addStep": "Add Step", @@ -4662,52 +4681,52 @@ "enabled": "Enabled" }, "contextCaveman": { - "title": "Caveman Engine", - "description": "Rule-based message compression, language packs, analytics and output mode controls.", - "advancedConfig": "__MISSING__:Advanced Configuration", - "advancedConfigDesc": "__MISSING__:Fine-tune compression behavior", - "aggressiveSettings": "__MISSING__:Aggressive Settings", - "aggressiveSettingsDesc": "__MISSING__:Maximum compression with potential quality trade-offs", + "title": "Caveman", + "description": "Правила сжатия сообщений, языковые пакеты, аналитика и мониторинг", + "advancedConfig": "Расширенная конфигурация", + "advancedConfigDesc": "Тонкая настройка сжатия", + "aggressiveSettings": "Агрессивные настройки", + "aggressiveSettingsDesc": "Настройки агрессивного сжатия", "requests": "Requests", "tokensSaved": "Tokens saved", "savingsPercent": "Savings %", "avgLatency": "Avg latency", "languagePacks": "Language Packs", "languagePacksDesc": "Enable compression rules for specific languages.", - "labelAutoTrigger": "__MISSING__:Auto-compress when context exceeds", - "labelCompressionRate": "__MISSING__:Compression strength", - "labelMaxTokens": "__MISSING__:Target tokens per message", - "labelMinLength": "__MISSING__:Minimum message length", - "labelMinSavings": "__MISSING__:Minimum tokens to save", - "enabled": "Enabled", + "labelAutoTrigger": "Автосрабатывание", + "labelCompressionRate": "Коэффициент сжатия", + "labelMaxTokens": "Макс. токенов", + "labelMinLength": "Мин. длина", + "labelMinSavings": "Мин. экономия", + "enabled": "Включено", "autoDetect": "Auto-detect language", "rulesCount": "{count} rules", - "inputCompressionTitle": "__MISSING__:Input compression", - "inputCompressionDesc": "__MISSING__:Rewrite chat history with shorter wording. Reduces input tokens by ~50%.", "analyticsTitle": "Compression Analytics", "noAnalytics": "No compression analytics yet.", - "outputMode": "__MISSING__:Output Mode", + "outputMode": "Режим вывода", "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.", "outputModeTitle": "Output Mode", - "quickSettings": "__MISSING__:Quick Settings", - "quickSettingsDesc": "__MISSING__:Basic compression settings to get started", + "quickSettings": "Быстрые настройки", + "quickSettingsDesc": "Быстрая настройка сжатия", "autoClarity": "Auto-Clarity Bypass", "bypassConditions": "Bypass conditions", - "bypassConditionsList": "__MISSING__:security, irreversible, clarification, order-sensitive", - "simpleMode": "__MISSING__:Simple", - "advancedMode": "__MISSING__:Advanced", - "tooltipAutoTrigger": "__MISSING__:Automatically compress when context exceeds this size.", - "tooltipCompressionRate": "__MISSING__:0.0 = none, 1.0 = maximum. 0.5 = balanced.", - "tooltipMaxTokens": "__MISSING__:Target token count after compression. Lower = more aggressive.", - "tooltipMinLength": "__MISSING__:Messages shorter than this are not compressed. Lower = more compression.", - "tooltipMinSavings": "__MISSING__:Only compress if it saves at least this many tokens.", - "ultraSettings": "__MISSING__:Ultra Settings", - "ultraSettingsDesc": "__MISSING__:SLM-powered semantic compression", + "bypassConditionsList": "security, irreversible, clarification, order-sensitive", + "simpleMode": "Простой режим", + "advancedMode": "Расширенный режим", + "tooltipAutoTrigger": "Автоматически применять сжатие", + "tooltipCompressionRate": "Целевой коэффициент сжатия", + "tooltipMaxTokens": "Максимальное количество токенов после сжатия", + "tooltipMinLength": "Минимальная длина сообщения для сжатия", + "tooltipMinSavings": "Минимальная экономия для применения сжатия", + "ultraSettings": "Ультра-настройки", + "ultraSettingsDesc": "Экстремальное сжатие", "preview": { "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.", "full": "Respond terse and compact. Preserve all technical substance.", "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols." - } + }, + "intensity": "Интенсивность", + "intensityMinimal": "Минимальная" }, "translator": { "title": "Переводчик", @@ -4750,28 +4769,28 @@ "errorShort": "ОШИБКА", "formatConverter": "Конвертер форматов", "formatConverterDescription": "Вставьте или введите тело запроса JSON. Переводчик автоматически определит исходный формат и преобразует его в целевой формат. Используйте это для отладки того, как OmniRoute преобразует запросы между форматами (OpenAI ↔ Claude ↔ Gemini ↔ API ответов).", - "translationPathHubSpoke": "__MISSING__:{source} → OpenAI (intermediate) → {target}", - "translationPathDirect": "__MISSING__:{source} → {target} (direct translator)", - "translationPathPassthrough": "__MISSING__:Same format — no translation needed", - "openaiIntermediatePanel": "__MISSING__:OpenAI Intermediate", - "autoFeaturesTitle": "__MISSING__:What OmniRoute does automatically", - "autoFeaturesCount": "__MISSING__:8 features", - "featureReasoningCache": "__MISSING__:Reasoning Cache", - "featureReasoningCacheDesc": "__MISSING__:Re-injects cached reasoning_content for thinking-mode models (DeepSeek V4, Kimi K2, Qwen) when clients omit it from conversation history.", - "featureSchemaCoercion": "__MISSING__:Schema Coercion", - "featureSchemaCoercionDesc": "__MISSING__:Fixes broken tool schemas: adds missing additionalProperties, sanitizes long descriptions, normalizes nested objects.", - "featureRoleNormalization": "__MISSING__:Role Normalization", - "featureRoleNormalizationDesc": "__MISSING__:Maps developer→system for non-OpenAI targets. Maps system→user for models that don't support system role.", - "featureToolCallIds": "__MISSING__:Tool Call ID Normalization", - "featureToolCallIdsDesc": "__MISSING__:Generates unique tool_call IDs when missing. Normalizes to 9-char format for providers like Mistral.", - "featureMissingToolResponse": "__MISSING__:Tool Response Injection", - "featureMissingToolResponseDesc": "__MISSING__:Injects empty tool_result messages when clients send tool_calls without corresponding responses.", - "featureThinkingBudget": "__MISSING__:Thinking Budget", - "featureThinkingBudgetDesc": "__MISSING__:Automatically manages thinking config. Removes thinking parameters when the last message is not from the user.", - "featureDirectPaths": "__MISSING__:Direct Translation Paths", - "featureDirectPathsDesc": "__MISSING__:Some format pairs (Claude→Gemini) have direct translators that bypass the OpenAI hub, producing more accurate output.", - "featureImageMapping": "__MISSING__:Image Size Mapping", - "featureImageMappingDesc": "__MISSING__:Translates image dimension conventions between API formats (e.g., OpenAI detail levels → Gemini dimensions).", + "translationPathHubSpoke": "{source} → OpenAI (intermediate) → {target}", + "translationPathDirect": "{source} → {target} (direct translator)", + "translationPathPassthrough": "Тот же формат — перевод не нужен", + "openaiIntermediatePanel": "Промежуточный OpenAI", + "autoFeaturesTitle": "Что OmniRoute делает автоматически", + "autoFeaturesCount": "8 features", + "featureReasoningCache": "Кэш рассуждений", + "featureReasoningCacheDesc": "Повторно использует кэшированный reasoning_content для моделей с режимом мышления", + "featureSchemaCoercion": "Приведение схем", + "featureSchemaCoercionDesc": "Автоматическое приведение JSON-схемы при трансляции между форматами", + "featureRoleNormalization": "Нормализация ролей", + "featureRoleNormalizationDesc": "Приведение названий ролей к стандарту целевого API", + "featureToolCallIds": "ID вызовов инструментов", + "featureToolCallIdsDesc": "Перезапись/сохранение ID вызовов инструментов между разными форматами", + "featureMissingToolResponse": "Пустые ответы инструментов", + "featureMissingToolResponseDesc": "Автозаполнение пустых ответов инструментов", + "featureThinkingBudget": "Бюджет мышления", + "featureThinkingBudgetDesc": "Настройка лимита токенов для reasoning/thinking", + "featureDirectPaths": "Прямые пути", + "featureDirectPathsDesc": "Проксирование запросов напрямую без трансляции, где это возможно", + "featureImageMapping": "Маппинг изображений", + "featureImageMappingDesc": "Преобразование форматов изображений между API (base64 ↔ URL)", "input": "Ввод", "output": "Выход", "auto": "Авто", @@ -4807,8 +4826,8 @@ "thinking": "мышление", "system-prompt": "Системная подсказка", "streaming": "Потоковое вещание", - "vision": "__MISSING__:Vision", - "schema-coercion": "__MISSING__:Schema Coercion" + "vision": "Vision", + "schema-coercion": "Schema Coercion" }, "templateDescriptions": { "simple-chat": "Основное текстовое сообщение", @@ -4817,8 +4836,8 @@ "thinking": "Расширенное мышление/рассуждение", "system-prompt": "Сложные системные инструкции", "streaming": "Запрос потоковой передачи SSE", - "vision": "__MISSING__:Multimodal request with image input", - "schema-coercion": "__MISSING__:Structured-output / JSON schema enforcement" + "vision": "Multimodal request with image input", + "schema-coercion": "Structured-output / JSON schema enforcement" }, "templatePayloads": { "simpleChat": { @@ -4847,14 +4866,14 @@ "prompt": "Расскажите мне короткую историю о роботе, который учится рисовать." }, "vision": { - "system": "__MISSING__:You are an assistant that describes images precisely.", - "userPrompt": "__MISSING__:What is shown in this image?", - "imageUrl": "__MISSING__:https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/600px-PNG_transparency_demonstration_1.png" + "system": "You are an assistant that describes images precisely.", + "userPrompt": "What is shown in this image?", + "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/600px-PNG_transparency_demonstration_1.png" }, "schemaCoercion": { - "userPrompt": "__MISSING__:Look up the weather for Tokyo using metric units and include the hourly breakdown.", - "toolDescription": "__MISSING__:Fetch weather for a city with structured options.", - "cityDescription": "__MISSING__:The city to query, e.g. 'Tokyo' or 'New York'." + "userPrompt": "Look up the weather for Tokyo using metric units and include the hourly breakdown.", + "toolDescription": "Fetch weather for a city with structured options.", + "cityDescription": "The city to query, e.g. 'Tokyo' or 'New York'." } }, "openaiCompatibleLabel": "Совместимость с OpenAI", @@ -4894,40 +4913,40 @@ "errorMessage": "Ошибка: {message}", "requestFailed": "Запрос не выполнен", "noTextExtracted": "(текст не извлечен)", - "liveMonitorMemoryNote": "__MISSING__:Events are stored in memory and lost on restart.", - "liveMonitorMemoryCapNote": "__MISSING__:Max 200 events retained.", - "eventSourcesLabel": "__MISSING__:Event sources:", - "eventSourceTranslatorPage": "__MISSING__:• Translator page (Chat Tester, Test Bench)", - "eventSourceMainPipeline": "__MISSING__:• Main request pipeline (CLI/IDE/API traffic)", + "liveMonitorMemoryNote": "Монитор показывает последние события в реальном времени. Данные хранятся в памяти.", + "liveMonitorMemoryCapNote": "Монитор буферизирует до {max} событий.", + "eventSourcesLabel": "Источники событий", + "eventSourceTranslatorPage": "Страница транслятора", + "eventSourceMainPipeline": "Основной конвейер", "liveMonitorDescriptionPrefix": "Показывает события перевода, когда вызовы API проходят через OmniRoute. События поступают из буфера в памяти (сбрасывается при перезапуске). Использование", "liveMonitorDescriptionSuffix": "или внешние вызовы API для генерации событий.", - "streamTransformer": "__MISSING__:Stream Transformer", - "modeDescriptionStreamTransformer": "__MISSING__:Run chat completions SSE streams through the Responses transformer.", - "streamTransformerTitle": "__MISSING__:Responses Stream Transformer", - "streamTransformerDescription": "__MISSING__:Paste a chat completions SSE stream, run it through OmniRoute's Responses transformer, and inspect the emitted response.* events before wiring a client.", - "loadTextSample": "__MISSING__:Load text sample", - "loadToolSample": "__MISSING__:Load tool-call sample", - "transformToResponses": "__MISSING__:Transform to Responses", - "rawChatSseInput": "__MISSING__:Raw chat completions SSE", - "transformedResponsesSse": "__MISSING__:Transformed Responses API SSE", - "noResultsYet": "__MISSING__:No results yet", - "transformedEvents": "__MISSING__:Transformed events", - "uniqueEventTypes": "__MISSING__:Unique event types", - "inputLines": "__MISSING__:Input lines", - "outputLines": "__MISSING__:Output lines", - "transformedEventTimeline": "__MISSING__:Transformed event timeline", - "transformerTimelineHint": "__MISSING__:Run the transformer to inspect emitted response.output_* events in order.", - "eventType": "__MISSING__:Event type", - "eventPreview": "__MISSING__:Preview", - "comboRouted": "__MISSING__:Combo routed", - "uniqueEndpoints": "__MISSING__:Unique endpoints", - "routeDetails": "__MISSING__:Route details", - "comboBadge": "__MISSING__:Combo", - "routeEndpointLabel": "__MISSING__:Endpoint", - "routeConnectionLabel": "__MISSING__:Connection", - "scenarioVision": "__MISSING__:Vision (image understanding)", - "scenarioSchemaCoercion": "__MISSING__:Schema coercion (structured output)", - "techniques": "__MISSING__:Techniques:" + "streamTransformer": "Трансформер потока", + "modeDescriptionStreamTransformer": "Преобразование потоковых SSE-событий Chat Completions в Responses API", + "streamTransformerTitle": "Трансформер потока", + "streamTransformerDescription": "Преобразование SSE-событий Chat Completions в Responses API", + "loadTextSample": "Загрузить текстовый пример", + "loadToolSample": "Загрузить пример с инструментами", + "transformToResponses": "Преобразовать в Responses", + "rawChatSseInput": "Ввод Chat SSE", + "transformedResponsesSse": "Вывод Responses SSE", + "noResultsYet": "Результатов пока нет", + "transformedEvents": "Преобразованные события", + "uniqueEventTypes": "Уникальные типы событий", + "inputLines": "Строк ввода", + "outputLines": "Строк вывода", + "transformedEventTimeline": "Временная шкала событий", + "transformerTimelineHint": "Зелёные — Chat события, синие — Responses события", + "eventType": "Тип события", + "eventPreview": "Предпросмотр события", + "comboRouted": "Маршрутизировано через комбо", + "uniqueEndpoints": "Уникальные эндпоинты", + "routeDetails": "Детали маршрутизации", + "comboBadge": "Комбо", + "routeEndpointLabel": "Эндпоинт", + "routeConnectionLabel": "Подключение", + "scenarioVision": "Vision (image understanding)", + "scenarioSchemaCoercion": "Schema coercion (structured output)", + "techniques": "Техники" }, "usage": { "title": "Использование", @@ -5001,25 +5020,25 @@ "passSuffix": "успеха", "casesCount": "{count, plural, one {# случай} few {# случая} many {# случаев} other {# случая}}", "runEval": "Запустить оценку", - "runAllSuites": "__MISSING__:Run All", - "runAllRunning": "__MISSING__:Running all...", - "runAllProgress": "__MISSING__:Running {current}/{total}: {name}", - "runAllFailedSuites": "__MISSING__:{count, plural, one {# suite failed} other {# suites failed}}", - "runAllCompleted": "__MISSING__:Ran {suites} suites — {passed} passed, {failed} failed", - "runAllCompletedWithFailures": "__MISSING__:Ran {completed} suites; {failedSuites} failed to complete", + "runAllSuites": "Run All", + "runAllRunning": "Running all...", + "runAllProgress": "Running {current}/{total}: {name}", + "runAllFailedSuites": "{count, plural, one {# suite failed} other {# suites failed}}", + "runAllCompleted": "Ran {suites} suites — {passed} passed, {failed} failed", + "runAllCompletedWithFailures": "Ran {completed} suites; {failedSuites} failed to complete", "runningProgress": "Запуск {current}/{total}...", "passRate": "проходной балл", "summaryBreakdown": "{passed} пройден · {failed} не пройден · всего {total}", "passedIconLabel": "✅ Пройдено", "failedIconLabel": "❌ Не удалось", - "resultPassed": "__MISSING__:Passed", - "resultFailed": "__MISSING__:Failed", - "expandResult": "__MISSING__:Expand result details", - "collapseResult": "__MISSING__:Collapse result details", + "resultPassed": "Пройдено", + "resultFailed": "Не пройдено", + "expandResult": "Развернуть", + "collapseResult": "Свернуть", "detailsContains": "Содержит: «{term}»", "detailsRegex": "Регулярное выражение: {pattern}", "detailsExpected": "Ожидается: \"{expected}\"", - "expectedOutputLabel": "__MISSING__:Expected Output", + "expectedOutputLabel": "Ожидаемый вывод", "noResultsYet": "Пока нет результатов", "testCasesCount": "Тестовые примеры ({count})", "noTestCasesDefined": "Тестовые примеры не определены", @@ -5085,36 +5104,18 @@ "tierPro": "Про", "tierPlus": "Плюс", "tierFree": "Бесплатно", - "tierLite": "Lite", "tierUnknown": "Неизвестно", - "statTotal": "Всего", - "statCritical": "Критично", - "statAlert": "Внимание", - "statHealthy": "Норма", - "filterPurchaseTypeLabel": "Тип", - "filterTierLabel": "Тариф", - "purchaseAll": "Все", - "purchaseOauthSub": "Подписка", - "purchaseOauthFree": "OAuth бесплатно", - "purchaseApiKey": "API-ключ", - "creditsLabel": "Кредиты", - "creditBalanceHint": "Остаток баланса", - "unlimitedLabel": "Без лимита", - "refreshing": "Обновление", - "resetsIn": "Сброс через", - "editCutoffs": "Изменить пороги", - "forceRefresh": "Обновить сейчас", "suiteBuilderSaveFailed": "Failed to save suite", - "clone": "__MISSING__:Clone", - "exportSuite": "__MISSING__:Export", - "importSuite": "__MISSING__:Import", - "suiteExported": "__MISSING__:Suite exported", - "suiteExportFailed": "__MISSING__:Failed to export suite", - "suiteImportReady": "__MISSING__:Suite import loaded for review", - "suiteImportFailed": "__MISSING__:Failed to import suite", - "suiteImportInvalid": "__MISSING__:Invalid eval suite JSON", - "suiteBuilderCloneSuffix": "__MISSING__:copy", - "suiteBuilderImportedSuite": "__MISSING__:Imported Suite", + "clone": "Клонировать", + "exportSuite": "Экспорт набора", + "importSuite": "Импорт набора", + "suiteExported": "Suite exported", + "suiteExportFailed": "Failed to export suite", + "suiteImportReady": "Suite import loaded for review", + "suiteImportFailed": "Failed to import suite", + "suiteImportInvalid": "Invalid eval suite JSON", + "suiteBuilderCloneSuffix": "copy", + "suiteBuilderImportedSuite": "Imported Suite", "scorecardTitle": "Scorecard", "evalApiKey": "API Key", "scorecardPassRate": "Pass Rate", @@ -5157,10 +5158,10 @@ "recentRunsTitle": "Recent Runs", "suiteBuilderCaseSystemPromptLabel": "System Prompt", "suiteBuilderCaseExpectedPlaceholder": "e.g. def fibonacci", - "suiteBuilderCaseExpectedPlaceholderContains": "__MISSING__:e.g. def fibonacci", - "suiteBuilderCaseExpectedPlaceholderExact": "__MISSING__:Paste the exact expected response", - "suiteBuilderCaseExpectedPlaceholderRegex": "__MISSING__:e.g. ^\\\\s*\\\\{.*\\\\}\\\\s*$", - "suiteBuilderCaseExpectedHintRegex": "__MISSING__:Use a JavaScript regular expression without wrapping slashes.", + "suiteBuilderCaseExpectedPlaceholderContains": "e.g. def fibonacci", + "suiteBuilderCaseExpectedPlaceholderExact": "Paste the exact expected response", + "suiteBuilderCaseExpectedPlaceholderRegex": "e.g. ^\\\\s*\\\\{.*\\\\}\\\\s*$", + "suiteBuilderCaseExpectedHintRegex": "Use a JavaScript regular expression without wrapping slashes.", "suiteBuilderNamePlaceholder": "e.g. Coding Quality Suite", "suiteBuilderAddCase": "Add Case", "cancel": "Cancel", @@ -5174,7 +5175,7 @@ "resultErrorLabel": "Error", "suiteBuilderBuiltInBadge": "Built-in", "suiteBuilderCaseCardTitle": "Test Case", - "suiteBuilderDuplicateCase": "__MISSING__:Duplicate", + "suiteBuilderDuplicateCase": "Duplicate", "weeklyLimitPlaceholder": "e.g. 50.00", "suiteBuilderCaseTagsHint": "Comma-separated tags for organizing test cases.", "notifyEvalRunFailedWithReason": "Evaluation failed: {reason}", @@ -5212,44 +5213,44 @@ "targetComparisonHint": "Side-by-side comparison of evaluation results between targets.", "compareCompletedWithScore": "Comparison completed — {score}% pass rate", "staleQuotaTooltip": "Last refresh failed — showing cached data", - "quotaThresholdLabel": "__MISSING__:Min left", - "quotaCutoffsColumnHelp": "__MISSING__:Stop requests when remaining quota falls to this percentage or below.", - "quotaCutoffsButtonDefault": "__MISSING__:Default", - "quotaCutoffsButtonHelp": "__MISSING__:Edit minimum remaining quota cutoffs for this account.", - "quotaCutoffsButtonDisabled": "__MISSING__:No quota windows are available for this account yet.", - "quotaCutoffsTitle": "__MISSING__:Quota cutoffs for {name} ({provider})", - "quotaCutoffsExplainer": "__MISSING__:Override the minimum remaining quota percentage where this account stops being selected for each quota window. Leave blank to inherit the provider default.", - "quotaCutoffsDefaultHint": "__MISSING__:Default min remaining: {default}%", - "quotaCutoffsResetAll": "__MISSING__:Reset all", - "quotaCutoffsNoWindows": "__MISSING__:No quota windows are available for this account yet.", - "quotaThresholdInvalid": "__MISSING__:Enter a whole number from 0 to 100.", - "budgetKpiToday": "__MISSING__:Today", - "budgetKpiThisMonth": "__MISSING__:This month", - "budgetKpiProjEom": "__MISSING__:Proj EOM", - "budgetKpiBlocked": "__MISSING__:Blocked", - "budgetKpiAtRisk": "__MISSING__:At risk", - "budgetKpiActiveKeys": "__MISSING__:Active keys", - "budgetSearchKeysPlaceholder": "__MISSING__:Search keys...", - "budgetSortPctUsed": "__MISSING__:Sort: % Used ↓", - "budgetSortTodayDollar": "__MISSING__:Sort: Today $ ↓", - "budgetSortMonthDollar": "__MISSING__:Sort: Month $ ↓", - "budgetSortNameAZ": "__MISSING__:Sort: Name (A–Z)", - "budgetColDailyLim": "__MISSING__:Daily lim", - "budgetColMonthlyLim": "__MISSING__:Monthly lim", - "budgetColUsedPct": "__MISSING__:Used %", - "budgetLoading": "__MISSING__:Loading…", - "budgetNoKeysMatch": "__MISSING__:No keys match filters", - "budgetLinearExtrapolation": "__MISSING__:linear extrapolation", - "budgetThisMonthSoFar": "__MISSING__:This month so far", - "budgetProjectedEndOfMonth": "__MISSING__:Projected end of month", - "budgetByProvider": "__MISSING__:by provider", - "budgetDailyDollar": "__MISSING__:Daily $", - "budgetWeeklyDollar": "__MISSING__:Weekly $", - "budgetMonthlyDollar": "__MISSING__:Monthly $", - "budgetWarnAtPct": "__MISSING__:Warn at %", - "quotaAlerts": "__MISSING__:Quota alerts", - "quotaTableRefreshing": "__MISSING__:⟳ Refreshing...", - "noSpendLast30Days": "__MISSING__:No spend in last 30 days" + "quotaThresholdLabel": "Порог квоты", + "quotaCutoffsColumnHelp": "Stop requests when remaining quota falls to this percentage or below.", + "quotaCutoffsButtonDefault": "Default", + "quotaCutoffsButtonHelp": "Edit minimum remaining quota cutoffs for this account.", + "quotaCutoffsButtonDisabled": "No quota windows are available for this account yet.", + "quotaCutoffsTitle": "Quota cutoffs for {name} ({provider})", + "quotaCutoffsExplainer": "Override the minimum remaining quota percentage where this account stops being selected for each quota window. Leave blank to inherit the provider default.", + "quotaCutoffsDefaultHint": "Default min remaining: {default}%", + "quotaCutoffsResetAll": "Reset all", + "quotaCutoffsNoWindows": "No quota windows are available for this account yet.", + "quotaThresholdInvalid": "Enter a whole number from 0 to 100.", + "budgetKpiToday": "Сегодня", + "budgetKpiThisMonth": "Этот месяц", + "budgetKpiProjEom": "Прогноз на конец месяца", + "budgetKpiBlocked": "Заблокировано", + "budgetKpiAtRisk": "Под риском", + "budgetKpiActiveKeys": "Активных ключей", + "budgetSearchKeysPlaceholder": "Поиск ключей...", + "budgetSortPctUsed": "% использования", + "budgetSortTodayDollar": "Сегодня ($)", + "budgetSortMonthDollar": "Месяц ($)", + "budgetSortNameAZ": "Имя А-Я", + "budgetColDailyLim": "Дневной лимит", + "budgetColMonthlyLim": "Месячный лимит", + "budgetColUsedPct": "Использовано", + "budgetLoading": "Загрузка...", + "budgetNoKeysMatch": "Нет ключей по запросу", + "budgetLinearExtrapolation": "Линейная экстраполяция", + "budgetThisMonthSoFar": "За текущий месяц", + "budgetProjectedEndOfMonth": "Прогноз на конец месяца", + "budgetByProvider": "По провайдерам", + "budgetDailyDollar": "В день ($)", + "budgetWeeklyDollar": "В неделю ($)", + "budgetMonthlyDollar": "В месяц ($)", + "budgetWarnAtPct": "Предупредить при %", + "quotaAlerts": "Оповещения о квотах", + "quotaTableRefreshing": "Обновление таблицы квот...", + "noSpendLast30Days": "Нет расходов за последние 30 дней" }, "modals": { "waitingAuth": "Ожидание авторизации", @@ -5467,7 +5468,7 @@ "docs": { "title": "Документация", "quickStart": "Быстрый старт", - "deploymentGuides": "__MISSING__:Deployment Guides", + "deploymentGuides": "Руководства по развёртыванию", "features": "Особенности", "supportedProviders": "Поддерживаемые провайдеры", "supportedProvidersToc": "Провайдеры", @@ -5504,18 +5505,18 @@ "quickStartStep4Title": "4. Установите URL-адрес клиентской базы.", "quickStartStep4Prefix": "Направьте свой клиент IDE или API на", "quickStartStep4Suffix": "Используйте префикс провайдера, например", - "deploySetupTitle": "__MISSING__:Setup Guide", - "deploySetupText": "__MISSING__:Step-by-step installation, environment configuration, and first-run walkthrough for OmniRoute.", - "deployElectronTitle": "__MISSING__:Electron Desktop", - "deployElectronText": "__MISSING__:Run OmniRoute as a native desktop application on Windows, macOS, and Linux.", - "deployDockerTitle": "__MISSING__:Docker", - "deployDockerText": "__MISSING__:Containerized deployment with Docker Compose; ready for production stacks and Kubernetes.", - "deployVmTitle": "__MISSING__:Virtual Machine", - "deployVmText": "__MISSING__:Self-host on any Linux VM. Includes systemd unit, log rotation, and backup tooling.", - "deployFlyTitle": "__MISSING__:Fly.io", - "deployFlyText": "__MISSING__:Deploy to Fly.io edge runtime with one fly.toml and a single deploy command.", - "deployPwaTitle": "__MISSING__:PWA", - "deployPwaText": "__MISSING__:Install OmniRoute as a Progressive Web App on Android, iOS, and desktop browsers.", + "deploySetupTitle": "Setup Guide", + "deploySetupText": "Step-by-step installation, environment configuration, and first-run walkthrough for OmniRoute.", + "deployElectronTitle": "Electron Desktop", + "deployElectronText": "Run OmniRoute as a native desktop application on Windows, macOS, and Linux.", + "deployDockerTitle": "Docker", + "deployDockerText": "Containerized deployment with Docker Compose; ready for production stacks and Kubernetes.", + "deployVmTitle": "Virtual Machine", + "deployVmText": "Self-host on any Linux VM. Includes systemd unit, log rotation, and backup tooling.", + "deployFlyTitle": "Fly.io", + "deployFlyText": "Deploy to Fly.io edge runtime with one fly.toml and a single deploy command.", + "deployPwaTitle": "PWA", + "deployPwaText": "Install OmniRoute as a Progressive Web App on Android, iOS, and desktop browsers.", "deployTermuxTitle": "Termux (Android)", "deployTermuxText": "Run OmniRoute headless on Android via Termux. Access the dashboard from your mobile browser.", "featureRoutingTitle": "Маршрутизация между несколькими провайдерами", @@ -5562,18 +5563,18 @@ "clientClaudeBullet1Prefix": "Использование", "clientClaudeBullet1Middle": "(Клод) или", "clientClaudeBullet1Suffix": "(Антигравитация) приставка.", - "clientWindsurfTitle": "__MISSING__:Windsurf", - "clientWindsurfBullet1": "__MISSING__:Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", - "clientWindsurfBullet2": "__MISSING__:Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", - "clientWindsurfBullet3": "__MISSING__:Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", - "clientClineTitle": "__MISSING__:Cline", - "clientClineBullet1": "__MISSING__:Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", - "clientClineBullet2": "__MISSING__:Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", - "clientClineBullet3": "__MISSING__:Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", - "clientKimiTitle": "__MISSING__:Kimi Coding", - "clientKimiBullet1": "__MISSING__:Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", - "clientKimiBullet2": "__MISSING__:Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", - "clientKimiBullet3": "__MISSING__:Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", "protocolsTitle": "Протоколы: MCP и A2A", "protocolsDescription": "OmniRoute предоставляет два операционных протокола помимо OpenAI-совместимых API: MCP для выполнения инструментов и A2A для рабочих процессов агент-к-агенту.", "protocolMcpTitle": "MCP (Model Context Protocol)", @@ -5617,61 +5618,61 @@ "troubleshootingTestConnection": "Используйте «Панель мониторинга» > «Поставщики» > «Проверить соединение» перед тестированием из IDE или внешних клиентов.", "troubleshootingCircuitBreaker": "Если поставщик услуг показывает, что автоматический выключатель разомкнут, дождитесь охлаждения или посетите страницу «Здоровье» для получения подробной информации.", "troubleshootingOAuth": "Для поставщиков OAuth выполните повторную аутентификацию, если срок действия токенов истечет. Проверьте индикатор состояния карты провайдера.", - "endpointCompletionsNote": "__MISSING__:Legacy completions endpoint for text generation.", - "endpointModerationsNote": "__MISSING__:Content moderation and safety classification.", - "endpointRerankNote": "__MISSING__:Document reranking for retrieval-augmented generation (Cohere, Jina).", - "endpointSearchNote": "__MISSING__:Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", - "endpointSearchAnalyticsNote": "__MISSING__:Analytics and metrics for search requests.", - "endpointVideoNote": "__MISSING__:Video generation (ComfyUI, SD WebUI workflows).", - "endpointMusicNote": "__MISSING__:Music generation via ComfyUI workflows.", - "endpointMessagesNote": "__MISSING__:Anthropic-native messages endpoint.", - "endpointCountTokensNote": "__MISSING__:Count tokens for a given message payload.", - "endpointFilesNote": "__MISSING__:File upload for multimodal inputs.", - "endpointBatchesNote": "__MISSING__:Batch processing for bulk API requests.", - "endpointWsNote": "__MISSING__:WebSocket endpoint for real-time streaming.", - "mgmtProvidersListNote": "__MISSING__:List all registered provider connections.", - "mgmtProvidersCreateNote": "__MISSING__:Create a new provider connection.", - "mgmtProvidersUpdateNote": "__MISSING__:Update an existing provider connection.", - "mgmtProvidersDeleteNote": "__MISSING__:Delete a provider connection.", - "mgmtProvidersTestNote": "__MISSING__:Test connectivity and authentication for a provider.", - "mgmtProvidersModelsNote": "__MISSING__:List available models for a specific provider.", - "mgmtSettingsGetNote": "__MISSING__:Retrieve current application settings.", - "mgmtSettingsUpdateNote": "__MISSING__:Update application settings.", - "mgmtPayloadRulesGetNote": "__MISSING__:Get payload transformation rules.", - "mgmtPayloadRulesUpdateNote": "__MISSING__:Update payload transformation rules.", - "mcpToolsTitle": "__MISSING__:MCP Tools", - "mcpToolsDescription": "__MISSING__:OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", - "mcpToolsCount": "__MISSING__:{count} tools", - "mcpToolsToc": "__MISSING__:MCP Tools", - "mcpToolsRoutingTitle": "__MISSING__:Routing & Discovery", - "mcpToolsRoutingDesc": "__MISSING__:Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", - "mcpToolsOperationsTitle": "__MISSING__:Operations & Strategy", - "mcpToolsOperationsDesc": "__MISSING__:Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", - "mcpToolsCacheTitle": "__MISSING__:Cache Management", - "mcpToolsCacheDesc": "__MISSING__:View cache statistics and flush semantic or signature caches.", - "mcpToolsCompressionTitle": "__MISSING__:Compression Engines", - "mcpToolsCompressionDesc": "__MISSING__:Configure RTK/Brotli compression, swap engines, and inspect compression analytics by combo.", - "mcpToolsOneProxyTitle": "__MISSING__:1Proxy / Tunnels", - "mcpToolsOneProxyDesc": "__MISSING__:Manage outbound proxies, rotate residential IPs, and inspect proxy health.", - "mcpToolsMemoryTitle": "__MISSING__:Memory", - "mcpToolsMemoryDesc": "__MISSING__:Search, add, and clear persistent conversational memory entries.", - "mcpToolsSkillsTitle": "__MISSING__:Skills", - "mcpToolsSkillsDesc": "__MISSING__:List, enable, execute, and monitor custom skill executions.", - "featureAutoComboTitle": "__MISSING__:Auto-Combo", - "featureAutoComboText": "__MISSING__:Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", - "featureSearchTitle": "__MISSING__:Web Search", - "featureSearchText": "__MISSING__:Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", - "featureMemoryTitle": "__MISSING__:Memory System", - "featureMemoryText": "__MISSING__:Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", - "featureSkillsTitle": "__MISSING__:Skills Framework", - "featureSkillsText": "__MISSING__:Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", - "featureAcpTitle": "__MISSING__:Agent Communication", - "featureAcpText": "__MISSING__:Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", - "protocolAcpTitle": "__MISSING__:ACP (Agent Communication)", - "protocolAcpDesc": "__MISSING__:Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", - "protocolAcpStep1": "__MISSING__:Navigate to Dashboard → Agents to view registered ACP agents.", - "protocolAcpStep2": "__MISSING__:Register new agents with capabilities and endpoint configuration.", - "protocolAcpStep3": "__MISSING__:Use CLI Tools to configure agent communication channels." + "endpointCompletionsNote": "Эндпоинт Chat Completions", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP-инструменты", + "mcpToolsDescription": "OmniRoute предоставляет 37+ MCP-инструментов", + "mcpToolsCount": "{count} инструментов", + "mcpToolsToc": "Содержание", + "mcpToolsRoutingTitle": "Маршрутизация", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Кэш", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsCompressionTitle": "Сжатие", + "mcpToolsCompressionDesc": "Configure RTK/Brotli compression, swap engines, and inspect compression analytics by combo.", + "mcpToolsOneProxyTitle": "1Proxy / Tunnels", + "mcpToolsOneProxyDesc": "Manage outbound proxies, rotate residential IPs, and inspect proxy health.", + "mcpToolsMemoryTitle": "Память", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Навыки", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Автоматические комбо", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Поиск", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Память", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Навыки", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "ACP-протокол", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP", + "protocolAcpDesc": "Agent Communication Protocol", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." }, "legal": { "privacyPolicy": "Политика конфиденциальности", @@ -5776,75 +5777,75 @@ "flowExecute": "Flow Execute", "flowSpawn": "Flow Spawn", "cliToolsRedirectCta": "Cli Tools Redirect Cta", - "comparisonTitle": "__MISSING__:CLI Tools vs Agent Targets — What's the Difference?", - "comparisonCliToolsLabel": "__MISSING__:CLI Tools page", - "comparisonCliToolsTitle": "__MISSING__:Your IDE sends requests through OmniRoute", - "comparisonCliToolsDesc": "__MISSING__:Configure Claude Code, Codex, Cursor, and other IDEs to use OmniRoute as their API base URL. OmniRoute acts as a proxy, routing requests to your configured providers.", - "comparisonAgentsLabel": "__MISSING__:This page (Agent Targets)", - "comparisonAgentsTitle": "__MISSING__:OmniRoute sends requests into local CLI tools", - "comparisonAgentsDesc": "__MISSING__:OmniRoute can spawn local CLI binaries (claude, codex, goose) as execution backends. The CLI tool processes the request using its own authentication and returns the result.", - "comparisonSummary": "__MISSING__:In short: CLI Tools = you configure tools to point at OmniRoute. Agent Targets = OmniRoute uses tools as its endpoints.", - "agentUseCaseHint": "__MISSING__:Can be used as an execution target via ACP protocol", - "flowDiagramClient": "__MISSING__:Client App", - "flowDiagramClientDesc": "__MISSING__:SDK, API, or upstream service", - "flowDiagramOmniRoute": "__MISSING__:OmniRoute", - "flowDiagramOmniRouteDesc": "__MISSING__:Receives request and selects target", - "flowDiagramSpawn": "__MISSING__:Spawn Process", - "flowDiagramSpawnDesc": "__MISSING__:Launches CLI binary via stdio", - "flowDiagramCli": "__MISSING__:CLI Agent", - "flowDiagramCliDesc": "__MISSING__:Processes with own auth/model", - "fingerprintSettingsHint": "__MISSING__:CLI Fingerprint matching (disguise requests as specific CLI tools) can be configured in", - "settingsRoutingLink": "__MISSING__:Settings/Routing", - "openSettings": "__MISSING__:Settings", - "copyRawUrlTitle": "__MISSING__:Copy raw URL to clipboard", - "copied": "__MISSING__:Copied!", - "copyUrl": "__MISSING__:Copy URL", - "startHere": "__MISSING__:Start Here", - "badgeNew": "__MISSING__:New", - "viewOnGithub": "__MISSING__:View on GitHub", - "howToUse": "__MISSING__:How to use", - "browseAllSkillsOnGithub": "__MISSING__:Browse all skills on GitHub", - "apiSkills": "__MISSING__:API Skills", - "cliSkills": "__MISSING__:CLI Skills" + "comparisonTitle": "Сравнение", + "comparisonCliToolsLabel": "CLI Tools page", + "comparisonCliToolsTitle": "Your IDE sends requests through OmniRoute", + "comparisonCliToolsDesc": "Configure Claude Code, Codex, Cursor, and other IDEs to use OmniRoute as their API base URL. OmniRoute acts as a proxy, routing requests to your configured providers.", + "comparisonAgentsLabel": "This page (Agent Targets)", + "comparisonAgentsTitle": "OmniRoute sends requests into local CLI tools", + "comparisonAgentsDesc": "OmniRoute can spawn local CLI binaries (claude, codex, goose) as execution backends. The CLI tool processes the request using its own authentication and returns the result.", + "comparisonSummary": "In short: CLI Tools = you configure tools to point at OmniRoute. Agent Targets = OmniRoute uses tools as its endpoints.", + "agentUseCaseHint": "Пример использования агента", + "flowDiagramClient": "Клиент", + "flowDiagramClientDesc": "IDE или терминал, где работает агент", + "flowDiagramOmniRoute": "OmniRoute", + "flowDiagramOmniRouteDesc": "Маршрутизация, прокси, балансировка, квоты", + "flowDiagramSpawn": "Запуск", + "flowDiagramSpawnDesc": "CLI или API-запрос к агенту", + "flowDiagramCli": "CLI", + "flowDiagramCliDesc": "Локальный AI-агент в терминале", + "fingerprintSettingsHint": "Настройки отпечатка", + "settingsRoutingLink": "Маршрутизация", + "openSettings": "Настройки", + "copyRawUrlTitle": "Скопировать URL", + "copied": "Скопировано!", + "copyUrl": "Копировать URL", + "startHere": "Начать здесь", + "badgeNew": "Новое", + "viewOnGithub": "Смотреть на GitHub", + "howToUse": "Как использовать", + "browseAllSkillsOnGithub": "Все навыки на GitHub", + "apiSkills": "API-навыки", + "cliSkills": "CLI-навыки" }, "cloudAgents": { - "title": "__MISSING__:Cloud Agents", - "description": "__MISSING__:Manage autonomous coding agents (Jules, Devin, Codex Cloud)", - "loading": "__MISSING__:Loading tasks...", - "aboutTitle": "__MISSING__:About Cloud Agents", - "aboutDescription": "__MISSING__:Cloud agents are remote AI coding assistants that can execute tasks autonomously. They work differently from local CLI agents - you interact with them through OmniRoute's API.", - "howItWorksTitle": "__MISSING__:How it works:", - "howItWorksDesc": "__MISSING__:Create a task → Agent analyzes and proposes a plan → You approve → Agent executes → Results returned", - "newTaskTitle": "__MISSING__:Create New Task", - "newTaskDescription": "__MISSING__:Start a new task with a cloud agent", - "selectAgent": "__MISSING__:Select Agent", - "taskDescription": "__MISSING__:Task Description", - "taskDescriptionPlaceholder": "__MISSING__:Describe what you want the agent to do...", - "startTask": "__MISSING__:Start Task", - "tasks": "__MISSING__:Tasks", - "taskDetail": "__MISSING__:Task Detail", - "noTasks": "__MISSING__:No tasks yet. Create one to get started.", - "untitledTask": "__MISSING__:Untitled Task", - "created": "__MISSING__:Created", - "conversation": "__MISSING__:Conversation", - "result": "__MISSING__:Result", - "error": "__MISSING__:Error", - "planReady": "__MISSING__:Plan Ready for Approval", - "approvePlan": "__MISSING__:Approve Plan", - "rejectPlan": "__MISSING__:Reject & Cancel", - "sendMessagePlaceholder": "__MISSING__:Send a message to the agent...", - "cancel": "__MISSING__:Cancel", - "delete": "__MISSING__:Delete", - "selectTaskPrompt": "__MISSING__:Select a task to view details", - "statusPending": "__MISSING__:Pending", - "statusRunning": "__MISSING__:Running", - "statusWaitingApproval": "__MISSING__:Waiting Approval", - "statusCompleted": "__MISSING__:Completed", - "statusFailed": "__MISSING__:Failed", - "statusCancelled": "__MISSING__:Cancelled", - "repositoryName": "__MISSING__:Repository name", - "repositoryUrl": "__MISSING__:Repository URL", - "branch": "__MISSING__:Branch" + "title": "Облачные агенты", + "description": "Управление автономными агентами кодирования (Jules, Devin, Codex Cloud)", + "loading": "Загрузка задач...", + "aboutTitle": "Об облачных агентах", + "aboutDescription": "Облачные агенты — это удалённые AI-помощники, которые могут выполнять задачи автономно.", + "howItWorksTitle": "Как это работает:", + "howItWorksDesc": "Создайте задачу → Агент анализирует и предлагает план → Вы утверждаете → Агент выполняет → Возвращает результат", + "newTaskTitle": "Новая задача", + "newTaskDescription": "Запустите новую задачу в облачном агенте", + "selectAgent": "Выберите агента", + "taskDescription": "Описание задачи", + "taskDescriptionPlaceholder": "Опишите, что должен сделать агент...", + "startTask": "Запустить", + "tasks": "Задачи", + "taskDetail": "Детали задачи", + "noTasks": "Задач пока нет.", + "untitledTask": "Задача без названия", + "created": "Создано", + "conversation": "Диалог", + "result": "Результат", + "error": "Ошибка", + "planReady": "План готов к утверждению", + "approvePlan": "Утвердить план", + "rejectPlan": "Отклонить и отменить", + "sendMessagePlaceholder": "Отправить сообщение агенту...", + "cancel": "Отмена", + "delete": "Удалить", + "selectTaskPrompt": "Выберите задачу для просмотра деталей", + "statusPending": "Ожидание", + "statusRunning": "Выполняется", + "statusWaitingApproval": "Ожидает утверждения", + "statusCompleted": "Завершено", + "statusFailed": "Ошибка", + "statusCancelled": "Отменено", + "repositoryName": "Название репозитория", + "repositoryUrl": "URL репозитория", + "branch": "Ветка" }, "templateNames": { "simple-chat": "Простой чат", @@ -5853,8 +5854,8 @@ "thinking": "Мышление", "tool-calling": "Вызов инструмента", "multi-turn": "Многооборотный", - "vision": "__MISSING__:Vision", - "schema-coercion": "__MISSING__:Schema Coercion" + "vision": "Vision", + "schema-coercion": "Schema Coercion" }, "templateDescriptions": { "simple-chat": "Шаблон простого чата", @@ -5863,8 +5864,8 @@ "thinking": "Шаблон рассуждения", "tool-calling": "Шаблон вызова инструментов", "multi-turn": "Шаблон многоходового диалога", - "vision": "__MISSING__:Multimodal template with image input", - "schema-coercion": "__MISSING__:Structured-output / JSON schema enforcement" + "vision": "Multimodal template with image input", + "schema-coercion": "Structured-output / JSON schema enforcement" }, "templatePayloads": { "simpleChat": { @@ -5924,7 +5925,6 @@ "clearError": "Не удалось очистить кэш.", "unavailable": "Кэш недоступен", "unavailableDesc": "Не удалось получить статистику кэша. Убедитесь, что сервер запущен.", - "loadingCacheAria": "__MISSING__:Loading cache", "promptCache": "Кэш промптов (на стороне провайдера)", "semanticCache": "Semantic Cache", "promptCacheSectionDesc": "Shows provider-side prompt caching activity from usage history so you can see where cache control is active and how much input reuse you are getting.", @@ -5987,248 +5987,248 @@ "totalProcessed": "Всего запросов обработано", "disabled": "Disabled", "totalRequests": "Total Requests", - "reasoningCache": "__MISSING__:Reasoning Replay", - "reasoningCacheDesc": "__MISSING__:Preserves model thinking for multi-turn tool calling flows", - "reasoningEntries": "__MISSING__:Active Entries", - "reasoningReplayRate": "__MISSING__:Replay Rate", - "reasoningReplays": "__MISSING__:Total Replays", - "reasoningCharsCached": "__MISSING__:Characters Cached", - "reasoningMisses": "__MISSING__:Cache Misses", - "reasoningByProvider": "__MISSING__:By Provider", - "reasoningByModel": "__MISSING__:By Model", - "reasoningRecentEntries": "__MISSING__:Recent Entries", - "reasoningToolCallId": "__MISSING__:Tool Call ID", - "reasoningChars": "__MISSING__:Characters", - "reasoningAge": "__MISSING__:Age", - "reasoningView": "__MISSING__:View", - "reasoningDetail": "__MISSING__:Reasoning Content", - "reasoningBehavior": "__MISSING__:Behavior", - "reasoningBehaviorCapture": "__MISSING__:Captures reasoning_content from streaming responses", - "reasoningBehaviorReplay": "__MISSING__:Re-injects on next turn when client omits it", - "reasoningBehaviorFallback": "__MISSING__:Memory-first with SQLite fallback for crash recovery", - "reasoningBehaviorTtl": "__MISSING__:TTL: 2 hours | Max entries: 2,000 (memory)", - "reasoningBehaviorModels": "__MISSING__:Supported: DeepSeek, Kimi, Qwen-Thinking, GLM", - "reasoningClearAll": "__MISSING__:Clear Reasoning Cache", - "reasoningClearSuccess": "__MISSING__:Cleared {count} reasoning cache entries", - "reasoningClearError": "__MISSING__:Failed to clear reasoning cache", - "reasoningNoData": "__MISSING__:No reasoning entries cached yet. Entries appear when thinking models use tool calling.", - "cachePerformanceRetry": "__MISSING__:Retry", - "cachePerformanceHitRate": "__MISSING__:Hit Rate", - "cachePerformanceAvgLatency": "__MISSING__:Avg Latency (ms)", - "cachePerformanceP95Latency": "__MISSING__:p95 Latency (ms)", - "retry": "__MISSING__:Retry", - "reasoningAvgChars": "__MISSING__:Avg Chars" + "reasoningCache": "Кэш рассуждений", + "reasoningCacheDesc": "Сохраняет reasoning_content для многошаговых вызовов инструментов", + "reasoningEntries": "Активные записи", + "reasoningReplayRate": "Доля повторного использования", + "reasoningReplays": "Всего повторных использований", + "reasoningCharsCached": "Символов в кэше", + "reasoningMisses": "Промахи кэша", + "reasoningByProvider": "По провайдерам", + "reasoningByModel": "По моделям", + "reasoningRecentEntries": "Последние записи", + "reasoningToolCallId": "ID вызова инструмента", + "reasoningChars": "Символов", + "reasoningAge": "Возраст", + "reasoningView": "Просмотр", + "reasoningDetail": "Содержимое рассуждения", + "reasoningBehavior": "Поведение", + "reasoningBehaviorCapture": "Захватывает reasoning_content из потоковых ответов", + "reasoningBehaviorReplay": "Повторно внедряет на следующем шаге, если клиент пропустил", + "reasoningBehaviorFallback": "Сначала в памяти, с SQLite для восстановления после сбоев", + "reasoningBehaviorTtl": "TTL: 2 часа | Макс. записей: 2,000 (в памяти)", + "reasoningBehaviorModels": "Поддерживается: DeepSeek, Kimi, Qwen-Thinking, GLM", + "reasoningClearAll": "Очистить кэш рассуждений", + "reasoningClearSuccess": "Очищено {count} записей кэша рассуждений", + "reasoningClearError": "Не удалось очистить кэш рассуждений", + "reasoningNoData": "Нет записей в кэше рассуждений.", + "cachePerformanceRetry": "Повторить", + "cachePerformanceHitRate": "Доля попаданий", + "cachePerformanceAvgLatency": "Средняя задержка (мс)", + "cachePerformanceP95Latency": "p95 задержка (мс)", + "retry": "Повторить", + "reasoningAvgChars": "Среднее символов" }, "proxyConfigModal": { - "levelGlobal": "__MISSING__:Global", - "levelProvider": "__MISSING__:Provider", - "levelCombo": "__MISSING__:Combo", - "levelKey": "__MISSING__:Key", - "levelDirect": "__MISSING__:Direct (no proxy)", - "titleGlobal": "__MISSING__:Global Proxy Configuration", - "titleLevel": "__MISSING__:{level} Proxy — {label}", - "loading": "__MISSING__:Loading proxy configuration...", - "inheritingFrom": "__MISSING__:Inheriting from", - "source": "__MISSING__:Source", - "savedProxy": "__MISSING__:Saved Proxy", - "custom": "__MISSING__:Custom", - "selectSavedProxyPlaceholder": "__MISSING__:Select saved proxy...", - "proxyType": "__MISSING__:Proxy Type", - "host": "__MISSING__:Host", - "hostPlaceholder": "__MISSING__:1.2.3.4 or proxy.example.com", - "port": "__MISSING__:Port", - "authOptional": "__MISSING__:Authentication (optional)", - "username": "__MISSING__:Username", - "usernamePlaceholder": "__MISSING__:Username", - "password": "__MISSING__:Password", - "passwordPlaceholder": "__MISSING__:Password", - "connected": "__MISSING__:Connected", - "ip": "__MISSING__:IP:", - "connectionFailed": "__MISSING__:Connection failed", - "testConnection": "__MISSING__:Test connection", - "clear": "__MISSING__:Clear", - "cancel": "__MISSING__:Cancel", - "save": "__MISSING__:Save", - "errorSelectSavedProxy": "__MISSING__:Please select a saved proxy first.", - "errorSelectProxyFirst": "__MISSING__:Please select a proxy first.", - "errorProxyNotFound": "__MISSING__:Selected proxy not found.", - "errorClearSavedProxy": "__MISSING__:Failed to clear saved proxy", - "errorSaveProxy": "__MISSING__:Failed to save proxy configuration", - "errorClearProxy": "__MISSING__:Failed to clear proxy configuration", - "errorSocks5Hidden": "__MISSING__:SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + "levelGlobal": "Глобальный", + "levelProvider": "Провайдер", + "levelCombo": "Комбо", + "levelKey": "Ключ", + "levelDirect": "Напрямую (без прокси)", + "titleGlobal": "Глобальная конфигурация прокси", + "titleLevel": "{level} прокси — {label}", + "loading": "Загрузка конфигурации прокси...", + "inheritingFrom": "Наследуется от", + "source": "Источник", + "savedProxy": "Сохранённый прокси", + "custom": "Свой", + "selectSavedProxyPlaceholder": "Выберите сохранённый прокси...", + "proxyType": "Тип прокси", + "host": "Хост", + "hostPlaceholder": "1.2.3.4 или proxy.example.com", + "port": "Порт", + "authOptional": "Аутентификация (необязательно)", + "username": "Имя пользователя", + "usernamePlaceholder": "Имя пользователя", + "password": "Пароль", + "passwordPlaceholder": "Пароль", + "connected": "Подключено", + "ip": "IP:", + "connectionFailed": "Ошибка подключения", + "testConnection": "Проверить подключение", + "clear": "Очистить", + "cancel": "Отмена", + "save": "Сохранить", + "errorSelectSavedProxy": "Выберите сохранённый прокси.", + "errorSelectProxyFirst": "Сначала выберите прокси.", + "errorProxyNotFound": "Прокси не найден.", + "errorClearSavedProxy": "Не удалось очистить прокси", + "errorSaveProxy": "Не удалось сохранить прокси", + "errorClearProxy": "Не удалось очистить конфигурацию прокси", + "errorSocks5Hidden": "SOCKS5 настроен, но скрыт (NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false)" }, "oauthModal": { - "title": "__MISSING__:Connect {providerName}", - "waiting": "__MISSING__:Waiting for authorization", - "completeAuthInPopup": "__MISSING__:Complete authorization in popup.", - "popupClosedHint": "__MISSING__:If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", - "popupBlocked": "__MISSING__:Popup blocked? Enter URL manually", - "deviceCodeVisitUrl": "__MISSING__:Visit the URL below and enter code:", - "deviceCodeVerificationUrl": "__MISSING__:Verification URL", - "deviceCodeYourCode": "__MISSING__:Your code", - "deviceCodeWaiting": "__MISSING__:Waiting for authorization...", - "googleOAuthWarning": "__MISSING__:Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", - "remoteAccessInfo": "__MISSING__:Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", - "step1OpenUrl": "__MISSING__:Step 1: Open this URL in your browser", - "copy": "__MISSING__:Copy", - "step2PasteCallback": "__MISSING__:Step 2: Paste callback URL or authorization code here", - "step2Hint": "__MISSING__:After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", - "connect": "__MISSING__:Connect", - "cancel": "__MISSING__:Cancel", - "success": "__MISSING__:Connection successful!", - "successMessage": "__MISSING__:Your {providerName} account has been connected.", - "done": "__MISSING__:Done", - "error": "__MISSING__:Connection failed", - "tryAgain": "__MISSING__:Try again" + "title": "Подключить {providerName}", + "waiting": "Ожидание авторизации", + "completeAuthInPopup": "Завершите авторизацию во всплывающем окне.", + "popupClosedHint": "Если окно закрылось без перенаправления, диалог переключится на ручной ввод URL.", + "popupBlocked": "Всплывающее окно заблокировано? Введите URL вручную", + "deviceCodeVisitUrl": "Откройте URL ниже и введите код:", + "deviceCodeVerificationUrl": "URL верификации", + "deviceCodeYourCode": "Ваш код", + "deviceCodeWaiting": "Ожидание авторизации...", + "googleOAuthWarning": "Удалённый доступ + Google OAuth: Учётные данные по умолчанию принимают перенаправления только на localhost. После авторизации скопируйте полный URL из адресной строки и вставьте его ниже.", + "remoteAccessInfo": "Удалённый доступ: после авторизации вы увидите страницу ошибки (localhost не найден). Это нормально — скопируйте URL из адресной строки и вставьте его ниже.", + "step1OpenUrl": "Шаг 1: Откройте этот URL в браузере", + "copy": "Копировать", + "step2PasteCallback": "Шаг 2: Вставьте callback URL или код авторизации", + "step2Hint": "После авторизации вставьте полный callback URL. Для Claude Code и Cline можно вставить код аутентификации напрямую, например code#state.", + "connect": "Подключить", + "cancel": "Отмена", + "success": "Подключение успешно!", + "successMessage": "Ваш {providerName} аккаунт подключён.", + "done": "Готово", + "error": "Ошибка подключения", + "tryAgain": "Попробовать снова" }, "cursorAuthModal": { - "title": "__MISSING__:Connect Cursor IDE", - "autoDetecting": "__MISSING__:Auto-detecting tokens...", - "readingFromCursor": "__MISSING__:Reading from Cursor IDE or cursor-agent", - "tokensAutoDetected": "__MISSING__:Tokens successfully auto-detected from Cursor IDE!", - "cursorNotDetected": "__MISSING__:Cursor IDE not detected. Please manually paste your token.", - "accessToken": "__MISSING__:Access Token", - "required": "__MISSING__:*", - "accessTokenPlaceholder": "__MISSING__:Access token will auto-populate...", - "machineId": "__MISSING__:Machine ID", - "optional": "__MISSING__:(optional)", - "machineIdPlaceholder": "__MISSING__:Machine ID will auto-populate...", - "importing": "__MISSING__:Importing...", - "importToken": "__MISSING__:Import Token", - "cancel": "__MISSING__:Cancel", - "errorAutoDetect": "__MISSING__:Unable to auto-detect tokens", - "errorAutoDetectFailed": "__MISSING__:Auto-detect tokens failed", - "errorEnterToken": "__MISSING__:Please enter access token", - "errorImportFailed": "__MISSING__:Import failed" + "title": "Подключить Cursor IDE", + "autoDetecting": "Автоопределение токенов...", + "readingFromCursor": "Чтение из Cursor IDE или cursor-agent", + "tokensAutoDetected": "Токены успешно определены из Cursor IDE!", + "cursorNotDetected": "Cursor IDE не обнаружен. Вставьте токен вручную.", + "accessToken": "Токен доступа", + "required": "*", + "accessTokenPlaceholder": "Токен доступа будет определён автоматически...", + "machineId": "ID машины", + "optional": "(опционально)", + "machineIdPlaceholder": "ID машины будет определён автоматически...", + "importing": "Импорт...", + "importToken": "Импортировать токен", + "cancel": "Отмена", + "errorAutoDetect": "Не удалось определить токены", + "errorAutoDetectFailed": "Автоопределение токенов не удалось", + "errorEnterToken": "Введите токен доступа", + "errorImportFailed": "Импорт не удался" }, "pricingModal": { - "title": "__MISSING__:Pricing Configuration", - "loading": "__MISSING__:Loading pricing data...", - "pricingRatesFormat": "__MISSING__:Pricing Rates Format", - "ratesDescription": "__MISSING__:All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", - "model": "__MISSING__:Model", - "input": "__MISSING__:Input", - "output": "__MISSING__:Output", - "cached": "__MISSING__:Cached", - "reasoning": "__MISSING__:Reasoning", - "cacheCreation": "__MISSING__:Cache Creation", - "noPricingData": "__MISSING__:No pricing data available", - "resetToDefaults": "__MISSING__:Reset to defaults", - "cancel": "__MISSING__:Cancel", - "saving": "__MISSING__:Saving...", - "saveChanges": "__MISSING__:Save changes", - "resetConfirm": "__MISSING__:Reset all pricing to defaults? This cannot be undone.", - "errorSaveFailed": "__MISSING__:Failed to save pricing", - "errorResetFailed": "__MISSING__:Failed to reset pricing" + "title": "Настройка цен", + "loading": "Загрузка цен...", + "pricingRatesFormat": "Формат ставок", + "ratesDescription": "Все ставки указаны в долларах за миллион токенов ($/1M токенов). Пример: ставка ввода 2.50 означает $2.50 за 1,000,000 входящих токенов.", + "model": "Модель", + "input": "Ввод", + "output": "Вывод", + "cached": "Кэш", + "reasoning": "Рассуждение", + "cacheCreation": "Создание кэша", + "noPricingData": "Нет данных о ценах", + "resetToDefaults": "Сбросить на умолчания", + "cancel": "Отмена", + "saving": "Сохранение...", + "saveChanges": "Сохранить изменения", + "resetConfirm": "Сбросить все цены на умолчания? Это действие нельзя отменить.", + "errorSaveFailed": "Не удалось сохранить цены", + "errorResetFailed": "Не удалось сбросить цены" }, "proxyRegistry": { - "title": "Title", - "description": "Description", - "importLegacy": "Import Legacy", - "bulkAssign": "Bulk Assign", - "addProxy": "Add Proxy", - "loading": "Loading", - "noProxies": "No Proxies", - "tableName": "Table Name", - "tableEndpoint": "Table Endpoint", - "tableStatus": "Table Status", - "tableHealth": "Table Health", - "tableUsage": "Table Usage", - "tableActions": "Table Actions", - "test": "Test", - "edit": "Edit", - "delete": "Delete", - "modalCreateTitle": "Modal Create Title", - "modalEditTitle": "Modal Edit Title", - "labelName": "Label Name", - "labelType": "__MISSING__:Type", - "labelHost": "__MISSING__:Host", - "labelPort": "__MISSING__:Port", - "labelUsername": "__MISSING__:Username", - "labelPassword": "__MISSING__:Password", - "labelRegion": "__MISSING__:Region", - "labelStatus": "__MISSING__:Status", - "labelNotes": "__MISSING__:Notes", - "usernamePlaceholderEdit": "__MISSING__:Leave blank to keep current username", - "passwordPlaceholderEdit": "__MISSING__:Leave blank to keep current password", - "statusActive": "__MISSING__:Active", - "statusInactive": "__MISSING__:Inactive", - "cancel": "__MISSING__:Cancel", - "save": "__MISSING__:Save", - "bulkModalTitle": "__MISSING__:Bulk Proxy Assignment", - "bulkLabelScope": "__MISSING__:Scope", - "bulkLabelProxy": "__MISSING__:Proxy", - "bulkClearAssignment": "__MISSING__:(Clear assignment)", - "bulkLabelScopeIds": "__MISSING__:Scope IDs (comma or newline separated)", - "bulkScopeIdsPlaceholder": "__MISSING__:provider-openai,provider-anthropic", - "bulkApply": "__MISSING__:Apply", - "errorLoadFailed": "Error Load Failed", - "errorNameHostRequired": "Error Name Host Required", - "errorSaveFailed": "Error Save Failed", - "errorDeleteFailed": "Error Delete Failed", + "title": "Реестр прокси", + "description": "Храните переиспользуемые прокси и отслеживайте привязки.", + "importLegacy": "Импорт из старой версии", + "bulkAssign": "Массовое назначение", + "addProxy": "Добавить прокси", + "loading": "Загрузка прокси...", + "noProxies": "Прокси пока не сохранены.", + "tableName": "Название", + "tableEndpoint": "Эндпоинт", + "tableStatus": "Статус", + "tableHealth": "Здоровье (24ч)", + "tableUsage": "Использование", + "tableActions": "Действия", + "test": "Проверить", + "edit": "Редактировать", + "delete": "Удалить", + "modalCreateTitle": "Создать прокси", + "modalEditTitle": "Редактировать прокси", + "labelName": "Название", + "labelType": "Тип", + "labelHost": "Хост", + "labelPort": "Порт", + "labelUsername": "Имя пользователя", + "labelPassword": "Пароль", + "labelRegion": "Регион", + "labelStatus": "Статус", + "labelNotes": "Заметки", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Активен", + "statusInactive": "Неактивен", + "cancel": "Отмена", + "save": "Сохранить", + "bulkModalTitle": "Массовое назначение прокси", + "bulkLabelScope": "Область", + "bulkLabelProxy": "Прокси", + "bulkClearAssignment": "(Очистить привязку)", + "bulkLabelScopeIds": "ID областей (через запятую или с новой строки)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Применить", + "errorLoadFailed": "Не удалось загрузить реестр", + "errorNameHostRequired": "Название и хост обязательны", + "errorSaveFailed": "Не удалось сохранить прокси", + "errorDeleteFailed": "Не удалось удалить прокси", "errorForceDeleteConfirm": "Error Force Delete Confirm", "errorMigrateFailed": "Error Migrate Failed", "errorBulkFailed": "Error Bulk Failed", - "success": "__MISSING__:✓", - "failure": "__MISSING__:✗", - "failed": "Failed", + "success": "OK", + "failure": "Ошибка", + "failed": "Ошибка", "successRate": "Success Rate", "avgLatency": "Avg Latency", "assignmentsCount": "Assignments Count", "noData": "No Data", - "testSuccess": "__MISSING__:✓ {ip}", - "testLatency": "__MISSING__:{latency}ms", - "testFailure": "__MISSING__:✗ {error}", - "bulkImport": "__MISSING__:Bulk Import", - "bulkImportTitle": "__MISSING__:Bulk Import Proxies", - "bulkImportDescription": "__MISSING__:Paste proxy profiles using pipe-delimited format. One proxy per line. Existing proxies (same host + port) will be updated.", - "bulkImportParse": "__MISSING__:Parse", - "bulkImportImport": "__MISSING__:Import {count} Proxies", - "bulkImportImporting": "__MISSING__:Importing...", - "bulkImportParsed": "__MISSING__:{count} proxies parsed", - "bulkImportSkipped": "__MISSING__:{count} lines skipped", - "bulkImportParseErrors": "__MISSING__:{count} errors", - "bulkImportNoValidEntries": "__MISSING__:No valid entries found. Check the format and try again.", - "bulkImportSuccess": "__MISSING__:Import complete: {created} created, {updated} updated, {failed} failed", - "bulkImportErrorLine": "__MISSING__:Line {line}: {reason}", - "bulkImportMaxExceeded": "__MISSING__:Maximum 100 proxies per import", - "bulkImportPreview": "__MISSING__:Preview", - "bulkImportErrorMissingName": "__MISSING__:Missing NAME", - "bulkImportErrorMissingHost": "__MISSING__:Missing HOST", - "bulkImportErrorInvalidPort": "__MISSING__:Invalid PORT (must be 1-65535)", - "bulkImportErrorInvalidType": "__MISSING__:Invalid TYPE (use http, https, or socks5)", - "bulkImportErrorInvalidStatus": "__MISSING__:Invalid STATUS (use active or inactive)", - "clearAssignment": "__MISSING__:(clear assignment)", - "bulkProxyAssignment": "__MISSING__:Bulk Proxy Assignment" + "testSuccess": "OK {ip}", + "testLatency": "{latency}мс", + "testFailure": "Ошибка {error}", + "bulkImport": "Массовый импорт", + "bulkImportTitle": "Массовый импорт прокси", + "bulkImportDescription": "Вставьте профили прокси в формате с разделителем |. Один прокси на строку.", + "bulkImportParse": "Разобрать", + "bulkImportImport": "Импортировать {count} прокси", + "bulkImportImporting": "Импорт...", + "bulkImportParsed": "{count} прокси распознано", + "bulkImportSkipped": "{count} строк пропущено", + "bulkImportParseErrors": "{count} ошибок", + "bulkImportNoValidEntries": "Нет корректных записей.", + "bulkImportSuccess": "Импорт завершён: {created} создано, {updated} обновлено, {failed} с ошибками", + "bulkImportErrorLine": "Строка {line}: {reason}", + "bulkImportMaxExceeded": "Максимум 100 прокси за один импорт", + "bulkImportPreview": "Предпросмотр", + "bulkImportErrorMissingName": "Отсутствует NAME", + "bulkImportErrorMissingHost": "Отсутствует HOST", + "bulkImportErrorInvalidPort": "Некорректный PORT (1-65535)", + "bulkImportErrorInvalidType": "Некорректный TYPE (http, https, socks5)", + "bulkImportErrorInvalidStatus": "Некорректный STATUS (active, inactive)", + "clearAssignment": "(очистить привязку)", + "bulkProxyAssignment": "Массовое назначение прокси" }, "playground": { - "title": "Title", - "description": "Description", - "endpoint": "Endpoint", - "provider": "Provider", - "model": "Model", - "accountKey": "Account Key", - "autoAccounts": "Auto Accounts", - "noAccounts": "No Accounts", - "send": "Send", - "cancel": "Cancel", - "audioFile": "Audio File", - "attachImages": "Attach Images", - "multipartFormData": "Multipart Form Data", - "upToImages": "Up To Images", - "selectAudioFile": "Select Audio File", - "clearAll": "Clear All", - "request": "Request", - "response": "Response", - "transcription": "Transcription", - "copy": "Copy", - "resetToDefault": "Reset To Default", - "downloadAudio": "Download Audio", - "copyText": "Copy Text", - "transcriptionHint": "Transcription Hint", - "imagesGenerated": "Images Generated", - "generatedImage": "Generated Image", - "save": "Save", + "title": "Песочница", + "description": "Тестируйте модели напрямую из панели управления", + "endpoint": "Эндпоинт", + "provider": "Провайдер", + "model": "Модель", + "accountKey": "Аккаунт / Ключ", + "autoAccounts": "Авто ({count} акк.)", + "noAccounts": "Нет аккаунтов", + "send": "Отправить", + "cancel": "Отмена", + "audioFile": "Аудиофайл", + "attachImages": "Прикрепить изображения (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "До 4 изображений", + "selectAudioFile": "Выберите аудиофайл для распознавания (mp3, wav, m4a, ogg, flac...)", + "clearAll": "Очистить всё", + "request": "Запрос", + "response": "Ответ", + "transcription": "Распознавание", + "copy": "Копировать", + "resetToDefault": "Сбросить на умолчания", + "downloadAudio": "Скачать аудио", + "copyText": "Копировать текст", + "transcriptionHint": "Распознавание использует multipart/form-data. Загрузите аудиофайл выше — JSON ниже управляет доп. параметрами (model, language).", + "imagesGenerated": "Сгенерировано {count} изображений", + "generatedImage": "Изображение {index}", + "save": "Сохранить", "endpointOptions": { "chat": "Chat", "responses": "Responses", @@ -6241,49 +6241,49 @@ "rerank": "Rerank", "search": "Search" }, - "conversationalChat": "__MISSING__:Conversational Chat", - "clearChat": "__MISSING__:Clear chat", - "typeMessagePlaceholder": "__MISSING__:Type a message... (Shift+Enter for new line)" + "conversationalChat": "Диалоговый чат", + "clearChat": "Очистить чат", + "typeMessagePlaceholder": "Введите сообщение... (Shift+Enter для новой строки)" }, "requestLogger": { - "recording": "Recording", - "paused": "Paused", - "pipelineLogsOn": "Pipeline logs on", - "pipelineLogsOff": "Pipeline logs off", - "updatingPipelineLogs": "Updating pipeline logs...", - "updatePipelineFailed": "Failed to update pipeline logging", - "capturePipeline": "Capture pipeline payloads for new requests", - "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", - "allProviders": "All providers", - "allModels": "All models", - "allAccounts": "All accounts", - "allApiKeys": "All API keys", - "total": "Total", - "ok": "Success", - "err": "Error", - "combo": "Combo", - "keys": "Keys", - "shown": "Shown", - "sortNewest": "Newest", - "sortOldest": "Oldest", - "sortTokensDesc": "Tokens ↓", - "sortTokensAsc": "Tokens ↑", - "sortDurationDesc": "Duration ↓", - "sortDurationAsc": "Duration ↑", - "sortStatusDesc": "Status ↓", - "sortStatusAsc": "Status ↑", - "sortModelAsc": "Model A-Z", - "sortModelDesc": "Model Z-A", - "sortLogs": "Sort logs", - "refresh": "Refresh", - "columnsLabel": "Columns", - "cacheSem": "SEM", - "cacheUp": "UP", - "semantic": "Semantic", - "upstream": "Upstream", - "semanticCacheHit": "Semantic cache hit (served by OmniRoute)", - "upstreamResponse": "Upstream provider response", - "noApiKey": "No API key", + "recording": "Запись", + "paused": "Пауза", + "pipelineLogsOn": "Логи конвейера вкл.", + "pipelineLogsOff": "Логи конвейера выкл.", + "updatingPipelineLogs": "Обновление логов конвейера...", + "updatePipelineFailed": "Не удалось обновить логи конвейера", + "capturePipeline": "Захват полезной нагрузки конвейера для новых запросов", + "searchPlaceholder": "Поиск по моделям, провайдерам, аккаунтам, ключам API, комбо...", + "allProviders": "Все провайдеры", + "allModels": "Все модели", + "allAccounts": "Все аккаунты", + "allApiKeys": "Все ключи API", + "total": "Всего", + "ok": "OK", + "err": "Ошибка", + "combo": "Комбо", + "keys": "Ключи", + "shown": "Показано", + "sortNewest": "Сначала новые", + "sortOldest": "Сначала старые", + "sortTokensDesc": "Токены ↓", + "sortTokensAsc": "Токены ↑", + "sortDurationDesc": "Длительность ↓", + "sortDurationAsc": "Длительность ↑", + "sortStatusDesc": "Статус ↓", + "sortStatusAsc": "Статус ↑", + "sortModelAsc": "Модель А-Я", + "sortModelDesc": "Модель Я-А", + "sortLogs": "Сортировка", + "refresh": "Обновить", + "columnsLabel": "Колонки", + "cacheSem": "СЕМ", + "cacheUp": "АП", + "semantic": "Семантический", + "upstream": "Провайдер", + "semanticCacheHit": "Попадание в семантический кэш (ответ OmniRoute)", + "upstreamResponse": "Ответ вышестоящего провайдера", + "noApiKey": "Нет ключа API", "requestedRoutedTitle": "Requested {requested}, routed as {routed}", "statusFilters": { "all": "All", @@ -6302,64 +6302,64 @@ "apiKey": "API Key", "combo": "Combo", "tokens": "Tokens", - "compressed": "__MISSING__:Compression", + "compressed": "Compression", "tps": "TPS", "duration": "Duration", "time": "Time" }, - "loadingLogs": "Loading logs...", - "noLogs": "No logs yet. Make some API calls to see them here.", - "noMatchingLogs": "No logs matching current filters.", + "loadingLogs": "Загрузка логов...", + "noLogs": "Логов пока нет. Сделайте несколько API-запросов, чтобы они появились.", + "noMatchingLogs": "Нет логов по текущим фильтрам.", "callLogsInfo": "Call logs are also saved as JSON files to {dataDir} and rotated based on {retentionDays} and {maxEntries}." }, "proxyLogger": { - "filterAll": "All", - "filterErrors": "Errors", - "filterSuccess": "Success", - "filterTimeout": "Timeout", - "colStatus": "Status", - "colProxy": "Proxy", + "filterAll": "Все", + "filterErrors": "Ошибки", + "filterSuccess": "Успешно", + "filterTimeout": "Тайм-аут", + "colStatus": "Статус", + "colProxy": "Прокси", "colTls": "TLS", - "colType": "Type", - "colLevel": "Level", - "colProvider": "Provider", - "colTarget": "Target", - "colLatency": "Latency", - "colPublicIp": "Public IP", - "colTime": "Time", - "recording": "Recording", - "paused": "Paused", - "searchPlaceholder": "Search host, provider, target, IP...", - "allTypes": "All Types", - "allLevels": "All Levels", - "allProviders": "All Providers", - "total": "total", + "colType": "Тип", + "colLevel": "Уровень", + "colProvider": "Провайдер", + "colTarget": "Цель", + "colLatency": "Задержка", + "colPublicIp": "Публичный IP", + "colTime": "Время", + "recording": "Запись", + "paused": "Пауза", + "searchPlaceholder": "Поиск по хосту, провайдеру, цели, IP...", + "allTypes": "Все типы", + "allLevels": "Все уровни", + "allProviders": "Все провайдеры", + "total": "всего", "ok": "OK", - "err": "ERR", - "timeoutShort": "TMO", - "direct": "direct", - "newest": "Newest", - "oldest": "Oldest", - "latencyDesc": "Latency ↓", - "latencyAsc": "Latency ↑", - "refresh": "Refresh", - "columns": "Columns", - "loadingProxyLogs": "Loading proxy logs...", - "noProxyLogs": "No proxy logs yet. Configure proxies and make API calls to see them here.", - "noMatchingLogs": "No logs match the current filters.", - "tlsFingerprint": "Chrome 124 TLS Fingerprint" + "err": "ОШБ", + "timeoutShort": "ТАО", + "direct": "напрямую", + "newest": "Новые", + "oldest": "Старые", + "latencyDesc": "Задержка ↓", + "latencyAsc": "Задержка ↑", + "refresh": "Обновить", + "columns": "Колонки", + "loadingProxyLogs": "Загрузка логов прокси...", + "noProxyLogs": "Логов прокси пока нет. Настройте прокси и сделайте запросы.", + "noMatchingLogs": "Нет логов по текущим фильтрам.", + "tlsFingerprint": "TLS-отпечаток Chrome 124" }, "endpointOptions": { - "speech": "Speech", - "search": "Search", - "images": "Images", - "chat": "Chat", - "music": "Music", + "speech": "Озвучивание", + "search": "Поиск", + "images": "Изображения", + "chat": "Чат", + "music": "Музыка", "responses": "Responses", - "rerank": "Rerank", - "video": "Video", - "embeddings": "Embeddings", - "transcription": "Transcription" + "rerank": "Переранжирование", + "video": "Видео", + "embeddings": "Эмбеддинги", + "transcription": "Распознавание" }, "toolDescriptions": { "cline": "Cline", @@ -6370,31 +6370,31 @@ "kilo": "Kilo" }, "runtime": { - "title": "Runtime", - "description": "Realtime observability — 3-layer resilience + sessions + quota alerts", - "pause": "Pause", - "resume": "Resume", - "refreshNow": "Refresh now", - "kpiSessions": "Sessions", - "kpiCircuits": "Circuits", - "kpiCooldowns": "Cooldowns", - "kpiLockouts": "Lockouts", + "title": "Среда выполнения", + "description": "Наблюдение в реальном времени — 3 уровня отказоустойчивости + сессии + оповещения о квотах", + "pause": "Пауза", + "resume": "Продолжить", + "refreshNow": "Обновить", + "kpiSessions": "Сессии", + "kpiCircuits": "Выключатели", + "kpiCooldowns": "Остывание", + "kpiLockouts": "Блокировки", "hintStickyBound": "{count} sticky-bound", "hintRecovering": "{count} recovering", "hintAllHealthy": "all healthy", "hintOpen": "open", "hintConnsCooling": "connections cooling", "hintModelsBlocked": "models blocked", - "resilienceTitle": "3-Layer Resilience", + "resilienceTitle": "3-уровневая отказоустойчивость", "resilienceSubtitle": "Mirrors the documented resilience model", - "providersHealthy": "{percent}% providers healthy", - "layer": "Layer {n}", - "layer1Title": "Provider Circuit Breakers", - "layer1Desc": "Stop traffic to providers failing at the upstream level", - "layer2Title": "Connection Cooldowns", - "layer2Desc": "Skip one bad account/key; other connections keep serving", - "layer3Title": "Model Lockouts", - "layer3Desc": "Per-model rate-limit locks; same connection still serves other models", + "providersHealthy": "{percent}% провайдеров здоровы", + "layer": "Уровень {n}", + "layer1Title": "Автоматические выключатели провайдеров", + "layer1Desc": "Остановка трафика к провайдерам с ошибками на upstream", + "layer2Title": "Остывание подключений", + "layer2Desc": "Пропуск одного сбойного аккаунта/ключа; остальные продолжают работать", + "layer3Title": "Блокировки моделей", + "layer3Desc": "Блокировка по лимиту на модель; то же подключение обслуживает другие модели", "badgeAffectedOf": "{affected} of {total} affected", "badgeCooling": "{count} cooling", "badgeLocked": "{count} locked", @@ -6403,43 +6403,43 @@ "emptyLockouts": "No model lockouts", "moreCooldowns": "+{count} more cooldowns", "moreLockouts": "+{count} more lockouts", - "feedTitle": "Live Feed", - "feedSubtitle": "Last {count} events", - "feedFilterAll": "All", - "feedFilterCircuits": "Circuits", - "feedFilterCooldowns": "Cooldowns", - "feedFilterLockouts": "Lockouts", - "feedFilterSessions": "Sessions", - "feedFilterQuotas": "Quotas", - "feedClear": "Clear", + "feedTitle": "Лента событий", + "feedSubtitle": "Последние {count} событий", + "feedFilterAll": "Все", + "feedFilterCircuits": "Выключатели", + "feedFilterCooldowns": "Остывание", + "feedFilterLockouts": "Блокировки", + "feedFilterSessions": "Сессии", + "feedFilterQuotas": "Квоты", + "feedClear": "Очистить", "feedEmptyWaiting": "Waiting for events... (polled every 5s)", "feedEmptyFiltered": "No events match this filter", - "sessionsTitle": "Active Sessions", - "sessionsSubtitle": "Sticky-bound request fingerprints (live)", + "sessionsTitle": "Активные сессии", + "sessionsSubtitle": "Привязки запросов (в реальном времени)", "sessionsActive": "{count} active", "sessionsEmptyTitle": "No active sessions", - "sessionsEmptyHint": "Sessions appear as requests flow through the proxy", - "tblSession": "Session", - "tblAge": "Age", - "tblIdle": "Idle", - "tblReqs": "Reqs", - "tblBoundTo": "Bound to", - "topApiKeys": "Top API keys", - "quotaMonitorsTitle": "Quota Monitors", - "quotaMonitorsSubtitle": "Live quota state per account window", - "openQuota": "Open Quota", - "allQuotasHealthy": "All quotas healthy", - "statusExhausted": "EXHAUSTED", - "statusAlerting": "ALERTING", - "statusError": "ERROR", + "sessionsEmptyHint": "Сессии появляются по мере прохождения запросов через прокси", + "tblSession": "Сессия", + "tblAge": "Возраст", + "tblIdle": "Простой", + "tblReqs": "Запросы", + "tblBoundTo": "Привязан к", + "topApiKeys": "Топ ключей API", + "quotaMonitorsTitle": "Мониторы квот", + "quotaMonitorsSubtitle": "Состояние квот в реальном времени", + "openQuota": "Открытая квота", + "allQuotasHealthy": "Все квоты в порядке", + "statusExhausted": "ИСЧЕРПАНО", + "statusAlerting": "ПРЕДУПРЕЖДЕНИЕ", + "statusError": "ОШИБКА", "moreSuffix": "+{count} more" }, "quotaShare": { - "title": "Quota Sharing", - "description": "Share provider quotas across API keys with % limits", - "newPool": "New pool", - "betaTitle": "Beta — UI preview.", - "betaDescription": "Configuration is saved in localStorage (not yet persisted on the server). Per-request cap enforcement is not yet wired into the proxy pipeline. This screen lets you design and visualize the quota split; real enforcement will land in a future iteration with DB persistence and upstream call interception.", + "title": "Общие квоты", + "description": "Распределение квот провайдеров между ключами API с процентными лимитами", + "newPool": "Новый пул", + "betaTitle": "Бета — предпросмотр UI.", + "betaDescription": "Конфигурация сохраняется в localStorage (ещё не на сервере). Этот экран позволяет спроектировать разделение квот; реальное применение будет в будущих версиях.", "kpiActivePools": "Active pools", "kpiKeysAllocated": "Keys allocated", "kpiAvgUnallocated": "Avg unallocated", @@ -6482,9 +6482,9 @@ "addKey": "+ Add key…", "equalSplit": "Equal split", "save": "Save allocations", - "betaPreviewLabel": "__MISSING__:Beta — UI preview.", - "betaConfigSavedPrefix": "__MISSING__:Configuration is saved in", - "betaConfigSavedSuffix": "__MISSING__:(not yet persisted on the server). Per-request cap enforcement is not yet wired into the proxy pipeline. This screen lets you design and visualize the quota split;", - "policyLabel": "__MISSING__:Policy:" + "betaPreviewLabel": "Beta — UI preview.", + "betaConfigSavedPrefix": "A configuração é salva em", + "betaConfigSavedSuffix": "(não persiste no servidor ainda). A aplicação dos caps por request ainda não está conectada ao pipeline da proxy. Esta tela permite desenhar e visualizar a divisão de cota;", + "policyLabel": "Policy:" } -} +} \ No newline at end of file