Settings gains a second service button next to restart: stop every managed local model server and exit the gateway process (nothing is respawned; in Docker the restart policy decides). The SPA replaces itself with a static "gateway is off" screen since the API is gone. The restart button is relabeled "Restart everything" to say what it always did — the gateway re-execs itself and managed servers come back with it. Translated in all seven languages.
646 lines
49 KiB
JavaScript
Vendored
646 lines
49 KiB
JavaScript
Vendored
// Russian — ru. Keys must match en.js exactly; missing keys fall back to English.
|
||
export default {
|
||
// brand / common
|
||
"brand.sub": "Шлюз",
|
||
"common.loading": "Загрузка…",
|
||
"common.save": "Сохранить",
|
||
"common.saving": "Сохранение…",
|
||
"common.cancel": "Отмена",
|
||
"common.add": "Добавить",
|
||
"common.edit": "Изменить",
|
||
"common.delete": "Удалить",
|
||
"common.close": "Закрыть",
|
||
"common.test": "Тест",
|
||
"common.copy": "Копировать",
|
||
"common.copied": "Скопировано",
|
||
"common.confirm": "Подтвердить",
|
||
"common.none": "нет",
|
||
"common.saved": "Сохранено",
|
||
"common.error": "Ошибка",
|
||
"common.ok": "OK",
|
||
"common.refresh": "Обновить",
|
||
"common.actions": "Действия",
|
||
"common.optional": "необязательно",
|
||
"common.search": "Поиск",
|
||
"common.all": "все",
|
||
|
||
// nav
|
||
"nav.dashboard": "Рабочий стол",
|
||
"nav.models": "Модели",
|
||
"nav.import": "Импорт модели",
|
||
"nav.routing": "Роутинг",
|
||
"nav.protocols": "Протоколы",
|
||
"nav.keys": "API-ключи",
|
||
"nav.playground": "Песочница",
|
||
"nav.settings": "Настройки",
|
||
"nav.foot": "Шлюз · v{v}",
|
||
"nav.billing": "Ключ роутера и оплата",
|
||
|
||
// topbar / status
|
||
"status.router": "Роутер",
|
||
"status.gateway": "Шлюз",
|
||
"status.online": "в сети",
|
||
"status.offline": "недоступен",
|
||
"status.checking": "проверка…",
|
||
"status.noKey": "нет ключа",
|
||
"theme.toggle": "Тема",
|
||
"logout": "Выйти",
|
||
|
||
// login
|
||
"login.title": "allaigate Gateway",
|
||
"login.subtitle": "Введите токен администратора для управления этим шлюзом.",
|
||
"login.token": "Токен администратора",
|
||
"login.tokenPlaceholder": "вставьте токен",
|
||
"login.submit": "Войти в консоль",
|
||
"login.hint": "Токен печатается в логе шлюза при запуске или задаётся через [admin].token_env.",
|
||
"login.failed": "Неверный токен администратора.",
|
||
|
||
// dashboard
|
||
"dash.title": "Рабочий стол",
|
||
"dash.subtitle": "Трафик в реальном времени, расходы и аналитика роутинга по пулу моделей.",
|
||
"dash.clear": "Очистить логи",
|
||
"dash.clearConfirm": "Очистить всю статистику и логи? Отменить нельзя.",
|
||
"dash.cleared": "Логи очищены",
|
||
"dash.range": "Период",
|
||
"dash.range.1h": "1ч",
|
||
"dash.range.24h": "24ч",
|
||
"dash.range.7d": "7д",
|
||
"dash.kpi.requests": "Запросы",
|
||
"dash.kpi.tokens": "Токены",
|
||
"dash.kpi.cost": "Стоимость",
|
||
"dash.kpi.latency": "Ср. задержка",
|
||
"dash.kpi.success": "Успешность",
|
||
"dash.kpi.failovers": "Переключения",
|
||
"dash.series.title": "Запросы по времени",
|
||
"dash.series.cost": "Расходы по времени",
|
||
"dash.series.empty": "Трафика за этот период нет.",
|
||
"dash.breakdown.title": "Разбивка",
|
||
"dash.groupby.model": "по модели",
|
||
"dash.groupby.tier": "по уровню",
|
||
"dash.groupby.label": "по задаче",
|
||
"dash.groupby.account": "по аккаунту",
|
||
"dash.recent.title": "Последние запросы",
|
||
"dash.recent.empty": "Запросов ещё нет. Попробуйте Песочницу.",
|
||
"dash.col.time": "Время",
|
||
"dash.col.model": "Модель",
|
||
"dash.col.tier": "Уровень",
|
||
"dash.col.task": "Задача",
|
||
"dash.col.tokens": "Токены",
|
||
"dash.col.cost": "Стоимость",
|
||
"dash.col.latency": "Задержка",
|
||
"dash.col.outcome": "Результат",
|
||
"dash.col.requests": "Запросы",
|
||
"dash.col.errors": "Ошибки",
|
||
"dash.health.title": "Состояние",
|
||
"dash.health.reachable": "доступен",
|
||
"dash.health.unreachable": "недоступен",
|
||
"dash.health.getKey": "Получить ключ роутера",
|
||
|
||
// models
|
||
"models.title": "Модели",
|
||
"models.subtitle": "Пул моделей — сочетайте дешёвые локальные модели с облачными API.",
|
||
"models.add": "Добавить модель",
|
||
"models.empty": "Моделей нет. Добавьте первую модель.",
|
||
"models.col.id": "ID",
|
||
"models.col.provider": "Провайдер",
|
||
"models.col.model": "Модель",
|
||
"models.col.tier": "Уровень цены",
|
||
"models.col.key": "Ключ",
|
||
"models.col.caps": "Возможности",
|
||
"models.col.price": "Цена (вх/исх)",
|
||
"models.probe": "Проверить",
|
||
"models.probe.ok": "Доступна ({ms} мс)",
|
||
"models.probe.fail": "Ошибка: {err}",
|
||
"models.form.addTitle": "Добавить модель",
|
||
"models.form.editTitle": "Редактировать модель",
|
||
"models.form.id": "ID",
|
||
"models.form.idHint": "Уникальный ID для роутинга, например local-qwen",
|
||
"models.form.provider": "Провайдер",
|
||
"models.form.baseUrl": "Base URL",
|
||
"models.form.model": "Имя модели",
|
||
"models.form.kind": "Тип",
|
||
"models.form.costTier": "Уровень цены",
|
||
"models.form.priceIn": "Цена вх. ($/1M)",
|
||
"models.form.priceOut": "Цена исх. ($/1M)",
|
||
"models.form.apiKeyEnv": "Имя env-переменной с ключом",
|
||
"models.form.apiKeyEnvHint": "Имя переменной окружения или секрета с ключом провайдера.",
|
||
"models.form.caps": "Возможности",
|
||
"models.form.secret": "Значение секрета",
|
||
"models.form.secretStored": "сохранён",
|
||
"models.form.secretEnv": "из env",
|
||
"models.form.secretMissing": "не задан",
|
||
"models.form.secretPlaceholder": "задать или заменить ключ (только запись)",
|
||
"models.deleteConfirm": "Удалить модель \"{id}\"?",
|
||
"models.form.idOrModel": "Укажите id или имя модели",
|
||
"models.form.apiKey": "API-ключ",
|
||
"models.form.apiKeyPlaceholder": "вставьте API-ключ",
|
||
"models.form.apiKeyNotNeeded": "не нужен (локальный сервер)",
|
||
"models.form.apiKeyHint": "Хранится безопасно на шлюзе; больше не показывается.",
|
||
"models.form.keyStored": "Ключ сохранён — оставьте пустым, чтобы не менять, или вставьте новый.",
|
||
"models.form.keyFromEnv": "Используется ключ из переменной окружения.",
|
||
"models.form.paramsTitle": "Параметры генерации, O(1) и режим размышления",
|
||
"models.form.temperature": "Температура",
|
||
"models.form.temperatureHint": "Температура генерации (0.0 — точные факты, 1.0+ — творчество).",
|
||
"models.form.topP": "Top-P (Nucleus Sampling)",
|
||
"models.form.topPHint": "Порог сэмплирования токенов (0.0 .. 1.0).",
|
||
"models.form.maxTokens": "Макс. токенов (Max Tokens)",
|
||
"models.form.maxTokensHint": "Максимальное количество генерируемых токенов.",
|
||
"models.form.thinkBudget": "Режим размышления / Think Budget",
|
||
"models.form.thinkBudgetHint": "Бюджет токенов мыслей (0 = выключен, N > 0 = лимит рассуждений).",
|
||
"models.form.systemPrompt": "Системный промпт по умолчанию",
|
||
"models.form.systemPromptHint": "Автоматически подставляется, если запрос не содержит системное сообщение.",
|
||
"models.form.systemPromptPlaceholder": "Вы — полезный ассистент...",
|
||
"models.form.testKey": "Проверить и загрузить модели",
|
||
"models.form.testing": "проверка…",
|
||
"models.form.foundModels": "загружено моделей: {n}",
|
||
"models.form.modelPlaceholder": "введите для поиска…",
|
||
"models.form.modelHint": "Нажмите «Проверить и загрузить модели», чтобы подтянуть список по ключу, затем выберите.",
|
||
"models.managed": "управляемая",
|
||
"models.managedHint": "Предоставляется CMF-сервером (Настройки → Локальные модели). Настраивается там.",
|
||
|
||
// routing
|
||
"routing.title": "Роутинг",
|
||
"routing.subtitle": "Сопоставьте уровни сложности с упорядоченным списком моделей (приоритет = fallback).",
|
||
"routing.default": "Модель по умолчанию",
|
||
"routing.defaultHint": "Используется, если роутер недоступен.",
|
||
"routing.tiers": "Уровни",
|
||
"routing.tierHint": "Перетащите чипы для изменения порядка; первый — предпочтительный, остальные — резервные.",
|
||
"routing.addModel": "+ добавить",
|
||
"routing.addTier": "Добавить уровень",
|
||
"routing.tierName": "Название уровня",
|
||
"routing.policy": "Политика",
|
||
"routing.policy.mode": "Режим",
|
||
"routing.policy.fixed": "Фиксированная таблица",
|
||
"routing.policy.costAware": "С учётом стоимости",
|
||
"routing.policy.maxCost": "Макс. стоимость запроса ($)",
|
||
"routing.policy.minClass": "Мин. класс на уровень",
|
||
"routing.empty": "Моделей нет — сначала добавьте модели.",
|
||
|
||
// protocols
|
||
"protocols.title": "Протоколы",
|
||
"protocols.subtitle": "Включайте только нужные входящие API. Переключатели применяются мгновенно.",
|
||
"protocols.implemented": "реализован",
|
||
"protocols.planned": "планируется",
|
||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||
"protocols.openai_chat.d": "POST /v1/chat/completions — работает с OpenAI SDK, LangChain, crewAI.",
|
||
"protocols.openai_completions": "OpenAI Completions (устаревший)",
|
||
"protocols.openai_completions.d": "POST /v1/completions — устаревшие интеграции.",
|
||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||
"protocols.openai_embeddings.d": "POST /v1/embeddings — RAG-пайплайны.",
|
||
"protocols.openai_models": "OpenAI Models",
|
||
"protocols.openai_models.d": "GET /v1/models — автообнаружение клиентами.",
|
||
"protocols.anthropic_messages": "Anthropic Messages",
|
||
"protocols.anthropic_messages.d": "POST /v1/messages — Claude-нативные агенты.",
|
||
"protocols.mcp": "MCP (Model Context Protocol)",
|
||
"protocols.mcp.d": "JSON-RPC / SSE — MCP-нативные оркестраторы.",
|
||
"protocols.native_passthrough": "Нативный проброс",
|
||
"protocols.native_passthrough.d": "POST /route — прямой доступ к решению роутера.",
|
||
|
||
// keys
|
||
"keys.title": "API-ключи",
|
||
"keys.subtitle": "Виртуальные ключи шлюза для агентов. Ключи провайдеров не покидают шлюз.",
|
||
"keys.add": "Новый ключ",
|
||
"keys.empty": "Ключей нет — шлюз в открытом режиме (без аутентификации).",
|
||
"keys.openMode": "Открытый режим: любой запрос принимается (ключ не нужен).",
|
||
"keys.col.key": "Ключ",
|
||
"keys.col.account": "Аккаунт",
|
||
"keys.col.rate": "Лимит / мин",
|
||
"keys.col.models": "Разрешённые модели",
|
||
"keys.form.title": "Новый API-ключ",
|
||
"keys.form.account": "Аккаунт",
|
||
"keys.form.rate": "Лимит запросов / мин",
|
||
"keys.form.allow": "Разрешённые модели",
|
||
"keys.form.allowHint": "Оставьте пустым, чтобы разрешить все модели.",
|
||
"keys.form.custom": "Произвольный ключ (необязательно)",
|
||
"keys.form.customHint": "Оставьте пустым для автогенерации sk-gw-…",
|
||
"keys.created": "Ключ создан — скопируйте его сейчас, он больше не отобразится:",
|
||
"keys.revoke": "Отозвать",
|
||
"keys.revokeConfirm": "Отозвать этот ключ?",
|
||
"keys.allowAll": "все",
|
||
|
||
// playground
|
||
"pg.title": "Песочница",
|
||
"pg.subtitle": "Отправьте запрос через активный пайплайн и изучите решение роутера.",
|
||
"pg.system": "Системный промпт",
|
||
"pg.systemPlaceholder": "необязательное системное сообщение",
|
||
"pg.prompt": "Промпт",
|
||
"pg.promptPlaceholder": "Задайте вопрос…",
|
||
"pg.mode": "Режим",
|
||
"pg.mode.auto": "Авто (роутинг)",
|
||
"pg.mode.pinned": "Фиксированная модель",
|
||
"pg.profile": "Профиль",
|
||
"pg.model": "Модель",
|
||
"pg.temp": "Температура",
|
||
"pg.maxTokens": "Макс. токены",
|
||
"pg.send": "Отправить",
|
||
"pg.stream": "Стриминг",
|
||
"pg.sending": "Отправка…",
|
||
"pg.answer": "Ответ",
|
||
"pg.empty": "Ответ и решение роутера появятся здесь.",
|
||
"pg.decision": "Решение роутера",
|
||
"pg.task": "Задача",
|
||
"pg.tier": "Уровень",
|
||
"pg.score": "Сложность",
|
||
"pg.selected": "Выбранная модель",
|
||
"pg.source": "Источник маршрута",
|
||
"pg.cost": "Стоимость",
|
||
"pg.latency": "Задержка",
|
||
"pg.tokens": "Токены (вх/исх)",
|
||
"pg.failover": "Failover",
|
||
"pg.error": "Ошибка запроса",
|
||
|
||
// settings
|
||
"settings.title": "Настройки",
|
||
"settings.subtitle": "Подключение к шлюзу, входные данные роутинга, надёжность и наблюдаемость.",
|
||
"settings.router": "Подключение к роутеру",
|
||
"settings.router.url": "URL роутера",
|
||
"settings.router.keyEnv": "Имя env-переменной с ключом роутера",
|
||
"settings.router.timeout": "Таймаут (мс)",
|
||
"settings.router.verifyTls": "Проверять TLS-сертификат",
|
||
"settings.router.enabled": "Использовать роутер (выкл = только локальные модели)",
|
||
"settings.cmf": "Локальные модели (CMF)",
|
||
"settings.cmf.localOnly": "Использовать только локальные модели",
|
||
"settings.cmf.manage": "Запускать локальный сервер моделей",
|
||
"settings.cmf.autoInstall": "Автоустановка cortiq (crates.io)",
|
||
"settings.cmf.autoUpdate": "Автообновление cortiq",
|
||
"settings.cmf.model": "Путь к локальной .cmf-модели",
|
||
"settings.cmf.port": "Порт локального сервера",
|
||
"settings.cmf.modelId": "ID модели в пуле",
|
||
"settings.cmf.note": "Обслуживает локальный .cmf через cortiq (github.com/infosave2007/cmf). Работает даже когда роутер недоступен.",
|
||
"settings.cmf.threads": "Рабочие потоки",
|
||
"settings.cmf.gpu": "Использовать GPU (Metal / wgpu)",
|
||
"settings.cmf.speedNote": "Потоки распараллеливают декод-матвеки (~×3; 0 = по умолчанию рантайма). GPU-оффлоад помогает в основном на prefill длинных промптов — декод упирается в пропускную способность памяти, поэтому на Apple Silicon почти нейтрален.",
|
||
"settings.cmf.pick": "выберите модель",
|
||
"settings.cmf.models": "Локальные модели",
|
||
"settings.cmf.modelsHelp": "Каждая строка — отдельная модель: шлюз поднимает свой cortiq serve на своём порту и регистрирует её в пуле. Добавляйте столько, сколько есть .cmf-файлов и свободных портов.",
|
||
"settings.cmf.rowHint": "id · файл .cmf · порт · потоки · GPU. Изменения применяются после перезапуска; удаление строки останавливает сервер.",
|
||
"settings.cmf.addServer": "+ Добавить модель",
|
||
"settings.cmf.checkPort": "Проверить порт",
|
||
"settings.cmf.portFree": "порт свободен",
|
||
"settings.cmf.portBusy": "порт занят",
|
||
"settings.cmf.useSuggested": "занять {port}",
|
||
"settings.cmf.serving": "работает: {model} на :{port}",
|
||
"settings.cmf.intro": "Запускайте модели локально движком cortiq — работает даже офлайн или когда роутер недоступен.",
|
||
"settings.cmf.runtime": "Среда cortiq",
|
||
"settings.cmf.runtimeHelp": "Инструмент командной строки `cortiq`, который загружает и запускает .cmf-модели. Установите один раз перед запуском локального сервера.",
|
||
"settings.cmf.install": "Установить cortiq",
|
||
"settings.cmf.reinstall": "Переустановить / обновить",
|
||
"settings.cmf.installing": "устанавливается… (компилируется, пара минут)",
|
||
"settings.cmf.installedOk": "cortiq установлен",
|
||
"settings.cmf.notInstalled": "не установлен",
|
||
"settings.cmf.addModel": "Добавить модель",
|
||
"settings.cmf.addModelHelp": "Модели скачиваются и конвертируются во вкладке Импорт (HuggingFace → .cmf). Затем укажите путь к .cmf ниже.",
|
||
"settings.cmf.importNote": "Ещё нет модели? Импортируйте:",
|
||
"settings.cmf.importLink": "Открыть Импорт",
|
||
"settings.cmf.modelHelp": "Путь к .cmf-файлу для запуска (напр. models/qwen.cmf), создаётся во вкладке Импорт. Несколько моделей под разные задачи? Импортируйте их и меняйте этот путь.",
|
||
"settings.cmf.portHelp": "TCP-порт локального сервера моделей (по умолчанию 8081). Меняйте, только если конфликтует с другим сервисом.",
|
||
"settings.cmf.threadsHelp": "Сколько ядер CPU использовать для генерации. Больше = быстрее (~×3 против 1 ядра); 0 — на усмотрение рантайма.",
|
||
"settings.cmf.gpuHelp": "Выгрузить матричные операции на GPU (Metal/wgpu). На Apple Silicon ускоряет в основном длинные промпты — декод упирается в пропускную способность памяти.",
|
||
"settings.cmf.localOnlyHelp": "Направлять все запросы в локальную модель, игнорируя роутер и облачные провайдеры.",
|
||
"settings.cmf.manageHelp": "Шлюз запускает `cortiq serve` для .cmf ниже при старте и маршрутизирует в него. Нужен установленный cortiq (шаг 1). Применяется после перезапуска.",
|
||
"settings.cmf.autoInstallHelp": "Если cortiq не найден при старте — установить автоматически с crates.io.",
|
||
"settings.cmf.autoUpdateHelp": "При старте обновлять cortiq до новейшей версии, когда есть новее.",
|
||
"settings.router.enabledHelp": "Использовать cortiq-router для классификации запроса (тип задачи + сложность) и выбора модели. Выкл = только локальная таблица маршрутизации.",
|
||
"settings.router.verifyTlsHelp": "Проверять TLS-сертификат роутера. Выключайте только для самоподписанного / привязанного к IP сертификата.",
|
||
"settings.telemetry.metricsHelp": "Отдавать метрики Prometheus по GET /metrics.",
|
||
"settings.cortiq.echoHelp": "Добавлять поле `cortiq` (задача, модель, стоимость) в тело каждого ответа. Заголовки ответа шлются всегда.",
|
||
"settings.stats.enabledHelp": "Записывать недавние запросы для дашборда и графиков.",
|
||
"settings.cache.enabledHelp": "Семантический кэш: возвращать сохранённый ответ, когда новый промпт очень похож на прошлый, пропуская вызов модели. Нужна embedding-модель в пуле.",
|
||
"settings.log.bodiesHelp": "Логировать полные тела запросов/ответов. По умолчанию выкл ради приватности.",
|
||
"settings.router.taxonomy": "ID таксономии",
|
||
"settings.router.getKey": "Получить или пополнить ключ роутера:",
|
||
"settings.router.secret": "Ключ роутера (значение)",
|
||
"settings.router.saveKey": "Сохранить ключ",
|
||
"settings.router.keySaved": "Ключ роутера сохранён",
|
||
"settings.router.keyEmpty": "Сначала вставьте ключ",
|
||
"settings.router.secretHelp": "Вставьте ключ из письма с api.allaigate.com и нажмите «Сохранить ключ». Это НЕ ключ из раздела «Ключи» — те выдаются клиентам для доступа к вашему шлюзу.",
|
||
"settings.router.keyStoredMask": "•••••••••••• — ключ сохранён (вставьте снова, чтобы заменить)",
|
||
"settings.router.test": "Проверить роутер",
|
||
"router.probe.ok": "Роутер работает ({ms} мс)",
|
||
"router.probe.noKey": "Ключ роутера не задан",
|
||
"router.probe.auth": "Ключ отклонён — недействителен или отозван",
|
||
"router.probe.payment": "Требуется оплата — тариф истёк или квота исчерпана",
|
||
"router.probe.quota": "Превышен лимит запросов",
|
||
"router.probe.timeout": "Роутер не ответил вовремя",
|
||
"router.probe.unreachable": "Роутер недоступен",
|
||
"router.probe.error": "Ошибка роутера",
|
||
"router.usage": "Использование",
|
||
"settings.route": "Входные данные роутинга",
|
||
"settings.route.strategy": "Стратегия текста",
|
||
"settings.route.maxChars": "Макс. символов",
|
||
"settings.route.cacheTtl": "TTL кэша",
|
||
"settings.route.profile": "Профиль по умолчанию",
|
||
"settings.route.strategyHelp": "Какой текст отправляется роутеру для классификации: last_user — только последнее сообщение пользователя; last_user_plus_system — последнее сообщение + системный промпт; concat_all — вся переписка.",
|
||
"settings.route.maxCharsHelp": "Максимум символов этого текста, отправляемого роутеру (длиннее — обрезается). Больше = точнее классификация, но медленнее/дороже вызовы роутера.",
|
||
"settings.route.cacheTtlHelp": "Сколько кэшируется решение роутинга для одинакового запроса, прежде чем роутер спрашивается снова (напр. 60s, 5m).",
|
||
"settings.route.profileHelp": "Профиль роутинга по умолчанию, если запрос его не задаёт: cost-saver (дешевле), balanced (баланс) или quality-first (качество). Влияет на выбор модели роутером.",
|
||
"settings.breaker": "Автоматический выключатель",
|
||
"settings.breaker.threshold": "Порог ошибок",
|
||
"settings.breaker.cooldown": "Время восстановления",
|
||
"settings.log": "Логирование",
|
||
"settings.log.level": "Уровень логов",
|
||
"settings.log.bodies": "Логировать тела сообщений (приватность отключена)",
|
||
"settings.telemetry": "Телеметрия",
|
||
"settings.telemetry.metrics": "Включить Prometheus /metrics",
|
||
"settings.cortiq": "Метаданные ответа",
|
||
"settings.cortiq.echo": "Включать блок роутинга cortiq в ответы",
|
||
"settings.stats": "Статистика",
|
||
"settings.stats.enabled": "Записывать статистику запросов",
|
||
"settings.stats.file": "Файл статистики (JSONL)",
|
||
"settings.stats.retention": "Срок хранения",
|
||
"settings.listen": "Адрес прослушивания",
|
||
"settings.export": "Экспорт конфигурации",
|
||
"settings.import": "Импорт конфигурации",
|
||
"settings.needsRestart": "Сохранено. Некоторые изменения (адрес прослушивания) требуют перезапуска.",
|
||
|
||
// toasts / misc
|
||
"toast.saved": "Изменения сохранены",
|
||
"toast.deleted": "Удалено",
|
||
"toast.probing": "Проверка…",
|
||
"toast.imported": "Конфигурация импортирована",
|
||
"dash.cache": "Семантический кэш",
|
||
"dash.cache.hitRate": "Попаданий",
|
||
"dash.cache.hits": "Попадания",
|
||
"dash.cache.saved": "Сэкономлено",
|
||
"dash.cache.disabled": "Семантический кэш выключен — включите в Настройках.",
|
||
"settings.cache": "Семантический кэш",
|
||
"settings.cache.enabled": "Включить семантический кэш",
|
||
"settings.cache.threshold": "Порог сходства",
|
||
"settings.cache.ttl": "TTL записи",
|
||
"settings.cache.embed": "Модель эмбеддингов",
|
||
"settings.cache.note": "Настройки кэша применяются после перезапуска.",
|
||
|
||
// импорт (HuggingFace → CMF)
|
||
"import.subtitle": "Найдите модель на HuggingFace, сконвертируйте в локальный .cmf и подключите.",
|
||
"import.searchPlaceholder": "Поиск моделей на HuggingFace (напр. qwen3, llama)…",
|
||
"import.searching": "Ищу…",
|
||
"import.noResults": "Модели не найдены.",
|
||
"import.configure": "Настройка конвертации",
|
||
"import.outName": "Имя файла",
|
||
"import.outNameHint": "Имя .cmf (буквы, цифры, - и _).",
|
||
"import.quant": "Квантизация",
|
||
"import.convert": "Сконвертировать и загрузить",
|
||
"import.converting": "Конвертация",
|
||
"import.started": "Конвертация запущена",
|
||
"import.failed": "Конвертация не удалась — смотрите лог.",
|
||
"import.register": "Подключить как локальную модель",
|
||
"import.registered": "Подключено как '{id}'. Запустите cortiq-server для обслуживания.",
|
||
"import.jobs": "Загрузки / Конвертации",
|
||
"import.cancel": "Отменить",
|
||
"import.cancelling": "Отмена — удаляю недописанный файл…",
|
||
"import.delete": "Удалить",
|
||
"import.deleteConfirm": "Удалить эту модель и сконвертированный .cmf-файл с диска?",
|
||
"import.deleted": "Удалено вместе с файлами",
|
||
"import.state.running": "идёт",
|
||
"import.state.done": "готово",
|
||
"import.state.error": "ошибка",
|
||
"import.state.cancelled": "отменено",
|
||
"import.featuredTitle": "Рекомендуемые готовые .cmf модели",
|
||
"import.featuredSub": "Готовые .cmf модели из аккаунта infosave на HuggingFace — список читается вживую, новые модели появляются здесь сами.",
|
||
"import.readyCmfBadge": "Готовая .cmf",
|
||
"import.directDownload": "Скачать",
|
||
"import.q.q8_2f": "8-бит двухполевой (𝒲×θ) — рекомендуется: лучшее качество/размер.",
|
||
"import.q.q8_row": "8-бит построчно — просто, надёжно.",
|
||
"import.q.q4": "4-бит блочно — компактнее, ниже качество.",
|
||
"import.q.q4_tiled": "4-бит тайловый (Q4_TILED) — х1.66 быстрее на Metal GPU.",
|
||
"import.q.vbit": "Переменная 3–8 бит — per-expert бюджеты.",
|
||
"import.q.q1t": "1.58-бит тернарный (Q1T) — BitNet b1.58 с оутлайерами.",
|
||
"import.q.q1s": "1-бит спарс (Q1S) — 1-бит база с голографическими оутлайерами.",
|
||
"import.q.q1p": "1-бит PTQ (Q1P) — 1-бит с переносом ошибки (error diffusion).",
|
||
"import.q.q1": "1-бит (Q1) — чистый бинарный формат.",
|
||
"import.q.f16": "16-бит — без квантования.",
|
||
"import.q.f32": "32-бит — полная точность (большой файл).",
|
||
|
||
"import.adv.title": "Расширенные настройки",
|
||
"import.adv.auto": "авто",
|
||
"import.adv.linearCore": "Линейное ядро",
|
||
"import.adv.linearHint": "Как переносятся/сворачиваются линейные слои внимания.",
|
||
"import.adv.nphase": "vmf_phase фаз/голову",
|
||
"import.adv.vbitShape": "Форма бюджета VBIT",
|
||
"import.adv.meanBits": "VBIT средних бит",
|
||
"import.adv.shard": "Шард макс (ГБ)",
|
||
"import.adv.noShard": "без шардинга",
|
||
"import.adv.skipMtp": "пропустить MTP-голову",
|
||
"import.adv.o1": "O(1)-внимание",
|
||
"import.adv.o1Hint": "Потоковое внимание с постоянной памятью: KV-кэш освобождается после prefill, длинный контекст не раздувает память. Веса не меняются — записывается лишь подсказка на загрузку; вернуться можно всегда (запуск с --o1 off). Проверено на Qwen3-0.6B: все слои ≈ ×1.18 перплексии.",
|
||
"import.adv.o1Off": "выкл — точное внимание (по умолчанию)",
|
||
"import.adv.o1All": "all — конвертировать все softmax-слои",
|
||
"import.adv.o1Deep": "deep N — только N самых глубоких слоёв",
|
||
"import.adv.o1Custom": "вручную — явный список слоёв",
|
||
"import.adv.o1DeepN": "N глубоких слоёв",
|
||
"import.adv.o1Layers": "Слои (через запятую)",
|
||
"import.adv.o1mHint": "число опорных точек (по умолчанию 32)",
|
||
"import.adv.o1windowHint": "ширина точного окна (по умолчанию 128)",
|
||
"import.adv.o1sinkHint": "постоянные точные sink-ключи (по умолчанию 4)",
|
||
|
||
// онбординг (первый запуск)
|
||
"onboarding.title": "Первоначальная настройка",
|
||
"onboarding.welcome": "Добро пожаловать в Cortiq Gateway",
|
||
"onboarding.welcomeSub": "Выберите язык — его можно сменить в шапке в любой момент.",
|
||
"onboarding.next": "Далее",
|
||
"onboarding.back": "Назад",
|
||
"onboarding.skip": "Пропустить",
|
||
"onboarding.skipSetup": "Пропустить",
|
||
"onboarding.finish": "Завершить",
|
||
"onboarding.featuredTitle": "Готовые модели в один клик",
|
||
"onboarding.featuredSub": "Это уже сконвертированные .cmf модели от infosave на HuggingFace — просто Скачать, без конвертации. Выберите одну или несколько для мгновенного старта.",
|
||
"onboarding.download": "Скачать",
|
||
"onboarding.hfTitle": "Любая модель с HuggingFace — автоконвертация",
|
||
"onboarding.hfSub": "Найдите любую модель, выберите квантизацию — мы автоматически сконвертируем её в .cmf. Никаких ручных правок конфига.",
|
||
"onboarding.noJobs": "Пока нет загрузок.",
|
||
"onboarding.doneTitle": "Готово",
|
||
"onboarding.doneSub": "Скачанные модели зарегистрируются автоматически. Добавить ещё можно во вкладке Импорт или Модели.",
|
||
"onboarding.doneHint": "Кнопка «Завершить» подключит все скачанные модели как локальные, поднимет для них .cmf сервер и настроит роутинг. Всё это потом можно изменить во вкладке Модели.",
|
||
"onboarding.willRegister": "Будут подключены как локальные модели",
|
||
"onboarding.nothingToRegister": "Завершённых загрузок пока нет — подключать нечего. Вернитесь на шаг назад и выберите модель.",
|
||
"onboarding.registeredN": "Подключено моделей: {n} — {ids}",
|
||
"onboarding.runtimeMissing": "Среда cortiq не установлена — установите её в Настройки → Локальные модели, чтобы запускать эти модели.",
|
||
"onboarding.downloaded": "скачана",
|
||
"onboarding.update": "Обновить",
|
||
"onboarding.deleteFile": "Удалить файл .cmf с диска",
|
||
"onboarding.confirmDelete": "Удалить «{id}»? Файл .cmf будет удалён с диска.",
|
||
"onboarding.unregistered": "Также отключено из моделей: {ids}",
|
||
|
||
// playground: media generation + streaming metrics
|
||
"pg.tab.chat": "Чат",
|
||
"pg.tab.image": "Изображение",
|
||
"pg.tab.video": "Видео",
|
||
"pg.generate": "Сгенерировать",
|
||
"pg.generating": "Генерация…",
|
||
"pg.genFailed": "Генерация не удалась — смотрите лог.",
|
||
"pg.result": "Результат",
|
||
"pg.genMetrics": "Метрики генерации",
|
||
"pg.imagePromptPlaceholder": "рыжая лиса в снегу на закате, фотореалистично, детальный мех",
|
||
"pg.videoPromptPlaceholder": "корги в поварском колпаке подбрасывает блин, шипение сковороды и весёлый лай",
|
||
"pg.imageEmpty": "Сгенерированное изображение появится здесь.",
|
||
"pg.videoEmpty": "Сгенерированный ролик (со звуком) появится здесь.",
|
||
"pg.width": "Ширина",
|
||
"pg.height": "Высота",
|
||
"pg.steps": "Шаги",
|
||
"pg.seed": "Seed",
|
||
"pg.randomSeed": "Случайный seed",
|
||
"pg.cfgHint": "Сила guidance; ≤ 1 отключает CFG и вдвое ускоряет генерацию.",
|
||
"pg.frames": "Кадры",
|
||
"pg.framesHint": "При 24 fps; округляется до сетки модели.",
|
||
"pg.quality": "Качество JPEG",
|
||
"pg.videoSizeHint": "Кратно 32; обученная короткая сторона — 768.",
|
||
"pg.videoStepsHint": "Turbo LoRA обучена на 4 шага.",
|
||
"pg.firstFrame": "Первый кадр (необязательно)",
|
||
"pg.lastFrame": "Последний кадр (необязательно)",
|
||
"pg.keyframeHint": "Превращает запуск в keyframe-to-video.",
|
||
"pg.resolution": "Разрешение",
|
||
"pg.genTime": "Время генерации",
|
||
"pg.timePerStep": "На шаг",
|
||
"pg.timePerFrame": "На кадр",
|
||
"pg.fileSize": "Размер файла",
|
||
"pg.duration": "Длительность",
|
||
"pg.play": "Играть",
|
||
"pg.noMediaModels": "Локальной модели ({kind}) ещё нет. Скачайте её (например, из коллекции infosave) во вкладке Импорт:",
|
||
"pg.tokSpeed": "Скорость",
|
||
"pg.ttft": "Первый токен",
|
||
|
||
// ops: logs, system, notices, gallery, chat, snippets, bench
|
||
"nav.logs": "Логи",
|
||
"logs.subtitle": "Последние записи журнала шлюза — то, что показал бы терминал.",
|
||
"logs.filterPlaceholder": "фильтр…",
|
||
"logs.pause": "Пауза",
|
||
"logs.resume": "Продолжить",
|
||
"logs.empty": "Ничего не найдено.",
|
||
"notice.openAdmin": "Панель управления открыта без токена и доступна с других машин. Задайте токен, если эта машина не приватная.",
|
||
"notice.update": "Доступно обновление: v{v}.",
|
||
"dash.sys.title": "Система",
|
||
"dash.sys.cores": "ядер",
|
||
"dash.sys.disk": "Диск (модели)",
|
||
"dash.sys.free": "свободно",
|
||
"dash.sys.gateway": "шлюз",
|
||
"fit.disk": "не хватит места",
|
||
"fit.diskTitle": "Загрузка больше свободного места на диске с моделями.",
|
||
"fit.ram": "может не влезть в RAM",
|
||
"fit.ramTitle": "Модель сравнима с объёмом RAM этой машины или больше — может не запуститься.",
|
||
"pg.eta": "осталось",
|
||
"pg.min": "мин",
|
||
"pg.queued": "В очереди — позиция {n}. Стартует, как только закончится текущая генерация.",
|
||
"pg.gallery": "Последние генерации",
|
||
"pg.galDeleteConfirm": "Удалить эту генерацию и её файлы?",
|
||
"pg.clearChat": "Очистить",
|
||
"keys.snip.title": "Подключите ваше приложение",
|
||
"keys.snip.hint": "Вставьте один из примеров в свой проект — заменить нужно только плейсхолдер ключа.",
|
||
"keys.snip.withKey": "В примерах ниже уже подставлен только что созданный ключ.",
|
||
"keys.snip.openMode": "API-ключи не настроены — шлюз принимает любое значение ключа.",
|
||
"keys.snip.keyPh": "ваш API-ключ",
|
||
"settings.restart": "Перезапустить всё",
|
||
"settings.restartConfirm": "Перезапустить шлюз и все серверы локальных моделей? Текущие запросы оборвутся.",
|
||
"settings.restarting": "Перезапуск — страница обновится, когда шлюз поднимется…",
|
||
"settings.shutdown": "Остановить всё и выключить",
|
||
"settings.shutdownConfirm": "Остановить все серверы локальных моделей и выключить шлюз? API и эта панель перестанут отвечать, пока вы не запустите шлюз заново.",
|
||
"settings.shutdownDone": "Шлюз выключен.",
|
||
"settings.shutdownHint": "Все серверы локальных моделей остановлены, процесс завершён. Запустите шлюз на сервере заново, чтобы вернуть панель.",
|
||
"bench.title": "Скорость локальных моделей",
|
||
"bench.hint": "Запускает `cortiq bench` на этой машине — реальные tok/s, по одной модели за раз.",
|
||
"bench.run": "Замерить",
|
||
"bench.running": "замер…",
|
||
"bench.failed": "ошибка",
|
||
"bench.none": "Локальных чат-моделей .cmf пока нет.",
|
||
|
||
// task-based routing
|
||
"task.chitchat": "Светская беседа",
|
||
"task.code": "Код",
|
||
"task.creative-writing": "Творческие тексты",
|
||
"task.extraction": "Извлечение данных",
|
||
"task.math": "Математика",
|
||
"task.qa": "Вопросы и ответы",
|
||
"task.summarization": "Суммаризация",
|
||
"task.translation": "Перевод",
|
||
"routing.tasks.title": "Распределение по задачам",
|
||
"routing.tasks.hint": "Модели правила идут первыми для своей задачи; цепочка по сложности остаётся резервом. Пусто = только по сложности.",
|
||
"routing.tasks.inherit": "по сложности (без правила)",
|
||
"routing.tasks.share": "{p}% запросов (7д)",
|
||
"routing.tasks.fromRouter": "метки получены с роутера",
|
||
"routing.tasks.builtin": "роутер недоступен — встроенный набор меток",
|
||
"routing.tasks.addCustom": "Добавить задачу",
|
||
"routing.tasks.addPlaceholder": "своя метка…",
|
||
|
||
// benchmark view
|
||
"nav.benchmark": "Бенчмарк",
|
||
"bm.title": "Бенчмарк",
|
||
"bm.subtitle": "Проверки качества и скорости через живой пайплайн: ответы сверяются по ключевым словам, ловится зацикливание, замеряются tok/s и время первого токена.",
|
||
"bm.models": "Какие модели тестировать",
|
||
"bm.quickMode": "Быстрый тест",
|
||
"bm.quickHint": "Короткое подмножество с краткими ответами — около минуты на локальную модель.",
|
||
"bm.suiteInfo": "Встроенный набор: {q} быстрых / {f} полных тестов, плюс ваши собственные.",
|
||
"bm.run": "Запустить",
|
||
"bm.pickModel": "Выберите хотя бы одну модель.",
|
||
"bm.testOf": "тест {i} из {n}",
|
||
"bm.results": "Результаты",
|
||
"bm.quick": "быстрый",
|
||
"bm.test": "Тест",
|
||
"bm.cellHint": "Клик по ячейке — полный ответ модели.",
|
||
"bm.history": "Прошлые прогоны (хранятся в этом браузере)",
|
||
"bm.custom": "Свои тесты",
|
||
"bm.customHint": "Промпт + ключевые слова через запятую, которые должны быть в ответе (| — синонимы). Хранятся в этом браузере.",
|
||
"bm.promptPh": "промпт…",
|
||
"bm.checkPh": "ключевые слова через запятую",
|
||
"bm.addTest": "Добавить тест",
|
||
"bm.emptyAnswer": "пустой ответ",
|
||
"bm.loopDetected": "зацикливание",
|
||
|
||
// benchmark: routing mode, cost, live
|
||
"bm.mode.routing": "Умный роутинг",
|
||
"bm.mode.models": "Отдельные модели",
|
||
"bm.mode.routingDesc": "Проверка главной фишки продукта: каждый тест идёт через cortiq-auto — видно, какую задачу распознал роутер, какую модель выбрал, совпало ли это с ожиданием и сколько это стоило.",
|
||
"bm.mode.modelsDesc": "Тот же набор тестов, но закреплённый за выбранными моделями — сравнение их качества, скорости и стоимости напрямую, мимо роутера.",
|
||
"bm.answersOk": "ответы верны",
|
||
"bm.classAcc": "классификация задач",
|
||
"bm.modelDist": "Запросы ушли в",
|
||
"bm.expectedLbl": "ожидалось:",
|
||
"bm.answer": "Ответ",
|
||
"bm.liveRunning": "идёт…",
|
||
"bm.spent": "потрачено",
|
||
"bm.verdict": "🏁 Готово: ответы {p}, потрачено {s}",
|
||
"bm.clearHistory": "Очистить всё",
|
||
|
||
// harness auto-setup (API keys view)
|
||
"keys.h.claude": "Claude Code — вставьте в терминал (шлюз говорит на протоколе Anthropic нативно):",
|
||
"keys.h.codex": "Codex — добавит провайдера в ~/.codex/config.toml и запустит:",
|
||
"keys.h.opencode": "OpenCode — запишет ~/.config/opencode/opencode.json (перезапишет!) и запустит:",
|
||
"keys.h.continue": "Continue (VS Code / JetBrains) — добавит модель в ~/.continue/config.yaml:",
|
||
"keys.h.cline1": "Cline (VS Code) — в настройках расширения укажите:",
|
||
"keys.h.cline2": "Настройки → API Provider → OpenAI Compatible, затем вставьте значения выше.",
|
||
"keys.h.note": "cortiq-auto — умный роутинг: роутер сам выбирает модель под каждый запрос. Чтобы закрепить конкретную, укажите её точное имя. На Windows запускайте скрипты в Git Bash / WSL или задайте те же переменные через настройки окружения системы.",
|
||
"keys.h.protoOff": "Протокол Anthropic (/v1/messages) выключен — Claude Code не подключится.",
|
||
"keys.h.enableProto": "Включить",
|
||
"keys.h.st.installed": "Установлен на машине шлюза",
|
||
"keys.h.st.configured": "Уже настроен на этот шлюз",
|
||
"keys.h.st.notFound": "Не найден на машине шлюза",
|
||
"bm.degraded": "роутер деградировал",
|
||
"bm.routerDegraded": "Роутер не успел ответить — запрос ушёл по резервной цепочке; классификация не засчитывается.",
|
||
"bm.cutByCap": "бюджет ушёл на размышления — ответ не успел",
|
||
"shell.uiStale": "Шлюз обновился — на этой странице старый интерфейс.",
|
||
"shell.reload": "Перезагрузить",
|
||
"keys.col.requests": "Запросы",
|
||
"keys.col.tokens": "Токены вх/исх",
|
||
"keys.col.costAll": "$ за всё время",
|
||
"routing.tasks.tier": "Сложность",
|
||
"routing.tasks.tierAuto": "Авто (по роутеру)",
|
||
"routing.tasks.tierHint": "Какая модель обслуживает задачу на какой сложности; «любая» ведёт на всех уровнях. Порядок = порядок фолбэка. Вердикт high по-прежнему эскалирует поверх «любых».",
|
||
"routing.tasks.tierAny": "любая сложность",
|
||
"routing.tasks.addModel": "модель",
|
||
"routing.bands.enable": "Мои границы сложности",
|
||
"routing.bands.hint": "Тяните ручки: где кончается low и где начинается high — ручки толкают друг друга, цифры обновляются на лету. Непрерывный score роутера пересчитывается ВАШИМИ границами; галочка снята — действуют пороги самого роутера.",
|
||
"tier.low": "лёгкий",
|
||
"tier.medium": "средний",
|
||
"tier.high": "сложный",
|
||
"bm.scoreHint": "Непрерывный коэффициент сложности роутера (0..1) — ползунки границ на вкладке Роутинг нарезают его на уровни.",
|
||
"settings.cache.noEmbed": "Кэш включён, но embedding-модели нет — он ничего не делает. Добавьте в пул модель с kind = \"embedding\" (например, OpenAI text-embedding) или выберите её ниже.",
|
||
"settings.cache.entries": "записей",
|
||
"settings.cache.hits": "попаданий",
|
||
"settings.cache.saved": "сэкономлено",
|
||
"keys.form.budget": "Бюджет в месяц, $ (0 = без лимита)",
|
||
"keys.form.budgetHint": "Когда траты аккаунта за месяц превысят потолок, запросы отклоняются с 429 insufficient_quota.",
|
||
"keys.budgetOf": "бюджет {b}/мес",
|
||
"dash.kpi.orBalance": "Баланс OpenRouter",
|
||
"keys.h.install": "Установить:",
|
||
"keys.snip.keyInputPh": "вставьте ваш API-ключ",
|
||
"keys.snip.apply": "Вставить ключ",
|
||
};
|