- OpenAI-compatible gateway with intelligent routing via cortiq-router (allaigate) - Embedded build-free admin SPA at /admin: 7 languages (en/ru/de/fr/es/zh/tr), light/dark themes, hot config reload (no restart) - Admin API, per-request statistics + Prometheus /metrics, secret store, playground - English documentation (primary) with Russian translations (*.ru.md)
257 lines
13 KiB
JavaScript
Vendored
257 lines
13 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.routing": "Роутинг",
|
||
"nav.protocols": "Протоколы",
|
||
"nav.keys": "API-ключи",
|
||
"nav.playground": "Playground",
|
||
"nav.settings": "Настройки",
|
||
"nav.foot": "Шлюз · v{v}",
|
||
|
||
// topbar / status
|
||
"status.router": "Роутер",
|
||
"status.gateway": "Шлюз",
|
||
"status.online": "в сети",
|
||
"status.offline": "недоступен",
|
||
"status.checking": "проверка…",
|
||
"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.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": "Запросов ещё нет. Попробуйте Playground.",
|
||
"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": "недоступен",
|
||
|
||
// 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}\"?",
|
||
|
||
// 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": "Playground",
|
||
"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.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.taxonomy": "ID таксономии",
|
||
"settings.route": "Входные данные роутинга",
|
||
"settings.route.strategy": "Стратегия текста",
|
||
"settings.route.maxChars": "Макс. символов",
|
||
"settings.route.cacheTtl": "TTL кэша",
|
||
"settings.route.profile": "Профиль по умолчанию",
|
||
"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": "Конфигурация импортирована",
|
||
};
|