diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json
index 6f3fa7156f..ebaad2dc12 100644
--- a/src/i18n/messages/ru.json
+++ b/src/i18n/messages/ru.json
@@ -36,7 +36,7 @@
"time": "Время",
"details": "Подробности",
"created": "Создано",
- "lastUsed": "Last Refreshed",
+ "lastUsed": "Последнее обновление",
"loadMore": "Загрузить больше",
"noResults": "Результаты не найдены",
"reloadPage": "Обновить страницу",
@@ -57,8 +57,8 @@
"note": "Примечание",
"free": "Бесплатно",
"skipToContent": "Перейти к содержимому",
- "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
- "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
+ "maintenanceServerIssues": "На сервере возникли проблемы. Некоторые функции могут быть недоступны.",
+ "maintenanceServerUnreachable": "Сервер недоступен. Повторное подключение...",
"accept": "accept",
"accountId": "accountId",
"alias": "alias",
@@ -143,7 +143,7 @@
"dashboard": "Панель управления",
"providers": "Провайдеры",
"combos": "Комбо",
- "autoCombo": "Auto Combo",
+ "autoCombo": "Автокомбо",
"usage": "Использование",
"analytics": "Аналитика",
"costs": "Затраты",
@@ -154,7 +154,7 @@
"settings": "Настройки",
"translator": "Переводчик",
"playground": "Площадка",
- "searchTools": "Search Tools",
+ "searchTools": "Инструменты поиска",
"agents": "Агенты",
"docs": "Документы",
"issues": "Проблемы",
@@ -162,19 +162,19 @@
"apiManager": "Менеджер API",
"logs": "Журналы",
"auditLog": "Журнал аудита",
- "shutdown": "Выключение",
- "restart": "Перезапустить",
+ "shutdown": "Выключить",
+ "restart": "Перезапуск",
"shutdownConfirm": "Выключить OmniRoute?",
"restartConfirm": "Перезапустить OmniRoute?",
"version": "v{version}",
"debug": "Отладка",
"system": "Система",
"help": "Помощь",
- "primarySection": "Main",
+ "primarySection": "Основные",
"cliSection": "CLI",
- "debugSection": "Debug",
- "systemSection": "System",
- "helpSection": "Help",
+ "debugSection": "Отладка",
+ "systemSection": "Система",
+ "helpSection": "Справка",
"serverDisconnected": "Сервер отключен",
"serverDisconnectedMsg": "Прокси-сервер остановлен или перезагружается.",
"expandSidebar": "Развернуть боковую панель",
@@ -191,8 +191,10 @@
"themeOrange": "Оранжевый",
"themeCyan": "Голубой",
"cliToolsShort": "Инструменты",
- "cache": "Cache",
- "cacheShort": "Cache"
+ "cache": "Кэш",
+ "cacheShort": "Кэш",
+ "memory": "Память",
+ "skills": "Навыки"
},
"themesPage": {
"title": "Темы",
@@ -221,15 +223,15 @@
"endpoint": "Конечные точки",
"endpointDescription": "Управление прокси-эндпоинтами, MCP, A2A и API-эндпоинтами",
"mcp": "MCP",
- "mcpDescription": "Model Context Protocol server management and tools",
+ "mcpDescription": "Управление сервером Model Context Protocol и инструментами",
"a2a": "A2A",
- "a2aDescription": "Agent-to-Agent protocol tasks and observability",
+ "a2aDescription": "Задачи и наблюдаемость протокола Agent-to-Agent",
"settings": "Настройки",
"settingsDescription": "Управляйте своими предпочтениями",
"openaiCompatible": "Совместимость с OpenAI",
"anthropicCompatible": "Антропная совместимость",
- "media": "Media",
- "mediaDescription": "Generate images, videos, and music",
+ "media": "Медиа",
+ "mediaDescription": "Создание изображений, видео и музыки",
"themes": "Темы",
"themesDescription": "Выберите цветовую тему для всей панели"
},
@@ -238,13 +240,13 @@
"quickStartDesc": "Приступайте к работе в 4 шага. Подключайте провайдеров, маршрутизируйте модели, контролируйте все.",
"fullDocs": "Полная документация",
"step1Title": "1. Создайте ключ API.",
- "step1Desc": "Перейдите к Endpoint -> Зарегистрированные ключи. Создайте один ключ для каждой среды.",
+ "step1Desc": "Перейдите к Конечная точка API → Зарегистрированные ключи. Создайте один ключ для каждой среды.",
"step2Title": "2. Подключите провайдеров",
- "step2Desc": "Добавьте учетные записи в Providers. Поддерживает OAuth, ключ API и уровни бесплатного пользования.",
+ "step2Desc": "Добавьте учетные записи в Провайдеры. Поддерживает OAuth, ключ API и уровни бесплатного пользования.",
"step3Title": "3. Укажите своего клиента",
"step3Desc": "Установите базовый URL-адрес {url} в клиенте IDE или API.",
"step4Title": "4. Мониторинг и оптимизация",
- "step4Desc": "Отслеживайте токены, стоимость и ошибки в Журналы запросов и Analytics.",
+ "step4Desc": "Отслеживайте токены, стоимость и ошибки в Журналы запросов и Аналитика.",
"providersOverview": "Обзор провайдеров",
"configuredOf": "{configured} настроен из {total} доступных поставщиков",
"noModelsAvailable": "Нет доступных моделей для этого поставщика.",
@@ -332,26 +334,26 @@
"keyCreatedNote": "Скопируйте и сохраните этот ключ сейчас — он больше не будет отображаться.",
"done": "Готово",
"savePermissions": "Сохранить разрешения",
- "autoResolve": "Auto-Resolve",
- "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
- "keyActive": "Key Active",
- "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.",
- "accessSchedule": "Access Schedule",
- "accessScheduleDesc": "Restrict access to specific hours and days of the week.",
- "scheduleFrom": "From",
- "scheduleUntil": "Until",
- "scheduleDays": "Days",
- "scheduleTimezone": "Timezone",
- "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin",
- "scheduleActive": "Schedule",
- "disabled": "Disabled",
- "daySun": "Sun",
- "dayMon": "Mon",
- "dayTue": "Tue",
- "dayWed": "Wed",
- "dayThu": "Thu",
- "dayFri": "Fri",
- "daySat": "Sat",
+ "autoResolve": "Авторазрешение",
+ "autoResolveDesc": "Автоматически сопоставлять неоднозначные имена моделей с нативным провайдером для этого API-ключа.",
+ "keyActive": "Ключ активен",
+ "keyActiveDesc": "Включить или отключить этот API-ключ. Отключённые ключи сразу отклоняются с 403.",
+ "accessSchedule": "Расписание доступа",
+ "accessScheduleDesc": "Ограничьте доступ определёнными часами и днями недели.",
+ "scheduleFrom": "С",
+ "scheduleUntil": "До",
+ "scheduleDays": "Дни",
+ "scheduleTimezone": "Часовой пояс",
+ "scheduleTimezoneHint": "Используйте имена часовых поясов IANA, например America/New_York, Europe/Berlin",
+ "scheduleActive": "Расписание",
+ "disabled": "Отключено",
+ "daySun": "Вс",
+ "dayMon": "Пн",
+ "dayTue": "Вт",
+ "dayWed": "Ср",
+ "dayThu": "Чт",
+ "dayFri": "Пт",
+ "daySat": "Сб",
"allowAll": "Разрешить все",
"restrict": "Ограничить",
"allowAllInfo": "Этот ключ дает доступ ко всем доступным моделям.",
@@ -376,8 +378,8 @@
"failedUpdatePermissionsRetry": "Не удалось обновить разрешения. Пожалуйста, попробуйте еще раз.",
"unknownProvider": "неизвестно",
"copyMaskedKey": "Копировать замаскированный ключ",
- "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key",
- "modelsCount": "{count, plural, one {# model} other {# models}}",
+ "keyOnlyAvailableAtCreation": "Полный ключ доступен только при создании — скопируйте его сразу после генерации",
+ "modelsCount": "{count, plural, one {# модель} few {# модели} many {# моделей} other {# модели}}",
"lastUsedOn": "Последний: {date}",
"editPermissions": "Редактировать разрешения",
"deleteKey": "Удалить ключ",
@@ -405,7 +407,7 @@
"refreshAuditLogAria": "Обновить журнал аудита",
"tableAria": "Записи журнала аудита",
"failedFetchAuditLog": "Не удалось получить журнал аудита.",
- "notAvailable": "—",
+ "notAvailable": "н/д",
"description": "Административные действия и события безопасности",
"showing": "Показаны записи {count} (смещение {offset})",
"previous": "Предыдущий"
@@ -413,74 +415,74 @@
"media": {
"title": "Медиа-площадка",
"subtitle": "Генерируйте изображения, видео и музыку",
- "model": "Model",
- "prompt": "Prompt",
+ "model": "Модель",
+ "prompt": "Промпт",
"generate": "Сгенерировать",
- "generating": "Generating...",
- "loadingModels": "Loading available models...",
- "noModels": "No models available. Configure providers with media capabilities first.",
- "error": "Generation Failed",
- "result": "Result",
- "imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.",
- "videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.",
- "musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI."
+ "generating": "Генерация...",
+ "loadingModels": "Загрузка доступных моделей...",
+ "noModels": "Нет доступных моделей. Сначала настройте провайдеров с возможностями медиа.",
+ "error": "Сбой генерации",
+ "result": "Результат",
+ "imageDescription": "Создавайте изображения по текстовым промптам с помощью OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI и других.",
+ "videoDescription": "Создавайте видео с AnimateDiff, Stable Video Diffusion через ComfyUI или SD WebUI.",
+ "musicDescription": "Создавайте музыку с помощью Stable Audio Open или MusicGen через ComfyUI."
},
"search": {
- "searchQuery": "Search Query",
- "searchResults": "Search Results",
- "cachedResult": "Cached",
- "searchCost": "Cost",
- "searchTools": "Search Tools",
- "searchToolsDesc": "Advanced search testing with provider comparison",
- "compareProviders": "Compare Providers",
- "rerankResults": "Rerank Results",
- "searchHistory": "Search History",
- "urlOverlap": "URL Overlap",
- "noSearchProviders": "No search providers configured. Add providers in Settings.",
- "noRerankModels": "No rerank model available",
- "webSearch": "Web Search",
- "provider": "Provider",
- "searchType": "Search Type",
- "maxResults": "Max Results",
- "filters": "Filters",
- "country": "Country",
- "language": "Language",
- "timeRange": "Time Range",
- "includeDomains": "Include Domains",
- "excludeDomains": "Exclude Domains",
- "safeSearch": "Safe Search",
- "safeSearchOff": "Off",
- "safeSearchModerate": "Moderate",
- "safeSearchStrict": "Strict",
- "queryPlaceholder": "Enter search query...",
- "providerAuto": "auto (cheapest)",
- "searchTypeWeb": "web",
- "searchTypeNews": "news",
- "optionAny": "any",
- "timeRangeDay": "Past day",
- "timeRangeWeek": "Past week",
- "timeRangeMonth": "Past month",
- "timeRangeYear": "Past year",
+ "searchQuery": "Поисковый запрос",
+ "searchResults": "Результаты поиска",
+ "cachedResult": "В кэше",
+ "searchCost": "Стоимость",
+ "searchTools": "Инструменты поиска",
+ "searchToolsDesc": "Продвинутое тестирование поиска с сравнением провайдеров",
+ "compareProviders": "Сравнить провайдеров",
+ "rerankResults": "Переранжировать результаты",
+ "searchHistory": "История поиска",
+ "urlOverlap": "Пересечение URL",
+ "noSearchProviders": "Провайдеры поиска не настроены. Добавьте их в настройках.",
+ "noRerankModels": "Модель для rerank недоступна",
+ "webSearch": "Веб-поиск",
+ "provider": "Провайдер",
+ "searchType": "Тип поиска",
+ "maxResults": "Макс. результатов",
+ "filters": "Фильтры",
+ "country": "Страна",
+ "language": "Язык",
+ "timeRange": "Диапазон времени",
+ "includeDomains": "Включить домены",
+ "excludeDomains": "Исключить домены",
+ "safeSearch": "Безопасный поиск",
+ "safeSearchOff": "Выкл.",
+ "safeSearchModerate": "Умеренный",
+ "safeSearchStrict": "Строгий",
+ "queryPlaceholder": "Введите поисковый запрос...",
+ "providerAuto": "авто (самый дешёвый)",
+ "searchTypeWeb": "веб",
+ "searchTypeNews": "новости",
+ "optionAny": "любой",
+ "timeRangeDay": "Последний день",
+ "timeRangeWeek": "Последняя неделя",
+ "timeRangeMonth": "Последний месяц",
+ "timeRangeYear": "Последний год",
"domainPlaceholder": "example.com",
- "requestTimedOut": "Request timed out ({seconds}s)",
- "networkError": "Network error",
- "formatted": "Formatted",
+ "requestTimedOut": "Время запроса истекло ({seconds}с)",
+ "networkError": "Ошибка сети",
+ "formatted": "Отформатировано",
"rawJson": "JSON",
- "cacheMiss": "cache miss",
- "cacheHit": "cache hit",
- "latency": "Latency",
- "cost": "Cost",
- "results": "Results",
- "rerank": "Rerank",
- "rerankModel": "Rerank Model",
- "positionDelta": "Position Change",
- "emptyState": "Send a search query to see results"
+ "cacheMiss": "промах кэша",
+ "cacheHit": "попадание в кэш",
+ "latency": "Задержка",
+ "cost": "Стоимость",
+ "results": "Результаты",
+ "rerank": "Переранжировать",
+ "rerankModel": "Модель rerank",
+ "positionDelta": "Изменение позиции",
+ "emptyState": "Отправьте поисковый запрос, чтобы увидеть результаты"
},
"cliTools": {
"title": "Инструменты интерфейса командной строки",
"noActiveProviders": "Нет активных провайдеров",
"noActiveProvidersDesc": "Сначала добавьте и подключите поставщиков, чтобы настроить инструменты CLI.",
- "mapModels": "Модели карт",
+ "mapModels": "Сопоставление моделей",
"testConnection": "Тестовое соединение",
"connectionStatus": "Статус соединения",
"configureEndpoint": "Настроить конечную точку",
@@ -515,11 +517,11 @@
"clear": "Очистить",
"comingSoon": "Скоро",
"checkingRuntime": "Проверка статуса выполнения...",
- "guideOnlyIntegration": "Интеграция только для руководства (локальная среда выполнения не требуется)",
+ "guideOnlyIntegration": "Интеграция только для справки (локальная среда выполнения не требуется)",
"cliRuntimeDetected": "Среда выполнения CLI обнаружена и готова",
- "cliFoundNotRunnable": "CLI найден, но не работает{reason}",
+ "cliFoundNotRunnable": "CLI найден, но не запускается{reason}",
"cliRuntimeNotDetected": "Среда выполнения CLI не обнаружена",
- "binary": "Двоичный",
+ "binary": "Бинарник",
"configPath": "Путь конфигурации",
"configPathShort": "Конфигурация",
"failedCheckRuntimeStatus": "Не удалось проверить статус выполнения.",
@@ -543,16 +545,16 @@
"mappingsSaved": "Сопоставления сохранены!",
"failedSaveMappings": "Не удалось сохранить сопоставления.",
"howItWorks": "Как это работает:",
- "antigravityHowWorksDesc": "Антигравитация отправляет запросы на конечную точку Google. MITM перехватывает и перенаправляет их в OmniRoute.",
+ "antigravityHowWorksDesc": "Antigravity отправляет запросы на конечную точку Google. MITM перехватывает их и перенаправляет в OmniRoute.",
"antigravityStep1": "1. Запустите MITM для маршрутизации запросов через OmniRoute.",
"antigravityStep2Prefix": "2. Добавить",
"antigravityStep2Suffix": "в файл хостов как 127.0.0.1.",
- "antigravityStep3": "3. Откройте Антигравитацию и запросы будут проксироваться.",
- "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
- "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
- "mitmStep2Prefix": "2. Add",
- "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
- "mitmStep3": "3. Open {toolName} and requests will be proxied.",
+ "antigravityStep3": "3. Откройте Antigravity, и запросы будут проксироваться.",
+ "mitmHowWorksDesc": "{toolName} отправляет запросы на конечную точку своего провайдера. MITM перехватывает и перенаправляет их в OmniRoute.",
+ "mitmStep1": "1. Запустите MITM, чтобы направлять запросы через OmniRoute.",
+ "mitmStep2Prefix": "2. Добавьте",
+ "mitmStep2Suffix": "в ваш hosts-файл как 127.0.0.1.",
+ "mitmStep3": "3. Откройте {toolName}, и запросы будут проксироваться.",
"sudoPasswordRequiredTitle": "Требуется пароль Sudo",
"sudoPasswordHint": "Пароль администратора необходим для изменения файлов хостов и настроек системного прокси.",
"enterSudoPassword": "Введите пароль sudo",
@@ -647,14 +649,14 @@
"codex": "Интерфейс командной строки Кодекса OpenAI",
"droid": "Искусственный интеллект заводского дроида",
"openclaw": "Открытый ИИ-помощник когтя",
- "cline": "Cline AI Coding Assistant CLI",
+ "cline": "Cline - CLI помощника по коду с ИИ",
"kilo": "Интерфейс командной строки Kilo Code AI Assistant",
"cursor": "Редактор кода курсора AI",
"continue": "Продолжить AI-помощник",
- "opencode": "OpenCode AI coding agent (Terminal)",
- "kiro": "Amazon Kiro — AI-powered IDE",
- "windsurf": "Windsurf AI Code Editor",
- "copilot": "GitHub Copilot AI Assistant"
+ "opencode": "OpenCode - агент кодирования с ИИ в терминале",
+ "kiro": "Amazon Kiro - IDE с ИИ",
+ "windsurf": "Редактор кода Windsurf с ИИ",
+ "copilot": "Ассистент GitHub Copilot с ИИ"
},
"guides": {
"cursor": {
@@ -704,28 +706,28 @@
}
},
"notes": {
- "0": "Continue использует файл конфигурации JSON."
+ "0": "Continue использует JSON-файл конфигурации."
}
},
"opencode": {
"steps": {
"1": {
- "title": "Install OpenCode",
- "desc": "Install via npm: npm install -g opencode-ai"
+ "title": "Установите OpenCode",
+ "desc": "Установите через npm: npm install -g opencode-ai"
},
"2": {
- "title": "API Key"
+ "title": "API-ключ"
},
"3": {
- "title": "Set Base URL",
+ "title": "Задайте базовый URL",
"desc": "opencode config set baseUrl {{baseUrl}}"
},
"4": {
- "title": "Select Model"
+ "title": "Выберите модель"
},
"5": {
- "title": "Use Thinking Variant",
- "desc": "For thinking models, run with --variant high/low/max (example command below)."
+ "title": "Используйте вариант мышления",
+ "desc": "Для thinking-моделей запускайте с --variant high/low/max (пример команды ниже)."
}
},
"notes": {
@@ -736,18 +738,18 @@
"kiro": {
"steps": {
"1": {
- "title": "Open Kiro Settings",
- "desc": "Go to Settings → AI Provider"
+ "title": "Откройте настройки Kiro",
+ "desc": "Перейдите в Настройки → Поставщик ИИ"
},
"2": {
- "title": "Base URL",
- "desc": "Paste your OmniRoute endpoint URL"
+ "title": "Базовый URL",
+ "desc": "Вставьте URL вашего эндпоинта OmniRoute"
},
"3": {
- "title": "API Key"
+ "title": "API-ключ"
},
"4": {
- "title": "Select Model"
+ "title": "Выберите модель"
}
},
"notes": {
@@ -757,28 +759,52 @@
"windsurf": {
"steps": {
"1": {
- "title": "Open AI Settings",
- "desc": "Click the AI Settings icon in Windsurf or go to Settings"
+ "title": "Откройте настройки ИИ",
+ "desc": "Нажмите значок настроек ИИ в Windsurf или откройте Настройки"
},
"2": {
- "title": "Add Custom Provider",
- "desc": "Select \"Add custom provider\" (OpenAI-compatible)"
+ "title": "Добавьте кастомного провайдера",
+ "desc": "Выберите \"Add custom provider\" (OpenAI-совместимый)"
},
"3": {
- "title": "Base URL",
+ "title": "Базовый URL",
"desc": "http://127.0.0.1:20128/v1"
},
"4": {
- "title": "API Key",
- "desc": "Select your OmniRoute API key"
+ "title": "API-ключ",
+ "desc": "Выберите ключ API OmniRoute"
},
"5": {
- "title": "Select Model",
- "desc": "Choose a model from the dropdown"
+ "title": "Выберите модель",
+ "desc": "Выберите модель из выпадающего списка"
}
}
}
- }
+ },
+ "guides.opencode.steps.1.title": "Установите OpenCode",
+ "guides.opencode.steps.1.desc": "Установите через npm: npm install -g opencode-ai",
+ "guides.opencode.steps.2.title": "API-ключ",
+ "guides.opencode.steps.3.title": "Задайте базовый URL",
+ "guides.opencode.steps.3.desc": "opencode config set baseUrl {{baseUrl}}",
+ "guides.opencode.steps.4.title": "Выберите модель",
+ "guides.opencode.steps.5.title": "Используйте вариант мышления",
+ "guides.opencode.steps.5.desc": "Для thinking-моделей запускайте с --variant high/low/max (пример команды ниже).",
+ "guides.kiro.steps.1.title": "Откройте настройки Kiro",
+ "guides.kiro.steps.1.desc": "Перейдите в Настройки → Поставщик ИИ",
+ "guides.kiro.steps.2.title": "Базовый URL",
+ "guides.kiro.steps.2.desc": "Вставьте URL вашего эндпоинта OmniRoute",
+ "guides.kiro.steps.3.title": "API-ключ",
+ "guides.kiro.steps.4.title": "Выберите модель",
+ "guides.windsurf.steps.1.title": "Откройте настройки ИИ",
+ "guides.windsurf.steps.1.desc": "Нажмите значок настроек ИИ в Windsurf или откройте Настройки",
+ "guides.windsurf.steps.2.title": "Добавьте кастомного провайдера",
+ "guides.windsurf.steps.2.desc": "Выберите \"Add custom provider\" (совместимый с OpenAI)",
+ "guides.windsurf.steps.3.title": "Базовый URL",
+ "guides.windsurf.steps.3.desc": "http://127.0.0.1:20128/v1",
+ "guides.windsurf.steps.4.title": "API-ключ",
+ "guides.windsurf.steps.4.desc": "Выберите ключ API OmniRoute",
+ "guides.windsurf.steps.5.title": "Выберите модель",
+ "guides.windsurf.steps.5.desc": "Выберите модель из выпадающего списка"
},
"combos": {
"title": "Комбо",
@@ -834,8 +860,8 @@
"randomDesc": "Равномерный случайный выбор, затем возврат к оставшимся моделям",
"leastUsedDesc": "Выбирает модель с наименьшим количеством запросов, балансируя нагрузку с течением времени.",
"costOptimizedDesc": "Маршруты к самой дешевой модели в первую очередь на основе цены",
- "strictRandom": "Strict Random",
- "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling",
+ "strictRandom": "Строгий случайный",
+ "strictRandomDesc": "Перемешивание колоды - каждая модель используется по одному разу перед новым перемешиванием",
"models": "Модели",
"autoBalance": "Автобаланс",
"advancedSettings": "Расширенные настройки",
@@ -849,53 +875,53 @@
"saving": "Сохранение...",
"weighted": "Взвешенный",
"leastUsed": "Наименее используемый",
- "costOpt": "Цена-опция",
- "strategyGuideTitle": "How to use this strategy",
- "strategyGuideWhen": "When to use",
- "strategyGuideAvoid": "Avoid when",
- "strategyGuideExample": "Example",
+ "costOpt": "Оптимизация по стоимости",
+ "strategyGuideTitle": "Как использовать эту стратегию",
+ "strategyGuideWhen": "Когда использовать",
+ "strategyGuideAvoid": "Когда избегать",
+ "strategyGuideExample": "Пример",
"strategyGuide": {
"priority": {
- "when": "You have one preferred model and only want fallback on failure.",
- "avoid": "You need request distribution across models.",
- "example": "Primary coding model with cheaper backup for outages."
+ "when": "У вас есть одна предпочтительная модель, и нужен только резервный вариант при сбое.",
+ "avoid": "Вам нужна распределённая нагрузка между несколькими моделями.",
+ "example": "Основная кодовая модель с более дешёвым резервом на случай отказа."
},
"weighted": {
- "when": "You need controlled traffic split across models.",
- "avoid": "You cannot maintain accurate weights over time.",
- "example": "80% stable model + 20% canary model rollout."
+ "when": "Вам нужен контролируемый раздел трафика между моделями.",
+ "avoid": "Вы не можете поддерживать точные веса со временем.",
+ "example": "80% стабильная модель + 20% canary rollout."
},
"round-robin": {
- "when": "You want predictable and even distribution.",
- "avoid": "Models differ too much in latency or cost.",
- "example": "Same model on multiple accounts to spread throughput."
+ "when": "Нужна предсказуемая и равномерная выдача запросов.",
+ "avoid": "Модели слишком сильно отличаются по задержке или стоимости.",
+ "example": "Одна и та же модель на нескольких аккаунтах для распределения пропускной способности."
},
"random": {
- "when": "You want simple distribution with minimal setup.",
- "avoid": "You need strict traffic guarantees.",
- "example": "Quick prototyping with equivalent models."
+ "when": "Нужна простая схема распределения без сложной настройки.",
+ "avoid": "Вам нужны строгие гарантии по трафику.",
+ "example": "Быстрое прототипирование на эквивалентных моделях."
},
"least-used": {
- "when": "You want adaptive balancing based on live demand.",
- "avoid": "Traffic is too low to benefit from usage balancing.",
- "example": "Mixed workloads where one model often gets overloaded."
+ "when": "Нужно адаптивное балансирование по живой нагрузке.",
+ "avoid": "Трафика слишком мало, чтобы выиграть от балансировки по использованию.",
+ "example": "Смешанные нагрузки, где одна модель часто перегружается."
},
"cost-optimized": {
- "when": "Cost reduction is your top priority.",
- "avoid": "Pricing data is missing or outdated.",
- "example": "Background or batch jobs where lower cost is preferred."
+ "when": "Снижение стоимости - ваш главный приоритет.",
+ "avoid": "Данные о ценах отсутствуют или устарели.",
+ "example": "Фоновые или пакетные задачи, где важнее низкая стоимость."
},
"strict-random": {
- "when": "Use when you want perfectly even spread — each model used once before repeating.",
- "avoid": "Avoid when models have different quality or latency and order matters.",
- "example": "Example: Multiple accounts of the same model to distribute usage evenly."
+ "when": "Используйте, когда нужен идеально ровный spread - каждая модель используется один раз перед повтором.",
+ "avoid": "Избегайте, когда модели отличаются по качеству или задержке и важен порядок.",
+ "example": "Пример: несколько аккаунтов одной модели для равномерного распределения использования."
}
},
"advancedHelp": {
- "maxRetries": "How many retries are attempted before failing a request.",
- "retryDelay": "Initial wait between retries. Higher values reduce burst pressure.",
+ "maxRetries": "Сколько повторных попыток выполняется до отказа запроса.",
+ "retryDelay": "Начальная пауза между повторными попытками. Большие значения уменьшают всплески нагрузки.",
"timeout": "Максимальная продолжительность запроса до прерывания.",
- "healthcheck": "Skips unhealthy models/providers from routing decisions.",
+ "healthcheck": "Пропускает нездоровые модели и провайдеров при принятии решений маршрутизации.",
"concurrencyPerModel": "Максимальное количество одновременных запросов, разрешенных для каждой модели в циклическом переборе.",
"queueTimeout": "Как долго запрос может находиться в очереди до истечения времени ожидания."
},
@@ -903,26 +929,26 @@
"templatesDescription": "Примените стартовый профиль, затем настройте модели и конфигурации.",
"templateApply": "Применить шаблон",
"templateHighAvailability": "Высокая доступность",
- "templateHighAvailabilityDesc": "Priority routing with health checks and safe retries.",
- "templateCostSaver": "Cost saver",
- "templateCostSaverDesc": "Cost-optimized routing for budget-first workloads.",
- "templateBalanced": "Balanced load",
- "templateBalancedDesc": "Least-used routing to spread demand over time.",
- "usageGuideHide": "Hide",
- "usageGuideDontShowAgain": "Don't show again",
- "usageGuideShow": "Show guide",
- "quickTestTitle": "Combo ready to validate",
- "quickTestDescription": "Run a test now to confirm fallback and latency behavior.",
- "testNow": "Test now",
- "pricingCoverage": "Pricing coverage",
- "pricingCoverageHint": "Cost-optimized works best when all combo models have pricing.",
- "pricingAvailable": "Pricing available",
- "pricingMissing": "No pricing",
- "pricingAvailableShort": "priced",
- "pricingMissingShort": "no-price",
- "warningRoundRobinSingleModel": "Round-robin is most useful with at least 2 models.",
- "warningCostOptimizedPartialPricing": "Only {priced} of {total} models have pricing. Routing may be partially cost-aware.",
- "warningCostOptimizedNoPricing": "No pricing data found for this combo. Cost-optimized may route unexpectedly.",
+ "templateHighAvailabilityDesc": "Маршрутизация по приоритету с проверкой состояния и безопасными повторными попытками.",
+ "templateCostSaver": "Экономия",
+ "templateCostSaverDesc": "Маршрутизация с оптимизацией по стоимости для задач, где важен бюджет.",
+ "templateBalanced": "Сбалансированная нагрузка",
+ "templateBalancedDesc": "Маршрутизация по наименее используемым моделям для равномерного распределения спроса.",
+ "usageGuideHide": "Скрыть",
+ "usageGuideDontShowAgain": "Больше не показывать",
+ "usageGuideShow": "Показать руководство",
+ "quickTestTitle": "Комбо готово к проверке",
+ "quickTestDescription": "Запустите тест сейчас, чтобы подтвердить поведение резервирования и задержки.",
+ "testNow": "Проверить сейчас",
+ "pricingCoverage": "Покрытие цен",
+ "pricingCoverageHint": "Оптимизация по стоимости работает лучше всего, когда у всех моделей комбо есть цены.",
+ "pricingAvailable": "Цены доступны",
+ "pricingMissing": "Без цен",
+ "pricingAvailableShort": "есть цена",
+ "pricingMissingShort": "нет цены",
+ "warningRoundRobinSingleModel": "Round robin наиболее полезен минимум с 2 моделями.",
+ "warningCostOptimizedPartialPricing": "Только у {priced} из {total} моделей есть цены. Маршрутизация может быть лишь частично чувствительна к стоимости.",
+ "warningCostOptimizedNoPricing": "Для этого комбо не найдены данные о ценах. Оптимизация по стоимости может маршрутизировать неожиданно.",
"readinessTitle": "Готовы сохранить?",
"readinessDescription": "Прежде чем создавать или обновлять эту комбинацию, просмотрите контрольный список.",
"readinessCheckName": "Имя комбинации действительно",
@@ -936,63 +962,67 @@
"saveBlockModels": "Добавьте хотя бы одну модель.",
"saveBlockWeighted": "Установите веса на 100 % (текущее: {total}%).",
"saveBlockPricing": "Добавьте цены хотя бы на одну модель или выберите другую стратегию.",
- "recommendationsLabel": "Recommended setup",
- "applyRecommendations": "Apply recommendations",
- "recommendationsUpdated": "Recommendations updated for {strategy}.",
- "recommendationsApplied": "Recommendations applied to this combo.",
+ "recommendationsLabel": "Рекомендуемая настройка",
+ "applyRecommendations": "Применить рекомендации",
+ "recommendationsUpdated": "Рекомендации обновлены для {strategy}.",
+ "recommendationsApplied": "Рекомендации применены к этому комбо.",
"strategyRecommendations": {
"priority": {
- "title": "Fail-safe baseline",
- "description": "Use one primary model and keep fallback chain short and reliable.",
- "tip1": "Put your most reliable model first.",
- "tip2": "Keep 1-2 backup models with similar quality.",
- "tip3": "Use safe retries to absorb transient provider failures."
+ "title": "Базовая отказоустойчивая схема",
+ "description": "Используйте одну основную модель и держите цепочку резервов короткой и надёжной.",
+ "tip1": "Ставьте самую надёжную модель первой.",
+ "tip2": "Держите 1-2 резервные модели схожего качества.",
+ "tip3": "Используйте безопасные повторные попытки, чтобы сгладить временные сбои провайдера."
},
"weighted": {
- "title": "Controlled traffic split",
- "description": "Great for canary rollouts and gradual migration between models.",
- "tip1": "Start with conservative split like 90/10.",
- "tip2": "Keep the total at 100% and auto-balance after changes.",
- "tip3": "Monitor success and latency before increasing canary weight."
+ "title": "Контролируемый раздел трафика",
+ "description": "Подходит для canary-раскатки и постепенной миграции между моделями.",
+ "tip1": "Начинайте с осторожного распределения, например 90/10.",
+ "tip2": "Держите сумму на уровне 100% и включайте автобаланс после изменений.",
+ "tip3": "Отслеживайте успешность и задержку перед увеличением веса canary."
},
"round-robin": {
- "title": "Predictable load sharing",
- "description": "Best when models are equivalent and you need smooth distribution.",
- "tip1": "Use at least 2 models.",
- "tip2": "Set concurrency limits to avoid burst overload.",
- "tip3": "Use queue timeout to fail fast under saturation."
+ "title": "Предсказуемое распределение нагрузки",
+ "description": "Лучше всего, когда модели эквивалентны и нужна плавная выдача.",
+ "tip1": "Используйте минимум 2 модели.",
+ "tip2": "Задайте лимиты параллелизма, чтобы избежать всплесков нагрузки.",
+ "tip3": "Используйте тайм-аут очереди, чтобы быстро падать при насыщении."
},
"random": {
- "title": "Quick spread with low setup",
- "description": "Use when you need simple distribution without strict guarantees.",
- "tip1": "Use models with similar latency profiles.",
- "tip2": "Keep retries enabled to absorb random misses.",
- "tip3": "Prefer this for experimentation, not strict SLAs."
+ "title": "Быстрое распределение с минимальной настройкой",
+ "description": "Используйте, когда нужно простое распределение без жёстких гарантий.",
+ "tip1": "Берите модели со схожими задержками.",
+ "tip2": "Оставляйте повторные попытки включёнными, чтобы сглаживать случайные промахи.",
+ "tip3": "Подходит для экспериментов, но не для строгих SLA."
},
"least-used": {
- "title": "Adaptive balancing",
- "description": "Routes to less-used models to reduce hotspots over time.",
- "tip1": "Works better under continuous traffic.",
- "tip2": "Combine with health checks for safer balancing.",
- "tip3": "Track per-model usage to validate distribution gains."
+ "title": "Адаптивное балансирование",
+ "description": "Маршрутизирует на менее используемые модели, чтобы со временем уменьшать горячие точки.",
+ "tip1": "Лучше работает при постоянном потоке запросов.",
+ "tip2": "Комбинируйте с проверкой здоровья для более безопасного балансирования.",
+ "tip3": "Отслеживайте использование по моделям, чтобы подтвердить выигрыш в распределении."
},
"cost-optimized": {
- "title": "Budget-first routing",
- "description": "Routes to lower-cost models when pricing metadata is available.",
- "tip1": "Ensure pricing coverage for all selected models.",
- "tip2": "Keep a quality fallback for hard prompts.",
- "tip3": "Use for batch/background jobs where cost is the main KPI."
+ "title": "Маршрутизация с приоритетом бюджета",
+ "description": "Маршрутизирует на более дешёвые модели, когда доступны данные о ценах.",
+ "tip1": "Убедитесь, что цены есть для всех выбранных моделей.",
+ "tip2": "Держите качественный резерв для сложных запросов.",
+ "tip3": "Подходит для пакетных и фоновых задач, где стоимость - главный KPI."
},
"strict-random": {
- "title": "Shuffle deck distribution",
- "description": "Each model is used exactly once per cycle before reshuffling.",
- "tip1": "Use at least 2 models for meaningful distribution.",
- "tip2": "Works best with equivalent-performance models.",
- "tip3": "Ideal for load balancing across multiple API accounts."
+ "title": "Распределение по перемешиванию",
+ "description": "Каждая модель используется ровно один раз за цикл перед повторным перемешиванием.",
+ "tip1": "Используйте минимум 2 модели для осмысленного распределения.",
+ "tip2": "Лучше всего работает с моделями схожей производительности.",
+ "tip3": "Идеально для балансировки нагрузки между несколькими API-аккаунтами."
}
},
- "templateFreeStack": "Free Stack ($0)",
- "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."
+ "templateFreeStack": "Бесплатный стек ($0)",
+ "templateFreeStackDesc": "Round robin по всем бесплатным провайдерам: Kiro (Claude), Qoder (5 моделей), Qwen (4 модели), Gemini CLI. Ноль стоимости, кодинг без остановки.",
+ "auto": "Авто",
+ "autoDesc": "Автоматическая стратегия - система сама выбирает подходящее поведение.",
+ "lkgp": "LKGP",
+ "lkgpDesc": "Маршрутизация по последней известной хорошей политике"
},
"costs": {
"title": "Затраты",
@@ -1036,15 +1066,15 @@
"responsesDesc": "OpenAI Responses API для Codex и продвинутых агентных рабочих процессов",
"listModelsDesc": "Список всех доступных моделей по всем подключённым провайдерам",
"settingsApiDesc": "Чтение и изменение конфигурации OmniRoute через API",
- "settingsApi": "Settings API",
+ "settingsApi": "API настроек",
"categoryCore": "Основные API",
"categoryMedia": "Медиа и мультимодальность",
- "categorySearch": "Search & Discovery",
+ "categorySearch": "Поиск и обнаружение",
"categoryUtility": "Утилиты и управление",
- "webSearch": "Web Search",
- "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching",
- "searchProvider": "Search Provider",
- "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected.",
+ "webSearch": "Веб-поиск",
+ "webSearchDesc": "Единый веб-поиск по нескольким провайдерам с автоматическим переключением и кэшированием",
+ "searchProvider": "Поставщик поиска",
+ "searchProviderDesc": "Этот поставщик используется для веб-поиска через POST /v1/search. Настройка модели не требуется — поисковые провайдеры готовы к использованию после подключения API-ключа.",
"enableCloudTitle": "Включить облачный прокси",
"whatYouGet": "Что вы получите",
"cloudBenefitAccess": "Доступ к вашему API из любой точки мира",
@@ -1078,62 +1108,62 @@
"connectionFailed": "Соединение не удалось",
"syncFailed": "Не удалось синхронизировать облачные данные.",
"cloudflaredTitle": "Cloudflare Quick Tunnel",
- "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint to make it accessible from the internet without configuring DNS.",
- "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. URLs change after restart.",
- "cloudflaredEnable": "Enable Tunnel",
- "cloudflaredInstallAndEnable": "Install & Enable",
- "cloudflaredDisable": "Stop Tunnel",
- "cloudflaredRunning": "Running",
- "cloudflaredStarting": "Starting",
- "cloudflaredStoppedState": "Stopped",
- "cloudflaredNotInstalled": "Not installed",
- "cloudflaredUnsupported": "Unsupported",
- "cloudflaredError": "Error",
- "cloudflaredStarted": "Cloudflare tunnel started",
- "cloudflaredStopped": "Cloudflare tunnel stopped",
- "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel",
- "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after restart.",
- "cloudflaredUnsupportedNote": "This platform is not supported for managed installation.",
- "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.",
- "cloudflaredLastError": "Last error: {error}",
+ "cloudflaredDescription": "Создайте временный Cloudflare Quick Tunnel для этой конечной точки, чтобы сделать её доступной из интернета без настройки DNS.",
+ "cloudflaredUrlNotice": "Создаёт временный Cloudflare Quick Tunnel. URL-адреса меняются после перезапуска.",
+ "cloudflaredEnable": "Включить туннель",
+ "cloudflaredInstallAndEnable": "Установить и включить",
+ "cloudflaredDisable": "Остановить туннель",
+ "cloudflaredRunning": "Работает",
+ "cloudflaredStarting": "Запуск",
+ "cloudflaredStoppedState": "Остановлен",
+ "cloudflaredNotInstalled": "Не установлен",
+ "cloudflaredUnsupported": "Не поддерживается",
+ "cloudflaredError": "Ошибка",
+ "cloudflaredStarted": "Cloudflare-туннель запущен",
+ "cloudflaredStopped": "Cloudflare-туннель остановлен",
+ "cloudflaredRequestFailed": "Не удалось обновить Cloudflare-туннель",
+ "cloudflaredTemporaryNote": "URL Quick Tunnel временные и изменятся после перезапуска.",
+ "cloudflaredUnsupportedNote": "Эта платформа не поддерживает управляемую установку.",
+ "cloudflaredIdleNote": "Создайте временный Cloudflare Quick Tunnel для этой конечной точки.",
+ "cloudflaredLastError": "Последняя ошибка: {error}",
"providerModelsTitle": "{provider} — Модели",
"noModelsForProvider": "Нет доступных моделей для этого поставщика.",
"chat": "Чат",
"embedding": "Встраивание",
"image": "Изображение",
- "custom": "обычай",
- "modelsCount": "{count, plural, one {# model} other {# models}}",
- "sectionTitle": "Integration Surface",
- "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints",
- "tabApis": "OpenAI-compatible APIs",
- "tabProtocols": "Protocols",
- "tabsAria": "Endpoint sections",
- "protocolsTitle": "Protocols",
- "protocolsDescription": "MCP and A2A are first-class endpoints with dedicated observability and controls.",
- "mcpCardTitle": "MCP Server",
- "mcpCardDescription": "Model Context Protocol over stdio",
- "a2aCardTitle": "A2A Server",
- "a2aCardDescription": "Agent2Agent JSON-RPC endpoint",
- "protocolToolsLabel": "Tools",
- "protocolTasksLabel": "Tasks",
- "protocolActiveStreamsLabel": "Active streams",
- "protocolLastActivity": "Last activity",
- "quickStart": "Quick Start",
- "openMcpDashboard": "Open MCP management",
- "openA2aDashboard": "Open A2A management",
- "mcpQuickStartTitle": "MCP Quick Start",
- "mcpQuickStartStep1": "Run the MCP server via `omniroute --mcp`.",
- "mcpQuickStartStep2": "Configure your MCP client to connect over stdio transport.",
- "mcpQuickStartStep3": "Invoke tools such as `omniroute_get_health` and `omniroute_list_combos`.",
- "a2aQuickStartTitle": "A2A Quick Start",
- "a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.",
- "a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.",
- "a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.",
- "completionsLegacy": "Completions (Legacy)",
- "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format"
+ "custom": "Пользовательский",
+ "modelsCount": "{count, plural, one {# модель} few {# модели} many {# моделей} other {# модели}}",
+ "sectionTitle": "Интерфейс интеграции",
+ "sectionDescription": "API, совместимые с OpenAI, и конечные точки операционных протоколов",
+ "tabApis": "OpenAI-совместимые API",
+ "tabProtocols": "Протоколы",
+ "tabsAria": "Разделы конечной точки",
+ "protocolsTitle": "Протоколы",
+ "protocolsDescription": "MCP и A2A - полноценные конечные точки с отдельной наблюдаемостью и управлением.",
+ "mcpCardTitle": "Сервер MCP",
+ "mcpCardDescription": "Model Context Protocol через stdio",
+ "a2aCardTitle": "Сервер A2A",
+ "a2aCardDescription": "JSON-RPC конечная точка Agent2Agent",
+ "protocolToolsLabel": "Инструменты",
+ "protocolTasksLabel": "Задачи",
+ "protocolActiveStreamsLabel": "Активные потоки",
+ "protocolLastActivity": "Последняя активность",
+ "quickStart": "Быстрый старт",
+ "openMcpDashboard": "Открыть управление MCP",
+ "openA2aDashboard": "Открыть управление A2A",
+ "mcpQuickStartTitle": "MCP: быстрый старт",
+ "mcpQuickStartStep1": "Запустите сервер MCP через `omniroute --mcp`.",
+ "mcpQuickStartStep2": "Настройте MCP-клиент на подключение через stdio.",
+ "mcpQuickStartStep3": "Вызывайте инструменты вроде `omniroute_get_health` и `omniroute_list_combos`.",
+ "a2aQuickStartTitle": "A2A: быстрый старт",
+ "a2aQuickStartStep1": "Откройте карточку агента по адресу `/.well-known/agent.json`.",
+ "a2aQuickStartStep2": "Отправляйте JSON-RPC-запросы на `POST /a2a` через `message/send` или `message/stream`.",
+ "a2aQuickStartStep3": "Отслеживайте и управляйте задачами через `tasks/get` и `tasks/cancel`.",
+ "completionsLegacy": "Завершения (устар.)",
+ "completionsLegacyDesc": "Устаревшие текстовые завершения OpenAI — поддерживают и строку prompt, и массив messages"
},
"endpoints": {
- "tabProxy": "Endpoint Proxy",
+ "tabProxy": "Прокси конечных точек",
"tabApiEndpoints": "API-эндпоинты",
"apiEndpointsTitle": "API-эндпоинты",
"apiEndpointsDescription": "Бэкенд API-эндпоинты, доступные для использования другими приложениями и сервисами.",
@@ -1145,126 +1175,126 @@
"featureAuth": "Управление API-ключами и OAuth-областями для каждого эндпоинта"
},
"mcpDashboard": {
- "loading": "Loading MCP dashboard...",
- "activate": "activate",
- "deactivate": "deactivate",
- "confirmSwitchCombo": "Confirm {action} combo \"{combo}\"?",
- "switchComboFailed": "Failed to switch combo state.",
- "switchComboSuccess": "Combo \"{combo}\" updated.",
- "confirmApplyProfile": "Apply resilience profile \"{profile}\"?",
- "applyProfileFailed": "Failed to apply resilience profile.",
- "applyProfileSuccess": "Profile \"{profile}\" applied.",
- "confirmResetBreakers": "Reset all circuit breakers?",
- "resetBreakersFailed": "Failed to reset circuit breakers.",
- "resetBreakersSuccess": "Circuit breakers reset.",
- "processStatus": "Process status",
- "online": "Online",
- "offline": "Offline",
+ "loading": "Загрузка панели MCP...",
+ "activate": "активировать",
+ "deactivate": "деактивировать",
+ "confirmSwitchCombo": "Подтвердить {action} комбо \"{combo}\"?",
+ "switchComboFailed": "Не удалось переключить состояние комбо.",
+ "switchComboSuccess": "Комбо \"{combo}\" обновлено.",
+ "confirmApplyProfile": "Применить профиль устойчивости \"{profile}\"?",
+ "applyProfileFailed": "Не удалось применить профиль устойчивости.",
+ "applyProfileSuccess": "Профиль \"{profile}\" применён.",
+ "confirmResetBreakers": "Сбросить все автоматические выключатели?",
+ "resetBreakersFailed": "Не удалось сбросить автоматические выключатели.",
+ "resetBreakersSuccess": "Автоматические выключатели сброшены.",
+ "processStatus": "Статус процесса",
+ "online": "В сети",
+ "offline": "Не в сети",
"pid": "PID",
- "sessionUptime": "Session uptime",
- "lastHeartbeat": "Last heartbeat",
- "activity24h": "Activity (24h)",
- "totalCalls": "Total calls",
- "successRate": "Success rate",
- "avgLatency": "Avg latency",
- "topTools": "Top tools",
- "noToolCalls24h": "No tool calls in the last 24 hours.",
- "runtimeDetails": "Runtime details",
- "transport": "Transport",
- "scopesEnforced": "Scopes enforced",
- "yes": "yes",
- "no": "no",
- "lastCall": "Last call",
- "heartbeatPath": "Heartbeat path",
- "operationalControls": "Operational controls",
- "switchCombo": "Switch combo",
- "inactive": "inactive",
- "active": "active",
- "activateCombo": "Activate combo",
- "deactivateCombo": "Deactivate combo",
- "applyResilienceProfile": "Apply resilience profile",
- "profileAggressive": "aggressive",
- "profileBalanced": "balanced",
- "profileConservative": "conservative",
- "applyProfile": "Apply profile",
- "resetCircuitBreakers": "Reset circuit breakers",
- "resetCircuitBreakersHelp": "Clears current breaker state and failure counters for providers.",
- "resetAllBreakers": "Reset all breakers",
- "toolsAndScopes": "Tools and scopes",
- "tableTool": "Tool",
- "tableScopes": "Scopes",
- "tablePhase": "Phase",
- "tableAudit": "Audit",
- "auditLog": "Audit log",
- "auditSummary": "Calls: {total} | page {page} of {totalPages}",
- "allTools": "All tools",
- "allResults": "All results",
- "success": "Success",
- "failure": "Failure",
+ "sessionUptime": "Время работы сеанса",
+ "lastHeartbeat": "Последний heartbeat",
+ "activity24h": "Активность (24ч)",
+ "totalCalls": "Всего вызовов",
+ "successRate": "Успешность",
+ "avgLatency": "Средняя задержка",
+ "topTools": "Топ инструментов",
+ "noToolCalls24h": "За последние 24 часа вызовов инструментов не было.",
+ "runtimeDetails": "Детали среды выполнения",
+ "transport": "Транспорт",
+ "scopesEnforced": "Скоупы применяются",
+ "yes": "да",
+ "no": "нет",
+ "lastCall": "Последний вызов",
+ "heartbeatPath": "Путь heartbeat",
+ "operationalControls": "Операционные элементы управления",
+ "switchCombo": "Переключить комбо",
+ "inactive": "неактивно",
+ "active": "активно",
+ "activateCombo": "Активировать комбо",
+ "deactivateCombo": "Деактивировать комбо",
+ "applyResilienceProfile": "Применить профиль устойчивости",
+ "profileAggressive": "агрессивный",
+ "profileBalanced": "сбалансированный",
+ "profileConservative": "консервативный",
+ "applyProfile": "Применить профиль",
+ "resetCircuitBreakers": "Сбросить автоматические выключатели",
+ "resetCircuitBreakersHelp": "Очищает текущее состояние выключателей и счётчики сбоев для провайдеров.",
+ "resetAllBreakers": "Сбросить все выключатели",
+ "toolsAndScopes": "Инструменты и скоупы",
+ "tableTool": "Инструмент",
+ "tableScopes": "Скоупы",
+ "tablePhase": "Фаза",
+ "tableAudit": "Аудит",
+ "auditLog": "Журнал аудита",
+ "auditSummary": "Вызовов: {total} | страница {page} из {totalPages}",
+ "allTools": "Все инструменты",
+ "allResults": "Все результаты",
+ "success": "Успех",
+ "failure": "Сбой",
"apiKeyIdPlaceholder": "apiKeyId",
- "loadingAuditEntries": "Loading audit entries...",
- "noAuditEntriesForFilters": "No audit entries found for current filters.",
- "tableTimestamp": "Timestamp",
- "tableDuration": "Duration",
- "tableResult": "Result",
- "tableApiKey": "API key",
- "failed": "failed",
- "previous": "Previous",
- "next": "Next"
+ "loadingAuditEntries": "Загрузка записей аудита...",
+ "noAuditEntriesForFilters": "Записи аудита по текущим фильтрам не найдены.",
+ "tableTimestamp": "Время",
+ "tableDuration": "Длительность",
+ "tableResult": "Результат",
+ "tableApiKey": "API-ключ",
+ "failed": "сбой",
+ "previous": "Предыдущая",
+ "next": "Следующая"
},
"a2aDashboard": {
- "loading": "Loading A2A dashboard...",
- "confirmCancelTask": "Cancel task {taskId}?",
- "cancelTaskFailed": "Failed to cancel task.",
- "cancelTaskSuccess": "Task {taskId} cancelled.",
- "smokeSendFailed": "message/send smoke test failed.",
- "smokeSendSuccessWithTask": "message/send ok (task {taskId}).",
- "smokeSendSuccess": "message/send ok.",
- "smokeStreamFailed": "message/stream smoke test failed.",
- "smokeStreamSuccessWithTask": "message/stream ok (task {taskId}{stateSuffix}).",
- "smokeStreamNoTaskId": "message/stream finished without task id.",
- "health": "Health",
- "ok": "ok",
- "totalTasks": "Total tasks",
- "activeStreams": "Active streams",
- "lastTask": "Last task",
- "taskStateOverview": "Task state overview",
+ "loading": "Загрузка панели A2A...",
+ "confirmCancelTask": "Отменить задачу {taskId}?",
+ "cancelTaskFailed": "Не удалось отменить задачу.",
+ "cancelTaskSuccess": "Задача {taskId} отменена.",
+ "smokeSendFailed": "smoke-тест message/send не пройден.",
+ "smokeSendSuccessWithTask": "message/send успешно (задача {taskId}).",
+ "smokeSendSuccess": "message/send успешно.",
+ "smokeStreamFailed": "smoke-тест message/stream не пройден.",
+ "smokeStreamSuccessWithTask": "message/stream успешно (задача {taskId}{stateSuffix}).",
+ "smokeStreamNoTaskId": "message/stream завершился без идентификатора задачи.",
+ "health": "Состояние",
+ "ok": "ок",
+ "totalTasks": "Всего задач",
+ "activeStreams": "Активные потоки",
+ "lastTask": "Последняя задача",
+ "taskStateOverview": "Обзор состояний задач",
"state": {
- "submitted": "submitted",
- "working": "working",
- "completed": "completed",
- "failed": "failed",
- "cancelled": "cancelled"
+ "submitted": "отправлена",
+ "working": "в работе",
+ "completed": "завершена",
+ "failed": "сбой",
+ "cancelled": "отменена"
},
- "agentCard": "Agent card",
- "version": "Version",
+ "agentCard": "Карточка агента",
+ "version": "Версия",
"url": "URL",
- "capabilities": "Capabilities",
- "agentCardNotAvailable": "Agent card not available.",
- "quickValidation": "Quick validation",
- "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.",
- "runMessageSend": "Run message/send",
- "runMessageStream": "Run message/stream",
- "taskManagement": "Task management",
- "taskSummary": "{total} tasks | page {page} of {totalPages}",
- "allStates": "all",
- "allSkills": "all skills",
- "loadingTasks": "Loading tasks...",
- "noTasksForFilters": "No tasks found for current filters.",
- "tableTask": "Task",
- "tableSkill": "Skill",
- "tableState": "State",
- "tableUpdated": "Updated",
- "tableActions": "Actions",
- "view": "View",
- "cancel": "Cancel",
- "previous": "Previous",
- "next": "Next",
- "taskDetail": "Task detail",
- "close": "Close",
- "metadata": "Metadata",
- "events": "Events",
- "artifacts": "Artifacts"
+ "capabilities": "Возможности",
+ "agentCardNotAvailable": "Карточка агента недоступна.",
+ "quickValidation": "Быстрая проверка",
+ "quickValidationDescription": "Выполняет smoke-вызовы через живую конечную точку `/a2a`.",
+ "runMessageSend": "Запустить message/send",
+ "runMessageStream": "Запустить message/stream",
+ "taskManagement": "Управление задачами",
+ "taskSummary": "{total} задач | страница {page} из {totalPages}",
+ "allStates": "все",
+ "allSkills": "все навыки",
+ "loadingTasks": "Загрузка задач...",
+ "noTasksForFilters": "Задачи по текущим фильтрам не найдены.",
+ "tableTask": "Задача",
+ "tableSkill": "Навык",
+ "tableState": "Состояние",
+ "tableUpdated": "Обновлено",
+ "tableActions": "Действия",
+ "view": "Просмотр",
+ "cancel": "Отменить",
+ "previous": "Предыдущая",
+ "next": "Следующая",
+ "taskDetail": "Детали задачи",
+ "close": "Закрыть",
+ "metadata": "Метаданные",
+ "events": "События",
+ "artifacts": "Артефакты"
},
"health": {
"title": "Здоровье системы",
@@ -1299,7 +1329,7 @@
"notAvailable": "—",
"totalRequests": "Всего запросов",
"noDataYet": "Данных пока нет",
- "promptCache": "Подскажите кэш",
+ "promptCache": "Кэш промптов",
"entries": "Записи",
"hitRate": "Скорость попадания",
"hitsMisses": "Попадания/промахи",
@@ -1316,9 +1346,9 @@
"providers": "Провайдеры",
"configuredProvidersLabel": "Настраивается в приборной панели",
"configuredProvidersHint": "Поставщики, учетные данные которых сохранены в /dashboard/providers, независимо от состояния времени выполнения.",
- "activeProviders": "{count} active",
+ "activeProviders": "{count} активных",
"activeProvidersHint": "Настроенные поставщики в настоящее время включены для маршрутизации запросов.",
- "monitoredProviders": "{count} monitored",
+ "monitoredProviders": "{count} под наблюдением",
"monitoredProvidersHint": "Поставщики услуг в настоящее время отслеживаются с помощью мониторов состояния автоматических выключателей.",
"healthyCount": "{count} здоров",
"nodeVersion": "Узел {version}",
@@ -1490,7 +1520,7 @@
"failedCreate": "Не удалось создать поставщика",
"errorOccurred": "Произошла ошибка. Пожалуйста, попробуйте еще раз.",
"modelStatus": "Статус модели",
- "showConfiguredOnly": "Configured only",
+ "showConfiguredOnly": "Только настроенные",
"allModelsOperational": "Все модели в рабочем состоянии",
"modelsWithIssues": "{count} модели с проблемами",
"allModelsNormal": "Все модели реагируют нормально.",
@@ -1501,7 +1531,7 @@
"clearing": "Очистка...",
"until": "До {time}",
"providerTestFailed": "Тест провайдера не пройден",
- "providerTestTimeout": "Provider test timed out — too many connections to test at once",
+ "providerTestTimeout": "Время теста провайдера истекло — слишком много соединений для одновременной проверки.",
"modeTest": "{mode} Тест",
"passedCount": "{count} пройден",
"failedCount": "{count} не удалось",
@@ -1584,14 +1614,16 @@
"importSuccessCount": "{count, plural, one {# model} other {# models}} успешно импортирован!",
"noNewModelsAddedExisting": "Новых моделей не добавлялось (все уже есть).",
"importDoneCount": "✓ Готово! {count, plural, one {# model imported.} other {# models imported.}}",
+ "modelsImported": "{count} моделей импортировано",
"unexpectedErrorOccurred": "Произошла непредвиденная ошибка",
- "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}",
+ "connectionCountLabel": "{count, plural, one {# соединение} few {# соединения} many {# соединений} other {# соединения}}",
"messagesPath": "сообщения",
"responsesPath": "ответы",
"chatCompletionsPath": "чат/дополнения",
"add": "Добавить",
"edit": "Редактировать",
"delete": "Удалить",
+ "close": "Закрыть",
"anthropic": "антропный",
"openai": "ОпенАИ",
"singleConnectionPerCompatible": "Для каждого совместимого узла разрешено только одно соединение. Добавьте еще один узел, если вам нужно больше соединений.",
@@ -1604,8 +1636,8 @@
"addFirstConnectionHint": "Добавьте первое соединение, чтобы начать",
"addConnection": "Добавить соединение",
"availableModels": "Доступные модели",
- "builtInModels": "Built-in models",
- "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
+ "builtInModels": "Встроенные модели",
+ "builtInModelsHint": "Модели реестра для этого провайдера. Используйте карандаш, чтобы задать параметры совместимости.",
"pageAutoRefresh": "Страница обновится автоматически...",
"statusDisabled": "отключен",
"statusConnected": "подключен",
@@ -1617,6 +1649,9 @@
"statusUnavailable": "недоступен",
"statusFailed": "не удалось",
"statusError": "ошибка",
+ "statusDeactivated": "Отключено (вручную)",
+ "statusBanned": "Заблокировано / нарушение песочницы",
+ "statusCreditsExhausted": "Недостаточно баланса / квота исчерпана",
"oauthAccount": "Учетная запись OAuth",
"errorTypeRuntime": "Локальная среда выполнения",
"errorTypeUpstreamAuth": "Авторизация восходящего потока",
@@ -1646,26 +1681,26 @@
"openRouterModelPlaceholder": "антропный/Клод-3-опус",
"customModels": "Пользовательские модели",
"customModelsHint": "Добавьте идентификаторы моделей, которых нет в списке по умолчанию. Они будут доступны для маршрутизации.",
- "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)",
- "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)",
- "compatAdjustmentsTitle": "Compatibility",
- "compatButtonLabel": "Compatibility",
- "compatToolIdShort": "Tool ID 9",
- "compatDeveloperShort": "Developer role",
- "compatDoNotPreserveDeveloper": "Do not preserve developer role",
- "compatBadgeNoPreserve": "No preserve",
- "compatProtocolLabel": "Client request protocol",
- "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).",
+ "normalizeToolCallIdLabel": "Нормализовать идентификаторы вызовов инструментов до 9 символов (например, Mistral)",
+ "preserveDeveloperRoleLabel": "Сохранять developer role OpenAI Responses (не сопоставлять с system)",
+ "compatAdjustmentsTitle": "Совместимость",
+ "compatButtonLabel": "Совместимость",
+ "compatToolIdShort": "ID инструмента 9",
+ "compatDeveloperShort": "Роль разработчика",
+ "compatDoNotPreserveDeveloper": "Не сохранять developer role",
+ "compatBadgeNoPreserve": "Без сохранения",
+ "compatProtocolLabel": "Протокол запроса клиента",
+ "compatProtocolHint": "Эти параметры применяются, когда OmniRoute обнаруживает такую форму запроса (OpenAI Chat, Responses API или Anthropic Messages).",
"compatProtocolOpenAI": "OpenAI Chat Completions",
"compatProtocolOpenAIResponses": "OpenAI Responses API",
"compatProtocolClaude": "Anthropic Messages",
- "compatUpstreamHeadersLabel": "Extra upstream headers",
- "compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.",
- "compatUpstreamHeaderName": "Header name",
- "compatUpstreamHeaderValue": "Value",
- "compatUpstreamAddRow": "Add header",
- "compatUpstreamRemoveRow": "Remove row",
- "compatBadgeUpstreamHeaders": "Headers",
+ "compatUpstreamHeadersLabel": "Дополнительные заголовки upstream",
+ "compatUpstreamHeadersHint": "Настройка с высоким уровнем доверия - тот же уровень, что и редактирование API-учётных данных провайдера; использовать только доверенным администраторам. Применяется после того, как OmniRoute добавит авторизацию из API-ключа провайдера. Если пользовательский заголовок совпадает по имени с уже существующим (например, Authorization), ваше значение полностью заменяет автоматически созданный заголовок (включая Bearer token) - upstream увидит только введённое вами значение, а не ключ из настроек. Ошибка настройки может привести к 401 или поломке upstream-аутентификации. По одной строке на заголовок (например, дополнительный Authentication для некоторых шлюзов). Наведите курсор или сфокусируйте поле, чтобы увидеть предпросмотр. Сохраняется при потере фокуса, клике вне поля или закрытии панели.",
+ "compatUpstreamHeaderName": "Имя заголовка",
+ "compatUpstreamHeaderValue": "Значение",
+ "compatUpstreamAddRow": "Добавить заголовок",
+ "compatUpstreamRemoveRow": "Удалить строку",
+ "compatBadgeUpstreamHeaders": "Заголовки",
"modelId": "Идентификатор модели",
"customModelPlaceholder": "например gpt-4.5-турбо",
"loading": "Загрузка...",
@@ -1700,30 +1735,30 @@
"email": "электронная почта",
"healthCheckMinutes": "Проверка здоровья (мин)",
"healthCheckHint": "Интервал обновления упреждающего токена. 0 = отключено.",
- "groupLabel": "Environment",
- "groupPlaceholder": "e.g. eKaizen, Personal",
+ "groupLabel": "Среда",
+ "groupPlaceholder": "например eKaizen, Personal",
"failedTestConnection": "Не удалось проверить соединение",
"failed": "Не удалось",
"leaveBlankKeepCurrentApiKey": "Оставьте пустым, чтобы сохранить текущий ключ API.",
"editCompatibleTitle": "Изменить совместимость {type}",
- "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.",
+ "compatibleBaseUrlHint": "Базовый URL вашего API, совместимого с {type}. Используйте расширенные настройки для собственных путей конечных точек.",
"apiKeyForCheck": "API-ключ (для проверки)",
"compatibleProdPlaceholder": "{type} Совместимость (Прод.)",
- "tokenRefreshed": "Token refreshed successfully",
- "tokenRefreshFailed": "Token refresh failed",
- "applyCodexAuthLocal": "Apply auth",
- "exportCodexAuthFile": "Export auth",
- "codexAuthAppliedLocal": "Codex auth.json applied locally",
- "codexAuthApplyFailed": "Failed to apply Codex auth.json locally",
- "codexAuthExported": "Codex auth.json exported",
- "codexAuthExportFailed": "Failed to export Codex auth.json",
- "advancedSettings": "Advanced Settings",
- "chatPathLabel": "Chat Endpoint Path",
+ "tokenRefreshed": "Токен успешно обновлён",
+ "tokenRefreshFailed": "Не удалось обновить токен",
+ "applyCodexAuthLocal": "Применить авторизацию",
+ "exportCodexAuthFile": "Экспортировать авторизацию",
+ "codexAuthAppliedLocal": "Codex auth.json применён локально",
+ "codexAuthApplyFailed": "Не удалось применить Codex auth.json локально",
+ "codexAuthExported": "Codex auth.json экспортирован",
+ "codexAuthExportFailed": "Не удалось экспортировать Codex auth.json",
+ "advancedSettings": "Расширенные настройки",
+ "chatPathLabel": "Путь чат-эндпоинта",
"chatPathPlaceholder": "/chat/completions",
- "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)",
- "modelsPathLabel": "Models Endpoint Path",
+ "chatPathHint": "Пользовательский путь чата для провайдеров с нестандартными API (например, /v4/chat/completions)",
+ "modelsPathLabel": "Путь эндпоинта моделей",
"modelsPathPlaceholder": "/models",
- "modelsPathHint": "Custom models path for validation (e.g. /v4/models)"
+ "modelsPathHint": "Пользовательский путь моделей для проверки (например, /v4/models)"
},
"settings": {
"title": "Настройки",
@@ -1747,8 +1782,8 @@
"darkMode": "Темный режим",
"lightMode": "Светлый режим",
"systemTheme": "Системная тема",
- "debugToggle": "Enable Debug Mode",
- "sidebarVisibilityToggle": "Show Sidebar Items",
+ "debugToggle": "Включить режим отладки",
+ "sidebarVisibilityToggle": "Показывать элементы боковой панели",
"enableCache": "Включить кеш",
"cacheTTL": "Срок жизни кэша",
"maxCacheSize": "Максимальный размер кэша",
@@ -1757,17 +1792,31 @@
"cacheMisses": "Промахи в кэше",
"hitRate": "Скорость попадания",
"cacheEntries": "Записи кэша",
- "cacheSettings": "Cache Settings",
- "semanticCache": "Semantic Cache",
- "maxEntries": "Max Entries",
- "ttlMinutes": "TTL (minutes)",
- "promptCache": "Подскажите кэш",
- "strategy": "Strategy",
- "preserveClientCache": "Preserve Client Cache",
- "enabled": "Enabled",
- "loading": "Loading...",
+ "adaptiveVolumeRouting": "Адаптивная маршрутизация по объёму",
+ "adaptiveVolumeRoutingDesc": "Динамически масштабируйте соединения на основе объёма нагрузки и давления пропускной способности.",
+ "cacheCleared": "Кэш успешно очищен",
+ "clearCacheFailed": "Не удалось очистить кэш",
+ "clearLkgpCache": "Очистить кэш LKGP",
+ "lkgpToggleTitle": "Последний известный хороший провайдер (LKGP)",
+ "lkgpToggleDesc": "Когда включено, маршрутизатор запоминает, какой провайдер последним отдал успешный ответ, и сначала пытается использовать его в следующих запросах.",
+ "lkgp": "Режим LKGP",
+ "lkgpDesc": "Последний известный хороший провайдер (предсказуемая устойчивость)",
+ "lkgpCacheCleared": "Кэш LKGP успешно очищен",
+ "lkgpCacheClearFailed": "Не удалось очистить кэш LKGP",
+ "maintenance": "Обслуживание",
+ "purgeExpiredLogs": "Удалить просроченные журналы",
+ "purgeLogsFailed": "Не удалось удалить журналы",
+ "cacheSettings": "Настройки кэша",
+ "semanticCache": "Семантический кэш",
+ "maxEntries": "Макс. записей",
+ "ttlMinutes": "TTL (минуты)",
+ "promptCache": "Кэш промптов",
+ "strategy": "Стратегия",
+ "preserveClientCache": "Сохранять клиентский кэш",
+ "enabled": "Включено",
+ "loading": "Загрузка...",
"saving": "Сохранение...",
- "save": "Save",
+ "save": "Сохранить",
"circuitBreaker": "Автоматический выключатель",
"retryPolicy": "Политика повтора",
"maxRetries": "Макс. повторов",
@@ -1775,10 +1824,10 @@
"timeoutMs": "Тайм-аут (мс)",
"enableSystemPrompt": "Включить системную подсказку",
"systemPromptText": "Текст системной подсказки",
- "autoDisableBannedAccounts": "Auto-Disable Banned Accounts",
- "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.",
- "autoDisableThreshold": "Ban Threshold",
- "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.",
+ "autoDisableBannedAccounts": "Автоматически отключать заблокированные аккаунты",
+ "autoDisableDescription": "Навсегда помечать соединения провайдера как отключённые, если они возвращают сигнал окончательной блокировки (например, HTTP 403 'verify your account'). Это убирает их из ротации комбо.",
+ "autoDisableThreshold": "Порог блокировки",
+ "autoDisableThresholdDesc": "Количество подряд идущих сигналов блокировки, необходимых перед постоянным отключением.",
"enableThinking": "Включить мышление",
"maxThinkingTokens": "Максимальное количество жетонов мышления",
"enableProxy": "Включить прокси",
@@ -1815,9 +1864,9 @@
"themeLight": "Свет",
"themeDark": "Темный",
"themeSystem": "Система",
- "sidebarVisibility": "Hide sidebar items",
- "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter.",
- "sidebarVisibilityHint": "Any sidebar section is hidden automatically when a...",
+ "sidebarVisibility": "Скрывать элементы боковой панели",
+ "sidebarVisibilityDesc": "Скрывайте любые элементы навигации боковой панели, чтобы уменьшить визуальный шум.",
+ "sidebarVisibilityHint": "Любой раздел боковой панели скрывается автоматически, когда...",
"hideHealthLogs": "Скрыть журналы проверки работоспособности",
"hideHealthLogsDesc": "Если включено, подавлять сообщения [HealthCheck] в консоли сервера.",
"themeAccent": "Цвет темы",
@@ -1830,22 +1879,22 @@
"themeViolet": "Фиолетовый",
"themeOrange": "Оранжевый",
"themeCyan": "Голубой",
- "whitelabeling": "Branding",
- "whitelabelingDesc": "Customize the application name and logo",
- "appName": "Application Name",
- "appNameDesc": "Display name shown in sidebar and browser tab",
- "customLogo": "Custom Logo URL",
- "customLogoDesc": "URL to your custom logo image",
- "uploadLogo": "Upload Logo",
- "resetLogo": "Reset to Default",
- "logoPreview": "Preview",
- "customFavicon": "Browser Favicon",
- "customFaviconDesc": "URL to your custom favicon (shown in browser tab)",
- "uploadFavicon": "Upload Favicon",
- "resetFavicon": "Reset Favicon",
- "faviconPreview": "Favicon Preview",
+ "whitelabeling": "Брендинг",
+ "whitelabelingDesc": "Настройте название приложения и логотип",
+ "appName": "Название приложения",
+ "appNameDesc": "Отображаемое имя в боковой панели и вкладке браузера",
+ "customLogo": "URL пользовательского логотипа",
+ "customLogoDesc": "Ссылка на ваше изображение логотипа",
+ "uploadLogo": "Загрузить логотип",
+ "resetLogo": "Сбросить по умолчанию",
+ "logoPreview": "Предпросмотр",
+ "customFavicon": "Favicon браузера",
+ "customFaviconDesc": "URL вашего favicon (показывается во вкладке браузера)",
+ "uploadFavicon": "Загрузить favicon",
+ "resetFavicon": "Сбросить favicon",
+ "faviconPreview": "Предпросмотр favicon",
"flushCache": "Очистить кэш",
- "flushing": "Промывка…",
+ "flushing": "Очистка…",
"size": "Размер",
"hits": "Хиты",
"evictions": "Выселения",
@@ -1901,11 +1950,11 @@
"providersBlocked": "Поставщик(и) {count} заблокирован в /models",
"blockProviderTitle": "Блок {provider}",
"unblockProviderTitle": "Разблокировать {provider}",
- "cliFingerprint": "CLI Fingerprint Matching",
- "cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.",
- "cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active",
- "enableFingerprintTitle": "Enable fingerprint for {provider}",
- "disableFingerprintTitle": "Disable fingerprint for {provider}",
+ "cliFingerprint": "Сопоставление отпечатка CLI",
+ "cliFingerprintDesc": "Сопоставляйте нативные сигнатуры бинарников CLI при проксировании запросов. Переупорядочивает заголовки и поля тела так, чтобы они выглядели идентично официальным CLI-инструментам. IP вашего прокси сохраняется.",
+ "cliFingerprintEnabled": "{count} провайдер(ов) с активным CLI-отпечатком",
+ "enableFingerprintTitle": "Включить отпечаток для {provider}",
+ "disableFingerprintTitle": "Отключить отпечаток для {provider}",
"routingStrategy": "Стратегия маршрутизации",
"routingAdvancedGuideTitle": "Расширенное руководство по маршрутизации",
"routingAdvancedGuideHint1": "Используйте «Fill First» для предсказуемого приоритета, Round Robin для обеспечения справедливости и P2C для устойчивости к задержкам.",
@@ -1922,8 +1971,8 @@
"leastUsedDesc": "Выберите наименее использованную учетную запись",
"costOpt": "Опция стоимости",
"costOptDesc": "Предпочитаю самый дешевый доступный аккаунт",
- "strictRandom": "Strict Random",
- "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling",
+ "strictRandom": "Строгий случайный",
+ "strictRandomDesc": "Перемешивание колоды — каждый аккаунт используется один раз перед повторным перемешиванием",
"stickyLimit": "Липкий лимит",
"stickyLimitDesc": "Звонки на аккаунт до переключения",
"modelAliases": "Псевдонимы моделей",
@@ -2114,7 +2163,7 @@
"daysAgo": "{count}дн назад",
"backupReasonManual": "руководство",
"backupReasonPreRestore": "предварительное восстановление",
- "connectionsCount": "{count, plural, one {# connection} other {# connections}}",
+ "connectionsCount": "{count, plural, one {# соединение} few {# соединения} many {# соединений} other {# соединения}}",
"noChangesSinceBackup": "Никаких изменений с момента последнего резервного копирования",
"backupFailed": "Резервное копирование не выполнено",
"restoreFailed": "Восстановление не удалось",
@@ -2165,45 +2214,45 @@
"editPricing": "Изменить цену",
"viewFullDetails": "Посмотреть полную информацию",
"themeCoral": "Коралл",
- "modelsDevTitle": "Model Database",
- "modelsDevDesc": "Auto-sync pricing, capabilities & specs from models.dev",
- "modelsDevEnabled": "Enable models.dev Sync",
- "modelsDevEnabledDesc": "Fetch model pricing, capabilities, and specs from the open-source models.dev database",
- "modelsDevInterval": "Sync Interval",
- "syncNow": "Sync Now",
- "syncing": "Syncing...",
- "lastSync": "Last sync",
- "never": "Never",
- "modelsDevStats": "Sync Statistics",
- "modelsDevStatsDesc": "Current models.dev data coverage",
- "modelsWithPricing": "Models with Pricing",
- "capabilities": "Capabilities",
- "lastSyncCount": "Last Sync Count",
- "lastSyncFull": "Last full sync",
- "modelsDevInfo": "How It Works",
- "modelsDevInfoDesc": "models.dev is an open-source database of AI model specifications maintained by the SST/OpenCode team. It provides pricing, capabilities, context limits, and modalities for 4,000+ models across 100+ providers.",
- "modelsDevInfoResolution": "Pricing resolution order (highest priority first):",
- "modelsDevInfoOrder": "User Override → models.dev → LiteLLM → Hardcoded Default",
- "memoryTitle": "Memory",
- "memoryDesc": "Persistent cross-session conversational memory",
- "memoryEnabled": "Enable Memory",
- "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.",
- "maxTokens": "Max Tokens",
- "retentionDays": "Retention",
- "recent": "Recent",
- "recentDesc": "Chronological window",
- "semantic": "Semantic",
- "semanticDesc": "Vector search",
- "hybrid": "Hybrid",
- "hybridDesc": "Recent + Semantic",
- "skillsTitle": "Skills",
- "skillsDesc": "Tools for models",
- "skillsEnabled": "Enable Skills",
- "skillsEnabledDesc": "Allows agents to trigger functions.",
- "skillsComingSoon": "Skills marketplace coming soon.",
- "memorySkillsTitle": "Memory & Skills",
- "memorySkillsDesc": "Persistent context & capabilities",
- "days": "Days"
+ "modelsDevTitle": "База моделей",
+ "modelsDevDesc": "Автосинхронизация цен, возможностей и спецификаций из models.dev",
+ "modelsDevEnabled": "Включить синхронизацию models.dev",
+ "modelsDevEnabledDesc": "Получать цены, возможности и спецификации моделей из открытой базы models.dev",
+ "modelsDevInterval": "Интервал синхронизации",
+ "syncNow": "Синхронизировать сейчас",
+ "syncing": "Синхронизация...",
+ "lastSync": "Последняя синхронизация",
+ "never": "Никогда",
+ "modelsDevStats": "Статистика синхронизации",
+ "modelsDevStatsDesc": "Текущее покрытие данных models.dev",
+ "modelsWithPricing": "Модели с ценами",
+ "capabilities": "Возможности",
+ "lastSyncCount": "Количество при последней синхронизации",
+ "lastSyncFull": "Последняя полная синхронизация",
+ "modelsDevInfo": "Как это работает",
+ "modelsDevInfoDesc": "models.dev - это открытая база спецификаций AI-моделей, поддерживаемая командой SST/OpenCode. Она предоставляет цены, возможности, ограничения контекста и модальности для более чем 4 000 моделей от более чем 100 провайдеров.",
+ "modelsDevInfoResolution": "Порядок выбора цены (сначала самый приоритетный):",
+ "modelsDevInfoOrder": "Переопределение пользователя → models.dev → LiteLLM → Жёстко заданное значение по умолчанию",
+ "memoryTitle": "Память",
+ "memoryDesc": "Постоянная кросс-сессионная память для диалогов",
+ "memoryEnabled": "Включить память",
+ "memoryEnabledDesc": "Когда включено, OmniRoute будет внедрять релевантный прошлый контекст.",
+ "maxTokens": "Макс. токенов",
+ "retentionDays": "Срок хранения",
+ "recent": "Недавнее",
+ "recentDesc": "Хронологическое окно",
+ "semantic": "Семантическое",
+ "semanticDesc": "Векторный поиск",
+ "hybrid": "Гибридное",
+ "hybridDesc": "Недавнее + семантическое",
+ "skillsTitle": "Навыки",
+ "skillsDesc": "Инструменты для моделей",
+ "skillsEnabled": "Включить навыки",
+ "skillsEnabledDesc": "Позволяет агентам вызывать функции.",
+ "skillsComingSoon": "Маркетплейс навыков скоро появится.",
+ "memorySkillsTitle": "Память и навыки",
+ "memorySkillsDesc": "Постоянный контекст и возможности",
+ "days": "Дни"
},
"translator": {
"title": "Переводчик",
@@ -2342,7 +2391,7 @@
"clientRequestDescription": "Тело запроса в том виде, в каком его отправил бы ваш клиент.",
"formatDetected": "Обнаружен формат",
"formatDetectedDescription": "OmniRoute автоматически определяет формат API по структуре запроса.",
- "openaiIntermediate": "OpenAI Средний уровень",
+ "openaiIntermediate": "Промежуточный формат OpenAI",
"openaiIntermediateDescription": "Все форматы сначала нормализуются до формата OpenAI (универсальный мост).",
"providerFormat": "Формат поставщика",
"providerFormatDescription": "Формат OpenAI транслируется в собственный формат провайдера.",
@@ -2386,7 +2435,7 @@
"latencyP50": "стр50",
"latencyP95": "стр.95",
"latencyP99": "стр.99",
- "promptCache": "Подскажите кэш",
+ "promptCache": "Кэш промптов",
"systemHealth": "Здоровье системы",
"entries": "Записи",
"activeCount": "{count} активен",
@@ -2396,38 +2445,38 @@
"circuitBreakers": "Автоматические выключатели",
"lockedIPs": "Заблокированные IP-адреса",
"lockoutsAutoRefreshHint": "Блокировка ограничения скорости для каждой модели • Автоматическое обновление 10 с.",
- "lockedCount": "{count, plural, one {# locked} other {# locked}}",
+ "lockedCount": "{count, plural, one {# заблокирован} few {# заблокировано} many {# заблокировано} other {# заблокировано}}",
"timeLeft": "{time} осталось",
"howItWorks": "Как это работает",
"howItWorksSubtitle": "Узнайте, как оценки подтверждают ваши ответы LLM",
"define": "Определить",
"defineStepDescription": "Создавайте тестовые примеры с подсказками для ввода и ожидаемыми критериями вывода, используя такие стратегии, как «содержит», регулярное выражение или точное соответствие.",
- "run": "Беги",
+ "run": "Запустить",
"runStepDescription": "Выполняйте тестовые сценарии для конечных точек LLM через OmniRoute. Каждый случай отправляется как реальный запрос API.",
"evaluate": "Оценить",
"evaluateStepDescription": "Ответы сравниваются с ожидаемыми критериями. См. «Годен/не годен» для каждого случая с показателями задержки и подробной обратной связью.",
"evalSuites": "Оценочные пакеты",
"evalSuitesHint": "Щелкните пакет, чтобы просмотреть тестовые примеры, а затем запустите его для оценки конечных точек LLM.",
"evalsLoading": "Загрузка тестовых пакетов...",
- "noEvalSuitesFound": "Eval Suites не найдено",
- "noEvalSuitesDescription": "Пакеты Eval можно определить через API или в коде. Они проверяют результаты модели на соответствие ожидаемым результатам, используя такие стратегии, как содержание, регулярное выражение, точное соответствие и пользовательские функции.",
- "columnCase": "Дело",
+ "noEvalSuitesFound": "Наборы оценок не найдены",
+ "noEvalSuitesDescription": "Наборы оценок можно определить через API или в коде. Они проверяют результаты модели на соответствие ожидаемым результатам, используя такие стратегии, как содержание, регулярное выражение, точное соответствие и пользовательские функции.",
+ "columnCase": "Случай",
"columnStatus": "Статус",
"columnLatency": "Задержка",
"columnDetails": "Подробности",
"columnModel": "Модель",
"columnStrategy": "Стратегия",
"columnExpected": "Ожидается",
- "statsSuites": "Люксы",
+ "statsSuites": "Наборы",
"statsTestCases": "Тестовые случаи",
"statsModels": "Модели",
"statsCoverage": "Покрытие",
"statsStrategiesCount": "{count} стратегии",
"evaluationStrategies": "Стратегии оценки",
"modelsUnderTest": "Тестируемые модели",
- "searchSuitesPlaceholder": "Искать апартаменты...",
- "passSuffix": "пройти",
- "casesCount": "{count, plural, one {# case} other {# cases}}",
+ "searchSuitesPlaceholder": "Поиск наборов...",
+ "passSuffix": "успеха",
+ "casesCount": "{count, plural, one {# случай} few {# случая} many {# случаев} other {# случая}}",
"runEval": "Запустить оценку",
"runningProgress": "Запуск {current}/{total}...",
"passRate": "проходной балл",
@@ -2442,7 +2491,7 @@
"noTestCasesDefined": "Тестовые примеры не определены",
"runEvalHint": "Нажмите «Запустить оценку», чтобы выполнить все случаи для вашей конечной точки LLM. Каждый тест отправляет реальный запрос через OmniRoute.",
"notifyNoTestCases": "Для этого набора тестовых примеров не определено.",
- "notifyAllCasesPassed": "Все дела {total} пройдены ✅",
+ "notifyAllCasesPassed": "Все случаи {total} пройдены ✅",
"notifySomeCasesFailed": "{passed}/{total} пройден, {failed} не выполнен",
"notifyEvalRunFailed": "Оценочный запуск не удался",
"notifyEvalTitle": "Оценка: {name}",
@@ -2465,33 +2514,33 @@
"durationMillisecondsShort": "{value}мс",
"durationSecondsShort": "{value}с",
"durationMinutesShort": "{value}м",
- "durationHoursShort": "{value}h",
+ "durationHoursShort": "{value}ч",
"reasonSeparator": " - ",
"notAvailableSymbol": "-",
"providerLimits": "Ограничения поставщика",
"noProviders": "Ни один провайдер не подключен",
"connectProvidersForQuota": "Подключайтесь к поставщикам с помощью OAuth, чтобы отслеживать ограничения и использование квот API.",
- "accountsCount": "{count, plural, one {# account} other {# accounts}}",
+ "accountsCount": "{count, plural, one {# аккаунт} few {# аккаунта} many {# аккаунтов} other {# аккаунта}}",
"filteredFromCount": "(отфильтровано из {count})",
"autoRefresh": "Автообновление",
"refreshAll": "Обновить все",
"loadingQuotas": "Загрузка...",
"account": "Аккаунт",
"modelQuotas": "Модельные квоты",
- "lastUsed": "Last Refreshed",
+ "lastUsed": "Последнее обновление",
"actions": "Действия",
"refreshQuota": "Обновить квоту",
"today": "Сегодня",
"tomorrow": "Завтра",
- "dayTimeFormat": "{day}, {time}",
+ "dayTimeFormat": "{day} — {time}",
"inDuration": "в {duration}",
"notApplicable": "Н/Д",
"rawPlanWithValue": "Необработанный план: {plan}",
"noPlanFromProvider": "Нет плана от провайдера",
"noQuotaData": "Нет данных о квотах",
- "ungrouped": "Ungrouped",
- "viewFlat": "Flat",
- "viewByEnvironment": "By Environment",
+ "ungrouped": "Без группы",
+ "viewFlat": "Плоский",
+ "viewByEnvironment": "По средам",
"noQuotaDataAvailable": "Нет данных о квотах",
"noAccountsForTierFilter": "Аккаунты для фильтра уровня не найдены",
"tierAll": "Все",
@@ -2621,15 +2670,15 @@
"restartServerWithNewPassword": "Перезагрузите сервер - он будет использовать новый пароль.",
"backToLogin": "Вернуться к входу",
"forgotPassword": "Забыли пароль?",
- "defaultPasswordHint": "Default password: 123456 (unless INITIAL_PASSWORD was set)",
+ "defaultPasswordHint": "Пароль по умолчанию: 123456 (если не задан INITIAL_PASSWORD)",
"Authorization": "Авторизация",
"Content-Disposition": "Содержание-Расположение",
- "waitingForAuthorization": "Waiting for authorization...",
- "waitingForGoogleAuthorization": "Waiting for Google authorization...",
- "waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
- "waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
- "waitingForQoderAuthorization": "Waiting for Qoder authorization...",
- "exchangingCodeForTokens": "Exchanging code for tokens..."
+ "waitingForAuthorization": "Ожидание авторизации...",
+ "waitingForGoogleAuthorization": "Ожидание авторизации Google...",
+ "waitingForOpenAIAuthorization": "Ожидание авторизации OpenAI...",
+ "waitingForAntigravityAuthorization": "Ожидание авторизации Antigravity...",
+ "waitingForQoderAuthorization": "Ожидание авторизации Qoder...",
+ "exchangingCodeForTokens": "Обмен кода на токены..."
},
"landing": {
"brandName": "ОмниРоут",
@@ -2721,10 +2770,10 @@
"supportedProvidersToc": "Провайдеры",
"commonUseCases": "Общие случаи использования",
"clientCompatibility": "Совместимость клиентов",
- "protocolsToc": "Protocols",
+ "protocolsToc": "Протоколы",
"apiReference": "Справочник по API",
- "managementApiReference": "Management API Reference",
- "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
+ "managementApiReference": "Справочник Management API",
+ "managementApiDescription": "Эндпоинты автоматизации для реестра прокси, назначения скоупов и миграции устаревших прокси.",
"method": "Метод",
"path": "Путь",
"notes": "Примечания",
@@ -2743,10 +2792,10 @@
"onThisPage": "На этой странице",
"documentationVersion": "Документация — v{version}",
"quickStartStep1Title": "1. Установите и запустите",
- "quickStartStep1Prefix": "Беги",
+ "quickStartStep1Prefix": "Запустите",
"quickStartStep1Middle": "или клонируйте с GitHub и запустите",
"quickStartStep2Title": "2. Создайте ключ API.",
- "quickStartStep2Text": "Перейдите в Конечная точка -> Зарегистрированные ключи. Создайте один ключ для каждой среды.",
+ "quickStartStep2Text": "Перейдите в раздел «Конечная точка API» → «Зарегистрированные ключи». Создайте один ключ для каждой среды.",
"quickStartStep3Title": "3. Подключите провайдеров",
"quickStartStep3Text": "Добавляйте учетные записи поставщиков с помощью входа в систему OAuth, ключа API или автоматического подключения на бесплатном уровне.",
"quickStartStep4Title": "4. Установите URL-адрес клиентской базы.",
@@ -2796,22 +2845,22 @@
"clientClaudeBullet1Prefix": "Использование",
"clientClaudeBullet1Middle": "(Клод) или",
"clientClaudeBullet1Suffix": "(Антигравитация) приставка.",
- "protocolsTitle": "Protocols: MCP & A2A",
- "protocolsDescription": "OmniRoute exposes two operational protocols in addition to OpenAI-compatible APIs: MCP for tool execution and A2A for agent-to-agent workflows.",
+ "protocolsTitle": "Протоколы: MCP и A2A",
+ "protocolsDescription": "OmniRoute предоставляет два операционных протокола помимо OpenAI-совместимых API: MCP для выполнения инструментов и A2A для рабочих процессов агент-к-агенту.",
"protocolMcpTitle": "MCP (Model Context Protocol)",
- "protocolMcpDesc": "Use MCP over stdio to let clients discover and call OmniRoute tools with audit visibility.",
- "protocolMcpStep1": "Start MCP transport with `omniroute --mcp`.",
- "protocolMcpStep2": "Point your MCP client to stdio transport.",
- "protocolMcpStep3": "Call `omniroute_get_health` and `omniroute_list_combos` to validate connectivity.",
+ "protocolMcpDesc": "Используйте MCP через stdio, чтобы клиенты могли находить и вызывать инструменты OmniRoute с аудитом.",
+ "protocolMcpStep1": "Запустите MCP-транспорт через `omniroute --mcp`.",
+ "protocolMcpStep2": "Укажите MCP-клиенту stdio-транспорт.",
+ "protocolMcpStep3": "Вызывайте `omniroute_get_health` и `omniroute_list_combos`, чтобы проверить подключение.",
"protocolA2aTitle": "A2A (Agent2Agent)",
- "protocolA2aDesc": "Use A2A JSON-RPC to submit tasks synchronously or via SSE streaming.",
- "protocolA2aStep1": "Read `/.well-known/agent.json` for agent discovery.",
- "protocolA2aStep2": "Send `message/send` or `message/stream` requests to `POST /a2a`.",
- "protocolA2aStep3": "Manage task lifecycle with `tasks/get` and `tasks/cancel`.",
- "protocolTroubleshootingTitle": "Protocol Troubleshooting",
- "protocolTroubleshooting1": "If MCP status is offline, verify the stdio process is running and heartbeat file is updating.",
- "protocolTroubleshooting2": "If A2A tasks stay in `working`, inspect `/api/a2a/tasks/:id` and stream events for terminal state.",
- "protocolTroubleshooting3": "Use `/dashboard/mcp` and `/dashboard/a2a` for operational controls and audit visibility.",
+ "protocolA2aDesc": "Используйте A2A JSON-RPC для отправки задач синхронно или через SSE-поток.",
+ "protocolA2aStep1": "Прочитайте `/.well-known/agent.json` для обнаружения агента.",
+ "protocolA2aStep2": "Отправляйте `message/send` или `message/stream` запросы на `POST /a2a`.",
+ "protocolA2aStep3": "Управляйте жизненным циклом задачи с помощью `tasks/get` и `tasks/cancel`.",
+ "protocolTroubleshootingTitle": "Диагностика протоколов",
+ "protocolTroubleshooting1": "Если статус MCP offline, проверьте, что stdio-процесс запущен и файл heartbeat обновляется.",
+ "protocolTroubleshooting2": "Если задачи A2A зависают в `working`, проверьте `/api/a2a/tasks/:id` и поток событий на финальное состояние.",
+ "protocolTroubleshooting3": "Используйте `/dashboard/mcp` и `/dashboard/a2a` для операционного управления и аудита.",
"endpointChatNote": "Конечная точка чата, совместимая с OpenAI (по умолчанию).",
"endpointResponsesNote": "Конечная точка API ответов (Кодекс, серия o).",
"endpointModelsNote": "Каталог моделей для всех подключенных провайдеров.",
@@ -2822,13 +2871,13 @@
"endpointRewriteChatNote": "Переписать помощник для клиентов без /v1.",
"endpointRewriteResponsesNote": "Переписать помощник для ответов без /v1.",
"endpointRewriteModelsNote": "Переписать помощник для обнаружения моделей без /v1.",
- "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
- "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
- "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
- "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
- "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
- "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
- "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
+ "mgmtProxiesListNote": "Список сохранённых элементов реестра прокси (поддерживает пагинацию).",
+ "mgmtProxiesCreateNote": "Создайте переиспользуемый элемент прокси в реестре.",
+ "mgmtProxiesHealthNote": "Получайте 24-часовые/скользящие метрики здоровья по каждому сохранённому прокси из журналов прокси.",
+ "mgmtProxiesBulkAssignNote": "Назначайте или очищайте один прокси сразу для многих scope ID за один запрос.",
+ "mgmtAssignmentsListNote": "Список назначений прокси по scope, scope_id или proxy_id.",
+ "mgmtAssignmentsUpdateNote": "Назначайте или очищайте прокси для глобального/поставщика/аккаунта/комбо scope.",
+ "mgmtLegacyMigrationNote": "Импортируйте старые карты proxyConfig в назначения реестра.",
"modelPrefixesDescriptionStart": "Используйте префикс поставщика перед названием модели для маршрутизации к определенному поставщику. Пример:",
"modelPrefixesDescriptionEnd": "маршруты к GitHub Copilot.",
"provider": "Поставщик",
@@ -2858,7 +2907,7 @@
"backToHome": "Вернуться домой",
"lastUpdated": "Последнее обновление: {date}.",
"policyLastUpdatedDate": "13 февраля 2026 г.",
- "listSeparator": "-",
+ "listSeparator": "•",
"questionsVisit": "Вопросы? Посетите наш",
"githubRepository": "Репозиторий GitHub",
"privacySection1Title": "1. Архитектура, ориентированная на локальность",
@@ -2901,74 +2950,125 @@
"termsSection6Text": "OmniRoute — это программное обеспечение с открытым исходным кодом. Вы можете свободно просматривать, изменять и распространять его в соответствии с условиями лицензии."
},
"agents": {
- "title": "CLI Agents",
- "description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.",
- "refresh": "Refresh",
- "installed": "Installed",
- "notFound": "Not Found",
- "builtIn": "Built-in",
- "custom": "Custom",
- "remove": "Remove",
- "addCustomAgent": "Add Custom Agent",
- "addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.",
- "agentName": "Agent Name",
- "binaryName": "Binary Name",
- "versionCommand": "Version Command",
- "spawnArgs": "Spawn Args",
- "addAgent": "Add Agent",
- "scanning": "Scanning system for CLI agents...",
- "opencodeIntegration": "OpenCode Integration",
- "opencodeDetected": "opencode {version} detected",
- "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.",
- "downloadConfig": "Download {file}",
- "downloaded": "Downloaded!",
- "setupGuideTitle": "Setup guide",
- "openCliTools": "Open CLI Tools",
- "setupGuideDetectCliTitle": "Detect installed CLIs",
- "setupGuideDetectCliDesc": "Click Refresh after installing or updating a CLI so OmniRoute can rescan binaries and versions.",
- "setupGuideCustomAgentTitle": "Register custom binary",
- "setupGuideCustomAgentDesc": "Use Add Custom Agent when your CLI is not in the built-in list. Provide binary name and version command.",
- "setupGuideCommandMissingTitle": "Fix 'command not found'",
- "setupGuideCommandMissingDesc": "Ensure the CLI command exists in PATH, open a new terminal session, and rerun Refresh."
+ "title": "CLI-агенты",
+ "description": "Находите установленные CLI-агенты в системе. Добавляйте пользовательские агенты для автоматического обнаружения.",
+ "refresh": "Обновить",
+ "installed": "Установлено",
+ "notFound": "Не найдено",
+ "builtIn": "Встроенный",
+ "custom": "Пользовательский",
+ "remove": "Удалить",
+ "addCustomAgent": "Добавить пользовательский агент",
+ "addCustomAgentDesc": "Зарегистрируйте любой CLI-инструмент для обнаружения. Он будет автоматически сканироваться при обновлении.",
+ "agentName": "Имя агента",
+ "binaryName": "Имя бинарника",
+ "versionCommand": "Команда версии",
+ "spawnArgs": "Аргументы запуска",
+ "addAgent": "Добавить агента",
+ "scanning": "Сканирование системы на наличие CLI-агентов...",
+ "opencodeIntegration": "Интеграция OpenCode",
+ "opencodeDetected": "обнаружен opencode {version}",
+ "opencodeDesc": "Сгенерируйте готовый к использованию {configFile} с базовым URL OmniRoute и всеми доступными моделями - просто положите его в корень проекта и запустите {command}.",
+ "downloadConfig": "Скачать {file}",
+ "downloaded": "Скачано!",
+ "setupGuideTitle": "Руководство по настройке",
+ "openCliTools": "Открыть CLI-инструменты",
+ "setupGuideDetectCliTitle": "Обнаружение установленных CLI",
+ "setupGuideDetectCliDesc": "Нажмите «Обновить» после установки или обновления CLI, чтобы OmniRoute заново просканировал бинарники и версии.",
+ "setupGuideCustomAgentTitle": "Регистрация пользовательского бинарника",
+ "setupGuideCustomAgentDesc": "Используйте «Добавить пользовательский агент», если ваш CLI отсутствует в встроенном списке. Укажите имя бинарника и команду версии.",
+ "setupGuideCommandMissingTitle": "Исправить 'command not found'",
+ "setupGuideCommandMissingDesc": "Убедитесь, что команда CLI есть в PATH, откройте новый терминал и снова нажмите «Обновить»."
},
"autoCombo": {
- "title": "Auto-Combo Engine",
- "statusNormal": "Normal",
- "statusIncident": "Incident Mode",
- "modePack": "Mode Pack",
- "providerScores": "Provider Scores",
- "noAutoCombo": "No auto-combo configured.",
- "excludedProviders": "Excluded Providers",
- "noExclusions": "No providers currently excluded.",
- "factorQuota": "Quota",
- "factorHealth": "Health",
- "factorCost": "Cost",
- "factorLatency": "Latency",
- "factorTaskFit": "Task Fit",
- "factorStability": "Stability",
- "factorTierPriority": "Tier Priority",
- "factorTierPriorityDesc": "Prefers accounts with higher quota tiers (Ultra/Pro over Free)",
- "scoreFactorBreakdown": "Scoring Factors",
- "modePackShipFast": "Ship Fast",
- "modePackCostSaver": "Cost Saver",
- "modePackQualityFirst": "Quality First",
- "modePackOfflineFriendly": "Offline Friendly"
+ "title": "Движок автокомбо",
+ "statusNormal": "Нормальный",
+ "statusIncident": "Режим инцидента",
+ "modePack": "Пакет режимов",
+ "providerScores": "Оценки провайдеров",
+ "noAutoCombo": "Автокомбо не настроено.",
+ "excludedProviders": "Исключённые провайдеры",
+ "noExclusions": "Сейчас нет исключённых провайдеров.",
+ "factorQuota": "Квота",
+ "factorHealth": "Состояние",
+ "factorCost": "Стоимость",
+ "factorLatency": "Задержка",
+ "factorTaskFit": "Соответствие задаче",
+ "factorStability": "Стабильность",
+ "factorTierPriority": "Приоритет тарифа",
+ "factorTierPriorityDesc": "Предпочитает аккаунты с более высоким тарифом (Ultra/Pro выше Free)",
+ "scoreFactorBreakdown": "Факторы оценки",
+ "modePackShipFast": "Быстрое выполнение",
+ "modePackCostSaver": "Экономный режим",
+ "modePackQualityFirst": "Сначала качество",
+ "modePackOfflineFriendly": "Подходит для офлайна"
+ },
+ "memory": {
+ "title": "Память",
+ "description": "Постоянная кросс-сессионная память для диалогов",
+ "memories": "Память",
+ "totalEntries": "Всего записей",
+ "tokensUsed": "Использовано токенов",
+ "hitRate": "Коэффициент попадания",
+ "loading": "Загрузка...",
+ "noMemories": "Записей памяти не найдено",
+ "search": "Поиск",
+ "allTypes": "Все типы",
+ "export": "Экспорт",
+ "import": "Импорт",
+ "addMemory": "Добавить запись памяти",
+ "type": "Тип",
+ "key": "Ключ",
+ "content": "Содержимое",
+ "created": "Создано",
+ "actions": "Действия",
+ "factual": "Фактическая",
+ "episodic": "Эпизодическая",
+ "procedural": "Процедурная",
+ "semantic": "Семантическая"
+ },
+ "skills": {
+ "title": "Навыки",
+ "description": "Инструменты для моделей",
+ "skillsTab": "Навыки",
+ "executionsTab": "Выполнения",
+ "sandboxTab": "Песочница",
+ "loading": "Загрузка...",
+ "noSkills": "Навыки не найдены",
+ "noExecutions": "Выполнений не найдено",
+ "enabled": "Включено",
+ "disabled": "Отключено",
+ "version": "Версия",
+ "tableDescription": "Описание",
+ "skill": "Навык",
+ "status": "Статус",
+ "duration": "Длительность",
+ "time": "Время",
+ "sandboxConfig": "Конфигурация песочницы",
+ "cpuLimit": "Лимит CPU",
+ "cpuLimitDesc": "Максимальное число ядер или доля CPU, доступная песочнице.",
+ "memoryLimit": "Лимит памяти",
+ "memoryLimitDesc": "Максимальный объём памяти, доступный песочнице.",
+ "timeout": "Тайм-аут",
+ "timeoutDesc": "Максимальная длительность выполнения до принудительного завершения.",
+ "networkAccess": "Доступ к сети",
+ "networkAccessDesc": "Разрешить навыку сетевые запросы."
},
"templateNames": {
- "simple-chat": "Simple Chat",
- "streaming": "Streaming",
- "system-prompt": "System Prompt",
- "thinking": "Thinking",
- "tool-calling": "Tool Calling",
- "multi-turn": "Multi-turn"
+ "simple-chat": "Простой чат",
+ "streaming": "Потоковое",
+ "system-prompt": "Системная подсказка",
+ "thinking": "Мышление",
+ "tool-calling": "Вызов инструмента",
+ "multi-turn": "Многооборотный"
},
"templateDescriptions": {
- "simple-chat": "Basic chat template",
- "streaming": "Streaming template",
- "system-prompt": "System prompt template",
- "thinking": "Thinking template",
- "tool-calling": "Tool calling template",
- "multi-turn": "Multi-turn template"
+ "simple-chat": "Шаблон простого чата",
+ "streaming": "Шаблон потоковой передачи",
+ "system-prompt": "Шаблон системной подсказки",
+ "thinking": "Шаблон рассуждения",
+ "tool-calling": "Шаблон вызова инструментов",
+ "multi-turn": "Шаблон многоходового диалога"
},
"templatePayloads": {
"simpleChat": {
@@ -2998,72 +3098,76 @@
}
},
"cache": {
- "title": "Cache Management",
- "description": "Monitor and manage semantic response cache, hit rates, and token savings.",
- "refresh": "Refresh",
- "clearAll": "Clear All",
- "memoryEntries": "Memory Entries",
- "memoryEntriesSub": "In-memory LRU",
- "dbEntries": "DB Entries",
- "dbEntriesSub": "Persisted (SQLite)",
- "cacheHits": "Cache Hits",
- "cacheHitsSub": "of {total} total",
- "tokensSaved": "Tokens Saved",
- "tokensSavedSub": "Estimated from hits",
- "hitRate": "Hit Rate",
- "performance": "Cache Performance",
- "autoRefresh": "Auto-refreshes every {seconds}s",
- "hits": "Hits",
- "misses": "Misses",
- "total": "Total",
- "behavior": "Cache Behavior",
- "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.",
- "behaviorBypass": "Bypass with header {header}.",
- "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).",
- "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.",
- "idempotency": "Idempotency Layer",
- "activeDedupKeys": "Active Dedup Keys",
- "dedupWindow": "Dedup Window",
- "clearSuccess": "Cache cleared. {count} expired entries removed.",
- "clearError": "Failed to clear cache.",
- "unavailable": "Cache unavailable",
- "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.",
- "promptCache": "Prompt Cache (Provider-Side)",
- "cachedRequests": "Cached Requests",
- "cacheHitRate": "Cache Hit Rate",
- "cachedTokens": "Cached Tokens",
- "cacheCreationTokens": "Cache Creation Tokens",
- "cacheMetrics": "Prompt Cache Metrics",
- "withCacheControl": "With Cache Control",
- "cachedTokensRead": "Cached Tokens (Read)",
- "cacheCreationWrite": "Cache Creation (Write)",
- "cacheReuseRatio": "Cache Reuse Ratio",
- "cacheReuseRatioDesc": "Cached tokens / Total input tokens",
- "estCostSaved": "Est. Cost Saved",
- "requestsShort": "reqs",
- "inputShort": "In",
- "cachedShort": "Cached",
- "writeShort": "Write",
- "resetting": "Resetting...",
- "resetMetrics": "Reset Metrics",
- "byProvider": "Breakdown by Provider",
- "provider": "Provider",
- "requests": "Requests",
- "inputTokens": "Input Tokens",
- "cachedTokensCol": "Cached",
- "cacheCreation": "Creation",
- "trend24h": "Cache Trend (24h)",
- "cached": "Cached",
- "overview": "Overview",
- "entries": "Entries",
- "searchEntries": "Search entries...",
- "search": "Search",
- "loading": "Loading...",
- "noEntries": "No cache entries found",
- "signature": "Signature",
- "model": "Model",
- "created": "Created",
- "expires": "Expires",
- "actions": "Actions"
+ "title": "Управление кэшем",
+ "description": "Отслеживайте и управляйте семантическим кэшем ответов, скоростью попаданий и экономией токенов.",
+ "refresh": "Обновить",
+ "clearAll": "Очистить всё",
+ "memoryEntries": "Записи в памяти",
+ "memoryEntriesSub": "LRU в памяти",
+ "dbEntries": "Записи БД",
+ "dbEntriesSub": "Сохранённые (SQLite)",
+ "cacheHits": "Попадания в кэш",
+ "cacheHitsSub": "из {total} всего",
+ "tokensSaved": "Сэкономленные токены",
+ "tokensSavedSub": "Оценка по попаданиям",
+ "hitRate": "Коэффициент попадания",
+ "performance": "Производительность кэша",
+ "autoRefresh": "Автообновление каждые {seconds}с",
+ "hits": "Попадания",
+ "misses": "Промахи",
+ "total": "Всего",
+ "behavior": "Поведение кэша",
+ "behaviorDeterministic": "Кэшируются только нестриминговые запросы с temperature=0.",
+ "behaviorBypass": "Обход с заголовком {header}.",
+ "behaviorTwoTier": "Двухуровневое хранилище: LRU в памяти (быстро) + SQLite (сохраняется между перезапусками).",
+ "behaviorTtl": "TTL по умолчанию: 30 минут. Настраивается через {envVar}.",
+ "idempotency": "Слой идемпотентности",
+ "activeDedupKeys": "Активные ключи дедупликации",
+ "dedupWindow": "Окно дедупликации",
+ "clearSuccess": "Кэш очищен. Удалено {count} просроченных записей.",
+ "clearError": "Не удалось очистить кэш.",
+ "unavailable": "Кэш недоступен",
+ "unavailableDesc": "Не удалось получить статистику кэша. Убедитесь, что сервер запущен.",
+ "promptCache": "Кэш промптов (на стороне провайдера)",
+ "cachedRequests": "Запросы из кэша",
+ "cacheHitRate": "Коэффициент попадания в кэш",
+ "cachedTokens": "Кэшированные токены",
+ "cacheCreationTokens": "Токены создания кэша",
+ "cacheMetrics": "Метрики кэша промптов",
+ "withCacheControl": "С управлением кэшем",
+ "cachedTokensRead": "Кэшированные токены (чтение)",
+ "cacheCreationWrite": "Создание кэша (запись)",
+ "cacheReuseRatio": "Коэффициент повторного использования кэша",
+ "cacheReuseRatioDesc": "Кэшированные токены / Все входные токены",
+ "estCostSaved": "Примерная экономия",
+ "requestsShort": "запр.",
+ "inputShort": "Вх.",
+ "cachedShort": "В кэше",
+ "writeShort": "Запись",
+ "resetting": "Сброс...",
+ "resetMetrics": "Сбросить метрики",
+ "byProvider": "Разбивка по провайдерам",
+ "provider": "Провайдер",
+ "requests": "Запросы",
+ "inputTokens": "Входные токены",
+ "cachedTokensCol": "Кэш.",
+ "cacheCreation": "Создание",
+ "trend24h": "Тренд кэша (24ч)",
+ "cached": "В кэше",
+ "overview": "Обзор",
+ "entries": "Записи",
+ "searchEntries": "Поиск записей...",
+ "search": "Поиск",
+ "loading": "Загрузка...",
+ "noEntries": "Записи кэша не найдены",
+ "signature": "Сигнатура",
+ "model": "Модель",
+ "created": "Создано",
+ "expires": "Истекает",
+ "actions": "Действия",
+ "deduplicatedRequests": "Дедуплицированные запросы",
+ "peakCached": "Пик кэша",
+ "savedCalls": "Сэкономленные API-запросы",
+ "totalProcessed": "Всего запросов обработано"
}
}
diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json
index 01bc578ef1..d2a83be472 100644
--- a/src/i18n/messages/uk-UA.json
+++ b/src/i18n/messages/uk-UA.json
@@ -162,8 +162,8 @@
"apiManager": "Менеджер API",
"logs": "Журнали",
"auditLog": "Журнал аудиту",
- "shutdown": "Вимкнення",
- "restart": "Перезапустіть",
+ "shutdown": "Вимкнути",
+ "restart": "Перезапуск",
"shutdownConfirm": "Вимкнути OmniRoute?",
"restartConfirm": "Перезапустити OmniRoute?",
"version": "v{version}",