diff --git a/CHANGELOG.md b/CHANGELOG.md index 6191594232..3aa34f9e45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -228,6 +228,14 @@ - **mcp:** move `enforceScopes` guard before `MCP_TOOL_MAP` lookup, add inline `scopes` parameter to `withScopeEnforcement()`, and declare scopes on all 24 dynamic tool definitions (memory, skills, plugins, gamification, compression) to fix scope enforcement for dynamic MCP tool groups (#2958) +### ✨ New Features + +- **notion:** add Notion as an MCP context source — 6 tools (`notion_search`, `notion_list_databases`, `notion_get_database`, `notion_query_database`, `notion_read`, `notion_append_blocks`) scoped under `read:notion` / `write:notion`, with dashboard "Context Sources" tab, settings API, and token persistence in `key_value` table (#2959) + +### 🔧 Bug Fixes + +- **mcp:** move `enforceScopes` guard before `MCP_TOOL_MAP` lookup, add inline `scopes` parameter to `withScopeEnforcement()`, and declare scopes on all 24 dynamic tool definitions (memory, skills, plugins, gamification, compression) to fix scope enforcement for dynamic MCP tool groups (#2958) + --- ## [3.8.7] — 2026-05-29 diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index a09f889100..f450608b2d 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -54,8 +54,8 @@ "none": "Жодного", "yes": "так", "no": "немає", - "on": "__MISSING__:ON", - "off": "__MISSING__:OFF", + "on": "Увімк.", + "off": "Вимк.", "warning": "Попередження", "note": "Примітка", "free": "безкоштовно", @@ -170,13 +170,13 @@ "failedToLoad": "Не вдалося завантажити", "categoryMedia": "Медіа", "enableCloud": "Увімкнути хмару", - "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon", - "retry": "Retry", - "embeddings": "Embeddings", - "errorCount": "Error Count", - "backupReasonManual": "Backup Reason Manual", - "safeSearchModerate": "Safe Search Moderate", - "activeLimiters": "Active Limiters", + "expirationBannerExpiringSoon": "Скоро закінчиться", + "retry": "Повторити", + "embeddings": "Вбудовування", + "errorCount": "Кількість помилок", + "backupReasonManual": "Ручне резервне копіювання", + "safeSearchModerate": "Помірний", + "activeLimiters": "Активні обмежувачі", "a2aCardTitle": "A2A Card Title", "cloudWorkerUnreachable": "Cloud Worker Unreachable", "testFailed": "Test Failed", @@ -582,7 +582,7 @@ "searchProvidersHeading": "Search Providers Heading", "comboName": "Combo Name", "autoDisableDescription": "Auto Disable Description", - "embeddingsDesc": "Embeddings Desc", + "embeddingsDesc": "Векторні представлення для семантичного пошуку", "operational": "Operational", "testAllApiKey": "Test All Api Key", "backupCreated": "Backup Created", @@ -708,7 +708,7 @@ "batchFilesListSearchPlaceholder": "Пошук за ідентифікатором або назвою файлу…", "batchFilesListFilesTable": "Файли", "batchPageLoadingMore": "Завантаження більше…", - "recommended": "__MISSING__:Recommended", + "recommended": "Рекомендовано", "batchConceptTitle": "Batch processing", "batchConceptSubtitle": "Process thousands of requests asynchronously at ~50% of the cost (24h window). Ideal for evaluations, classification, and embeddings.", "batchConceptHowItWorks": "How it works", @@ -870,8 +870,8 @@ "endpointsSubtitle": "Ваші URL-адреси підключення AI", "apiManager": "Менеджер API", "apiManagerSubtitle": "Керуйте ключами API та доступом", - "embeddedServices": "__MISSING__:Embedded Services", - "embeddedServicesSubtitle": "__MISSING__:Manage local proxy services", + "embeddedServices": "Вбудовані сервіси", + "embeddedServicesSubtitle": "Керування локальними проксі-сервісами", "logs": "Журнали", "webhooks": "Веб-хуки", "webhooksSubtitle": "Отримуйте сповіщення про події", @@ -978,7 +978,7 @@ "settingsAi": "Налаштування AI", "settingsSecurity": "Безпека", "settingsFeatureFlags": "Прапори функцій", - "settingsAuthz": "__MISSING__:Authz", + "settingsAuthz": "Авторизація", "settingsRouting": "Маршрутизація", "settingsResilience": "Стійкість", "settingsAdvanced": "Розширені", @@ -1058,7 +1058,7 @@ "settingsFeatureFlagsSubtitle": "Перемикання можливостей системи", "settingsSidebar": "Бічна панель", "settingsSidebarSubtitle": "Налаштування компонування бічної панелі", - "settingsAuthzSubtitle": "__MISSING__:Route inventory and bypass policy", + "settingsAuthzSubtitle": "Інвентар маршрутів та політика обходу", "docsSubtitle": "Документація", "issuesSubtitle": "Повідомити про помилку", "changelogSubtitle": "Примітки до випуску" @@ -1109,91 +1109,91 @@ "signatureTitle": "Підписи Webhook", "signatureDescription": "Кожна доставка містить заголовок X-Webhook-Signature, підписаний HMAC-SHA256 із використанням секрету веб-хука. Перш ніж довіряти корисному навантаженню, перевірте підпис.", "wizard": { - "cancel": "__MISSING__:Cancel", - "step1Title": "__MISSING__:Select Integration", - "step2Title": "__MISSING__:Configure Target", - "step3Title": "__MISSING__:Events & Test", - "back": "__MISSING__:Back", - "next": "__MISSING__:Next", - "finish": "__MISSING__:Finish", - "step1Desc": "__MISSING__:Select the target integration system for this webhook." + "cancel": "Скасувати", + "step1Title": "Виберіть інтеграцію", + "step2Title": "Налаштуйте ціль", + "step3Title": "Події та тест", + "back": "Назад", + "next": "Далі", + "finish": "Завершити", + "step1Desc": "Виберіть цільову систему інтеграції для цього веб-хука." }, "howItWorks": { - "step1": "__MISSING__:Choose an integration provider (e.g. Slack, Discord, custom webhook) and set up the connection details.", - "step2": "__MISSING__:Configure system events to subscribe to (e.g. completion errors, model fallbacks, or usage limits).", - "step3": "__MISSING__:Verify the configuration by sending a test payload to make sure the endpoint receives it.", - "step4": "__MISSING__:Secure your endpoint by validating the X-Webhook-Signature HMAC-SHA256 header using the webhook's secret.", - "title": "__MISSING__:How Webhooks Work", - "customOnly": "__MISSING__:Only applicable for custom endpoint integrations.", - "hmacRecipeTitle": "__MISSING__:HMAC Verification Recipe", - "hmacRecipe": "__MISSING__:To verify webhook payloads in Node.js, compute the HMAC-SHA256 of the raw request body using your secret key. Compare it to the X-Webhook-Signature header using timingSafeEqual.", - "timeoutNote": "__MISSING__:Webhook deliveries have a timeout of 10 seconds.", - "retryNote": "__MISSING__:Failed deliveries are retried up to 5 times with exponential backoff.", - "docsLink": "__MISSING__:Read the full Webhooks developer guide", - "hmacRecipePython": "__MISSING__:Python HMAC verification: hmac.new(secret, body, hashlib.sha256).hexdigest()", - "hmacRecipeBash": "__MISSING__:Bash HMAC verification: echo -n \"$body\" | openssl dgst -sha256 -hmac \"$secret\"" + "step1": "Виберіть провайдера інтеграції (напр., Slack, Discord, користувацький веб-хук) і налаштуйте параметри з'єднання.", + "step2": "Налаштуйте системні події для підписки (напр., помилки завершення, резервні перемикання моделей або ліміти використання).", + "step3": "Перевірте конфігурацію, надіславши тестове повідомлення, щоб переконатися, що ендпоінт його отримує.", + "step4": "Захистіть свій ендпоінт, валідуючи заголовок X-Webhook-Signature HMAC-SHA256 за секретом веб-хука.", + "title": "Як працюють веб-хуки", + "customOnly": "Застосовно лише до користувацьких ендпоінтних інтеграцій.", + "hmacRecipeTitle": "Рецепт перевірки HMAC", + "hmacRecipe": "Щоб перевірити повідомлення веб-хука в Node.js, обчисліть HMAC-SHA256 сирого тіла запиту, використовуючи свій секретний ключ. Порівняйте його із заголовком X-Webhook-Signature через timingSafeEqual.", + "timeoutNote": "Доставка веб-хуків має тайм-аут 10 секунд.", + "retryNote": "Невдалі доставки повторюються до 5 разів з експоненційним затримкою.", + "docsLink": "Прочитайте повний посібник для розробників з веб-хуків", + "hmacRecipePython": "Перевірка HMAC у Python: hmac.new(secret, body, hashlib.sha256).hexdigest()", + "hmacRecipeBash": "Перевірка HMAC у Bash: echo -n \"$body\" | openssl dgst -sha256 -hmac \"$secret\"" }, "deliveries": { - "title": "__MISSING__:Delivery Logs", - "loadFailed": "__MISSING__:Failed to load webhook delivery logs.", - "empty": "__MISSING__:No deliveries recorded yet. Trigger an event or send a test payload.", - "status": "__MISSING__:Status", - "event": "__MISSING__:Event", - "latency": "__MISSING__:Latency", - "at": "__MISSING__:Sent At" + "title": "Логи доставки", + "loadFailed": "Не вдалося завантажити логи доставки веб-хуків.", + "empty": "Поки не зафіксовано доставок. Спричиніть подію або надішліть тестове повідомлення.", + "status": "Стан", + "event": "Подія", + "latency": "Затримка", + "at": "Надіслано о" }, "kinds": { - "comingSoon": "__MISSING__:Coming Soon", + "comingSoon": "Скоро", "slack": "__MISSING__:Slack", - "slackDesc": "__MISSING__:Post system events directly into a Slack channel", + "slackDesc": "Публікуйте системні події безпосередньо в канал Slack", "telegram": "__MISSING__:Telegram", - "telegramDesc": "__MISSING__:Send event messages using a Telegram bot", + "telegramDesc": "Надсилайте повідомлення про події через Telegram-бота", "discord": "__MISSING__:Discord", - "discordDesc": "__MISSING__:Deliver real-time updates directly to a Discord server", - "custom": "__MISSING__:Custom Webhook", - "customDesc": "__MISSING__:Deliver system event payloads to any HTTPS endpoint", - "email": "__MISSING__:Email Notification", - "emailDesc": "__MISSING__:Receive summary updates via email", + "discordDesc": "Доставляйте оновлення в реальному часі безпосередньо на сервер Discord", + "custom": "Користувацький веб-хук", + "customDesc": "Доставляйте корисні навантаження системних подій на будь-який HTTPS-ендпоінт", + "email": "Email-сповіщення", + "emailDesc": "Отримуйте підсумкові оновлення електронною поштою", "pagerduty": "__MISSING__:PagerDuty", - "pagerdutyDesc": "__MISSING__:Trigger alerts on PagerDuty for critical system issues", + "pagerdutyDesc": "Запускайте сповіщення PagerDuty для критичних системних проблем", "teams": "__MISSING__:Microsoft Teams", - "teamsDesc": "__MISSING__:Forward system notifications to Microsoft Teams channels" + "teamsDesc": "Перенаправляйте системні сповіщення в канали Microsoft Teams" }, - "testPayloadSent": "__MISSING__:Test Payload Sent", - "testResponse": "__MISSING__:Test Response", + "testPayloadSent": "Тестове повідомлення надіслано", + "testResponse": "Тестова відповідь", "validateUrl": { - "checking": "__MISSING__:Checking URL...", - "ok": "__MISSING__:URL is valid", - "blockedPrivate": "__MISSING__:URL is a blocked private address", - "invalidUrl": "__MISSING__:Invalid URL format" + "checking": "Перевірка URL...", + "ok": "URL коректний", + "blockedPrivate": "URL вказує на заблоковану приватну адресу", + "invalidUrl": "Невірний формат URL" }, "custom": { - "endpointUrl": "__MISSING__:Endpoint URL", + "endpointUrl": "URL ендпоінта", "endpointUrlPlaceholder": "__MISSING__:https://api.yourdomain.com/webhook", - "secretKey": "__MISSING__:Secret Key", - "secretKeyPlaceholder": "__MISSING__:Enter secret key or leave blank to auto-generate", - "secretKeyHint": "__MISSING__:Used to sign the payload header for authentication." + "secretKey": "Секретний ключ", + "secretKeyPlaceholder": "Введіть секретний ключ або залиште порожнім для авто-генерації", + "secretKeyHint": "Використовується для підпису заголовка корисного навантаження для автентифікації." }, "discord": { - "webhookUrl": "__MISSING__:Discord Webhook URL", + "webhookUrl": "URL веб-хука Discord", "webhookUrlPlaceholder": "__MISSING__:https://discord.com/api/webhooks/...", - "webhookUrlHint": "__MISSING__:The webhook URL copied from your Discord channel integration settings.", - "tutorial": "__MISSING__:How to create a Discord webhook:" + "webhookUrlHint": "URL веб-хука, скопійований з налаштувань інтеграції каналу Discord.", + "tutorial": "Як створити веб-хук у Discord:" }, "slack": { - "webhookUrl": "__MISSING__:Slack Webhook URL", + "webhookUrl": "URL веб-хука Slack", "webhookUrlPlaceholder": "__MISSING__:https://hooks.slack.com/services/...", - "webhookUrlHint": "__MISSING__:The webhook URL copied from your Slack Incoming Webhooks integration.", - "tutorial": "__MISSING__:How to create a Slack webhook:" + "webhookUrlHint": "URL веб-хука, скопійований з інтеграції Incoming Webhooks у Slack.", + "tutorial": "Як створити веб-хук у Slack:" }, "telegram": { - "botToken": "__MISSING__:Telegram Bot Token", + "botToken": "Токен Telegram-бота", "botTokenPlaceholder": "__MISSING__:123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ", - "botTokenHint": "__MISSING__:The HTTP API token received from @BotFather when creating your bot.", - "chatId": "__MISSING__:Telegram Chat ID / Channel", - "chatIdPlaceholder": "__MISSING__:-100123456789 or @channelname", - "chatIdHint": "__MISSING__:The unique numerical identifier or public username of the chat/channel.", - "tutorial": "__MISSING__:How to configure Telegram webhook:" + "botTokenHint": "Токен HTTP API, отриманий від @BotFather під час створення бота.", + "chatId": "Telegram Chat ID / канал", + "chatIdPlaceholder": "-100123456789 або @channelname", + "chatIdHint": "Унікальний числовий ідентифікатор або публічний username чату/каналу.", + "tutorial": "Як налаштувати веб-хук Telegram:" } }, "compliance": { @@ -1265,13 +1265,13 @@ "a2aLoadingTasks": "Завантаження завдань A2A..." }, "themesPage": { - "title": "Themes", - "description": "Choose a preset theme or create your own with a single color", - "presetColors": "Popular colors", - "customTheme": "Custom theme", - "customThemeDesc": "Click create theme and pick one color", - "createTheme": "Create theme", - "activePreset": "Active theme" + "title": "Теми", + "description": "Виберіть готову тему або створіть свою з одного кольору", + "presetColors": "Популярні кольори", + "customTheme": "Користувацька тема", + "customThemeDesc": "Натисніть «Створити тему» і виберіть один колір", + "createTheme": "Створити тему", + "activePreset": "Активна тема" }, "header": { "logout": "Вийти", @@ -1416,81 +1416,81 @@ }, "analytics": { "title": "Аналітика", - "usageAnalyticsTitle": "__MISSING__:Usage Analytics", + "usageAnalyticsTitle": "Аналітика використання", "diversityScoreTitle": "Різноманітність постачальників", - "diversityScoreDesc": "__MISSING__:Provider concentration snapshot for the recent traffic window.", - "diversityShannonEntropy": "__MISSING__:Shannon entropy", - "diversityWindow": "__MISSING__:Window: {count} reqs · Last {mins} mins", - "diversityHealthy": "__MISSING__:Healthy Distribution", - "diversityRiskHigh": "__MISSING__:High Vendor Lock-in Risk", - "diversityRiskModerate": "__MISSING__:Moderate Distribution", - "diversityScoreLabel": "__MISSING__:score", - "diversityHigherExplanation": "__MISSING__:Higher values mean traffic is spread across multiple providers.", - "diversityNoData": "__MISSING__:No recent usage data available.", - "chartRequests": "__MISSING__:Requests", - "chartInput": "__MISSING__:Input", - "chartOutput": "__MISSING__:Output", - "chartTotal": "__MISSING__:Total", - "chartCost": "__MISSING__:Cost", - "chartShare": "__MISSING__:Share", - "chartServiceTier": "__MISSING__:Service Tier", - "chartServiceTierSplit": "__MISSING__:Fast / Standard cost split", - "chartCostPct": "__MISSING__:{pct}% of cost", - "chartUsageDetail": "__MISSING__:Usage Detail", - "chartCacheRead": "__MISSING__:Cache read", - "chartCostByProvider": "__MISSING__:Cost by Provider", - "chartNoCostData": "__MISSING__:No cost data", - "chartModelUsageOverTime": "__MISSING__:Model Usage Over Time", - "chartNoData": "__MISSING__:No data", - "chartWeekly": "__MISSING__:Weekly", - "chartModelBreakdown": "__MISSING__:Model Breakdown", - "chartModel": "__MISSING__:Model", - "chartProvider": "__MISSING__:Provider", - "chartProviderBreakdown": "__MISSING__:Provider Breakdown", - "filterAllKeys": "__MISSING__:All Keys", - "filterSearchKeys": "__MISSING__:Search keys…", - "filterNoKeysMatch": "__MISSING__:No keys match", - "filterOneKey": "__MISSING__:1 key", - "filterMultipleKeys": "__MISSING__:{count} keys", - "rangeToday": "__MISSING__:Today", - "rangeYesterday": "__MISSING__:Yesterday", - "rangeLast3Days": "__MISSING__:Last 3 days", - "rangeThisWeek": "__MISSING__:This week", - "rangeLast14Days": "__MISSING__:Last 14 days", - "rangeThisMonth": "__MISSING__:This month", - "rangeQuickSelect": "__MISSING__:Quick Select", - "rangeStart": "__MISSING__:Start", - "rangeEnd": "__MISSING__:End", - "rangeCancel": "__MISSING__:Cancel", - "rangeApply": "__MISSING__:Apply", - "rangeErrorInvalid": "__MISSING__:Start must be before end", - "period1D": "__MISSING__:1D", - "period7D": "__MISSING__:7D", - "period30D": "__MISSING__:30D", - "period90D": "__MISSING__:90D", - "periodYTD": "__MISSING__:YTD", - "periodAll": "__MISSING__:All", - "totalTokens": "__MISSING__:Total Tokens", - "inputTokens": "__MISSING__:Input Tokens", - "outputTokens": "__MISSING__:Output Tokens", - "estCost": "__MISSING__:Est. Cost", - "infraTitle": "__MISSING__:Infrastructure", - "infraAccounts": "__MISSING__:Accounts", - "infraProviders": "__MISSING__:Providers", - "infraApiKeys": "__MISSING__:API Keys", - "infraModels": "__MISSING__:Models", - "perfTitle": "__MISSING__:Performance", - "perfAvgTokens": "__MISSING__:Avg Tokens/Req", - "perfCostReq": "__MISSING__:Cost/Req", - "perfIoRatio": "__MISSING__:I/O Ratio", - "perfFastReq": "__MISSING__:Fast Requests", - "highlightsTitle": "__MISSING__:Highlights", - "highlightsTopModel": "__MISSING__:Top Model", - "highlightsTopProvider": "__MISSING__:Top Provider", - "highlightsBusiestDay": "__MISSING__:Busiest Day", - "highlightsDiversity": "__MISSING__:Diversity", - "highlightsFallbackRate": "__MISSING__:Fallback Rate", - "customRange": "__MISSING__:Custom", + "diversityScoreDesc": "Розподіл навантаження між провайдерами для останнього вікна трафіку.", + "diversityShannonEntropy": "Ентропія Шеннона", + "diversityWindow": "Вікно: {count} запитів · останні {mins} хв", + "diversityHealthy": "Здоровий розподіл", + "diversityRiskHigh": "Високий ризик прив'язки до постачальника", + "diversityRiskModerate": "Помірний розподіл", + "diversityScoreLabel": "оцінка", + "diversityHigherExplanation": "Вищі значення означають, що трафік розподілено між кількома провайдерами.", + "diversityNoData": "Немає даних про нещодавнє використання.", + "chartRequests": "Запити", + "chartInput": "Вхід", + "chartOutput": "Вихід", + "chartTotal": "Усього", + "chartCost": "Вартість", + "chartShare": "Частка", + "chartServiceTier": "Рівень сервісу", + "chartServiceTierSplit": "Розподіл вартості Fast / Standard", + "chartCostPct": "{pct}% від вартості", + "chartUsageDetail": "Деталі використання", + "chartCacheRead": "Читання з кешу", + "chartCostByProvider": "Вартість за провайдером", + "chartNoCostData": "Немає даних про вартість", + "chartModelUsageOverTime": "Використання моделей з часом", + "chartNoData": "Немає даних", + "chartWeekly": "Щотижнево", + "chartModelBreakdown": "Розподіл за моделями", + "chartModel": "Модель", + "chartProvider": "Провайдер", + "chartProviderBreakdown": "Розподіл за провайдерами", + "filterAllKeys": "Усі ключі", + "filterSearchKeys": "Пошук ключів…", + "filterNoKeysMatch": "Жоден ключ не відповідає", + "filterOneKey": "1 ключ", + "filterMultipleKeys": "{count} ключів", + "rangeToday": "Сьогодні", + "rangeYesterday": "Учора", + "rangeLast3Days": "Останні 3 дні", + "rangeThisWeek": "Цей тиждень", + "rangeLast14Days": "Останні 14 днів", + "rangeThisMonth": "Цей місяць", + "rangeQuickSelect": "Швидкий вибір", + "rangeStart": "Початок", + "rangeEnd": "Кінець", + "rangeCancel": "Скасувати", + "rangeApply": "Застосувати", + "rangeErrorInvalid": "Початок має бути раніше за кінець", + "period1D": "1д", + "period7D": "7д", + "period30D": "30д", + "period90D": "90д", + "periodYTD": "З поч. року", + "periodAll": "Увесь час", + "totalTokens": "Усього токенів", + "inputTokens": "Вхідні токени", + "outputTokens": "Вихідні токени", + "estCost": "Орієнт. вартість", + "infraTitle": "Інфраструктура", + "infraAccounts": "Акаунти", + "infraProviders": "Провайдери", + "infraApiKeys": "API-ключі", + "infraModels": "Моделі", + "perfTitle": "Продуктивність", + "perfAvgTokens": "Середньо токенів/запит", + "perfCostReq": "Вартість/запит", + "perfIoRatio": "Співвідношення В/В", + "perfFastReq": "Швидкі запити", + "highlightsTitle": "Ключові показники", + "highlightsTopModel": "Топ-модель", + "highlightsTopProvider": "Топ-провайдер", + "highlightsBusiestDay": "Найзавантаженіший день", + "highlightsDiversity": "Розмаїття", + "highlightsFallbackRate": "Частота резервного перемикання", + "customRange": "Свій", "overviewDescription": "Відстежуйте шаблони використання API, споживання маркерів, витрати та тенденції активності в усіх постачальників і моделей.", "evalsDescription": "Запустіть пакети оцінювання, щоб протестувати та перевірити кінцеві точки LLM. Порівняйте якість моделі, виявіть регресії та порівняйте затримку.", "overview": "Огляд", @@ -1610,26 +1610,26 @@ "endpointRestrictions": "Обмеження ендпоінтів", "allEndpointsAllowed": "Дозволено всі ендпоінти", "endpointsRestricted": "{count, plural, one {# ендпоінт обмежено} few {# ендпоінти обмежено} many {# ендпоінтів обмежено} other {# ендпоінта обмежено}}", - "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": "Цей ключ може отримати доступ до всіх доступних моделей.", @@ -1654,8 +1654,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": "Видалити ключ", @@ -1683,24 +1683,21 @@ "expirationDate": "Термін придатності", "managementAccess": "Доступ до керування", "allowedConnections": "Дозволені підключення", - "searchPlaceholder": "__MISSING__:Search by name or token...", - "activeOnly": "__MISSING__:Active only", - "filterStatus": "__MISSING__:STATUS", - "filterType": "__MISSING__:TYPE", - "filterAll": "__MISSING__:All", - "filterStatusActive": "__MISSING__:Active", - "filterStatusDisabled": "__MISSING__:Disabled", - "filterStatusBanned": "__MISSING__:Banned", - "filterStatusExpired": "__MISSING__:Expired", - "filterTypeStandard": "__MISSING__:Standard", - "filterTypeManage": "__MISSING__:Manage", - "filterTypeRestricted": "__MISSING__:Restricted", - "shownOf": "__MISSING__:{shown} of {total} shown", - "emptyFilterTitle": "__MISSING__:No keys match your filters", - "emptyFilterClear": "__MISSING__:Clear filters", - "endpointRestrictions": "Allowed Endpoints", - "allEndpointsAllowed": "This key can access all API endpoints.", - "endpointsRestricted": "Restricted to {count} endpoint{count, plural, one {} other {s}}." + "searchPlaceholder": "Пошук за назвою або токеном...", + "activeOnly": "Лише активні", + "filterStatus": "СТАН", + "filterType": "ТИП", + "filterAll": "Усі", + "filterStatusActive": "Активні", + "filterStatusDisabled": "Вимкнені", + "filterStatusBanned": "Заблоковані", + "filterStatusExpired": "Прострочені", + "filterTypeStandard": "Стандартні", + "filterTypeManage": "Керування", + "filterTypeRestricted": "Обмежені", + "shownOf": "Показано {shown} з {total}", + "emptyFilterTitle": "Жоден ключ не відповідає фільтрам", + "emptyFilterClear": "Очистити фільтри" }, "auditLog": { "title": "Журнал аудиту", @@ -1739,22 +1736,22 @@ "videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.", "musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI.", "kinds": { - "embedding": "__MISSING__:Embedding", - "image": "__MISSING__:Image", - "imageToText": "__MISSING__:Image to Text", - "tts": "__MISSING__:Text to Speech", - "stt": "__MISSING__:Speech to Text", - "webSearch": "__MISSING__:Web Search", + "embedding": "Вбудовування", + "image": "Зображення", + "imageToText": "Зображення → текст", + "tts": "Текст → мова", + "stt": "Мова → текст", + "webSearch": "Веб-пошук", "webFetch": "__MISSING__:Web Fetch", - "video": "__MISSING__:Video", - "music": "__MISSING__:Music" + "video": "Відео", + "music": "Музика" }, - "noProviders": "__MISSING__:No providers configured for this kind yet.", - "addConnection": "__MISSING__:Add Connection", - "backToProviders": "__MISSING__:Back to Providers", - "connections": "__MISSING__:{count} Connections", - "noConnections": "__MISSING__:No connections yet — add one from the provider page.", - "loading": "__MISSING__:Loading..." + "noProviders": "Поки що немає налаштованих провайдерів цього типу.", + "addConnection": "Додати з'єднання", + "backToProviders": "Назад до провайдерів", + "connections": "{count} з'єднань", + "noConnections": "З'єднань ще немає — додайте з боку сторінки провайдера.", + "loading": "Завантаження..." }, "search": { "searchQuery": "Search Query", @@ -2027,7 +2024,7 @@ "amp": "Use when you want Amp CLI routed through OmniRoute with stable shorthand aliases and OpenAI-compatible setup.", "qwen": "Use when you want Qwen Code CLI with OmniRoute-managed provider settings and multi-provider model access.", "hermes": "Використовуйте, коли вам потрібен легкий власний помічник зі штучним інтелектом для швидких завдань.", - "hermes-agent": "__MISSING__:Use when you need Hermes Agent (by Nousresearch) with default, delegation, vision and auxiliary models routed through OmniRoute.", + "hermes-agent": "Використовуйте, коли потрібен Hermes Agent (від Nousresearch) із моделями за замовчуванням, делегування, vision та допоміжними, маршрутизованими через OmniRoute.", "custom": "Використовуйте для реалізації спеціальних інструментів або загальних конфігурацій, сумісних з OpenAI." }, "toolDescriptions": { @@ -2047,7 +2044,7 @@ "qwen": "Alibaba Qwen Code CLI", "amp": "Sourcegraph Amp coding assistant CLI", "hermes": "Hermes AI Terminal Assistant", - "hermes-agent": "__MISSING__:Hermes Agent (by Nousresearch) - Advanced terminal AI with multi-model support (delegation, vision, compression, etc.)", + "hermes-agent": "Hermes Agent (від Nousresearch) — просунутий термінальний AI з підтримкою мультимоделей (делегування, vision, стиснення тощо)", "custom": "Generic OpenAI-сумісний CLI або SDK генератор конфігурації" }, "guides": { @@ -2394,9 +2391,9 @@ "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", + "usageGuideHide": "Приховати", + "usageGuideDontShowAgain": "Більше не показувати", + "usageGuideShow": "Показати інструкцію", "quickTestTitle": "Combo ready to validate", "quickTestDescription": "Run a test now to confirm fallback and latency behavior.", "testNow": "Test now", @@ -2409,9 +2406,9 @@ "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.", - "filterAll": "All", - "filterIntelligent": "Intelligent", - "filterDeterministic": "Deterministic", + "filterAll": "Усі", + "filterIntelligent": "Інтелектуальні", + "filterDeterministic": "Детерміновані", "filterEmptyTitle": "No combos match this strategy filter.", "filterEmptyIntelligentDescription": "Create an auto or LKGP combo to populate the intelligent routing dashboard.", "filterEmptyDeterministicDescription": "Only auto and LKGP combos exist right now. Switch back to All or create a deterministic combo.", @@ -2434,17 +2431,17 @@ "recommendationsApplied": "Recommendations applied to this combo.", "intelligentPanelTitle": "Intelligent Routing Dashboard", "intelligentPanelDesc": "Real-time scoring and health status for this auto-routing combo.", - "configOnlyStatus": "__MISSING__:Configuration View", - "configOnlyHint": "__MISSING__:This panel shows routing inputs only. Live breaker state is available on the Health page.", - "routingInputs": "__MISSING__:Routing Inputs", - "routingInputsHint": "__MISSING__:Mode pack and weighting stay here; breaker runtime state stays on the Health page.", - "emailVisibilityHint": "__MISSING__:Account emails here follow the global privacy toggle.", - "emailVisibilityTooltip": "__MISSING__:Use the eye icon to reveal or hide account emails globally across combos, providers and quota screens.", - "manualModel": "__MISSING__:Manual model", - "manualModelInvalid": "__MISSING__:Enter a model as provider/model.", - "manualModelUnknownProvider": "__MISSING__:Unknown provider prefix.", - "builderDynamicAccountShort": "__MISSING__:Dynamic account", - "builderNeedValidName": "__MISSING__:Define a valid combo name before continuing.", + "configOnlyStatus": "Перегляд конфігурації", + "configOnlyHint": "Ця панель показує лише вхідні дані маршрутизації. Стан запобіжника в реальному часі доступний на сторінці Стан системи.", + "routingInputs": "Параметри маршрутизації", + "routingInputsHint": "Режим і ваги залишаються тут; стан запобіжника в реальному часі — на сторінці Стан системи.", + "emailVisibilityHint": "Адреси акаунтів тут підпорядковуються глобальному перемикачу приватності.", + "emailVisibilityTooltip": "Використовуйте піктограму ока, щоб глобально показувати або приховувати адреси акаунтів у комбо, провайдерах і квотах.", + "manualModel": "Модель вручну", + "manualModelInvalid": "Введіть модель у форматі провайдер/модель.", + "manualModelUnknownProvider": "Невідомий префікс провайдера.", + "builderDynamicAccountShort": "Динамічний акаунт", + "builderNeedValidName": "Введіть коректну назву комбо перед продовженням.", "statusOverview": "Status Overview", "normalOperation": "Normal Operation", "allProvidersHealthy": "Providers are reporting healthy routing conditions.", @@ -2587,18 +2584,18 @@ "autoDesc": "Self-healing smart routing pool (Performance optimized)", "lkgp": "LKGP Mode", "lkgpDesc": "Last Known Good Provider (Predictable resilience)", - "wizardGuideTitle": "Getting Started with Combos", - "wizardGuideDesc": "Create model combos to route AI traffic intelligently", - "wizardGuideHint": "or click + Create Combo above", - "createFirstCombo": "Create Your First Combo", - "wizardStep1Title": "Name Your Combo", - "wizardStep1Desc": "Give your combo a unique name to identify it in routing rules", - "wizardStep2Title": "Add Models", - "wizardStep2Desc": "Select AI models and arrange their fallback priority order", - "wizardStep3Title": "Choose Strategy", + "wizardGuideTitle": "Початок роботи з Комбо", + "wizardGuideDesc": "Створіть комбінації моделей для розумної маршрутизації AI-трафіку", + "wizardGuideHint": "або натисніть + Створити комбо вище", + "createFirstCombo": "Створити перше комбо", + "wizardStep1Title": "Назвіть комбо", + "wizardStep1Desc": "Дайте комбо унікальну назву для ідентифікації в правилах маршрутизації", + "wizardStep2Title": "Додайте моделі", + "wizardStep2Desc": "Виберіть AI-моделі та задайте порядок резервного перемикання", + "wizardStep3Title": "Виберіть стратегію", "wizardStep3Desc": "Pick how requests are distributed across your models - 13 strategies available", - "wizardStep4Title": "Review & Save", - "wizardStep4Desc": "Review your configuration and activate the combo", + "wizardStep4Title": "Перевірте та збережіть", + "wizardStep4Desc": "Перегляньте конфігурацію та активуйте комбо", "emailVisibilityStateOn": "On", "emailVisibilityStateOff": "Off", "reorderHandle": "Drag to reorder", @@ -2755,7 +2752,7 @@ "currentPeriod": "Поточна половина", "exportCSV": "Експортувати як CSV", "exportJSON": "Експорт як JSON", - "legacyFreeLabel": "__MISSING__:Legacy / Free", + "legacyFreeLabel": "Застаріле / безкоштовне", "costExplorerTitle": "Оглядач витрат", "costExplorerDescription": "Переглядайте витрати за постачальником, моделлю, ключем API, обліковим записом або рівнем сервісу.", "groupProvider": "Постачальник", @@ -2766,11 +2763,11 @@ "serviceTierFast": "__MISSING__:Fast", "serviceTierFlex": "__MISSING__:Flex", "serviceTierStandard": "__MISSING__:Standard", - "serviceTierBreakdownTitle": "__MISSING__:Service Tier", - "serviceTierBreakdownSubtitle": "__MISSING__:Fast / Flex / Standard split", - "serviceTierUsageSaved": "__MISSING__:usage saved", - "serviceTierCostSaved": "__MISSING__:saved", - "serviceTierCostShareSuffix": "__MISSING__:of cost", + "serviceTierBreakdownTitle": "Рівень сервісу", + "serviceTierBreakdownSubtitle": "Розподіл Fast / Flex / Standard", + "serviceTierUsageSaved": "збережено використання", + "serviceTierCostSaved": "заощаджено", + "serviceTierCostShareSuffix": "від вартості", "dimension": "Вимір", "share": "Частка", "legacyOrFree": "Застаріле / безкоштовне", @@ -2983,16 +2980,16 @@ "localServer": "Локальний сервер", "cloudOmniroute": "Cloud OmniRoute", "copyUrl": "Копіювати URL", - "badgeLoopbackTooltip": "__MISSING__:This endpoint is only accessible locally (loopback only)", - "badgeAlwaysProtectedTooltip": "__MISSING__:This endpoint is always protected and requires authorization", - "badgeInternalTooltip": "__MISSING__:This is an internal system endpoint", - "tierAll": "__MISSING__:All", - "tierAuth": "__MISSING__:Authenticated", + "badgeLoopbackTooltip": "Цей ендпоінт доступний лише локально (loopback)", + "badgeAlwaysProtectedTooltip": "Цей ендпоінт завжди захищений і потребує авторизації", + "badgeInternalTooltip": "Це внутрішній системний ендпоінт", + "tierAll": "Усі", + "tierAuth": "З автентифікацією", "tierLoopback": "__MISSING__:Loopback", - "tierAlwaysProtected": "__MISSING__:Always Protected", - "tierPublic": "__MISSING__:Public", - "hideInternal": "__MISSING__:Hide Internal", - "showInternal": "__MISSING__:Show Internal" + "tierAlwaysProtected": "Завжди захищені", + "tierPublic": "Публічні", + "hideInternal": "Приховати внутрішні", + "showInternal": "Показати внутрішні" }, "endpoints": { "tabProxy": "Endpoint Proxy", @@ -3022,20 +3019,20 @@ "processStatus": "Статус процесу", "online": "Онлайн", "offline": "Офлайн", - "disableLabel": "__MISSING__:Disable {label}", - "enableLabel": "__MISSING__:Enable {label}", - "transportMode": "__MISSING__:Transport Mode", - "transportStdioDesc": "__MISSING__:Local — IDE spawns process via omniroute --mcp", - "transportSseDesc": "__MISSING__:Remote — Server-Sent Events over HTTP", - "transportStreamableHttpDesc": "__MISSING__:Remote — Modern bidirectional HTTP", - "copy": "__MISSING__:Copy", + "disableLabel": "Вимкнути {label}", + "enableLabel": "Увімкнути {label}", + "transportMode": "Режим транспорту", + "transportStdioDesc": "Локально — IDE запускає процес через omniroute --mcp", + "transportSseDesc": "Віддалено — Server-Sent Events через HTTP", + "transportStreamableHttpDesc": "Віддалено — сучасний двонаправлений HTTP", + "copy": "Копіювати", "mcpDashboardCopyUrl": "Копіювати URL", - "mcpDisabledTitle": "__MISSING__:MCP is disabled", - "mcpDisabledDesc": "__MISSING__:Enable MCP above to configure transport mode and view server telemetry.", - "mcpIntro": "__MISSING__:Model Context Protocol — {tools} tools across {scopes} scopes, {transports} transports (stdio / SSE / Streamable HTTP).", - "mcpStep1": "__MISSING__:Run via {code}", - "mcpStep2": "__MISSING__:Configure your MCP client to connect over stdio transport.", - "mcpStep3": "__MISSING__:Invoke tools like {code1} and {code2}.", + "mcpDisabledTitle": "MCP вимкнено", + "mcpDisabledDesc": "Увімкніть MCP вище, щоб налаштувати транспорт і переглядати телеметрію сервера.", + "mcpIntro": "Model Context Protocol — {tools} інструментів у {scopes} областях, {transports} транспортів (stdio / SSE / Streamable HTTP).", + "mcpStep1": "Запустіть через {code}", + "mcpStep2": "Налаштуйте свого MCP-клієнта на з'єднання через stdio.", + "mcpStep3": "Викликайте інструменти, як-от {code1} та {code2}.", "pid": "PID", "sessionUptime": "Час роботи сесії", "lastHeartbeat": "Останній удар серця", @@ -3156,16 +3153,16 @@ "rpcMethodGet": "завдань / одерж", "rpcMethodCancel": "завдань/скас", "serviceLabel": "A2A", - "online": "__MISSING__:Online", - "offline": "__MISSING__:Offline", - "disableLabel": "__MISSING__:Disable {label}", - "enableLabel": "__MISSING__:Enable {label}", - "a2aDisabledTitle": "__MISSING__:A2A is disabled", - "a2aDisabledDesc": "__MISSING__:Enable A2A above to view task telemetry, agent details, and validation tools.", - "a2aIntro": "__MISSING__:Agent2Agent JSON-RPC 2.0 endpoint — send tasks, stream responses, cancel in-flight jobs.", - "a2aStep1": "__MISSING__:Discover the agent card at {code}.", - "a2aStep2": "__MISSING__:Send JSON-RPC to {code1} using {code2} or {code3}.", - "a2aStep3": "__MISSING__:Track and cancel tasks with {code1} and {code2}." + "online": "Онлайн", + "offline": "Офлайн", + "disableLabel": "Вимкнути {label}", + "enableLabel": "Увімкнути {label}", + "a2aDisabledTitle": "A2A вимкнено", + "a2aDisabledDesc": "Увімкніть A2A вище, щоб переглядати телеметрію задач, деталі агентів і інструменти валідації.", + "a2aIntro": "Ендпоінт Agent2Agent JSON-RPC 2.0 — надсилайте задачі, отримуйте відповіді потоково, скасовуйте поточні завдання.", + "a2aStep1": "Знайдіть картку агента за {code}.", + "a2aStep2": "Надішліть JSON-RPC на {code1}, використовуючи {code2} або {code3}.", + "a2aStep3": "Відстежуйте та скасовуйте задачі за допомогою {code1} і {code2}." }, "memory": { "title": "Memory Management", @@ -3235,42 +3232,42 @@ "q": "Q", "filterSkillsPlaceholder": "Фільтруйте навички за назвою, описом або тегом", "allModes": "Всі режими", - "totalSkills": "__MISSING__:Total Skills", - "enabledSkills": "__MISSING__:Enabled", - "totalExecutions": "__MISSING__:Executions", - "successRate": "__MISSING__:Success Rate", - "marketplaceTab": "__MISSING__:Marketplace", - "applyFilters": "__MISSING__:Apply filters", - "popularDefaultsLabel": "__MISSING__:Popular by default for selected provider:", - "onMode": "__MISSING__:ON", - "offMode": "__MISSING__:OFF", - "autoMode": "__MISSING__:AUTO", - "installSkillButton": "__MISSING__:Install Skill", - "installSkillModalTitle": "__MISSING__:Install Skill", - "installJsonPlaceholder": "__MISSING__:Paste skill manifest JSON here...", - "installing": "__MISSING__:Installing...", - "installSuccess": "__MISSING__:Skill installed ({id})", - "installError": "__MISSING__:Install failed", - "invalidJson": "__MISSING__:Invalid JSON", - "searchMarketplacePlaceholder": "__MISSING__:Search skills...", - "searchMarketplace": "__MISSING__:Search Marketplace", - "marketplaceEmpty": "__MISSING__:No skills found in marketplace", - "marketplaceError": "__MISSING__:Search failed", - "installingFromMarketplace": "__MISSING__:Installing from marketplace...", - "popularSkills": "__MISSING__:Popular Skills", + "totalSkills": "Усього навичок", + "enabledSkills": "Увімкнено", + "totalExecutions": "Виконань", + "successRate": "Успішність", + "marketplaceTab": "Магазин", + "applyFilters": "Застосувати фільтри", + "popularDefaultsLabel": "Популярні за замовчуванням для вибраного провайдера:", + "onMode": "УВІМК.", + "offMode": "ВИМК.", + "autoMode": "АВТО", + "installSkillButton": "Встановити навичку", + "installSkillModalTitle": "Встановити навичку", + "installJsonPlaceholder": "Вставте JSON-маніфест навички сюди...", + "installing": "Встановлення...", + "installSuccess": "Навичку встановлено ({id})", + "installError": "Не вдалося встановити", + "invalidJson": "Некоректний JSON", + "searchMarketplacePlaceholder": "Пошук навичок...", + "searchMarketplace": "Пошук у магазині", + "marketplaceEmpty": "У магазині не знайдено навичок", + "marketplaceError": "Не вдалося виконати пошук", + "installingFromMarketplace": "Встановлення з магазину...", + "popularSkills": "Популярні навички", "skillsMarketplace": "Ринок навичок", - "searching": "__MISSING__:Searching...", - "pageInfo": "__MISSING__:Page {page} of {totalPages} ({total} total)", - "previous": "__MISSING__:Previous", - "next": "__MISSING__:Next", - "activeProvider": "__MISSING__:Active provider:", - "changeInSettings": "__MISSING__:Change this in Settings → Memory & Skills.", - "installs": "__MISSING__:installs", - "marketplaceSkillsMpHint": "__MISSING__:Configure your SkillsMP API key in Settings to browse the marketplace.", - "marketplaceSkillsShHint": "__MISSING__:Search the skills.sh open directory to discover and install agent skills.", - "installSkillModalDesc": "__MISSING__:Paste a skill manifest JSON or upload a .json file.", - "uploadJson": "__MISSING__:Upload JSON", - "cancel": "__MISSING__:Cancel", + "searching": "Пошук...", + "pageInfo": "Сторінка {page} з {totalPages} (усього {total})", + "previous": "Попередня", + "next": "Наступна", + "activeProvider": "Активний провайдер:", + "changeInSettings": "Змінити можна в Налаштування → Пам'ять і навички.", + "installs": "встановлень", + "marketplaceSkillsMpHint": "Налаштуйте свій SkillsMP API-ключ у Налаштуваннях, щоб переглядати магазин.", + "marketplaceSkillsShHint": "Шукайте у відкритому каталозі skills.sh, щоб знаходити й встановлювати навички агентів.", + "installSkillModalDesc": "Вставте JSON-маніфест навички або завантажте .json-файл.", + "uploadJson": "Завантажити JSON", + "cancel": "Скасувати", "installSkill": "Встановити навик" }, "health": { @@ -3358,35 +3355,35 @@ "noSessionQuotaMonitorsActive": "Немає активних моніторів квоти сеансу.", "gracefulDegradationStatus": "Витончений статус деградації", "additionalModels": "+{count} більше моделей", - "providerHealthMatrixTitle": "__MISSING__:Provider Health Matrix", - "providerHealthMatrixDescription": "__MISSING__:Provider × account × model states from breakers, cooldowns, lockouts and logs.", - "healthMatrixRange": "__MISSING__:Health matrix range", - "providerFilter": "__MISSING__:Provider filter", - "onlyIssues": "__MISSING__:Only issues", - "refresh": "__MISSING__:Refresh", - "accounts": "__MISSING__:Accounts", - "models": "__MISSING__:Models", - "issues": "__MISSING__:Issues", - "loadingProviderHealthMatrix": "__MISSING__:Loading provider health matrix...", - "failedProviderHealthMatrix": "__MISSING__:Failed to load Provider Health Matrix: {error}", - "noProvidersMatchedFilters": "__MISSING__:No providers matched the current filters.", - "modelPillSummary": "__MISSING__:{requests} req · {successRate} success · {latency} avg", - "modelLockoutSummary": "__MISSING__:{reason} · {duration} left", - "locked": "__MISSING__:locked", - "inferred": "__MISSING__:inferred", - "inactive": "__MISSING__:Inactive", - "noConnectionId": "__MISSING__:no connection id", - "accountModelSummary": "__MISSING__:{connectionId} · {count} models", - "cooldown": "__MISSING__:cooldown", - "durationRemaining": "__MISSING__:{duration} remaining", - "noSyncedModelsOrTraffic": "__MISSING__:No synced models or recent traffic yet.", - "providerRowSummary": "__MISSING__:{active}/{total} active accounts · {requests} req · {successRate} success · {latency} avg", - "cooldownCount": "__MISSING__:{count} cooldown", - "lockoutCount": "__MISSING__:{count} lockouts", - "issueCount": "__MISSING__:{count} issues", - "score": "__MISSING__:Score", - "lastRequest": "__MISSING__:Last request", - "lastError": "__MISSING__:Last error" + "providerHealthMatrixTitle": "Матриця стану провайдерів", + "providerHealthMatrixDescription": "Стани провайдер × акаунт × модель за запобіжниками, охолодженнями, блокуваннями та логами.", + "healthMatrixRange": "Діапазон матриці стану", + "providerFilter": "Фільтр провайдерів", + "onlyIssues": "Лише проблеми", + "refresh": "Оновити", + "accounts": "Акаунти", + "models": "Моделі", + "issues": "Проблеми", + "loadingProviderHealthMatrix": "Завантаження матриці стану провайдерів...", + "failedProviderHealthMatrix": "Не вдалося завантажити матрицю стану провайдерів: {error}", + "noProvidersMatchedFilters": "Жоден провайдер не відповідає поточним фільтрам.", + "modelPillSummary": "{requests} запитів · {successRate} успіх · {latency} середньо", + "modelLockoutSummary": "{reason} · залишилось {duration}", + "locked": "заблоковано", + "inferred": "виведено", + "inactive": "Неактивний", + "noConnectionId": "немає ID з'єднання", + "accountModelSummary": "{connectionId} · {count} моделей", + "cooldown": "охолодження", + "durationRemaining": "залишилось {duration}", + "noSyncedModelsOrTraffic": "Поки немає синхронізованих моделей або нещодавнього трафіку.", + "providerRowSummary": "{active}/{total} активних акаунтів · {requests} запитів · {successRate} успіх · {latency} середньо", + "cooldownCount": "{count} охолодження", + "lockoutCount": "{count} блокувань", + "issueCount": "{count} проблем", + "score": "Оцінка", + "lastRequest": "Останній запит", + "lastError": "Остання помилка" }, "telemetry": { "title": "Системна телеметрія", @@ -3514,15 +3511,15 @@ "provider": "Provider", "account": "Account", "elapsed": "Elapsed", - "activeStage": "__MISSING__:Stage", - "activeStageUnknown": "__MISSING__:Not sent to upstream yet", - "activeStageRegistered": "__MISSING__:Registered", - "activeStagePayloadPrepared": "__MISSING__:Payload prepared", - "activeStageWaitingAccountSlot": "__MISSING__:Waiting for account slot", - "activeStageWaitingRateLimit": "__MISSING__:Waiting for rate limiter", - "activeStageRateLimitSlotAcquired": "__MISSING__:Rate limit slot acquired", - "activeStageSendingToProvider": "__MISSING__:Sending to upstream", - "activeStageProviderResponseStarted": "__MISSING__:Upstream response started", + "activeStage": "Етап", + "activeStageUnknown": "Ще не надіслано до провайдера", + "activeStageRegistered": "Зареєстровано", + "activeStagePayloadPrepared": "Корисне навантаження підготовлено", + "activeStageWaitingAccountSlot": "Очікування слота акаунта", + "activeStageWaitingRateLimit": "Очікування обмежувача швидкості", + "activeStageRateLimitSlotAcquired": "Слот обмеження швидкості отримано", + "activeStageSendingToProvider": "Надсилання до провайдера", + "activeStageProviderResponseStarted": "Відповідь провайдера почала надходити", "count": "Count", "payloads": "Payloads", "viewPayloads": "View", @@ -3647,26 +3644,26 @@ "errorCountNoCode": "{count} Помилка", "warningCount": "{count} Попередження", "noConnections": "Жодних зв'язків", - "expiredBadge": "Expired", - "expiringSoonBadge": "Expiring Soon", + "expiredBadge": "Прострочено", + "expiringSoonBadge": "Скоро закінчиться", "freeTier": "Вільний рівень", "freeTierAvailable": "Доступний безкоштовний рівень", - "hasFreeTooltip": "__MISSING__:Free tier available", - "noAuthLabel": "__MISSING__:No Auth", - "noAuthProviders": "__MISSING__:No Auth Providers", - "upstreamProxyLabel": "__MISSING__:Upstream Proxy", - "freeAggregated": "__MISSING__:All providers with free tier (also shown in their native category)", + "hasFreeTooltip": "Доступний безкоштовний рівень", + "noAuthLabel": "Без автентифікації", + "noAuthProviders": "Провайдери без автентифікації", + "upstreamProxyLabel": "Висхідний проксі", + "freeAggregated": "Усі провайдери з безкоштовним рівнем (також показані у своїй рідній категорії)", "deprecated": "Застаріле", "deprecatedProvider": "Цей постачальник більше не підтримується", "riskNotice": { - "title": "__MISSING__:Before continuing", - "tooltip": "__MISSING__:Provider with usage caveats — click for details", - "oauth": "__MISSING__:This provider uses your official product session/OAuth, which is not authorized for proxy/router use.\n\nWe don't recommend intensive autonomous agent usage (OpenCloud-style, long multi-step flows, large batches) — the upstream may react by restricting or banning the account.\n\nUse at your own risk.", - "webCookie": "__MISSING__:This provider authenticates through your web session cookies. The upstream service may invalidate the session at any time, requiring you to log in again. Not recommended for long unattended operations.\n\nUse at your own risk.", - "deprecated": "__MISSING__:This provider was discontinued by its upstream and may stop working without notice. Existing connections may continue working until the upstream fully removes access. Consider alternatives.", - "dontShowAgain": "__MISSING__:Don't show this again for this provider", - "understand": "__MISSING__:I understand, continue", - "cancel": "__MISSING__:Cancel" + "title": "Перед тим, як продовжити", + "tooltip": "Провайдер із застереженнями щодо використання — натисніть для подробиць", + "oauth": "Цей провайдер використовує вашу офіційну продуктову сесію/OAuth, які не авторизовані для використання у проксі/маршрутизаторі.\n\nМи не рекомендуємо інтенсивне автономне використання агентами (стиль OpenCloud, довгі багатокрокові потоки, великі пакети) — провайдер може у відповідь обмежити або заблокувати акаунт.\n\nВикористовуйте на власний ризик.", + "webCookie": "Цей провайдер автентифікується через cookie вашої веб-сесії. Сервіс може в будь-який момент анулювати сесію, що вимагатиме повторного входу. Не рекомендовано для довгих автоматизованих операцій.\n\nВикористовуйте на власний ризик.", + "deprecated": "Цей провайдер припинено сервісом і він може перестати працювати без попередження. Існуючі з'єднання можуть продовжувати працювати, поки сервіс остаточно не закриє доступ. Розгляньте альтернативи.", + "dontShowAgain": "Більше не показувати для цього провайдера", + "understand": "Я розумію, продовжити", + "cancel": "Скасувати" }, "disabled": "Вимкнено", "enableProvider": "Увімкнути провайдера", @@ -3701,7 +3698,7 @@ "failedCreate": "Не вдалося створити постачальника", "errorOccurred": "Сталася помилка. Спробуйте ще раз.", "modelStatus": "Статус моделі", - "showConfiguredOnly": "Configured only", + "showConfiguredOnly": "Лише налаштовані", "allModelsOperational": "Всі моделі робочі", "modelsWithIssues": "{count} моделі з проблемами", "allModelsNormal": "Усі моделі реагують нормально.", @@ -3754,7 +3751,7 @@ "openaiCompatibleDetails": "Відомості про сумісність з OpenAI", "messagesApi": "API повідомлень", "responsesApi": "API відповідей", - "embeddings": "Embeddings", + "embeddings": "Вбудовування", "audioTranscriptions": "Audio Transcriptions", "audioSpeech": "Audio Speech", "imagesGenerations": "Images Generations", @@ -4151,7 +4148,7 @@ "codexWeeklyToggleTitle": "Codex Weekly Toggle Title", "compatUpstreamHeaderNamePlaceholder": "Compat Upstream Header Name Placeholder", "compatUpstreamHeaderValuePlaceholder": "Compat Upstream Header Value Placeholder", - "compatible": "Compatible", + "compatible": "Сумісні", "configuredCount": "Configured Count", "consoleApiKeyOracleHint": "Console Api Key Oracle Hint", "consoleApiKeyOracleLabel": "Console Api Key Oracle Label", @@ -4188,11 +4185,11 @@ "geminiCliProjectIdLabel": "Ідентифікатор проекту Google Cloud", "geminiCliProjectIdPlaceholder": "мій-gcp-ідентифікатор-проекту", "antigravityProjectIdHint": "Додаткове перевизначення для запитів на код Antigravity Cloud. Залиште поле порожнім, щоб використовувати проект, виявлений під час Google OAuth.", - "antigravityClientProfileLabel": "__MISSING__:Client profile", - "antigravityClientProfileHint": "__MISSING__:Choose which Antigravity client identity OmniRoute presents to the API.", + "antigravityClientProfileLabel": "Профіль клієнта", + "antigravityClientProfileHint": "Виберіть, яку клієнтську ідентичність Antigravity OmniRoute представляє API.", "antigravityClientProfileIde": "__MISSING__:IDE", "antigravityClientProfileHarness": "__MISSING__:Harness / CLI", - "codexFastTierActiveChip": "__MISSING__:Codex Fast tier is active", + "codexFastTierActiveChip": "Codex Fast tier активний", "tierFast": "__MISSING__:Fast", "antigravityProjectIdLabel": "Ідентифікатор проекту Google Cloud", "antigravityProjectIdPlaceholder": "мій-gcp-ідентифікатор-проекту", @@ -4292,24 +4289,24 @@ "providerDetailMyClaudeAccountPlaceholder": "Мій обліковий запис Клода", "providerDetailPathAutoDetected": "Шлях визначається автоматично для кожної ОС (Linux/Mac).", "webFetch": "__MISSING__:Web Fetch", - "webFetchTooltip": "__MISSING__:Providers that extract content from web URLs (HTML → Markdown, scrape, screenshot)", - "webFetchProvidersHeading": "__MISSING__:Web Fetch Providers", - "compatibleProvidersDesc": "__MISSING__:OpenAI-compatible and Anthropic-compatible endpoints you host or configure. Point any OpenAI SDK to your own URL and route requests here.", - "oauthProvidersDesc": "__MISSING__:Providers authenticated via OAuth — sign in once and OmniRoute handles token rotation automatically.", + "webFetchTooltip": "Провайдери, що отримують вміст із веб-URL (HTML → Markdown, парсинг, скріншоти)", + "webFetchProvidersHeading": "Провайдери Web Fetch", + "compatibleProvidersDesc": "OpenAI-сумісні та Anthropic-сумісні ендпоінти, які ви хостите або налаштовуєте. Спрямуйте будь-який OpenAI SDK на свій URL і маршрутизуйте запити сюди.", + "oauthProvidersDesc": "Провайдери з автентифікацією через OAuth — увійдіть один раз, OmniRoute автоматично обертатиме токени.", "webCookieProvidersDesc": "Ці постачальники використовують веб-сеанси браузера, файли cookie або веб-токени замість ключів API. Відкрийте постачальника, щоб додати необхідні облікові дані сеансу.", - "apiKeyProvidersDesc": "__MISSING__:Standard API key providers. Add your key once and OmniRoute routes, retries, and rate-limits on your behalf.", - "noAuthProvidersDesc": "__MISSING__:Open endpoints that require no credentials — ready to use immediately without any sign-up.", - "upstreamProxyProvidersDesc": "__MISSING__:Route outbound traffic through an upstream proxy before it reaches the provider. Useful for corporate networks or traffic inspection.", - "webFetchProvidersDesc": "__MISSING__:Providers that fetch and extract content from web URLs. Use them to ground prompts with live web data.", - "aggregatorsGatewaysDesc": "__MISSING__:Multi-provider aggregators and AI gateways that expose a single unified API across dozens of underlying models.", - "enterpriseCloudDesc": "__MISSING__:Enterprise-tier and cloud-hosted models with enhanced SLAs, compliance certifications, and dedicated capacity.", - "cloudAgentProvidersDesc": "__MISSING__:Autonomous cloud agents that execute long-running tasks with plan approval and live status tracking.", - "localProvidersDesc": "__MISSING__:Self-hosted models running on your own hardware. No data leaves your infrastructure.", - "searchProvidersDesc": "__MISSING__:Web and document search providers. Attach them to LLM calls for Retrieval-Augmented Generation.", - "audioProvidersDesc": "__MISSING__:Text-to-speech and speech-to-text providers for voice I/O and audio transcription pipelines.", - "embeddingRerankProvidersDesc": "__MISSING__:Vector embedding and reranking providers for semantic search, RAG pipelines, and similarity scoring.", - "imageProvidersDesc": "__MISSING__:Image generation and vision providers — create images from text or analyse existing ones.", - "videoProvidersDesc": "__MISSING__:Video generation providers. Create short video clips from text prompts or images.", + "apiKeyProvidersDesc": "Стандартні провайдери з API-ключами. Додайте ключ один раз, OmniRoute сам маршрутизує, повторює запити та контролює ліміти.", + "noAuthProvidersDesc": "Відкриті ендпоінти без облікових даних — готові до використання одразу, без реєстрації.", + "upstreamProxyProvidersDesc": "Спрямовуйте вихідний трафік через висхідний проксі перед тим, як він досягне провайдера. Корисно для корпоративних мереж або інспекції трафіку.", + "webFetchProvidersDesc": "Провайдери, що отримують і витягують вміст із веб-URL. Використовуйте їх, щоб збагатити промпти даними з вебу в реальному часі.", + "aggregatorsGatewaysDesc": "Мультипровайдерські агрегатори та AI-шлюзи з єдиним уніфікованим API для десятків моделей.", + "enterpriseCloudDesc": "Корпоративні та хмарні моделі з розширеними SLA, сертифікацією відповідності та виділеними потужностями.", + "cloudAgentProvidersDesc": "Автономні хмарні агенти, які виконують довготривалі задачі з підтвердженням плану та відстеженням статусу в реальному часі.", + "localProvidersDesc": "Самостійно розгорнуті моделі на вашому обладнанні. Дані не залишають вашу інфраструктуру.", + "searchProvidersDesc": "Провайдери веб- і документного пошуку. Підключіть їх до LLM-викликів для retrieval-augmented generation.", + "audioProvidersDesc": "Провайдери TTS і STT для голосового вводу/виводу та транскрипції аудіо.", + "embeddingRerankProvidersDesc": "Провайдери векторних вбудовувань і переранжування для семантичного пошуку, RAG-конвеєрів та оцінювання схожості.", + "imageProvidersDesc": "Провайдери генерації та аналізу зображень — створюйте зображення з тексту або аналізуйте наявні.", + "videoProvidersDesc": "Провайдери генерації відео. Створюйте короткі відеокліпи з текстових промптів або зображень.", "onboardingWizard": "Майстер адаптації постачальника", "onboardingWizardShort": "Майстер адаптації", "onboardingWizardDescription": "Підключіть постачальників ключів API, настроюваної сумісності та OAuth із перевіркою, стійкістю та негайним тестом з’єднання.", @@ -4412,64 +4409,64 @@ "cache": "Кеш", "resilience": "Стійкість", "routingSettingsIntro": "Контролює, як ваші запити маршрутизуються, перетворюються та надсилаються постачальникам AI.", - "routingOpDropParagraphContainsLabel": "__MISSING__:Drop paragraph (contains)", - "routingOpDropParagraphStartsWithLabel": "__MISSING__:Drop paragraph (starts with)", - "routingOpReplaceTextLabel": "__MISSING__:Replace text", - "routingOpReplaceRegexLabel": "__MISSING__:Replace regex", - "routingOpDropBlockContainsLabel": "__MISSING__:Drop block (contains)", - "routingOpPrependSystemBlockLabel": "__MISSING__:Prepend system block", - "routingOpAppendSystemBlockLabel": "__MISSING__:Append system block", - "routingOpInjectBillingHeaderLabel": "__MISSING__:Inject billing header", - "routingOpObfuscateWordsLabel": "__MISSING__:Obfuscate words (ZWJ)", - "routingOpDropParagraphContainsDesc": "__MISSING__:Removes any paragraph (text block split on blank lines) inside the system prompt whose text contains ANY of the listed substrings. Use to strip third-party client fingerprints like 'github.com/anomalyco/opencode' or 'docs.openwebui.com' that Anthropic's classifier flags.", - "routingOpDropParagraphStartsWithDesc": "__MISSING__:Removes any paragraph that STARTS WITH one of the listed prefixes. Use for identity lines like 'You are OpenCode' or 'You are Open WebUI' that announce the calling client.", - "routingOpReplaceTextDesc": "__MISSING__:Replaces a literal substring with another literal substring. Use for known trigger phrases — e.g. rewrite 'Here is some useful information about the environment you are running in:' to 'Environment context you are running in:' (an empirically-validated trigger phrase).", - "routingOpReplaceRegexDesc": "__MISSING__:Replaces text matching a regular expression. Use when you need patterns (character classes, optional whitespace, anchors) instead of literal substrings. A malformed pattern is caught at runtime when the op runs.", - "routingOpDropBlockContainsDesc": "__MISSING__:Removes ENTIRE system blocks (not just paragraphs) whose text contains any of the listed substrings. Use when a whole block is fingerprint-bearing and you want it gone — e.g. an injected MCP-server description.", - "routingOpPrependSystemBlockDesc": "__MISSING__:Inserts a new text block at the FRONT of the system array. Use to add the SDK identity 'You are a Claude agent, built on Anthropic's Claude Agent SDK.' that Anthropic's classifier expects.", - "routingOpAppendSystemBlockDesc": "__MISSING__:Inserts a new text block at the END of the system array. Use for cosmetic additions that don't need to be at position [0].", - "routingOpInjectBillingHeaderDesc": "__MISSING__:Prepends the special 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;' text block that Anthropic's classifier validates. Required for CC bridge relay endpoints; for the native claude provider OmniRoute already injects its own billing line so this op is usually redundant there.", - "routingOpObfuscateWordsDesc": "__MISSING__:Inserts a Zero-Width-Joiner character after the first letter of each listed word, so 'opencode' becomes 'o‍pencode'. Reads identical to humans but bypasses classifier word matches. Targets system blocks, user/assistant messages, and tool descriptions.", - "routingNeedlesHint": "__MISSING__:List of substrings. A paragraph matches if it contains ANY one of them. Add one per line via 'Add entry'.", - "routingPrefixesHint": "__MISSING__:List of strings. A paragraph matches if it starts with any one of them (leading whitespace is trimmed before matching).", - "routingCaseSensitiveHint": "__MISSING__:When ON, 'OpenCode' and 'opencode' are different strings. When OFF (default), the comparison ignores case.", - "routingMatchLiteralHint": "__MISSING__:Exact literal substring to find. No regex syntax — special chars like . * ? are treated as themselves.", - "routingReplacementTextHint": "__MISSING__:Replacement string. Leave blank to delete the match. The output preserves surrounding text.", - "routingAllOccurrencesHint": "__MISSING__:When ON (default), every instance is replaced. When OFF, only the first match is replaced.", - "routingPatternHint": "__MISSING__:JavaScript regex source. Don't wrap in slashes — just 'foo(.*)bar'. Server rejects patterns that fail to compile.", - "routingRegexFlagsHint": "__MISSING__:JavaScript regex flags (g = all matches, i = case-insensitive, s = dot matches newline, m = multiline). Default 'g'.", - "routingBlockTextHint": "__MISSING__:Full text of the new system block. Use a literal string; the system block stores text only.", - "routingIdempotencyKeyHint": "__MISSING__:Optional. If set, the op skips when a block whose text starts with this key is already present. Prevents double-prepend on retries.", - "routingBillingEntrypointHint": "__MISSING__:Value injected as 'cc_entrypoint='. Anthropic accepts 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI), or other documented values.", - "routingBillingVersionFormatHint": "__MISSING__:How the 3-char build hash after cc_version= is computed. 'ex-machina' = sha256 of CCH_SALT+chars-from-first-user-msg+version (per-message). 'omniroute-daystamp' = sha256 of YYYY-MM-DD+version (stable per-day).", - "routingBillingCchAlgoHint": "__MISSING__:How the 5-char cch= token is computed. 'sha256-first-user' = sha256 of first user message text. 'xxhash64-body' = body-level signing fills it later. 'static-zero' = literal '00000' placeholder.", - "routingObfuscateWordsHint": "__MISSING__:Lowercase words to obfuscate. ZWJ insertion is applied case-insensitively, so 'opencode' also matches 'OpenCode' and 'OPENCODE'.", - "routingObfuscateTargetsHint": "__MISSING__:Which body regions to scan for the words: system blocks, user/assistant messages, and/or tool descriptions.", - "routingObfuscateTargetsLabel": "__MISSING__:Targets", - "routingSummarizeDropParagraphContains": "__MISSING__:drop paragraphs containing: {items}", - "routingSummarizeDropParagraphStartsWith": "__MISSING__:drop paragraphs starting with: {items}", - "routingSummarizeReplaceText": "__MISSING__:replace \"{match}\" → \"{replacement}\"", + "routingOpDropParagraphContainsLabel": "Видалити абзац (містить)", + "routingOpDropParagraphStartsWithLabel": "Видалити абзац (починається з)", + "routingOpReplaceTextLabel": "Замінити текст", + "routingOpReplaceRegexLabel": "Замінити за regex", + "routingOpDropBlockContainsLabel": "Видалити блок (містить)", + "routingOpPrependSystemBlockLabel": "Додати системний блок на початок", + "routingOpAppendSystemBlockLabel": "Додати системний блок у кінець", + "routingOpInjectBillingHeaderLabel": "Вставити billing-заголовок", + "routingOpObfuscateWordsLabel": "Обфускувати слова (ZWJ)", + "routingOpDropParagraphContainsDesc": "Видаляє будь-який абзац (текстовий блок, розділений порожніми рядками) у системному промпті, текст якого містить БУДЬ-ЯКИЙ з перелічених підрядків. Використовуйте для видалення відбитків сторонніх клієнтів, як-от 'github.com/anomalyco/opencode' чи 'docs.openwebui.com', які класифікатор Anthropic позначає як підозрілі.", + "routingOpDropParagraphStartsWithDesc": "Видаляє будь-який абзац, що ПОЧИНАЄТЬСЯ З одного з перелічених префіксів. Використовуйте для рядків ідентифікації на кшталт 'You are OpenCode' або 'You are Open WebUI', які повідомляють про викликаючого клієнта.", + "routingOpReplaceTextDesc": "Заміняє літеральний підрядок іншим літеральним підрядком. Використовуйте для відомих тригер-фраз — напр., замініть 'Here is some useful information about the environment you are running in:' на 'Environment context you are running in:' (емпірично перевірена тригер-фраза).", + "routingOpReplaceRegexDesc": "Заміняє текст, що відповідає регулярному виразу. Використовуйте, коли потрібні шаблони (класи символів, опціональні пробіли, якорі), а не літеральні підрядки. Некоректний шаблон ловиться під час виконання операції.", + "routingOpDropBlockContainsDesc": "Видаляє ЦІЛІ системні блоки (не лише абзаци), текст яких містить будь-який з перелічених підрядків. Використовуйте, коли цілий блок є відбитком і ви хочете його прибрати — напр., вставлений опис MCP-сервера.", + "routingOpPrependSystemBlockDesc": "Вставляє новий текстовий блок на ПОЧАТОК масиву system. Використовуйте, щоб додати ідентичність SDK 'You are a Claude agent, built on Anthropic's Claude Agent SDK.', яку очікує класифікатор Anthropic.", + "routingOpAppendSystemBlockDesc": "Вставляє новий текстовий блок у КІНЕЦЬ масиву system. Використовуйте для косметичних доповнень, які не мають бути на позиції [0].", + "routingOpInjectBillingHeaderDesc": "Додає на початок спеціальний блок 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;', який валідує класифікатор Anthropic. Обов'язково для CC bridge relay-ендпоінтів; для рідного провайдера claude OmniRoute уже вставляє власний рядок billing, тож тут операція зазвичай зайва.", + "routingOpObfuscateWordsDesc": "Вставляє символ Zero-Width-Joiner після першої літери кожного перелічене слова, так що 'opencode' стає 'o‍pencode'. Для людей читається однаково, але обходить збіги слів класифікатора. Орієнтовано на системні блоки, повідомлення user/assistant і описи інструментів.", + "routingNeedlesHint": "Список підрядків. Абзац збігається, якщо містить БУДЬ-ЯКИЙ з них. Додавайте по одному через 'Додати запис'.", + "routingPrefixesHint": "Список рядків. Абзац збігається, якщо починається з будь-якого з них (провідні пробіли обрізаються перед порівнянням).", + "routingCaseSensitiveHint": "Коли УВІМКНЕНО, 'OpenCode' і 'opencode' — різні рядки. Коли ВИМКНЕНО (за замовчуванням), порівняння ігнорує регістр.", + "routingMatchLiteralHint": "Точний літеральний підрядок для пошуку. Без regex-синтаксису — спеціальні символи . * ? трактуються як самі себе.", + "routingReplacementTextHint": "Рядок-заміна. Залиште порожнім, щоб видалити збіг. Оточуючий текст зберігається.", + "routingAllOccurrencesHint": "Коли УВІМКНЕНО (за замовчуванням), заміняються всі входження. Коли ВИМКНЕНО, лише перший збіг.", + "routingPatternHint": "Джерело JavaScript-regex. Не загортайте у слеші — просто 'foo(.*)bar'. Сервер відхиляє шаблони, які не компілюються.", + "routingRegexFlagsHint": "Прапорці JavaScript-regex (g = усі збіги, i = без врахування регістру, s = крапка збігає newline, m = багаторядково). За замовчуванням 'g'.", + "routingBlockTextHint": "Повний текст нового системного блоку. Використовуйте літеральний рядок; системний блок зберігає лише текст.", + "routingIdempotencyKeyHint": "Опційно. Якщо задано, операція пропускається, коли блок із текстом, що починається з цього ключа, уже присутній. Запобігає подвійному вставленню при повторах.", + "routingBillingEntrypointHint": "Значення, що вставляється як 'cc_entrypoint='. Anthropic приймає 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI) або інші задокументовані значення.", + "routingBillingVersionFormatHint": "Як обчислюється 3-символьний хеш збірки після cc_version=. 'ex-machina' = sha256 від CCH_SALT+символів-першого-user-повідомлення+версії (на кожне повідомлення). 'omniroute-daystamp' = sha256 від YYYY-MM-DD+версії (стабільно за день).", + "routingBillingCchAlgoHint": "Як обчислюється 5-символьний токен cch=. 'sha256-first-user' = sha256 тексту першого user-повідомлення. 'xxhash64-body' = підпис на рівні body заповнюється пізніше. 'static-zero' = літеральний '00000' плейсхолдер.", + "routingObfuscateWordsHint": "Слова в нижньому регістрі для обфускації. Вставка ZWJ застосовується без врахування регістру, тож 'opencode' також збігається з 'OpenCode' і 'OPENCODE'.", + "routingObfuscateTargetsHint": "Які зони body сканувати на слова: системні блоки, повідомлення user/assistant та/або описи інструментів.", + "routingObfuscateTargetsLabel": "Цілі", + "routingSummarizeDropParagraphContains": "видалити абзаци, що містять: {items}", + "routingSummarizeDropParagraphStartsWith": "видалити абзаци, що починаються з: {items}", + "routingSummarizeReplaceText": "замінити \"{match}\" → \"{replacement}\"", "routingSummarizeReplaceRegex": "__MISSING__:regex /{pattern}/{flags} → \"{replacement}\"", - "routingSummarizeDropBlockContains": "__MISSING__:drop blocks containing: {items}", - "routingSummarizePrependSystemBlock": "__MISSING__:prepend block: \"{text}\"", - "routingSummarizeAppendSystemBlock": "__MISSING__:append block: \"{text}\"", - "routingSummarizeInjectBillingHeader": "__MISSING__:inject billing header (entrypoint={entrypoint}, version={versionFormat}, cch={cchAlgo})", - "routingSummarizeObfuscateWords": "__MISSING__:obfuscate {count} word(s) via ZWJ in {targets}", - "routingDefaultAutoVariantLKGP": "__MISSING__:Last Known Good Provider", - "routingDefaultAutoVariantLKGPDesc": "__MISSING__:Last Known Good Provider", - "routingDefaultAutoVariantCoding": "__MISSING__:Quality-first for code", - "routingDefaultAutoVariantCodingDesc": "__MISSING__:Quality-first for code", - "routingDefaultAutoVariantFast": "__MISSING__:Low-latency routing", - "routingDefaultAutoVariantFastDesc": "__MISSING__:Low-latency routing", - "routingDefaultAutoVariantCheap": "__MISSING__:Cost-optimized", - "routingDefaultAutoVariantCheapDesc": "__MISSING__:Cost-optimized", - "routingDefaultAutoVariantOffline": "__MISSING__:High availability", - "routingDefaultAutoVariantOfflineDesc": "__MISSING__:High availability", - "routingDefaultAutoVariantSmart": "__MISSING__:Best discovery (10% explore)", - "routingDefaultAutoVariantSmartDesc": "__MISSING__:Best discovery (10% explore)", - "routingOpSummaryCount": "__MISSING__:{count, plural, =0 {no ops} one {# op} other {# ops}}", - "routingOpEnabled": "__MISSING__:enabled", - "routingOpDisabled": "__MISSING__:disabled", + "routingSummarizeDropBlockContains": "видалити блоки, що містять: {items}", + "routingSummarizePrependSystemBlock": "додати блок на початок: \"{text}\"", + "routingSummarizeAppendSystemBlock": "додати блок у кінець: \"{text}\"", + "routingSummarizeInjectBillingHeader": "вставити billing-заголовок (entrypoint={entrypoint}, version={versionFormat}, cch={cchAlgo})", + "routingSummarizeObfuscateWords": "обфускувати {count} слово(а) через ZWJ у {targets}", + "routingDefaultAutoVariantLKGP": "Останній справний провайдер", + "routingDefaultAutoVariantLKGPDesc": "Останній справний провайдер", + "routingDefaultAutoVariantCoding": "Якість насамперед — для коду", + "routingDefaultAutoVariantCodingDesc": "Якість насамперед — для коду", + "routingDefaultAutoVariantFast": "Маршрутизація з низькою затримкою", + "routingDefaultAutoVariantFastDesc": "Маршрутизація з низькою затримкою", + "routingDefaultAutoVariantCheap": "Оптимізація за вартістю", + "routingDefaultAutoVariantCheapDesc": "Оптимізація за вартістю", + "routingDefaultAutoVariantOffline": "Висока доступність", + "routingDefaultAutoVariantOfflineDesc": "Висока доступність", + "routingDefaultAutoVariantSmart": "Найкраще виявлення (10% розвідки)", + "routingDefaultAutoVariantSmartDesc": "Найкраще виявлення (10% розвідки)", + "routingOpSummaryCount": "{count, plural, =0 {немає операцій} one {# операція} few {# операції} many {# операцій} other {# операції}}", + "routingOpEnabled": "увімкнено", + "routingOpDisabled": "вимкнено", "routingOpStatusSeparator": "__MISSING__: · ", "resilienceSettingsIntro": "Автоматична повторна спроба, час відновлення та резервний варіант у разі збою постачальників.", "aiSettingsIntro": "Спеціальні параметри ШІ для планування бюджету, поведінки моделі та стиснення.", @@ -4666,12 +4663,12 @@ "configure": "Налаштувати", "globalSystemPrompt": "Глобальна системна підказка", "saved": "Збережено", - "beforePromptLabel": "__MISSING__:Before Prompt", - "beforePromptDesc": "__MISSING__:Injected before agent/provider system instructions", - "beforePromptPlaceholder": "__MISSING__:Instructions inserted before agent/provider prompt...", - "afterPromptLabel": "__MISSING__:After Prompt", - "afterPromptDesc": "__MISSING__:Injected after agent/provider system instructions", - "afterPromptPlaceholder": "__MISSING__:Instructions inserted after agent/provider prompt...", + "beforePromptLabel": "Перед промптом", + "beforePromptDesc": "Вставляється перед системними інструкціями агента/провайдера", + "beforePromptPlaceholder": "Інструкції, що вставляються перед промптом агента/провайдера...", + "afterPromptLabel": "Після промпту", + "afterPromptDesc": "Вставляється після системних інструкцій агента/провайдера", + "afterPromptPlaceholder": "Інструкції, що вставляються після промпту агента/провайдера...", "chars": "{count} символів", "thinkingBudgetTitle": "Мислення про бюджет", "thinkingBudgetDesc": "Контролюйте використання маркера міркування AI для всіх запитів", @@ -5228,36 +5225,36 @@ "oneproxySuccess": "Успіх", "oneproxyFailed": "Не вдалося", "routingAntigravitySignatureTitle": "Режим кешу сигнатур антигравітації", - "routingAntigravitySignatureDesc": "__MISSING__:Control whether OmniRoute reuses only stored Gemini thought signatures or accepts validated client-provided signatures in Antigravity-compatible tool-call flows.", - "routingAntigravitySignatureEnabledLabel": "__MISSING__:Enabled", - "routingAntigravitySignatureEnabledDesc": "__MISSING__:Current behavior. Ignore client-provided signatures and keep using the stored OmniRoute flow.", - "routingAntigravitySignatureBypassLabel": "__MISSING__:Bypass", - "routingAntigravitySignatureBypassDesc": "__MISSING__:Accept client-provided signatures after lightweight validation and fall back to the stored signature when invalid.", - "routingAntigravitySignatureBypassStrictLabel": "__MISSING__:Bypass Strict", - "routingAntigravitySignatureBypassStrictDesc": "__MISSING__:Require full protobuf validation before accepting a client-provided signature.", + "routingAntigravitySignatureDesc": "Керує тим, чи OmniRoute використовує лише збережені підписи мислення Gemini, чи приймає підтверджені клієнтом підписи у потоках виклику інструментів, сумісних з Antigravity.", + "routingAntigravitySignatureEnabledLabel": "Увімкнено", + "routingAntigravitySignatureEnabledDesc": "Поточна поведінка. Ігнорувати підписи від клієнта і продовжувати використовувати збережений потік OmniRoute.", + "routingAntigravitySignatureBypassLabel": "Обхід", + "routingAntigravitySignatureBypassDesc": "Приймати підписи від клієнта після спрощеної валідації, повертаючись до збереженого підпису, якщо він некоректний.", + "routingAntigravitySignatureBypassStrictLabel": "Обхід строгий", + "routingAntigravitySignatureBypassStrictDesc": "Вимагати повну валідацію protobuf перед прийняттям клієнтського підпису.", "routingHeaderFingerprintTitle": "Відбиток заголовка (на постачальника)", "routingServerRejectedSave": "⚠ Сервер відхилив збереження:", "routingAddTransformOp": "Додайте операцію трансформації", "routingClientCacheControlTitle": "Контроль кешу клієнта", - "routingClientCacheControlDesc": "__MISSING__:Configure whether OmniRoute preserves client-provided cache_control markers", - "routingClientCacheControlAutoDesc": "__MISSING__:For deterministic Claude-compatible flows, preserve client-provided cache_control as-is. If the request has no cache_control, OmniRoute does not inject any bridge-owned markers for CC-compatible third-party proxy compatibility.", - "routingClientCacheControlAlwaysLabel": "__MISSING__:Always Preserve", - "routingClientCacheControlAlwaysDesc": "__MISSING__:Always forward client-provided cache_control headers to upstream providers as-is.", - "routingClientCacheControlNeverLabel": "__MISSING__:Never Preserve", - "routingClientCacheControlNeverDesc": "__MISSING__:Always remove client cache_control headers and let OmniRoute manage caching where native provider flows support it.", + "routingClientCacheControlDesc": "Налаштовує, чи зберігає OmniRoute клієнтські маркери cache_control", + "routingClientCacheControlAutoDesc": "Для детермінованих Claude-сумісних потоків зберігати клієнтський cache_control як є. Якщо запит не має cache_control, OmniRoute не вставляє власних bridge-маркерів — для сумісності з CC-сумісними сторонніми проксі.", + "routingClientCacheControlAlwaysLabel": "Завжди зберігати", + "routingClientCacheControlAlwaysDesc": "Завжди передавати клієнтський cache_control до провайдера як є.", + "routingClientCacheControlNeverLabel": "Ніколи не зберігати", + "routingClientCacheControlNeverDesc": "Завжди видаляти клієнтський cache_control і дозволяти OmniRoute керувати кешуванням, де це підтримує рідний потік провайдера.", "routingZeroConfigTitle": "Автоматична маршрутизація без конфігурації", - "routingZeroConfigDesc": "__MISSING__:Enable automatic provider selection using the auto/ prefix. When enabled, requests to auto, auto/coding, auto/fast, etc. will dynamically route across all connected providers.", + "routingZeroConfigDesc": "Увімкнути автоматичний вибір провайдера через префікс auto/. Коли увімкнено, запити до auto, auto/coding, auto/fast тощо динамічно маршрутизуються між усіма підключеними провайдерами.", "routingDefaultAutoVariant": "Автоматичний варіант за замовчуванням", "visionBridge": "Vision Bridge", - "visionBridgeDesc": "__MISSING__:Run an automatic vision-to-text fallback before routing image requests to text-only models.", - "visionBridgeEnabledLabel": "__MISSING__:Enabled", - "visionBridgeEnabledDesc": "__MISSING__:Toggle the pre-call bridge that replaces image parts with extracted text.", + "visionBridgeDesc": "Запустити автоматичне vision-to-text резервування перед маршрутизацією зображень до текстових моделей.", + "visionBridgeEnabledLabel": "Увімкнено", + "visionBridgeEnabledDesc": "Перемикач попереднього мосту, який заміняє частини із зображеннями на витягнутий текст.", "visionBridgeModel": "Модель мосту", "visionBridgeModelPlaceholder": "openai/gpt-4o-mini", - "visionBridgeModelHint": "__MISSING__:Any OmniRoute model ID that supports vision can be used here.", + "visionBridgeModelHint": "Тут можна використовувати будь-який ID моделі OmniRoute, що підтримує vision.", "visionBridgePrompt": "Підказка Bridge", "visionBridgePromptPlaceholder": "Стисло опишіть це зображення.", - "visionBridgePromptHint": "__MISSING__:Sent to the vision model before the extracted description is injected back into the original request.", + "visionBridgePromptHint": "Надсилається до vision-моделі перед тим, як отриманий опис вставляється назад до оригінального запиту.", "visionBridgeTimeoutMs": "Час очікування (мс)", "visionBridgeMaxImagesPerRequest": "Максимальна кількість зображень на запит", "resilienceMaxBackoffSteps": "Max backoff steps", @@ -5314,48 +5311,48 @@ "cliproxyapiStatus": "Статус CLIProxyAPI", "cliproxyapiNotDetected": "Не виявлено", "payloadRulesTitle": "Правила корисного навантаження", - "payloadRulesDesc": "__MISSING__:Configure request payload mutations by model and protocol. Changes are persisted in settings and hot reloaded into the runtime immediately after save.", + "payloadRulesDesc": "Налаштування мутацій корисного навантаження за моделлю та протоколом. Зміни зберігаються в налаштуваннях і гаряче перезавантажуються одразу після збереження.", "payloadRuleDefaultTitle": "__MISSING__:default", - "payloadRuleDefaultDesc": "__MISSING__:Applies params only when the target path is missing from the outgoing payload.", + "payloadRuleDefaultDesc": "Застосовує параметри лише коли цільовий шлях відсутній у вихідному payload.", "payloadRuleOverrideTitle": "__MISSING__:override", - "payloadRuleOverrideDesc": "__MISSING__:Forces values onto the payload, replacing anything already present at that path.", + "payloadRuleOverrideDesc": "Примусово встановлює значення в payload, замінюючи все, що вже є за цим шляхом.", "payloadRuleFilterTitle": "__MISSING__:filter", - "payloadRuleFilterDesc": "__MISSING__:Removes blocked params from the payload before the upstream request is sent.", + "payloadRuleFilterDesc": "Видаляє заблоковані параметри з payload перед надсиланням провайдеру.", "payloadRuleDefaultRawTitle": "__MISSING__:defaultRaw", - "payloadRuleDefaultRawDesc": "__MISSING__:Like default, but string values are parsed as JSON first when possible. The legacy input alias default-raw is also accepted on save.", - "payloadEditorTitle": "__MISSING__:Editor", - "payloadEditorDesc": "__MISSING__:Use the runtime schema shape: default, override, filter, defaultRaw. The API also accepts the legacy input key default-raw.", - "payloadEditorReady": "__MISSING__:Ready", - "payloadResetInfo": "__MISSING__:Editor reset to the neutral template. Save to apply it.", - "payloadSaveSuccess": "__MISSING__:Payload rules saved and hot reloaded.", - "payloadJsonParseError": "__MISSING__:JSON parse error: {error}", - "payloadMustBeObject": "__MISSING__:Payload rules must be a JSON object.", - "payloadInvalidJson": "__MISSING__:Invalid JSON payload.", - "payloadValidJsonRequired": "__MISSING__:Payload rules must be valid JSON before saving.", - "savePayloadRules": "__MISSING__:Save Payload Rules", - "requestLimitsTitle": "__MISSING__:Request Limits", - "requestLimitsDesc": "__MISSING__:Configure global request limits and concurrency guards.", - "maxRequestSizeLabel": "__MISSING__:Max Request Size (MB)", - "maxRequestSizeDesc": "__MISSING__:Maximum allowed size for incoming API requests.", - "maxResponseSizeLabel": "__MISSING__:Max Response Size (MB)", - "maxResponseSizeDesc": "__MISSING__:Maximum allowed size for outgoing API responses.", - "maxRequestTokensLabel": "__MISSING__:Max Request Tokens", - "maxRequestTokensDesc": "__MISSING__:Maximum total tokens allowed in a single request.", - "maxResponseTokensLabel": "__MISSING__:Max Response Tokens", - "maxResponseTokensDesc": "__MISSING__:Maximum total tokens allowed in a single response.", + "payloadRuleDefaultRawDesc": "Як default, але рядкові значення спершу парсяться як JSON, де можливо. Застарілий ключ default-raw також приймається при збереженні.", + "payloadEditorTitle": "Редактор", + "payloadEditorDesc": "Використовуйте схему runtime: default, override, filter, defaultRaw. API також приймає застарілий ключ default-raw.", + "payloadEditorReady": "Готово", + "payloadResetInfo": "Редактор скинуто до нейтрального шаблону. Збережіть, щоб застосувати.", + "payloadSaveSuccess": "Правила payload збережено й гаряче перезавантажено.", + "payloadJsonParseError": "Помилка розбору JSON: {error}", + "payloadMustBeObject": "Правила payload мають бути JSON-об'єктом.", + "payloadInvalidJson": "Некоректний JSON у payload.", + "payloadValidJsonRequired": "Правила payload мають бути коректним JSON перед збереженням.", + "savePayloadRules": "Зберегти правила payload", + "requestLimitsTitle": "Ліміти запитів", + "requestLimitsDesc": "Налаштування глобальних лімітів запитів і захисту конкурентності.", + "maxRequestSizeLabel": "Макс. розмір запиту (МБ)", + "maxRequestSizeDesc": "Максимально дозволений розмір вхідних API-запитів.", + "maxResponseSizeLabel": "Макс. розмір відповіді (МБ)", + "maxResponseSizeDesc": "Максимально дозволений розмір вихідних API-відповідей.", + "maxRequestTokensLabel": "Макс. токенів у запиті", + "maxRequestTokensDesc": "Максимально дозволено токенів у одному запиті.", + "maxResponseTokensLabel": "Макс. токенів у відповіді", + "maxResponseTokensDesc": "Максимально дозволено токенів у одній відповіді.", "modelCooldownsTitle": "Моделі в процесі відновлення", "modelCooldownsEmpty": "Зараз немає моделей, які перебувають у відновленні.", "codexFastTierTitle": "Codex Fast Tier", "codexFastTierDesc": "Глобально ввести service_tier=пріоритет для запитів OpenAI Codex.", "codexFastTierHint": "Якщо ввімкнено, OmniRoute додає service_tier=priority до вихідних запитів Codex для підключень, у яких ще не вказано рівень. Пріоритетний рівень потребує ключа OpenAI Enterprise API або шляху ChatGPT-auth Codex; інші типи ключів отримають від OpenAI повідомлення про помилку рівня. Налаштування кожного підключення на сторінці постачальника Codex мають перевагу.", "codexFastTierSaveError": "Не вдалося оновити налаштування Codex Fast Tier", - "codexFastTierTierLabel": "__MISSING__:Service tier", - "codexFastTierTierPriority": "__MISSING__:Priority", + "codexFastTierTierLabel": "Рівень сервісу", + "codexFastTierTierPriority": "Пріоритет", "codexFastTierTierFlex": "__MISSING__:Flex", - "codexFastTierTierDefault": "__MISSING__:Default", - "codexFastTierModelsLabel": "__MISSING__:Fast-tier models", - "codexFastTierModelsHint": "__MISSING__:Only checked models receive service_tier when Fast Tier is enabled.", - "codexFastTierModelCheckbox": "__MISSING__:Enable Fast Tier for {model}", + "codexFastTierTierDefault": "За замовчуванням", + "codexFastTierModelsLabel": "Моделі Fast-tier", + "codexFastTierModelsHint": "Лише позначені моделі отримують service_tier, коли Fast Tier увімкнено.", + "codexFastTierModelCheckbox": "Увімкнути Fast Tier для {model}", "claudeFastModeTitle": "Швидкий режим Клода", "claudeFastModeDesc": "Увімкнути для вибраних запитів Клода швидкий антропний режим (швидкість: \"швидко\").", "claudeFastModeHint": "Anthropic офіційно не підтримує швидкий режим для клієнтів у стилі SDK. Якщо ввімкнено, OmniRoute пересилає заголовок X-CPA-Force-Fast-Mode, щоб парна збірка CLIProxyAPI могла підробити точку входу. Лише перелічені моделі Opus перевіряються Anthropic на стороні клієнта. Рівень підписки, максимальний план і кредитний баланс у швидкому режимі все ще застосовуються на стороні сервера — Anthropic може повернути out_of_credits, навіть якщо перемикач увімкнено.", @@ -5363,58 +5360,58 @@ "claudeFastModeModelCheckbox": "Увімкнути швидкий режим для {model}", "claudeFastModeSaveError": "Не вдалося оновити налаштування швидкого режиму Claude", "authz": { - "title": "__MISSING__:Authz Inventory", - "description": "__MISSING__:5-tier route classification with live bypass policy. Read shows the full taxonomy; mutations re-prompt for the management password.", - "loading": "__MISSING__:Loading inventory…", - "loadError": "__MISSING__:Failed to load authz inventory", + "title": "Інвентар авторизації", + "description": "5-рівнева класифікація маршрутів з живою політикою обходу. Перегляд показує повну таксономію; зміни вимагають повторного введення пароля керування.", + "loading": "Завантаження інвентарю…", + "loadError": "Не вдалося завантажити інвентар авторизації", "tier": { - "LOCAL_ONLY": "__MISSING__:Local only", - "ALWAYS_PROTECTED": "__MISSING__:Always protected", - "MANAGEMENT": "__MISSING__:Management", - "CLIENT_API": "__MISSING__:Client API", - "PUBLIC": "__MISSING__:Public" + "LOCAL_ONLY": "Лише локально", + "ALWAYS_PROTECTED": "Завжди захищено", + "MANAGEMENT": "Керування", + "CLIENT_API": "Клієнтський API", + "PUBLIC": "Публічно" }, "bypass": { - "section": "__MISSING__:Manage-scope bypass", + "section": "Обхід для manage-області", "kill_switch": { - "label": "__MISSING__:Bypass kill-switch", - "desc": "__MISSING__:Master toggle. When off, no LOCAL_ONLY prefix is reachable from non-loopback regardless of the per-prefix list." + "label": "Аварійний вимикач обходу", + "desc": "Головний перемикач. Коли вимкнено, жоден префікс LOCAL_ONLY недоступний з не-loopback незалежно від списку префіксів." }, "prefix": { - "label": "__MISSING__:Bypassable prefixes", - "desc": "__MISSING__:LOCAL_ONLY prefixes that manage-scope API keys (or dashboard sessions) may reach from non-loopback hosts.", - "add": "__MISSING__:Add prefix", + "label": "Префікси, що піддаються обходу", + "desc": "Префікси LOCAL_ONLY, до яких API-ключі manage-області (або сесії дашборда) можуть звертатися з не-loopback хостів.", + "add": "Додати префікс", "placeholder": "__MISSING__:/api/mcp/v2/", - "empty": "__MISSING__:No prefixes configured. Bypass effectively off." + "empty": "Префікси не налаштовано. Обхід фактично вимкнено." }, - "cli_tools_runtime_note": "__MISSING__:Spawn-capable prefix. Compile-time deny; cannot be made bypassable. Shown read-only." + "cli_tools_runtime_note": "Префікс із можливістю spawn. Заборонено на етапі компіляції; не може бути зроблено обхідним. Показано лише для читання." }, "password": { "prompt": { - "label": "__MISSING__:Current password", - "desc": "__MISSING__:Re-confirm to apply security-impacting changes." + "label": "Поточний пароль", + "desc": "Підтвердіть, щоб застосувати зміни, що впливають на безпеку." }, - "placeholder": "__MISSING__:Current management password", - "cancel": "__MISSING__:Cancel", - "submit": "__MISSING__:Apply" + "placeholder": "Поточний пароль керування", + "cancel": "Скасувати", + "submit": "Застосувати" }, - "save": "__MISSING__:Save changes", - "saved": "__MISSING__:Authz settings updated", - "pending": "__MISSING__:Unsaved changes", + "save": "Зберегти зміни", + "saved": "Налаштування авторизації оновлено", + "pending": "Незбережені зміни", "badge": { - "bypassable": "__MISSING__:Bypassable via manage scope", - "strict": "__MISSING__:Strict loopback", - "auth_required": "__MISSING__:Auth required", - "public": "__MISSING__:Public", - "always_protected": "__MISSING__:Always protected", - "spawn_capable": "__MISSING__:Spawn-capable" + "bypassable": "З обходом через manage-область", + "strict": "Строгий loopback", + "auth_required": "Потрібна автентифікація", + "public": "Публічно", + "always_protected": "Завжди захищено", + "spawn_capable": "Можливість spawn" }, "error": { - "PASSWORD_REQUIRED": "__MISSING__:Current password required to apply these changes.", - "PASSWORD_MISMATCH": "__MISSING__:Current password is incorrect.", - "INSUFFICIENT_SCOPE": "__MISSING__:API key lacks the manage scope.", - "BYPASS_PREFIX_NOT_ALLOWED": "__MISSING__:One or more prefixes target spawn-capable routes and cannot be bypassed.", - "GENERIC": "__MISSING__:Failed to update authz settings." + "PASSWORD_REQUIRED": "Для застосування цих змін потрібен поточний пароль.", + "PASSWORD_MISMATCH": "Поточний пароль неправильний.", + "INSUFFICIENT_SCOPE": "API-ключ не має manage-області.", + "BYPASS_PREFIX_NOT_ALLOWED": "Один або декілька префіксів вказують на маршрути з можливістю spawn і не можуть бути обхідними.", + "GENERIC": "Не вдалося оновити налаштування авторизації." } }, "resilienceBaseCooldownLabel": "Базовий час відновлення", @@ -5463,15 +5460,15 @@ "qdrantCleanupSuccess": "Добре: вилучено {count} балів (утримання: {days} днів)", "qdrantCleanupFailed": "Помилка очищення", "qdrantCleanupError": "Помилка: {error}", - "vercelRelaySuccess": "__MISSING__:Vercel Relay deployed successfully", - "vercelRelayButton": "__MISSING__:Deploy Vercel Relay", - "vercelRelayModalTitle": "__MISSING__:Deploy Vercel Relay", - "vercelRelayWarning": "__MISSING__:Warning: A Vercel deployment token is required. This token will only be used to create the serverless relay and will never be stored by OmniRoute.", - "vercelRelayTokenLabel": "__MISSING__:Vercel Access Token", - "vercelRelayProjectNameLabel": "__MISSING__:Vercel Project Name", - "vercelRelayFreeTierNote": "__MISSING__:Relays are lightweight proxy endpoints deployed on Vercel's free tier to bypass local network/region limitations.", - "vercelRelayDeploying": "__MISSING__:Deploying...", - "vercelRelayDeploy": "__MISSING__:Deploy", + "vercelRelaySuccess": "Vercel Relay розгорнуто успішно", + "vercelRelayButton": "Розгорнути Vercel Relay", + "vercelRelayModalTitle": "Розгорнути Vercel Relay", + "vercelRelayWarning": "Увага: потрібен токен розгортання Vercel. Цей токен використовується лише для створення серверлес-релею та ніколи не зберігається OmniRoute.", + "vercelRelayTokenLabel": "Токен доступу Vercel", + "vercelRelayProjectNameLabel": "Назва проєкту Vercel", + "vercelRelayFreeTierNote": "Релеї — це легкі проксі-ендпоінти, розгорнуті на безкоштовному рівні Vercel для обходу мережевих/регіональних обмежень.", + "vercelRelayDeploying": "Розгортання...", + "vercelRelayDeploy": "Розгорнути", "homePinProviderQuotaToHome": "Закріпити інформацію на головній сторінці", "homeProviderQuotaLimits": "Ліміти квот провайдерів", "homeProviderQuotaLimitsDesc": "Закріпити контейнер стану квот провайдерів (з кнопкою «Оновити все») вгорі головної сторінки.", @@ -5481,22 +5478,22 @@ "homeProviderTopologyDesc": "Показувати топологію провайдерів на головній сторінці." }, "contextRtk": { - "title": "RTK Engine", - "description": "Command-aware compression for tool output, terminal logs and build results.", - "enabled": "Enabled", - "intensity": "Intensity", - "intensityMinimal": "Minimal", - "intensityStandard": "Standard", - "intensityAggressive": "Aggressive", - "toolResults": "Tool results", - "assistantMessages": "Assistant messages", - "codeBlocks": "Code blocks", + "title": "Двигун RTK", + "description": "Стиснення з урахуванням команд для виводу інструментів, логів терміналу та результатів збірок.", + "enabled": "Увімкнено", + "intensity": "Інтенсивність", + "intensityMinimal": "Мінімальна", + "intensityStandard": "Стандартна", + "intensityAggressive": "Агресивна", + "toolResults": "Результати інструментів", + "assistantMessages": "Повідомлення асистента", + "codeBlocks": "Блоки коду", "filterCatalog": "Каталог фільтрів", "filterCatalogDesc": "Доступні вихідні фільтри за категоріями", "guidedConfig": "Конфігурація", "guidedConfigDesc": "Налаштуйте, як RTK фільтрує вихід вашого терміналу", - "maxLines": "Max lines", - "maxChars": "Max chars", + "maxLines": "Макс. рядків", + "maxChars": "Макс. символів", "deduplicateThreshold": "Порогове значення дедуплікатів", "customFilters": "Спеціальні фільтри", "detectedType": "Виявлений тип", @@ -5508,22 +5505,22 @@ "rawOutputFailures": "Невдачі", "rawOutputAlways": "Завжди", "rawOutputMaxBytes": "Максимальна кількість вихідних байтів", - "filterTesting": "Filter Testing", - "pasteOutput": "Paste tool output to test filtering...", + "filterTesting": "Тестування фільтрів", + "pasteOutput": "Вставте вивід інструменту для тестування фільтрації...", "presetHigh": "Агресивний", "presetLow": "світло", "presetMaxChars": "Максимальна кількість вихідних символів", "presetMaxLines": "Макс вихідних ліній", "presetMedium": "Стандартний", - "run": "Run", - "result": "Result", - "previewEmpty": "Run a sample to preview RTK output.", - "detected": "Detected", - "masterSwitchOffAlert": "__MISSING__:Token Saver master switch is OFF — these settings will not affect requests until you turn it on from the Endpoint page.", - "tokensFiltered": "Tokens filtered", - "filtersActive": "Filters active", - "requests": "Requests", - "avgSavings": "Avg savings", + "run": "Запустити", + "result": "Результат", + "previewEmpty": "Запустіть приклад, щоб переглянути вивід RTK.", + "detected": "Виявлено", + "masterSwitchOffAlert": "Головний перемикач Token Saver ВИМКНЕНО — ці налаштування не впливатимуть на запити, поки ви не ввімкнете його на сторінці Кінцеві точки.", + "tokensFiltered": "Відфільтровано токенів", + "filtersActive": "Активних фільтрів", + "requests": "Запитів", + "avgSavings": "Сер. економія", "simpleMode": "просто", "advancedMode": "Просунутий", "searchFilters": "Фільтри пошуку...", @@ -5532,26 +5529,26 @@ "tooltipMaxLines": "Максимальна кількість рядків, які не потрібно виводити командою. Надлишки обрізаються." }, "contextCombos": { - "title": "Compression Combos", - "description": "Define how engines are combined for different routing scenarios.", - "createCombo": "Create Compression Combo", - "editCombo": "Edit", - "deleteCombo": "Delete", - "deleteConfirm": "Delete this compression combo?", - "pipeline": "Pipeline", - "addStep": "Add Step", - "removeStep": "Remove", - "name": "Name", - "descriptionField": "Description", - "languagePacks": "Language Packs", - "outputMode": "Output Mode", - "assignToRouting": "Assign to Routing Combos", - "noAssignments": "No routing combos available", - "default": "Default", - "setAsDefault": "Set as Default", - "save": "Save", - "cancel": "Cancel", - "enabled": "Enabled" + "title": "Комбінації стиснення", + "description": "Визначте, як двигуни комбінуються для різних сценаріїв маршрутизації.", + "createCombo": "Створити комбінацію стиснення", + "editCombo": "Редагувати", + "deleteCombo": "Видалити", + "deleteConfirm": "Видалити цю комбінацію стиснення?", + "pipeline": "Конвеєр", + "addStep": "Додати крок", + "removeStep": "Прибрати", + "name": "Назва", + "descriptionField": "Опис", + "languagePacks": "Мовні пакети", + "outputMode": "Режим виводу", + "assignToRouting": "Призначити до маршрутизаційних комбо", + "noAssignments": "Немає доступних маршрутизаційних комбо", + "default": "За замовчуванням", + "setAsDefault": "Зробити стандартним", + "save": "Зберегти", + "cancel": "Скасувати", + "enabled": "Увімкнено" }, "contextCaveman": { "title": "Caveman Engine", @@ -5574,8 +5571,8 @@ "enabled": "Enabled", "autoDetect": "Auto-detect language", "rulesCount": "{count} rules", - "inputCompressionTitle": "__MISSING__:Input compression", - "inputCompressionDesc": "__MISSING__:Rewrite chat history with shorter wording. Reduces input tokens by ~50%.", + "inputCompressionTitle": "Стиснення входу", + "inputCompressionDesc": "Переписує історію чату коротшими формулюваннями. Зменшує вхідні токени приблизно на 50%.", "analyticsTitle": "Compression Analytics", "noAnalytics": "No compression analytics yet.", "outputMode": "Режим виведення", @@ -5870,19 +5867,19 @@ "runStepDescription": "Виконуйте тестові випадки на кінцевих точках LLM через OmniRoute. Кожен випадок надсилається як справжній запит API.", "evaluate": "Оцініть", "evaluateStepDescription": "Відповіді порівнюються з очікуваними критеріями. Перегляньте відповідність/незадоволення для кожного випадку з показниками затримки та детальним відгуком.", - "evalsStrategyContainsLabel": "__MISSING__:Contains", - "evalsStrategyExactLabel": "__MISSING__:Exact Match", + "evalsStrategyContainsLabel": "Містить", + "evalsStrategyExactLabel": "Точний збіг", "evalsStrategyRegexLabel": "__MISSING__:Regex", - "evalsStrategyCustomLabel": "__MISSING__:Custom Logic", - "evalsStrategyContainsDescription": "__MISSING__:Checks if the LLM output contains the expected substring.", - "evalsStrategyExactDescription": "__MISSING__:Checks if the LLM output exactly matches the expected value.", - "evalsStrategyRegexDescription": "__MISSING__:Validates the LLM output against a regular expression pattern.", - "evalsStrategyCustomDescription": "__MISSING__:Custom evaluation logic (configured via JSON).", - "historyColumnSuiteName": "__MISSING__:Suite Name", - "historyColumnTarget": "__MISSING__:Target", - "historyColumnPassRate": "__MISSING__:Pass Rate", - "historyColumnAvgLatencyMs": "__MISSING__:Avg Latency", - "historyColumnCreatedAt": "__MISSING__:Executed", + "evalsStrategyCustomLabel": "Своя логіка", + "evalsStrategyContainsDescription": "Перевіряє, чи містить вивід LLM очікуваний підрядок.", + "evalsStrategyExactDescription": "Перевіряє, чи вивід LLM точно дорівнює очікуваному значенню.", + "evalsStrategyRegexDescription": "Валідує вивід LLM за регулярним виразом.", + "evalsStrategyCustomDescription": "Користувацька логіка оцінювання (конфігурується через JSON).", + "historyColumnSuiteName": "Назва набору", + "historyColumnTarget": "Ціль", + "historyColumnPassRate": "% успішних", + "historyColumnAvgLatencyMs": "Сер. затримка", + "historyColumnCreatedAt": "Виконано", "evalSuites": "Комплекти оцінювання", "evalSuitesHint": "Натисніть набір, щоб переглянути тестові випадки, а потім запустіть, щоб оцінити свої кінцеві точки LLM", "evalsLoading": "Завантаження eval suites...", @@ -5966,23 +5963,23 @@ "loadingQuotas": "Завантаження...", "account": "Обліковий запис", "modelQuotas": "Модельні квоти", - "lastUsed": "Last Refreshed", + "lastUsed": "Останнє оновлення", "actions": "Дії", "refreshQuota": "Оновити квоту", "today": "Сьогодні", "tomorrow": "завтра", "dayTimeFormat": "{day}, {time}", "inDuration": "в {duration}", - "notApplicable": "N/A", + "notApplicable": "Н/Д", "rawPlanWithValue": "Необроблений план: {plan}", "noPlanFromProvider": "Без плану від провайдера", "noQuotaData": "Немає даних про квоти", - "cardExpand": "__MISSING__:Expand", - "cardCollapse": "__MISSING__:Collapse", - "moreQuotas": "__MISSING__:+{count} more", - "ungrouped": "Ungrouped", - "viewFlat": "Flat", - "viewByEnvironment": "By Environment", + "cardExpand": "Розгорнути", + "cardCollapse": "Згорнути", + "moreQuotas": "+{count} ще", + "ungrouped": "Без групи", + "viewFlat": "Список", + "viewByEnvironment": "За середовищем", "noQuotaDataAvailable": "Немає даних про квоти", "noAccountsForTierFilter": "Не знайдено облікових записів для фільтра рівня", "tierAll": "всі", @@ -5995,21 +5992,21 @@ "tierFree": "безкоштовно", "tierLite": "__MISSING__:Lite", "tierUnknown": "Невідомий", - "statTotal": "__MISSING__:Total", - "statCritical": "__MISSING__:Critical", - "statAlert": "__MISSING__:Alert", - "statHealthy": "__MISSING__:Healthy", - "filterPurchaseTypeLabel": "__MISSING__:Type", - "filterTierLabel": "__MISSING__:Tier", - "purchaseAll": "__MISSING__:All", - "purchaseOauthSub": "__MISSING__:Subscription", - "purchaseOauthFree": "__MISSING__:OAuth Free", - "purchaseApiKey": "__MISSING__:API Key", - "creditsLabel": "__MISSING__:Credits", - "creditBalanceHint": "__MISSING__:Remaining balance", - "unlimitedLabel": "__MISSING__:Unlimited", - "refreshing": "__MISSING__:Refreshing", - "resetsIn": "__MISSING__:Resets in", + "statTotal": "Усього", + "statCritical": "Критично", + "statAlert": "Тривога", + "statHealthy": "Справно", + "filterPurchaseTypeLabel": "Тип", + "filterTierLabel": "Рівень", + "purchaseAll": "Усі", + "purchaseOauthSub": "Підписка", + "purchaseOauthFree": "OAuth безкоштовно", + "purchaseApiKey": "API-ключ", + "creditsLabel": "Кредити", + "creditBalanceHint": "Залишок балансу", + "unlimitedLabel": "Без обмежень", + "refreshing": "Оновлення...", + "resetsIn": "Скидання через", "editCutoffs": "Редагувати обрізки", "forceRefresh": "Оновіть зараз", "suiteBuilderSaveFailed": "Failed to save suite", @@ -6031,7 +6028,7 @@ "evalTargetHint": "Select a model or combo to evaluate.", "suiteBuilderDeleted": "Suite deleted successfully", "suiteBuilderCaseCardHint": "Define the input prompt and expected output criteria.", - "nextResetUtc": "Next reset (UTC)", + "nextResetUtc": "Наступне скидання (UTC)", "scorecardHint": "Aggregated pass rates across all evaluation suites.", "suiteLatestRunsHint": "Most recent evaluation runs for this suite.", "saving": "Saving", @@ -6158,10 +6155,10 @@ "quotaAlerts": "Сповіщення про квоту", "quotaTableRefreshing": "⟳ Освіжає...", "noSpendLast30Days": "Немає витрат за останні 30 днів", - "updatedShort": "__MISSING__:Updated", - "lastRefreshed": "__MISSING__:Last refreshed", - "providerQuota": "__MISSING__:Provider Quota", - "providerQuotaHomeHint": "__MISSING__:Live status across connected accounts" + "updatedShort": "Оновлено", + "lastRefreshed": "Останнє оновлення", + "providerQuota": "Квота провайдера", + "providerQuotaHomeHint": "Стан у реальному часі за підключеними акаунтами" }, "modals": { "waitingAuth": "Очікування авторизації", @@ -6718,12 +6715,12 @@ "browseAllSkillsOnGithub": "Перегляньте всі навички на GitHub", "apiSkills": "Навички API", "cliSkills": "Навички CLI", - "apiSkillsSubtitle": "__MISSING__:{count} skills — control OmniRoute via REST / HTTP", - "cliSkillsSubtitle": "__MISSING__:{count} skills — control OmniRoute via the omniroute terminal binary", - "howToUseStep1": "__MISSING__:Click {copyUrl} on the skill you want your agent to know about.", - "howToUseStep2": "__MISSING__:In your AI agent (Claude, Cursor, Cline…), say:", + "apiSkillsSubtitle": "{count} навичок — керуйте OmniRoute через REST / HTTP", + "cliSkillsSubtitle": "{count} навичок — керуйте OmniRoute через термінальний бінарник omniroute", + "howToUseStep1": "Натисніть {copyUrl} на навичці, яку має знати ваш агент.", + "howToUseStep2": "У вашому AI-агенті (Claude, Cursor, Cline…) скажіть:", "howToUseStep2Code": "__MISSING__:Use the skill at [pasted-url]", - "howToUseStep3": "__MISSING__:The agent fetches the SKILL.md and learns OmniRoute's API or CLI — no manual docs needed." + "howToUseStep3": "Агент завантажує SKILL.md і вивчає API або CLI OmniRoute — без потреби в документації вручну." }, "cloudAgents": { "title": "Хмарні агенти", @@ -6742,28 +6739,28 @@ "tasks": "завдання", "taskDetail": "Деталь завдання", "noTasks": "Завдань ще немає. Створіть його, щоб почати.", - "noTasksTitle": "__MISSING__:No tasks yet", - "noTasksDesc": "__MISSING__:Create your first task to get started.", - "tasksTab": "__MISSING__:Tasks", - "agentsTab": "__MISSING__:Agents", - "settingsTab": "__MISSING__:Settings", - "agentsEnabled": "__MISSING__:Enabled", - "agentsDisabled": "__MISSING__:Disabled", - "filterAllProviders": "__MISSING__:All Providers", - "filterAll": "__MISSING__:All", - "autoRefreshing": "__MISSING__:Auto-refreshing", - "viewPR": "__MISSING__:View Pull Request", - "connected": "__MISSING__:Connected", - "notConnected": "__MISSING__:Not connected", - "configure": "__MISSING__:Configure", - "settingsTitle": "__MISSING__:Cloud Agent Settings", - "settingsDesc": "__MISSING__:Configure local preferences for cloud agents.", - "settingEnableAgents": "__MISSING__:Enable cloud agents", - "settingEnableAgentsDesc": "__MISSING__:Allow OmniRoute to orchestrate autonomous coding agents.", - "settingAutoPR": "__MISSING__:Auto-create PR", - "settingAutoPRDesc": "__MISSING__:When a task is completed, automatically create a Pull Request with the changes.", - "settingRequireApproval": "__MISSING__:Require plan approval", - "settingRequireApprovalDesc": "__MISSING__:Always wait for manual approval before an agent executes a proposed plan.", + "noTasksTitle": "Поки немає задач", + "noTasksDesc": "Створіть першу задачу, щоб почати.", + "tasksTab": "Задачі", + "agentsTab": "Агенти", + "settingsTab": "Налаштування", + "agentsEnabled": "Увімкнено", + "agentsDisabled": "Вимкнено", + "filterAllProviders": "Усі провайдери", + "filterAll": "Усі", + "autoRefreshing": "Автооновлення", + "viewPR": "Переглянути Pull Request", + "connected": "Підключено", + "notConnected": "Не підключено", + "configure": "Налаштувати", + "settingsTitle": "Налаштування хмарних агентів", + "settingsDesc": "Налаштування локальних параметрів для хмарних агентів.", + "settingEnableAgents": "Увімкнути хмарних агентів", + "settingEnableAgentsDesc": "Дозволити OmniRoute оркеструвати автономних агентів кодування.", + "settingAutoPR": "Авто-створення PR", + "settingAutoPRDesc": "Коли задача завершена, автоматично створювати Pull Request зі змінами.", + "settingRequireApproval": "Вимагати підтвердження плану", + "settingRequireApprovalDesc": "Завжди чекати на ручне підтвердження, перш ніж агент виконає запропонований план.", "untitledTask": "Завдання без назви", "created": "Створено", "conversation": "Розмова", @@ -6864,7 +6861,7 @@ "clearError": "Failed to clear cache.", "unavailable": "Cache unavailable", "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", - "loadingCacheAria": "__MISSING__:Loading cache", + "loadingCacheAria": "Завантаження кешу", "promptCache": "Prompt Cache (Provider-Side)", "semanticCache": "Semantic Cache", "promptCacheSectionDesc": "Shows provider-side prompt caching activity from usage history so you can see where cache control is active and how much input reuse you are getting.", @@ -6906,9 +6903,9 @@ "peakCached": "Peak cached", "cached": "Cached", "overview": "Overview", - "tableProvider": "__MISSING__:Provider", - "tableModel": "__MISSING__:Model", - "performanceTitle": "__MISSING__:Performance", + "tableProvider": "Провайдер", + "tableModel": "Модель", + "performanceTitle": "Продуктивність", "semanticCacheSectionDesc": "OmniRoute's own deterministic response cache. When enabled, repeated non-streaming temperature=0 requests can be served locally without hitting the upstream provider.", "semanticCacheDisabledDesc": "Semantic cache is disabled. OmniRoute will skip local response reuse until you turn it back on in Settings.", "semanticEntriesDesc": "Persisted semantic cache records currently stored in SQLite. Provider-side prompt cache activity is not listed here.", @@ -6960,11 +6957,11 @@ "cachePerformanceP95Latency": "p95 Затримка (мс)", "retry": "Повторіть спробу", "reasoningAvgChars": "Середні символи", - "tableShare": "__MISSING__:Share", - "justNow": "__MISSING__:just now", - "minutesAgo": "__MISSING__:{minutes}m ago", - "hoursAgo": "__MISSING__:{hours}h ago", - "daysAgo": "__MISSING__:{days}d ago", + "tableShare": "Частка", + "justNow": "щойно", + "minutesAgo": "{minutes} хв тому", + "hoursAgo": "{hours} год тому", + "daysAgo": "{days} дн тому", "entries": "Entries" }, "proxyConfigModal": { @@ -7110,12 +7107,12 @@ "bulkLabelScopeIds": "Ідентифікатори області дії (розділені комою або новим рядком)", "bulkScopeIdsPlaceholder": "провайдер-опенай, провайдер-антропік", "bulkApply": "Застосувати", - "labelScope": "__MISSING__:Scope", - "labelProxy": "__MISSING__:Proxy", - "scopeGlobal": "__MISSING__:global", - "scopeProvider": "__MISSING__:provider", - "scopeAccount": "__MISSING__:account", - "scopeCombo": "__MISSING__:combo", + "labelScope": "Область", + "labelProxy": "Проксі", + "scopeGlobal": "глобальна", + "scopeProvider": "провайдер", + "scopeAccount": "акаунт", + "scopeCombo": "комбо", "bulkImportErrorMissingName": "Відсутній NAME", "bulkImportErrorMissingHost": "Відсутній HOST", "bulkImportErrorInvalidPort": "Недійсний ПОРТ (має бути 1-65535)", @@ -7260,41 +7257,41 @@ "enterToolResult": "Enter tool result…" }, "miniPlayground": { - "endpoint": "__MISSING__:Endpoint", - "apiKey": "__MISSING__:API Key", - "model": "__MISSING__:Model", - "voice": "__MISSING__:Voice", - "speed": "__MISSING__:Speed", - "input": "__MISSING__:Input", + "endpoint": "Ендпоінт", + "apiKey": "API-ключ", + "model": "Модель", + "voice": "Голос", + "speed": "Швидкість", + "input": "Ввід", "url": "__MISSING__:URL", - "format": "__MISSING__:Format", - "depth": "__MISSING__:Depth", - "copyCurl": "__MISSING__:Copy cURL", - "copied": "__MISSING__:Copied!", - "run": "__MISSING__:Run", - "running": "__MISSING__:Running...", - "response": "__MISSING__:Response", - "tunnel": "__MISSING__:Tunnel", - "send": "__MISSING__:Send", - "selectKey": "__MISSING__:Select key", - "testLabel": "__MISSING__:Test", - "expandTest": "__MISSING__:Expand test", - "collapseTest": "__MISSING__:Collapse test", - "revealKey": "__MISSING__:Reveal key", - "hideKey": "__MISSING__:Hide key", - "download": "__MISSING__:Download", - "play": "__MISSING__:Play", - "query": "__MISSING__:Query", - "numResults": "__MISSING__:Max results", - "prompt": "__MISSING__:Prompt", - "size": "__MISSING__:Size", - "duration": "__MISSING__:Duration", - "question": "__MISSING__:Question", - "audioFile": "__MISSING__:Audio file", - "noKeysFound": "__MISSING__:No API keys found. Add one in the Keys section.", - "exampleLabel": "__MISSING__:Example", - "latency": "__MISSING__:{ms}ms", - "statsLine": "__MISSING__:{ms}ms · {tokensIn} in / {tokensOut} out tokens" + "format": "Формат", + "depth": "Глибина", + "copyCurl": "Копіювати cURL", + "copied": "Скопійовано!", + "run": "Запустити", + "running": "Виконання...", + "response": "Відповідь", + "tunnel": "Тунель", + "send": "Надіслати", + "selectKey": "Виберіть ключ", + "testLabel": "Тест", + "expandTest": "Розгорнути тест", + "collapseTest": "Згорнути тест", + "revealKey": "Показати ключ", + "hideKey": "Приховати ключ", + "download": "Завантажити", + "play": "Відтворити", + "query": "Запит", + "numResults": "Макс. результатів", + "prompt": "Промпт", + "size": "Розмір", + "duration": "Тривалість", + "question": "Питання", + "audioFile": "Аудіофайл", + "noKeysFound": "API-ключі не знайдено. Додайте у розділі Ключі.", + "exampleLabel": "Приклад", + "latency": "{ms} мс", + "statsLine": "{ms} мс · {tokensIn} вх / {tokensOut} вих токенів" }, "requestLogger": { "recording": "Recording", @@ -7409,7 +7406,7 @@ "responses": "Responses", "rerank": "Rerank", "video": "Video", - "embeddings": "Embeddings", + "embeddings": "Вбудовування", "transcription": "Transcription" }, "toolDescriptions": {