Fifteen changes aimed at the first day of real use: - Import and media jobs persist to <data>/jobs-*.json and reload on start (running ones settle as errors); the Register button no longer vanishes because the gateway restarted. - Docker ships the cortiq binary (built in the builder stage) — local .cmf chat models and image/video generation now work in containers, where auto-install never could (no cargo in the runtime image). libvulkan1 added for optional GPU offload. - Open admin console on 0.0.0.0 without a token now warns in the log and shows a dismissible banner — the VPS footgun is at least labeled. - "Restart gateway" button in Settings: stops managed model servers, spawns a fresh copy (bind retried while the port frees), Docker relies on the container restart policy instead. - Dashboard "System" panel: CPU sparkline + load, RAM (with the gateway's own RSS), free disk at the models dir — sampled by sysinfo every 2 s. - Featured model cards warn "not enough disk" / "may not fit in RAM" before the download, from the same live snapshot. - Log viewer in the sidebar: a 500-line in-memory ring fed by a second ANSI-free tracing layer; filter, level, pause, copy. - Update check: crates.io polled twice a day, the console shows an "update available" notice. - Media generations queue up (with position shown) instead of being rejected; progress gained an honest ETA from measured throughput. - Generation gallery under the image/video tabs: lazy PPM thumbnails, click to reopen with seed/steps, delete. - Playground chat is a real dialogue now: history is resent, bubbles, Clear, Cmd/Ctrl+Enter. - "Connect your app" snippets (curl / Python / JS) on the keys page, with the real key inlined right after creation. - One-click benchmark on the Models page via `cortiq bench --json`. - Config export now downloads the actual gateway.toml (comments intact); import accepts TOML (validated, hot-reloaded) and the legacy JSON. - Streaming token counts are exact when the model server provides usage (cortiq-server patch, shipped separately); the gateway fallback now counts content chunks (1/token on cortiq) instead of chars/4. Wizard's Finish lands on the Playground. 37 new strings in all 7 languages.
541 lines
40 KiB
JavaScript
Vendored
541 lines
40 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": "Перезапуск — страница обновится, когда шлюз поднимется…",
|
||
"bench.title": "Скорость локальных моделей",
|
||
"bench.hint": "Запускает `cortiq bench` на этой машине — реальные tok/s, по одной модели за раз.",
|
||
"bench.run": "Замерить",
|
||
"bench.running": "замер…",
|
||
"bench.failed": "ошибка",
|
||
"bench.none": "Локальных чат-моделей .cmf пока нет.",
|
||
};
|