feat: universal LLM gateway with embedded multilingual admin console
- 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)
This commit is contained in:
Vendored
+256
@@ -0,0 +1,256 @@
|
||||
// Deutsch — German translation for allaigate admin console.
|
||||
export default {
|
||||
// brand / common
|
||||
"brand.sub": "Gateway",
|
||||
"common.loading": "Laden…",
|
||||
"common.save": "Speichern",
|
||||
"common.saving": "Wird gespeichert…",
|
||||
"common.cancel": "Abbrechen",
|
||||
"common.add": "Hinzufügen",
|
||||
"common.edit": "Bearbeiten",
|
||||
"common.delete": "Löschen",
|
||||
"common.close": "Schließen",
|
||||
"common.test": "Testen",
|
||||
"common.copy": "Kopieren",
|
||||
"common.copied": "Kopiert",
|
||||
"common.confirm": "Bestätigen",
|
||||
"common.none": "keine",
|
||||
"common.saved": "Gespeichert",
|
||||
"common.error": "Fehler",
|
||||
"common.ok": "OK",
|
||||
"common.refresh": "Aktualisieren",
|
||||
"common.actions": "Aktionen",
|
||||
"common.optional": "optional",
|
||||
"common.search": "Suchen",
|
||||
"common.all": "alle",
|
||||
|
||||
// nav
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.models": "Modelle",
|
||||
"nav.routing": "Routing",
|
||||
"nav.protocols": "Protokolle",
|
||||
"nav.keys": "API-Schlüssel",
|
||||
"nav.playground": "Playground",
|
||||
"nav.settings": "Einstellungen",
|
||||
"nav.foot": "Gateway · v{v}",
|
||||
|
||||
// topbar / status
|
||||
"status.router": "Router",
|
||||
"status.gateway": "Gateway",
|
||||
"status.online": "online",
|
||||
"status.offline": "offline",
|
||||
"status.checking": "Prüfe…",
|
||||
"theme.toggle": "Design",
|
||||
"logout": "Abmelden",
|
||||
|
||||
// login
|
||||
"login.title": "allaigate Gateway",
|
||||
"login.subtitle": "Admin-Token eingeben, um dieses Gateway zu verwalten.",
|
||||
"login.token": "Admin-Token",
|
||||
"login.tokenPlaceholder": "Admin-Token einfügen",
|
||||
"login.submit": "Konsole öffnen",
|
||||
"login.hint": "Das Token wird beim Start im Gateway-Log ausgegeben oder über [admin].token_env gesetzt.",
|
||||
"login.failed": "Ungültiger Admin-Token.",
|
||||
|
||||
// dashboard
|
||||
"dash.title": "Dashboard",
|
||||
"dash.subtitle": "Live-Traffic, Kosten und Routing-Analyse für Ihren Modell-Pool.",
|
||||
"dash.range": "Zeitraum",
|
||||
"dash.range.1h": "1h",
|
||||
"dash.range.24h": "24h",
|
||||
"dash.range.7d": "7d",
|
||||
"dash.kpi.requests": "Anfragen",
|
||||
"dash.kpi.tokens": "Tokens",
|
||||
"dash.kpi.cost": "Kosten",
|
||||
"dash.kpi.latency": "Ø Latenz",
|
||||
"dash.kpi.success": "Erfolgsrate",
|
||||
"dash.kpi.failovers": "Failovers",
|
||||
"dash.series.title": "Anfragen im Zeitverlauf",
|
||||
"dash.series.cost": "Kosten im Zeitverlauf",
|
||||
"dash.series.empty": "Kein Traffic in diesem Zeitraum.",
|
||||
"dash.breakdown.title": "Aufschlüsselung",
|
||||
"dash.groupby.model": "nach Modell",
|
||||
"dash.groupby.tier": "nach Tier",
|
||||
"dash.groupby.label": "nach Aufgabe",
|
||||
"dash.groupby.account": "nach Account",
|
||||
"dash.recent.title": "Letzte Anfragen",
|
||||
"dash.recent.empty": "Noch keine Anfragen aufgezeichnet. Playground ausprobieren.",
|
||||
"dash.col.time": "Zeit",
|
||||
"dash.col.model": "Modell",
|
||||
"dash.col.tier": "Tier",
|
||||
"dash.col.task": "Aufgabe",
|
||||
"dash.col.tokens": "Tokens",
|
||||
"dash.col.cost": "Kosten",
|
||||
"dash.col.latency": "Latenz",
|
||||
"dash.col.outcome": "Ergebnis",
|
||||
"dash.col.requests": "Anfragen",
|
||||
"dash.col.errors": "Fehler",
|
||||
"dash.health.title": "Status",
|
||||
"dash.health.reachable": "erreichbar",
|
||||
"dash.health.unreachable": "nicht erreichbar",
|
||||
|
||||
// models
|
||||
"models.title": "Modelle",
|
||||
"models.subtitle": "Ihr Modell-Pool — lokale Modelle und Cloud-APIs kombinieren.",
|
||||
"models.add": "Modell hinzufügen",
|
||||
"models.empty": "Noch keine Modelle. Erstes Modell hinzufügen.",
|
||||
"models.col.id": "ID",
|
||||
"models.col.provider": "Anbieter",
|
||||
"models.col.model": "Modell",
|
||||
"models.col.tier": "Kostenstufe",
|
||||
"models.col.key": "Schlüssel",
|
||||
"models.col.caps": "Fähigkeiten",
|
||||
"models.col.price": "Preis (ein/aus)",
|
||||
"models.probe": "Prüfen",
|
||||
"models.probe.ok": "Erreichbar ({ms} ms)",
|
||||
"models.probe.fail": "Fehlgeschlagen: {err}",
|
||||
"models.form.addTitle": "Modell hinzufügen",
|
||||
"models.form.editTitle": "Modell bearbeiten",
|
||||
"models.form.id": "ID",
|
||||
"models.form.idHint": "Eindeutige ID für das Routing, z. B. local-qwen",
|
||||
"models.form.provider": "Anbieter",
|
||||
"models.form.baseUrl": "Basis-URL",
|
||||
"models.form.model": "Modellname",
|
||||
"models.form.kind": "Typ",
|
||||
"models.form.costTier": "Kostenstufe",
|
||||
"models.form.priceIn": "Preis ein ($/1M)",
|
||||
"models.form.priceOut": "Preis aus ($/1M)",
|
||||
"models.form.apiKeyEnv": "API-Schlüssel Umgebungsvariable",
|
||||
"models.form.apiKeyEnvHint": "Name der Umgebungsvariable / des gespeicherten Geheimnisses für den Anbieterschlüssel.",
|
||||
"models.form.caps": "Fähigkeiten",
|
||||
"models.form.secret": "Geheimwert",
|
||||
"models.form.secretStored": "gespeichert",
|
||||
"models.form.secretEnv": "aus Umgebung",
|
||||
"models.form.secretMissing": "nicht gesetzt",
|
||||
"models.form.secretPlaceholder": "Schlüssel setzen oder ersetzen (nur Schreiben)",
|
||||
"models.deleteConfirm": "Modell \"{id}\" löschen?",
|
||||
|
||||
// routing
|
||||
"routing.title": "Routing",
|
||||
"routing.subtitle": "Komplexitätsstufen einer priorisierten Modellliste zuordnen (Priorität = Fallback).",
|
||||
"routing.default": "Standardmodell",
|
||||
"routing.defaultHint": "Wird verwendet, wenn der Router nicht erreichbar ist.",
|
||||
"routing.tiers": "Stufen",
|
||||
"routing.tierHint": "Chips ziehen zum Sortieren; erstes bevorzugt, die übrigen sind Fallbacks.",
|
||||
"routing.addModel": "+ hinzufügen",
|
||||
"routing.addTier": "Stufe hinzufügen",
|
||||
"routing.tierName": "Stufenname",
|
||||
"routing.policy": "Richtlinie",
|
||||
"routing.policy.mode": "Modus",
|
||||
"routing.policy.fixed": "Feste Tabelle",
|
||||
"routing.policy.costAware": "Kostenoptimiert",
|
||||
"routing.policy.maxCost": "Max. Kosten pro Anfrage ($)",
|
||||
"routing.policy.minClass": "Mindestklasse je Stufe",
|
||||
"routing.empty": "Keine Modelle verfügbar — zuerst Modelle hinzufügen.",
|
||||
|
||||
// protocols
|
||||
"protocols.title": "Protokolle",
|
||||
"protocols.subtitle": "Nur benötigte eingehende API-Oberflächen aktivieren. Änderungen wirken sofort.",
|
||||
"protocols.implemented": "implementiert",
|
||||
"protocols.planned": "geplant",
|
||||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||||
"protocols.openai_chat.d": "POST /v1/chat/completions — kompatibel mit OpenAI SDK, LangChain, crewAI.",
|
||||
"protocols.openai_completions": "OpenAI Completions (legacy)",
|
||||
"protocols.openai_completions.d": "POST /v1/completions — Legacy-Integrationen.",
|
||||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||||
"protocols.openai_embeddings.d": "POST /v1/embeddings — RAG-Pipelines.",
|
||||
"protocols.openai_models": "OpenAI Models",
|
||||
"protocols.openai_models.d": "GET /v1/models — automatische Client-Erkennung.",
|
||||
"protocols.anthropic_messages": "Anthropic Messages",
|
||||
"protocols.anthropic_messages.d": "POST /v1/messages — Claude-native Agenten.",
|
||||
"protocols.mcp": "MCP (Model Context Protocol)",
|
||||
"protocols.mcp.d": "JSON-RPC / SSE — MCP-native Orchestratoren.",
|
||||
"protocols.native_passthrough": "Nativer Passthrough",
|
||||
"protocols.native_passthrough.d": "POST /route — direkter Zugriff auf die Routing-Entscheidung.",
|
||||
|
||||
// keys
|
||||
"keys.title": "API-Schlüssel",
|
||||
"keys.subtitle": "Virtuelle Gateway-Schlüssel für Ihre Agenten. Anbieterschlüssel verlassen das Gateway nicht.",
|
||||
"keys.add": "Neuer Schlüssel",
|
||||
"keys.empty": "Keine Schlüssel konfiguriert — Gateway im offenen Modus (keine Authentifizierung).",
|
||||
"keys.openMode": "Offener Modus: Alle Anfragen werden akzeptiert (kein Schlüssel erforderlich).",
|
||||
"keys.col.key": "Schlüssel",
|
||||
"keys.col.account": "Account",
|
||||
"keys.col.rate": "Rate / Min.",
|
||||
"keys.col.models": "Erlaubte Modelle",
|
||||
"keys.form.title": "Neuer API-Schlüssel",
|
||||
"keys.form.account": "Account",
|
||||
"keys.form.rate": "Ratenlimit / Min.",
|
||||
"keys.form.allow": "Erlaubte Modelle",
|
||||
"keys.form.allowHint": "Leer lassen, um alle Modelle zu erlauben.",
|
||||
"keys.form.custom": "Eigener Schlüssel (optional)",
|
||||
"keys.form.customHint": "Leer lassen für automatische Generierung sk-gw-…",
|
||||
"keys.created": "Schlüssel erstellt — jetzt kopieren, er wird nicht mehr angezeigt:",
|
||||
"keys.revoke": "Widerrufen",
|
||||
"keys.revokeConfirm": "Diesen Schlüssel widerrufen?",
|
||||
"keys.allowAll": "alle",
|
||||
|
||||
// playground
|
||||
"pg.title": "Playground",
|
||||
"pg.subtitle": "Prompt durch die Live-Pipeline senden und Routing-Entscheidung prüfen.",
|
||||
"pg.system": "System-Prompt",
|
||||
"pg.systemPlaceholder": "optionale Systemnachricht",
|
||||
"pg.prompt": "Prompt",
|
||||
"pg.promptPlaceholder": "Etwas fragen…",
|
||||
"pg.mode": "Modus",
|
||||
"pg.mode.auto": "Auto (Route)",
|
||||
"pg.mode.pinned": "Fixiertes Modell",
|
||||
"pg.profile": "Profil",
|
||||
"pg.model": "Modell",
|
||||
"pg.temp": "Temperatur",
|
||||
"pg.maxTokens": "Max. Tokens",
|
||||
"pg.send": "Senden",
|
||||
"pg.sending": "Wird gesendet…",
|
||||
"pg.answer": "Antwort",
|
||||
"pg.empty": "Antwort und Routing-Entscheidung erscheinen hier.",
|
||||
"pg.decision": "Routing-Entscheidung",
|
||||
"pg.task": "Aufgabe",
|
||||
"pg.tier": "Tier",
|
||||
"pg.score": "Komplexität",
|
||||
"pg.selected": "Gewähltes Modell",
|
||||
"pg.source": "Route-Quelle",
|
||||
"pg.cost": "Kosten",
|
||||
"pg.latency": "Latenz",
|
||||
"pg.tokens": "Tokens (ein/aus)",
|
||||
"pg.failover": "Failover",
|
||||
"pg.error": "Anfrage fehlgeschlagen",
|
||||
|
||||
// settings
|
||||
"settings.title": "Einstellungen",
|
||||
"settings.subtitle": "Gateway-Verbindung, Routing-Eingabe, Zuverlässigkeit und Beobachtbarkeit.",
|
||||
"settings.router": "Router-Verbindung",
|
||||
"settings.router.url": "Router-URL",
|
||||
"settings.router.keyEnv": "Router-Schlüssel Umgebungsvariable",
|
||||
"settings.router.timeout": "Timeout (ms)",
|
||||
"settings.router.verifyTls": "TLS-Zertifikat prüfen",
|
||||
"settings.router.taxonomy": "Taxonomie-ID",
|
||||
"settings.route": "Routing-Eingabe",
|
||||
"settings.route.strategy": "Textstrategie",
|
||||
"settings.route.maxChars": "Max. Zeichen",
|
||||
"settings.route.cacheTtl": "Cache-TTL",
|
||||
"settings.route.profile": "Standardprofil",
|
||||
"settings.breaker": "Circuit Breaker",
|
||||
"settings.breaker.threshold": "Fehlerschwelle",
|
||||
"settings.breaker.cooldown": "Cooldown",
|
||||
"settings.log": "Protokollierung",
|
||||
"settings.log.level": "Log-Ebene",
|
||||
"settings.log.bodies": "Nachrichtentexte protokollieren (Datenschutz aus)",
|
||||
"settings.telemetry": "Telemetrie",
|
||||
"settings.telemetry.metrics": "Prometheus /metrics bereitstellen",
|
||||
"settings.cortiq": "Antwort-Metadaten",
|
||||
"settings.cortiq.echo": "cortiq-Routing-Block in Antworten einbetten",
|
||||
"settings.stats": "Statistiken",
|
||||
"settings.stats.enabled": "Anfrage-Statistiken aufzeichnen",
|
||||
"settings.stats.file": "Statistikdatei (JSONL)",
|
||||
"settings.stats.retention": "Aufbewahrung",
|
||||
"settings.listen": "Lausch-Adresse",
|
||||
"settings.export": "Konfiguration exportieren",
|
||||
"settings.import": "Konfiguration importieren",
|
||||
"settings.needsRestart": "Gespeichert. Einige Änderungen (Lausch-Adresse) erfordern einen Neustart.",
|
||||
|
||||
// toasts / misc
|
||||
"toast.saved": "Änderungen gespeichert",
|
||||
"toast.deleted": "Gelöscht",
|
||||
"toast.probing": "Prüfe…",
|
||||
"toast.imported": "Konfiguration importiert",
|
||||
};
|
||||
Vendored
+257
@@ -0,0 +1,257 @@
|
||||
// English — source of truth. Other languages override per key; missing keys fall
|
||||
// back to English. Keep keys identical across all language files.
|
||||
export default {
|
||||
// brand / common
|
||||
"brand.sub": "Gateway",
|
||||
"common.loading": "Loading…",
|
||||
"common.save": "Save",
|
||||
"common.saving": "Saving…",
|
||||
"common.cancel": "Cancel",
|
||||
"common.add": "Add",
|
||||
"common.edit": "Edit",
|
||||
"common.delete": "Delete",
|
||||
"common.close": "Close",
|
||||
"common.test": "Test",
|
||||
"common.copy": "Copy",
|
||||
"common.copied": "Copied",
|
||||
"common.confirm": "Confirm",
|
||||
"common.none": "none",
|
||||
"common.saved": "Saved",
|
||||
"common.error": "Error",
|
||||
"common.ok": "OK",
|
||||
"common.refresh": "Refresh",
|
||||
"common.actions": "Actions",
|
||||
"common.optional": "optional",
|
||||
"common.search": "Search",
|
||||
"common.all": "all",
|
||||
|
||||
// nav
|
||||
"nav.dashboard": "Dashboard",
|
||||
"nav.models": "Models",
|
||||
"nav.routing": "Routing",
|
||||
"nav.protocols": "Protocols",
|
||||
"nav.keys": "API keys",
|
||||
"nav.playground": "Playground",
|
||||
"nav.settings": "Settings",
|
||||
"nav.foot": "Gateway · v{v}",
|
||||
|
||||
// topbar / status
|
||||
"status.router": "Router",
|
||||
"status.gateway": "Gateway",
|
||||
"status.online": "online",
|
||||
"status.offline": "offline",
|
||||
"status.checking": "checking…",
|
||||
"theme.toggle": "Theme",
|
||||
"logout": "Log out",
|
||||
|
||||
// login
|
||||
"login.title": "allaigate Gateway",
|
||||
"login.subtitle": "Enter the admin token to manage this gateway.",
|
||||
"login.token": "Admin token",
|
||||
"login.tokenPlaceholder": "paste admin token",
|
||||
"login.submit": "Open console",
|
||||
"login.hint": "The token is printed in the gateway log on startup, or set via [admin].token_env.",
|
||||
"login.failed": "Invalid admin token.",
|
||||
|
||||
// dashboard
|
||||
"dash.title": "Dashboard",
|
||||
"dash.subtitle": "Live traffic, cost and routing analytics for your model pool.",
|
||||
"dash.range": "Range",
|
||||
"dash.range.1h": "1h",
|
||||
"dash.range.24h": "24h",
|
||||
"dash.range.7d": "7d",
|
||||
"dash.kpi.requests": "Requests",
|
||||
"dash.kpi.tokens": "Tokens",
|
||||
"dash.kpi.cost": "Cost",
|
||||
"dash.kpi.latency": "Avg latency",
|
||||
"dash.kpi.success": "Success rate",
|
||||
"dash.kpi.failovers": "Failovers",
|
||||
"dash.series.title": "Requests over time",
|
||||
"dash.series.cost": "Cost over time",
|
||||
"dash.series.empty": "No traffic yet in this range.",
|
||||
"dash.breakdown.title": "Breakdown",
|
||||
"dash.groupby.model": "by model",
|
||||
"dash.groupby.tier": "by tier",
|
||||
"dash.groupby.label": "by task",
|
||||
"dash.groupby.account": "by account",
|
||||
"dash.recent.title": "Recent requests",
|
||||
"dash.recent.empty": "No requests recorded yet. Try the Playground.",
|
||||
"dash.col.time": "Time",
|
||||
"dash.col.model": "Model",
|
||||
"dash.col.tier": "Tier",
|
||||
"dash.col.task": "Task",
|
||||
"dash.col.tokens": "Tokens",
|
||||
"dash.col.cost": "Cost",
|
||||
"dash.col.latency": "Latency",
|
||||
"dash.col.outcome": "Outcome",
|
||||
"dash.col.requests": "Requests",
|
||||
"dash.col.errors": "Errors",
|
||||
"dash.health.title": "Health",
|
||||
"dash.health.reachable": "reachable",
|
||||
"dash.health.unreachable": "unreachable",
|
||||
|
||||
// models
|
||||
"models.title": "Models",
|
||||
"models.subtitle": "Your model pool — mix cheap local models with cloud APIs.",
|
||||
"models.add": "Add model",
|
||||
"models.empty": "No models yet. Add your first model to get started.",
|
||||
"models.col.id": "ID",
|
||||
"models.col.provider": "Provider",
|
||||
"models.col.model": "Model",
|
||||
"models.col.tier": "Cost tier",
|
||||
"models.col.key": "Key",
|
||||
"models.col.caps": "Capabilities",
|
||||
"models.col.price": "Price (in/out)",
|
||||
"models.probe": "Probe",
|
||||
"models.probe.ok": "Reachable ({ms} ms)",
|
||||
"models.probe.fail": "Failed: {err}",
|
||||
"models.form.addTitle": "Add model",
|
||||
"models.form.editTitle": "Edit model",
|
||||
"models.form.id": "ID",
|
||||
"models.form.idHint": "Unique id used in routing, e.g. local-qwen",
|
||||
"models.form.provider": "Provider",
|
||||
"models.form.baseUrl": "Base URL",
|
||||
"models.form.model": "Model name",
|
||||
"models.form.kind": "Kind",
|
||||
"models.form.costTier": "Cost tier",
|
||||
"models.form.priceIn": "Price in ($/1M)",
|
||||
"models.form.priceOut": "Price out ($/1M)",
|
||||
"models.form.apiKeyEnv": "API key env name",
|
||||
"models.form.apiKeyEnvHint": "Name of the env var / stored secret holding this provider's key.",
|
||||
"models.form.caps": "Capabilities",
|
||||
"models.form.secret": "Secret value",
|
||||
"models.form.secretStored": "stored",
|
||||
"models.form.secretEnv": "from env",
|
||||
"models.form.secretMissing": "not set",
|
||||
"models.form.secretPlaceholder": "set or replace key (write-only)",
|
||||
"models.deleteConfirm": "Delete model \"{id}\"?",
|
||||
|
||||
// routing
|
||||
"routing.title": "Routing",
|
||||
"routing.subtitle": "Map complexity tiers to an ordered list of models (priority = fallback).",
|
||||
"routing.default": "Default model",
|
||||
"routing.defaultHint": "Used when the router is unreachable.",
|
||||
"routing.tiers": "Tiers",
|
||||
"routing.tierHint": "Drag chips to reorder; first is preferred, the rest are fallbacks.",
|
||||
"routing.addModel": "+ add",
|
||||
"routing.addTier": "Add tier",
|
||||
"routing.tierName": "Tier name",
|
||||
"routing.policy": "Policy",
|
||||
"routing.policy.mode": "Mode",
|
||||
"routing.policy.fixed": "Fixed table",
|
||||
"routing.policy.costAware": "Cost-aware",
|
||||
"routing.policy.maxCost": "Max cost per request ($)",
|
||||
"routing.policy.minClass": "Minimum class per tier",
|
||||
"routing.empty": "No models available — add models first.",
|
||||
|
||||
// protocols
|
||||
"protocols.title": "Protocols",
|
||||
"protocols.subtitle": "Enable only the inbound API surfaces you need. Toggles apply live.",
|
||||
"protocols.implemented": "implemented",
|
||||
"protocols.planned": "planned",
|
||||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||||
"protocols.openai_chat.d": "POST /v1/chat/completions — works with OpenAI SDK, LangChain, crewAI.",
|
||||
"protocols.openai_completions": "OpenAI Completions (legacy)",
|
||||
"protocols.openai_completions.d": "POST /v1/completions — legacy integrations.",
|
||||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||||
"protocols.openai_embeddings.d": "POST /v1/embeddings — RAG pipelines.",
|
||||
"protocols.openai_models": "OpenAI Models",
|
||||
"protocols.openai_models.d": "GET /v1/models — client auto-discovery.",
|
||||
"protocols.anthropic_messages": "Anthropic Messages",
|
||||
"protocols.anthropic_messages.d": "POST /v1/messages — Claude-native agents.",
|
||||
"protocols.mcp": "MCP (Model Context Protocol)",
|
||||
"protocols.mcp.d": "JSON-RPC / SSE — MCP-native orchestrators.",
|
||||
"protocols.native_passthrough": "Native passthrough",
|
||||
"protocols.native_passthrough.d": "POST /route — direct access to the routing decision.",
|
||||
|
||||
// keys
|
||||
"keys.title": "API keys",
|
||||
"keys.subtitle": "Virtual gateway keys for your agents. Provider keys never leave the gateway.",
|
||||
"keys.add": "New key",
|
||||
"keys.empty": "No keys configured — the gateway is in open mode (no auth).",
|
||||
"keys.openMode": "Open mode: any request is accepted (no key required).",
|
||||
"keys.col.key": "Key",
|
||||
"keys.col.account": "Account",
|
||||
"keys.col.rate": "Rate / min",
|
||||
"keys.col.models": "Allowed models",
|
||||
"keys.form.title": "New API key",
|
||||
"keys.form.account": "Account",
|
||||
"keys.form.rate": "Rate limit / min",
|
||||
"keys.form.allow": "Allowed models",
|
||||
"keys.form.allowHint": "Leave empty to allow all models.",
|
||||
"keys.form.custom": "Custom key (optional)",
|
||||
"keys.form.customHint": "Leave empty to auto-generate sk-gw-…",
|
||||
"keys.created": "Key created — copy it now, it won't be shown again:",
|
||||
"keys.revoke": "Revoke",
|
||||
"keys.revokeConfirm": "Revoke this key?",
|
||||
"keys.allowAll": "all",
|
||||
|
||||
// playground
|
||||
"pg.title": "Playground",
|
||||
"pg.subtitle": "Send a prompt through the live pipeline and inspect the routing decision.",
|
||||
"pg.system": "System prompt",
|
||||
"pg.systemPlaceholder": "optional system message",
|
||||
"pg.prompt": "Prompt",
|
||||
"pg.promptPlaceholder": "Ask something…",
|
||||
"pg.mode": "Mode",
|
||||
"pg.mode.auto": "Auto (route)",
|
||||
"pg.mode.pinned": "Pinned model",
|
||||
"pg.profile": "Profile",
|
||||
"pg.model": "Model",
|
||||
"pg.temp": "Temperature",
|
||||
"pg.maxTokens": "Max tokens",
|
||||
"pg.send": "Send",
|
||||
"pg.sending": "Sending…",
|
||||
"pg.answer": "Answer",
|
||||
"pg.empty": "The answer and routing decision will appear here.",
|
||||
"pg.decision": "Routing decision",
|
||||
"pg.task": "Task",
|
||||
"pg.tier": "Tier",
|
||||
"pg.score": "Complexity",
|
||||
"pg.selected": "Selected model",
|
||||
"pg.source": "Route source",
|
||||
"pg.cost": "Cost",
|
||||
"pg.latency": "Latency",
|
||||
"pg.tokens": "Tokens (in/out)",
|
||||
"pg.failover": "Failover",
|
||||
"pg.error": "Request failed",
|
||||
|
||||
// settings
|
||||
"settings.title": "Settings",
|
||||
"settings.subtitle": "Gateway connection, routing input, reliability and observability.",
|
||||
"settings.router": "Router connection",
|
||||
"settings.router.url": "Router URL",
|
||||
"settings.router.keyEnv": "Router key env name",
|
||||
"settings.router.timeout": "Timeout (ms)",
|
||||
"settings.router.verifyTls": "Verify TLS certificate",
|
||||
"settings.router.taxonomy": "Taxonomy id",
|
||||
"settings.route": "Routing input",
|
||||
"settings.route.strategy": "Text strategy",
|
||||
"settings.route.maxChars": "Max chars",
|
||||
"settings.route.cacheTtl": "Cache TTL",
|
||||
"settings.route.profile": "Default profile",
|
||||
"settings.breaker": "Circuit breaker",
|
||||
"settings.breaker.threshold": "Error threshold",
|
||||
"settings.breaker.cooldown": "Cooldown",
|
||||
"settings.log": "Logging",
|
||||
"settings.log.level": "Log level",
|
||||
"settings.log.bodies": "Log message bodies (privacy off)",
|
||||
"settings.telemetry": "Telemetry",
|
||||
"settings.telemetry.metrics": "Expose Prometheus /metrics",
|
||||
"settings.cortiq": "Response metadata",
|
||||
"settings.cortiq.echo": "Echo cortiq routing block in responses",
|
||||
"settings.stats": "Statistics",
|
||||
"settings.stats.enabled": "Record request statistics",
|
||||
"settings.stats.file": "Stats file (JSONL)",
|
||||
"settings.stats.retention": "Retention",
|
||||
"settings.listen": "Listen address",
|
||||
"settings.export": "Export config",
|
||||
"settings.import": "Import config",
|
||||
"settings.needsRestart": "Saved. Some changes (listen address) require a restart.",
|
||||
|
||||
// toasts / misc
|
||||
"toast.saved": "Changes saved",
|
||||
"toast.deleted": "Deleted",
|
||||
"toast.probing": "Probing…",
|
||||
"toast.imported": "Config imported",
|
||||
};
|
||||
Vendored
+256
@@ -0,0 +1,256 @@
|
||||
// Spanish — traducciones para la consola de administración de allaigate Gateway.
|
||||
export default {
|
||||
// brand / common
|
||||
"brand.sub": "Gateway",
|
||||
"common.loading": "Cargando…",
|
||||
"common.save": "Guardar",
|
||||
"common.saving": "Guardando…",
|
||||
"common.cancel": "Cancelar",
|
||||
"common.add": "Agregar",
|
||||
"common.edit": "Editar",
|
||||
"common.delete": "Eliminar",
|
||||
"common.close": "Cerrar",
|
||||
"common.test": "Probar",
|
||||
"common.copy": "Copiar",
|
||||
"common.copied": "Copiado",
|
||||
"common.confirm": "Confirmar",
|
||||
"common.none": "ninguno",
|
||||
"common.saved": "Guardado",
|
||||
"common.error": "Error",
|
||||
"common.ok": "OK",
|
||||
"common.refresh": "Actualizar",
|
||||
"common.actions": "Acciones",
|
||||
"common.optional": "opcional",
|
||||
"common.search": "Buscar",
|
||||
"common.all": "todos",
|
||||
|
||||
// nav
|
||||
"nav.dashboard": "Panel",
|
||||
"nav.models": "Modelos",
|
||||
"nav.routing": "Enrutamiento",
|
||||
"nav.protocols": "Protocolos",
|
||||
"nav.keys": "Claves API",
|
||||
"nav.playground": "Playground",
|
||||
"nav.settings": "Configuración",
|
||||
"nav.foot": "Gateway · v{v}",
|
||||
|
||||
// topbar / status
|
||||
"status.router": "Router",
|
||||
"status.gateway": "Gateway",
|
||||
"status.online": "en línea",
|
||||
"status.offline": "sin conexión",
|
||||
"status.checking": "verificando…",
|
||||
"theme.toggle": "Tema",
|
||||
"logout": "Cerrar sesión",
|
||||
|
||||
// login
|
||||
"login.title": "allaigate Gateway",
|
||||
"login.subtitle": "Ingresa el token de administrador para gestionar este gateway.",
|
||||
"login.token": "Token de administrador",
|
||||
"login.tokenPlaceholder": "pega el token de administrador",
|
||||
"login.submit": "Abrir consola",
|
||||
"login.hint": "El token se imprime en el log del gateway al iniciar, o se configura mediante [admin].token_env.",
|
||||
"login.failed": "Token de administrador inválido.",
|
||||
|
||||
// dashboard
|
||||
"dash.title": "Panel",
|
||||
"dash.subtitle": "Tráfico en vivo, costos y análisis de enrutamiento de tu pool de modelos.",
|
||||
"dash.range": "Rango",
|
||||
"dash.range.1h": "1h",
|
||||
"dash.range.24h": "24h",
|
||||
"dash.range.7d": "7d",
|
||||
"dash.kpi.requests": "Solicitudes",
|
||||
"dash.kpi.tokens": "Tokens",
|
||||
"dash.kpi.cost": "Costo",
|
||||
"dash.kpi.latency": "Latencia promedio",
|
||||
"dash.kpi.success": "Tasa de éxito",
|
||||
"dash.kpi.failovers": "Failovers",
|
||||
"dash.series.title": "Solicitudes en el tiempo",
|
||||
"dash.series.cost": "Costo en el tiempo",
|
||||
"dash.series.empty": "Sin tráfico en este rango.",
|
||||
"dash.breakdown.title": "Desglose",
|
||||
"dash.groupby.model": "por modelo",
|
||||
"dash.groupby.tier": "por nivel",
|
||||
"dash.groupby.label": "por tarea",
|
||||
"dash.groupby.account": "por cuenta",
|
||||
"dash.recent.title": "Solicitudes recientes",
|
||||
"dash.recent.empty": "Sin solicitudes registradas. Prueba el Playground.",
|
||||
"dash.col.time": "Hora",
|
||||
"dash.col.model": "Modelo",
|
||||
"dash.col.tier": "Nivel",
|
||||
"dash.col.task": "Tarea",
|
||||
"dash.col.tokens": "Tokens",
|
||||
"dash.col.cost": "Costo",
|
||||
"dash.col.latency": "Latencia",
|
||||
"dash.col.outcome": "Resultado",
|
||||
"dash.col.requests": "Solicitudes",
|
||||
"dash.col.errors": "Errores",
|
||||
"dash.health.title": "Estado",
|
||||
"dash.health.reachable": "accesible",
|
||||
"dash.health.unreachable": "inaccesible",
|
||||
|
||||
// models
|
||||
"models.title": "Modelos",
|
||||
"models.subtitle": "Tu pool de modelos — combina modelos locales económicos con APIs en la nube.",
|
||||
"models.add": "Agregar modelo",
|
||||
"models.empty": "Sin modelos aún. Agrega tu primer modelo para comenzar.",
|
||||
"models.col.id": "ID",
|
||||
"models.col.provider": "Proveedor",
|
||||
"models.col.model": "Modelo",
|
||||
"models.col.tier": "Nivel de costo",
|
||||
"models.col.key": "Clave",
|
||||
"models.col.caps": "Capacidades",
|
||||
"models.col.price": "Precio (entrada/salida)",
|
||||
"models.probe": "Sondear",
|
||||
"models.probe.ok": "Accesible ({ms} ms)",
|
||||
"models.probe.fail": "Error: {err}",
|
||||
"models.form.addTitle": "Agregar modelo",
|
||||
"models.form.editTitle": "Editar modelo",
|
||||
"models.form.id": "ID",
|
||||
"models.form.idHint": "ID único usado en enrutamiento, ej. local-qwen",
|
||||
"models.form.provider": "Proveedor",
|
||||
"models.form.baseUrl": "URL base",
|
||||
"models.form.model": "Nombre del modelo",
|
||||
"models.form.kind": "Tipo",
|
||||
"models.form.costTier": "Nivel de costo",
|
||||
"models.form.priceIn": "Precio entrada ($/1M)",
|
||||
"models.form.priceOut": "Precio salida ($/1M)",
|
||||
"models.form.apiKeyEnv": "Nombre de variable env para clave API",
|
||||
"models.form.apiKeyEnvHint": "Nombre de la variable de entorno o secreto que contiene la clave del proveedor.",
|
||||
"models.form.caps": "Capacidades",
|
||||
"models.form.secret": "Valor secreto",
|
||||
"models.form.secretStored": "almacenado",
|
||||
"models.form.secretEnv": "desde env",
|
||||
"models.form.secretMissing": "no configurado",
|
||||
"models.form.secretPlaceholder": "establecer o reemplazar clave (solo escritura)",
|
||||
"models.deleteConfirm": "¿Eliminar modelo \"{id}\"?",
|
||||
|
||||
// routing
|
||||
"routing.title": "Enrutamiento",
|
||||
"routing.subtitle": "Asigna niveles de complejidad a una lista ordenada de modelos (prioridad = fallback).",
|
||||
"routing.default": "Modelo predeterminado",
|
||||
"routing.defaultHint": "Usado cuando el router no está disponible.",
|
||||
"routing.tiers": "Niveles",
|
||||
"routing.tierHint": "Arrastra los chips para reordenar; el primero es preferido, los demás son fallbacks.",
|
||||
"routing.addModel": "+ agregar",
|
||||
"routing.addTier": "Agregar nivel",
|
||||
"routing.tierName": "Nombre del nivel",
|
||||
"routing.policy": "Política",
|
||||
"routing.policy.mode": "Modo",
|
||||
"routing.policy.fixed": "Tabla fija",
|
||||
"routing.policy.costAware": "Consciente del costo",
|
||||
"routing.policy.maxCost": "Costo máx. por solicitud ($)",
|
||||
"routing.policy.minClass": "Clase mínima por nivel",
|
||||
"routing.empty": "Sin modelos disponibles — agrega modelos primero.",
|
||||
|
||||
// protocols
|
||||
"protocols.title": "Protocolos",
|
||||
"protocols.subtitle": "Activa solo las APIs de entrada que necesitas. Los cambios se aplican en vivo.",
|
||||
"protocols.implemented": "implementado",
|
||||
"protocols.planned": "planificado",
|
||||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||||
"protocols.openai_chat.d": "POST /v1/chat/completions — compatible con OpenAI SDK, LangChain, crewAI.",
|
||||
"protocols.openai_completions": "OpenAI Completions (legacy)",
|
||||
"protocols.openai_completions.d": "POST /v1/completions — integraciones heredadas.",
|
||||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||||
"protocols.openai_embeddings.d": "POST /v1/embeddings — pipelines RAG.",
|
||||
"protocols.openai_models": "OpenAI Models",
|
||||
"protocols.openai_models.d": "GET /v1/models — autodescubrimiento de clientes.",
|
||||
"protocols.anthropic_messages": "Anthropic Messages",
|
||||
"protocols.anthropic_messages.d": "POST /v1/messages — agentes nativos Claude.",
|
||||
"protocols.mcp": "MCP (Model Context Protocol)",
|
||||
"protocols.mcp.d": "JSON-RPC / SSE — orquestadores nativos MCP.",
|
||||
"protocols.native_passthrough": "Passthrough nativo",
|
||||
"protocols.native_passthrough.d": "POST /route — acceso directo a la decisión de enrutamiento.",
|
||||
|
||||
// keys
|
||||
"keys.title": "Claves API",
|
||||
"keys.subtitle": "Claves de gateway virtuales para tus agentes. Las claves del proveedor nunca salen del gateway.",
|
||||
"keys.add": "Nueva clave",
|
||||
"keys.empty": "Sin claves configuradas — el gateway está en modo abierto (sin autenticación).",
|
||||
"keys.openMode": "Modo abierto: cualquier solicitud es aceptada (no se requiere clave).",
|
||||
"keys.col.key": "Clave",
|
||||
"keys.col.account": "Cuenta",
|
||||
"keys.col.rate": "Límite / min",
|
||||
"keys.col.models": "Modelos permitidos",
|
||||
"keys.form.title": "Nueva clave API",
|
||||
"keys.form.account": "Cuenta",
|
||||
"keys.form.rate": "Límite de tasa / min",
|
||||
"keys.form.allow": "Modelos permitidos",
|
||||
"keys.form.allowHint": "Deja vacío para permitir todos los modelos.",
|
||||
"keys.form.custom": "Clave personalizada (opcional)",
|
||||
"keys.form.customHint": "Deja vacío para generar automáticamente sk-gw-…",
|
||||
"keys.created": "Clave creada — cópiala ahora, no se mostrará de nuevo:",
|
||||
"keys.revoke": "Revocar",
|
||||
"keys.revokeConfirm": "¿Revocar esta clave?",
|
||||
"keys.allowAll": "todos",
|
||||
|
||||
// playground
|
||||
"pg.title": "Playground",
|
||||
"pg.subtitle": "Envía un prompt por el pipeline en vivo e inspecciona la decisión de enrutamiento.",
|
||||
"pg.system": "Prompt del sistema",
|
||||
"pg.systemPlaceholder": "mensaje de sistema opcional",
|
||||
"pg.prompt": "Prompt",
|
||||
"pg.promptPlaceholder": "Escribe algo…",
|
||||
"pg.mode": "Modo",
|
||||
"pg.mode.auto": "Auto (enrutar)",
|
||||
"pg.mode.pinned": "Modelo fijo",
|
||||
"pg.profile": "Perfil",
|
||||
"pg.model": "Modelo",
|
||||
"pg.temp": "Temperatura",
|
||||
"pg.maxTokens": "Tokens máx.",
|
||||
"pg.send": "Enviar",
|
||||
"pg.sending": "Enviando…",
|
||||
"pg.answer": "Respuesta",
|
||||
"pg.empty": "La respuesta y la decisión de enrutamiento aparecerán aquí.",
|
||||
"pg.decision": "Decisión de enrutamiento",
|
||||
"pg.task": "Tarea",
|
||||
"pg.tier": "Nivel",
|
||||
"pg.score": "Complejidad",
|
||||
"pg.selected": "Modelo seleccionado",
|
||||
"pg.source": "Fuente de ruta",
|
||||
"pg.cost": "Costo",
|
||||
"pg.latency": "Latencia",
|
||||
"pg.tokens": "Tokens (entrada/salida)",
|
||||
"pg.failover": "Failover",
|
||||
"pg.error": "Solicitud fallida",
|
||||
|
||||
// settings
|
||||
"settings.title": "Configuración",
|
||||
"settings.subtitle": "Conexión del gateway, entrada de enrutamiento, fiabilidad y observabilidad.",
|
||||
"settings.router": "Conexión del router",
|
||||
"settings.router.url": "URL del router",
|
||||
"settings.router.keyEnv": "Nombre de variable env para clave del router",
|
||||
"settings.router.timeout": "Tiempo de espera (ms)",
|
||||
"settings.router.verifyTls": "Verificar certificado TLS",
|
||||
"settings.router.taxonomy": "ID de taxonomía",
|
||||
"settings.route": "Entrada de enrutamiento",
|
||||
"settings.route.strategy": "Estrategia de texto",
|
||||
"settings.route.maxChars": "Máx. caracteres",
|
||||
"settings.route.cacheTtl": "TTL de caché",
|
||||
"settings.route.profile": "Perfil predeterminado",
|
||||
"settings.breaker": "Circuit breaker",
|
||||
"settings.breaker.threshold": "Umbral de errores",
|
||||
"settings.breaker.cooldown": "Cooldown",
|
||||
"settings.log": "Registro",
|
||||
"settings.log.level": "Nivel de log",
|
||||
"settings.log.bodies": "Registrar cuerpos de mensajes (privacidad desactivada)",
|
||||
"settings.telemetry": "Telemetría",
|
||||
"settings.telemetry.metrics": "Exponer Prometheus /metrics",
|
||||
"settings.cortiq": "Metadatos de respuesta",
|
||||
"settings.cortiq.echo": "Incluir bloque de enrutamiento cortiq en respuestas",
|
||||
"settings.stats": "Estadísticas",
|
||||
"settings.stats.enabled": "Registrar estadísticas de solicitudes",
|
||||
"settings.stats.file": "Archivo de estadísticas (JSONL)",
|
||||
"settings.stats.retention": "Retención",
|
||||
"settings.listen": "Dirección de escucha",
|
||||
"settings.export": "Exportar configuración",
|
||||
"settings.import": "Importar configuración",
|
||||
"settings.needsRestart": "Guardado. Algunos cambios (dirección de escucha) requieren reinicio.",
|
||||
|
||||
// toasts / misc
|
||||
"toast.saved": "Cambios guardados",
|
||||
"toast.deleted": "Eliminado",
|
||||
"toast.probing": "Sondeando…",
|
||||
"toast.imported": "Configuración importada",
|
||||
};
|
||||
Vendored
+256
@@ -0,0 +1,256 @@
|
||||
// French (fr) — same keys as en.js; missing keys fall back to English.
|
||||
export default {
|
||||
// brand / common
|
||||
"brand.sub": "Gateway",
|
||||
"common.loading": "Chargement…",
|
||||
"common.save": "Enregistrer",
|
||||
"common.saving": "Enregistrement…",
|
||||
"common.cancel": "Annuler",
|
||||
"common.add": "Ajouter",
|
||||
"common.edit": "Modifier",
|
||||
"common.delete": "Supprimer",
|
||||
"common.close": "Fermer",
|
||||
"common.test": "Tester",
|
||||
"common.copy": "Copier",
|
||||
"common.copied": "Copié",
|
||||
"common.confirm": "Confirmer",
|
||||
"common.none": "aucun",
|
||||
"common.saved": "Enregistré",
|
||||
"common.error": "Erreur",
|
||||
"common.ok": "OK",
|
||||
"common.refresh": "Actualiser",
|
||||
"common.actions": "Actions",
|
||||
"common.optional": "optionnel",
|
||||
"common.search": "Rechercher",
|
||||
"common.all": "tous",
|
||||
|
||||
// nav
|
||||
"nav.dashboard": "Tableau de bord",
|
||||
"nav.models": "Modèles",
|
||||
"nav.routing": "Routage",
|
||||
"nav.protocols": "Protocoles",
|
||||
"nav.keys": "Clés API",
|
||||
"nav.playground": "Playground",
|
||||
"nav.settings": "Paramètres",
|
||||
"nav.foot": "Gateway · v{v}",
|
||||
|
||||
// topbar / status
|
||||
"status.router": "Routeur",
|
||||
"status.gateway": "Gateway",
|
||||
"status.online": "en ligne",
|
||||
"status.offline": "hors ligne",
|
||||
"status.checking": "vérification…",
|
||||
"theme.toggle": "Thème",
|
||||
"logout": "Déconnexion",
|
||||
|
||||
// login
|
||||
"login.title": "allaigate Gateway",
|
||||
"login.subtitle": "Saisissez le jeton administrateur pour gérer cette passerelle.",
|
||||
"login.token": "Jeton admin",
|
||||
"login.tokenPlaceholder": "coller le jeton admin",
|
||||
"login.submit": "Ouvrir la console",
|
||||
"login.hint": "Le jeton est affiché dans le log de la passerelle au démarrage, ou défini via [admin].token_env.",
|
||||
"login.failed": "Jeton admin invalide.",
|
||||
|
||||
// dashboard
|
||||
"dash.title": "Tableau de bord",
|
||||
"dash.subtitle": "Trafic en direct, coûts et analyses de routage pour votre pool de modèles.",
|
||||
"dash.range": "Période",
|
||||
"dash.range.1h": "1h",
|
||||
"dash.range.24h": "24h",
|
||||
"dash.range.7d": "7j",
|
||||
"dash.kpi.requests": "Requêtes",
|
||||
"dash.kpi.tokens": "Tokens",
|
||||
"dash.kpi.cost": "Coût",
|
||||
"dash.kpi.latency": "Latence moy.",
|
||||
"dash.kpi.success": "Taux de succès",
|
||||
"dash.kpi.failovers": "Basculements",
|
||||
"dash.series.title": "Requêtes dans le temps",
|
||||
"dash.series.cost": "Coûts dans le temps",
|
||||
"dash.series.empty": "Aucun trafic sur cette période.",
|
||||
"dash.breakdown.title": "Répartition",
|
||||
"dash.groupby.model": "par modèle",
|
||||
"dash.groupby.tier": "par niveau",
|
||||
"dash.groupby.label": "par tâche",
|
||||
"dash.groupby.account": "par compte",
|
||||
"dash.recent.title": "Requêtes récentes",
|
||||
"dash.recent.empty": "Aucune requête enregistrée. Essayez le Playground.",
|
||||
"dash.col.time": "Heure",
|
||||
"dash.col.model": "Modèle",
|
||||
"dash.col.tier": "Niveau",
|
||||
"dash.col.task": "Tâche",
|
||||
"dash.col.tokens": "Tokens",
|
||||
"dash.col.cost": "Coût",
|
||||
"dash.col.latency": "Latence",
|
||||
"dash.col.outcome": "Résultat",
|
||||
"dash.col.requests": "Requêtes",
|
||||
"dash.col.errors": "Erreurs",
|
||||
"dash.health.title": "Santé",
|
||||
"dash.health.reachable": "accessible",
|
||||
"dash.health.unreachable": "inaccessible",
|
||||
|
||||
// models
|
||||
"models.title": "Modèles",
|
||||
"models.subtitle": "Votre pool de modèles — combinez modèles locaux économiques et API cloud.",
|
||||
"models.add": "Ajouter un modèle",
|
||||
"models.empty": "Aucun modèle. Ajoutez votre premier modèle pour commencer.",
|
||||
"models.col.id": "ID",
|
||||
"models.col.provider": "Fournisseur",
|
||||
"models.col.model": "Modèle",
|
||||
"models.col.tier": "Niveau de coût",
|
||||
"models.col.key": "Clé",
|
||||
"models.col.caps": "Capacités",
|
||||
"models.col.price": "Prix (entrée/sortie)",
|
||||
"models.probe": "Sonder",
|
||||
"models.probe.ok": "Accessible ({ms} ms)",
|
||||
"models.probe.fail": "Échec : {err}",
|
||||
"models.form.addTitle": "Ajouter un modèle",
|
||||
"models.form.editTitle": "Modifier le modèle",
|
||||
"models.form.id": "ID",
|
||||
"models.form.idHint": "Identifiant unique utilisé dans le routage, ex. local-qwen",
|
||||
"models.form.provider": "Fournisseur",
|
||||
"models.form.baseUrl": "URL de base",
|
||||
"models.form.model": "Nom du modèle",
|
||||
"models.form.kind": "Type",
|
||||
"models.form.costTier": "Niveau de coût",
|
||||
"models.form.priceIn": "Prix entrée ($/1M)",
|
||||
"models.form.priceOut": "Prix sortie ($/1M)",
|
||||
"models.form.apiKeyEnv": "Nom de la var. d'env. pour la clé",
|
||||
"models.form.apiKeyEnvHint": "Nom de la variable d'env. ou du secret contenant la clé de ce fournisseur.",
|
||||
"models.form.caps": "Capacités",
|
||||
"models.form.secret": "Valeur secrète",
|
||||
"models.form.secretStored": "stocké",
|
||||
"models.form.secretEnv": "depuis l'env.",
|
||||
"models.form.secretMissing": "non défini",
|
||||
"models.form.secretPlaceholder": "définir ou remplacer la clé (écriture seule)",
|
||||
"models.deleteConfirm": "Supprimer le modèle \"{id}\" ?",
|
||||
|
||||
// routing
|
||||
"routing.title": "Routage",
|
||||
"routing.subtitle": "Associez les niveaux de complexité à une liste ordonnée de modèles (priorité = repli).",
|
||||
"routing.default": "Modèle par défaut",
|
||||
"routing.defaultHint": "Utilisé lorsque le routeur est inaccessible.",
|
||||
"routing.tiers": "Niveaux",
|
||||
"routing.tierHint": "Glissez les puces pour réordonner ; le premier est préféré, les autres sont des replis.",
|
||||
"routing.addModel": "+ ajouter",
|
||||
"routing.addTier": "Ajouter un niveau",
|
||||
"routing.tierName": "Nom du niveau",
|
||||
"routing.policy": "Politique",
|
||||
"routing.policy.mode": "Mode",
|
||||
"routing.policy.fixed": "Table fixe",
|
||||
"routing.policy.costAware": "Sensible au coût",
|
||||
"routing.policy.maxCost": "Coût max par requête ($)",
|
||||
"routing.policy.minClass": "Classe minimale par niveau",
|
||||
"routing.empty": "Aucun modèle disponible — ajoutez des modèles d'abord.",
|
||||
|
||||
// protocols
|
||||
"protocols.title": "Protocoles",
|
||||
"protocols.subtitle": "Activez uniquement les surfaces API entrantes nécessaires. Les bascules s'appliquent en direct.",
|
||||
"protocols.implemented": "implémenté",
|
||||
"protocols.planned": "planifié",
|
||||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||||
"protocols.openai_chat.d": "POST /v1/chat/completions — compatible avec OpenAI SDK, LangChain, crewAI.",
|
||||
"protocols.openai_completions": "OpenAI Completions (héritage)",
|
||||
"protocols.openai_completions.d": "POST /v1/completions — intégrations héritées.",
|
||||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||||
"protocols.openai_embeddings.d": "POST /v1/embeddings — pipelines RAG.",
|
||||
"protocols.openai_models": "OpenAI Models",
|
||||
"protocols.openai_models.d": "GET /v1/models — découverte automatique des clients.",
|
||||
"protocols.anthropic_messages": "Anthropic Messages",
|
||||
"protocols.anthropic_messages.d": "POST /v1/messages — agents natifs Claude.",
|
||||
"protocols.mcp": "MCP (Model Context Protocol)",
|
||||
"protocols.mcp.d": "JSON-RPC / SSE — orchestrateurs natifs MCP.",
|
||||
"protocols.native_passthrough": "Passage natif",
|
||||
"protocols.native_passthrough.d": "POST /route — accès direct à la décision de routage.",
|
||||
|
||||
// keys
|
||||
"keys.title": "Clés API",
|
||||
"keys.subtitle": "Clés de passerelle virtuelles pour vos agents. Les clés fournisseurs ne quittent jamais la passerelle.",
|
||||
"keys.add": "Nouvelle clé",
|
||||
"keys.empty": "Aucune clé configurée — la passerelle est en mode ouvert (sans auth).",
|
||||
"keys.openMode": "Mode ouvert : toute requête est acceptée (aucune clé requise).",
|
||||
"keys.col.key": "Clé",
|
||||
"keys.col.account": "Compte",
|
||||
"keys.col.rate": "Débit / min",
|
||||
"keys.col.models": "Modèles autorisés",
|
||||
"keys.form.title": "Nouvelle clé API",
|
||||
"keys.form.account": "Compte",
|
||||
"keys.form.rate": "Limite de débit / min",
|
||||
"keys.form.allow": "Modèles autorisés",
|
||||
"keys.form.allowHint": "Laisser vide pour autoriser tous les modèles.",
|
||||
"keys.form.custom": "Clé personnalisée (optionnel)",
|
||||
"keys.form.customHint": "Laisser vide pour générer automatiquement sk-gw-…",
|
||||
"keys.created": "Clé créée — copiez-la maintenant, elle ne sera plus affichée :",
|
||||
"keys.revoke": "Révoquer",
|
||||
"keys.revokeConfirm": "Révoquer cette clé ?",
|
||||
"keys.allowAll": "tous",
|
||||
|
||||
// playground
|
||||
"pg.title": "Playground",
|
||||
"pg.subtitle": "Envoyez une invite via le pipeline en direct et inspectez la décision de routage.",
|
||||
"pg.system": "Invite système",
|
||||
"pg.systemPlaceholder": "message système optionnel",
|
||||
"pg.prompt": "Invite",
|
||||
"pg.promptPlaceholder": "Posez une question…",
|
||||
"pg.mode": "Mode",
|
||||
"pg.mode.auto": "Auto (routage)",
|
||||
"pg.mode.pinned": "Modèle épinglé",
|
||||
"pg.profile": "Profil",
|
||||
"pg.model": "Modèle",
|
||||
"pg.temp": "Température",
|
||||
"pg.maxTokens": "Tokens max",
|
||||
"pg.send": "Envoyer",
|
||||
"pg.sending": "Envoi…",
|
||||
"pg.answer": "Réponse",
|
||||
"pg.empty": "La réponse et la décision de routage s'afficheront ici.",
|
||||
"pg.decision": "Décision de routage",
|
||||
"pg.task": "Tâche",
|
||||
"pg.tier": "Niveau",
|
||||
"pg.score": "Complexité",
|
||||
"pg.selected": "Modèle sélectionné",
|
||||
"pg.source": "Source du routage",
|
||||
"pg.cost": "Coût",
|
||||
"pg.latency": "Latence",
|
||||
"pg.tokens": "Tokens (entrée/sortie)",
|
||||
"pg.failover": "Basculement",
|
||||
"pg.error": "Requête échouée",
|
||||
|
||||
// settings
|
||||
"settings.title": "Paramètres",
|
||||
"settings.subtitle": "Connexion passerelle, entrée de routage, fiabilité et observabilité.",
|
||||
"settings.router": "Connexion routeur",
|
||||
"settings.router.url": "URL du routeur",
|
||||
"settings.router.keyEnv": "Nom de l'env. pour la clé du routeur",
|
||||
"settings.router.timeout": "Délai d'expiration (ms)",
|
||||
"settings.router.verifyTls": "Vérifier le certificat TLS",
|
||||
"settings.router.taxonomy": "ID de taxonomie",
|
||||
"settings.route": "Entrée de routage",
|
||||
"settings.route.strategy": "Stratégie de texte",
|
||||
"settings.route.maxChars": "Caractères max",
|
||||
"settings.route.cacheTtl": "TTL du cache",
|
||||
"settings.route.profile": "Profil par défaut",
|
||||
"settings.breaker": "Disjoncteur",
|
||||
"settings.breaker.threshold": "Seuil d'erreur",
|
||||
"settings.breaker.cooldown": "Temporisation",
|
||||
"settings.log": "Journalisation",
|
||||
"settings.log.level": "Niveau de log",
|
||||
"settings.log.bodies": "Journaliser les corps de messages (confidentialité désactivée)",
|
||||
"settings.telemetry": "Télémétrie",
|
||||
"settings.telemetry.metrics": "Exposer Prometheus /metrics",
|
||||
"settings.cortiq": "Métadonnées de réponse",
|
||||
"settings.cortiq.echo": "Inclure le bloc de routage cortiq dans les réponses",
|
||||
"settings.stats": "Statistiques",
|
||||
"settings.stats.enabled": "Enregistrer les statistiques de requêtes",
|
||||
"settings.stats.file": "Fichier de stats (JSONL)",
|
||||
"settings.stats.retention": "Rétention",
|
||||
"settings.listen": "Adresse d'écoute",
|
||||
"settings.export": "Exporter la config",
|
||||
"settings.import": "Importer la config",
|
||||
"settings.needsRestart": "Enregistré. Certains changements (adresse d'écoute) nécessitent un redémarrage.",
|
||||
|
||||
// toasts / misc
|
||||
"toast.saved": "Modifications enregistrées",
|
||||
"toast.deleted": "Supprimé",
|
||||
"toast.probing": "Sondage…",
|
||||
"toast.imported": "Config importée",
|
||||
};
|
||||
Vendored
+256
@@ -0,0 +1,256 @@
|
||||
// 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": "Конфигурация импортирована",
|
||||
};
|
||||
Vendored
+256
@@ -0,0 +1,256 @@
|
||||
// Turkish — tam çeviri; eksik anahtarlar İngilizce'ye geri döner.
|
||||
export default {
|
||||
// brand / common
|
||||
"brand.sub": "Gateway",
|
||||
"common.loading": "Yükleniyor…",
|
||||
"common.save": "Kaydet",
|
||||
"common.saving": "Kaydediliyor…",
|
||||
"common.cancel": "İptal",
|
||||
"common.add": "Ekle",
|
||||
"common.edit": "Düzenle",
|
||||
"common.delete": "Sil",
|
||||
"common.close": "Kapat",
|
||||
"common.test": "Test",
|
||||
"common.copy": "Kopyala",
|
||||
"common.copied": "Kopyalandı",
|
||||
"common.confirm": "Onayla",
|
||||
"common.none": "yok",
|
||||
"common.saved": "Kaydedildi",
|
||||
"common.error": "Hata",
|
||||
"common.ok": "Tamam",
|
||||
"common.refresh": "Yenile",
|
||||
"common.actions": "İşlemler",
|
||||
"common.optional": "isteğe bağlı",
|
||||
"common.search": "Ara",
|
||||
"common.all": "tümü",
|
||||
|
||||
// nav
|
||||
"nav.dashboard": "Pano",
|
||||
"nav.models": "Modeller",
|
||||
"nav.routing": "Yönlendirme",
|
||||
"nav.protocols": "Protokoller",
|
||||
"nav.keys": "API anahtarları",
|
||||
"nav.playground": "Oyun alanı",
|
||||
"nav.settings": "Ayarlar",
|
||||
"nav.foot": "Gateway · v{v}",
|
||||
|
||||
// topbar / status
|
||||
"status.router": "Yönlendirici",
|
||||
"status.gateway": "Gateway",
|
||||
"status.online": "çevrimiçi",
|
||||
"status.offline": "çevrimdışı",
|
||||
"status.checking": "kontrol ediliyor…",
|
||||
"theme.toggle": "Tema",
|
||||
"logout": "Çıkış yap",
|
||||
|
||||
// login
|
||||
"login.title": "allaigate Gateway",
|
||||
"login.subtitle": "Bu gateway'i yönetmek için yönetici token'ını girin.",
|
||||
"login.token": "Yönetici token'ı",
|
||||
"login.tokenPlaceholder": "yönetici token'ını yapıştırın",
|
||||
"login.submit": "Konsolu aç",
|
||||
"login.hint": "Token, başlangıçta gateway günlüğüne yazdırılır veya [admin].token_env ile ayarlanır.",
|
||||
"login.failed": "Geçersiz yönetici token'ı.",
|
||||
|
||||
// dashboard
|
||||
"dash.title": "Pano",
|
||||
"dash.subtitle": "Model havuzunuz için canlı trafik, maliyet ve yönlendirme analitiği.",
|
||||
"dash.range": "Aralık",
|
||||
"dash.range.1h": "1s",
|
||||
"dash.range.24h": "24s",
|
||||
"dash.range.7d": "7g",
|
||||
"dash.kpi.requests": "İstekler",
|
||||
"dash.kpi.tokens": "Token'lar",
|
||||
"dash.kpi.cost": "Maliyet",
|
||||
"dash.kpi.latency": "Ort. gecikme",
|
||||
"dash.kpi.success": "Başarı oranı",
|
||||
"dash.kpi.failovers": "Yedeklemeler",
|
||||
"dash.series.title": "Zamana göre istekler",
|
||||
"dash.series.cost": "Zamana göre maliyet",
|
||||
"dash.series.empty": "Bu aralıkta henüz trafik yok.",
|
||||
"dash.breakdown.title": "Dağılım",
|
||||
"dash.groupby.model": "modele göre",
|
||||
"dash.groupby.tier": "kademeye göre",
|
||||
"dash.groupby.label": "göreve göre",
|
||||
"dash.groupby.account": "hesaba göre",
|
||||
"dash.recent.title": "Son istekler",
|
||||
"dash.recent.empty": "Henüz kayıtlı istek yok. Oyun alanını deneyin.",
|
||||
"dash.col.time": "Zaman",
|
||||
"dash.col.model": "Model",
|
||||
"dash.col.tier": "Kademe",
|
||||
"dash.col.task": "Görev",
|
||||
"dash.col.tokens": "Token'lar",
|
||||
"dash.col.cost": "Maliyet",
|
||||
"dash.col.latency": "Gecikme",
|
||||
"dash.col.outcome": "Sonuç",
|
||||
"dash.col.requests": "İstekler",
|
||||
"dash.col.errors": "Hatalar",
|
||||
"dash.health.title": "Sağlık",
|
||||
"dash.health.reachable": "erişilebilir",
|
||||
"dash.health.unreachable": "erişilemiyor",
|
||||
|
||||
// models
|
||||
"models.title": "Modeller",
|
||||
"models.subtitle": "Model havuzunuz — ucuz yerel modelleri bulut API'leriyle karıştırın.",
|
||||
"models.add": "Model ekle",
|
||||
"models.empty": "Henüz model yok. Başlamak için ilk modelinizi ekleyin.",
|
||||
"models.col.id": "ID",
|
||||
"models.col.provider": "Sağlayıcı",
|
||||
"models.col.model": "Model",
|
||||
"models.col.tier": "Maliyet kademesi",
|
||||
"models.col.key": "Anahtar",
|
||||
"models.col.caps": "Yetenekler",
|
||||
"models.col.price": "Fiyat (giriş/çıkış)",
|
||||
"models.probe": "Sına",
|
||||
"models.probe.ok": "Erişilebilir ({ms} ms)",
|
||||
"models.probe.fail": "Başarısız: {err}",
|
||||
"models.form.addTitle": "Model ekle",
|
||||
"models.form.editTitle": "Modeli düzenle",
|
||||
"models.form.id": "ID",
|
||||
"models.form.idHint": "Yönlendirmede kullanılan benzersiz id, örn. local-qwen",
|
||||
"models.form.provider": "Sağlayıcı",
|
||||
"models.form.baseUrl": "Temel URL",
|
||||
"models.form.model": "Model adı",
|
||||
"models.form.kind": "Tür",
|
||||
"models.form.costTier": "Maliyet kademesi",
|
||||
"models.form.priceIn": "Giriş fiyatı ($/1M)",
|
||||
"models.form.priceOut": "Çıkış fiyatı ($/1M)",
|
||||
"models.form.apiKeyEnv": "API anahtarı ortam değişkeni adı",
|
||||
"models.form.apiKeyEnvHint": "Bu sağlayıcının anahtarını tutan ortam değişkeni / saklı gizli adı.",
|
||||
"models.form.caps": "Yetenekler",
|
||||
"models.form.secret": "Gizli değer",
|
||||
"models.form.secretStored": "saklandı",
|
||||
"models.form.secretEnv": "ortamdan",
|
||||
"models.form.secretMissing": "ayarlanmadı",
|
||||
"models.form.secretPlaceholder": "anahtarı ayarla veya değiştir (yalnızca yazma)",
|
||||
"models.deleteConfirm": "\"{id}\" modelini sil?",
|
||||
|
||||
// routing
|
||||
"routing.title": "Yönlendirme",
|
||||
"routing.subtitle": "Karmaşıklık kademelerini sıralı model listesiyle eşleştirin (öncelik = yedek).",
|
||||
"routing.default": "Varsayılan model",
|
||||
"routing.defaultHint": "Yönlendirici erişilemez olduğunda kullanılır.",
|
||||
"routing.tiers": "Kademeler",
|
||||
"routing.tierHint": "Sıralamak için çipleri sürükleyin; birincisi tercih edilir, diğerleri yedektir.",
|
||||
"routing.addModel": "+ ekle",
|
||||
"routing.addTier": "Kademe ekle",
|
||||
"routing.tierName": "Kademe adı",
|
||||
"routing.policy": "İlke",
|
||||
"routing.policy.mode": "Mod",
|
||||
"routing.policy.fixed": "Sabit tablo",
|
||||
"routing.policy.costAware": "Maliyet bilinçli",
|
||||
"routing.policy.maxCost": "İstek başına maks. maliyet ($)",
|
||||
"routing.policy.minClass": "Kademe başına minimum sınıf",
|
||||
"routing.empty": "Kullanılabilir model yok — önce model ekleyin.",
|
||||
|
||||
// protocols
|
||||
"protocols.title": "Protokoller",
|
||||
"protocols.subtitle": "Yalnızca ihtiyaç duyduğunuz gelen API yüzeylerini etkinleştirin. Geçişler anında uygulanır.",
|
||||
"protocols.implemented": "uygulandı",
|
||||
"protocols.planned": "planlandı",
|
||||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||||
"protocols.openai_chat.d": "POST /v1/chat/completions — OpenAI SDK, LangChain, crewAI ile çalışır.",
|
||||
"protocols.openai_completions": "OpenAI Completions (eski)",
|
||||
"protocols.openai_completions.d": "POST /v1/completions — eski entegrasyonlar.",
|
||||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||||
"protocols.openai_embeddings.d": "POST /v1/embeddings — RAG ardışık düzenleri.",
|
||||
"protocols.openai_models": "OpenAI Models",
|
||||
"protocols.openai_models.d": "GET /v1/models — istemci otomatik keşfi.",
|
||||
"protocols.anthropic_messages": "Anthropic Messages",
|
||||
"protocols.anthropic_messages.d": "POST /v1/messages — Claude yerel ajanları.",
|
||||
"protocols.mcp": "MCP (Model Context Protocol)",
|
||||
"protocols.mcp.d": "JSON-RPC / SSE — MCP yerel orkestratörler.",
|
||||
"protocols.native_passthrough": "Yerel geçiş",
|
||||
"protocols.native_passthrough.d": "POST /route — yönlendirme kararına doğrudan erişim.",
|
||||
|
||||
// keys
|
||||
"keys.title": "API anahtarları",
|
||||
"keys.subtitle": "Ajanlarınız için sanal gateway anahtarları. Sağlayıcı anahtarları gateway'den hiç çıkmaz.",
|
||||
"keys.add": "Yeni anahtar",
|
||||
"keys.empty": "Anahtar yapılandırılmadı — gateway açık modda (kimlik doğrulama yok).",
|
||||
"keys.openMode": "Açık mod: tüm istekler kabul edilir (anahtar gerekmez).",
|
||||
"keys.col.key": "Anahtar",
|
||||
"keys.col.account": "Hesap",
|
||||
"keys.col.rate": "Oran / dak",
|
||||
"keys.col.models": "İzin verilen modeller",
|
||||
"keys.form.title": "Yeni API anahtarı",
|
||||
"keys.form.account": "Hesap",
|
||||
"keys.form.rate": "Oran sınırı / dak",
|
||||
"keys.form.allow": "İzin verilen modeller",
|
||||
"keys.form.allowHint": "Tüm modellere izin vermek için boş bırakın.",
|
||||
"keys.form.custom": "Özel anahtar (isteğe bağlı)",
|
||||
"keys.form.customHint": "sk-gw-… otomatik oluşturmak için boş bırakın.",
|
||||
"keys.created": "Anahtar oluşturuldu — şimdi kopyalayın, bir daha gösterilmeyecek:",
|
||||
"keys.revoke": "İptal et",
|
||||
"keys.revokeConfirm": "Bu anahtarı iptal et?",
|
||||
"keys.allowAll": "tümü",
|
||||
|
||||
// playground
|
||||
"pg.title": "Oyun alanı",
|
||||
"pg.subtitle": "Canlı ardışık düzen üzerinden istem gönderin ve yönlendirme kararını inceleyin.",
|
||||
"pg.system": "Sistem istemi",
|
||||
"pg.systemPlaceholder": "isteğe bağlı sistem mesajı",
|
||||
"pg.prompt": "İstem",
|
||||
"pg.promptPlaceholder": "Bir şey sorun…",
|
||||
"pg.mode": "Mod",
|
||||
"pg.mode.auto": "Otomatik (yönlendir)",
|
||||
"pg.mode.pinned": "Sabitlenmiş model",
|
||||
"pg.profile": "Profil",
|
||||
"pg.model": "Model",
|
||||
"pg.temp": "Sıcaklık",
|
||||
"pg.maxTokens": "Maks. token",
|
||||
"pg.send": "Gönder",
|
||||
"pg.sending": "Gönderiliyor…",
|
||||
"pg.answer": "Yanıt",
|
||||
"pg.empty": "Yanıt ve yönlendirme kararı burada görünecek.",
|
||||
"pg.decision": "Yönlendirme kararı",
|
||||
"pg.task": "Görev",
|
||||
"pg.tier": "Kademe",
|
||||
"pg.score": "Karmaşıklık",
|
||||
"pg.selected": "Seçilen model",
|
||||
"pg.source": "Rota kaynağı",
|
||||
"pg.cost": "Maliyet",
|
||||
"pg.latency": "Gecikme",
|
||||
"pg.tokens": "Token'lar (giriş/çıkış)",
|
||||
"pg.failover": "Yedekleme",
|
||||
"pg.error": "İstek başarısız",
|
||||
|
||||
// settings
|
||||
"settings.title": "Ayarlar",
|
||||
"settings.subtitle": "Gateway bağlantısı, yönlendirme girişi, güvenilirlik ve gözlemlenebilirlik.",
|
||||
"settings.router": "Yönlendirici bağlantısı",
|
||||
"settings.router.url": "Yönlendirici URL'si",
|
||||
"settings.router.keyEnv": "Yönlendirici anahtarı ortam değişkeni adı",
|
||||
"settings.router.timeout": "Zaman aşımı (ms)",
|
||||
"settings.router.verifyTls": "TLS sertifikasını doğrula",
|
||||
"settings.router.taxonomy": "Taksonomi id",
|
||||
"settings.route": "Yönlendirme girişi",
|
||||
"settings.route.strategy": "Metin stratejisi",
|
||||
"settings.route.maxChars": "Maks. karakter",
|
||||
"settings.route.cacheTtl": "Önbellek TTL",
|
||||
"settings.route.profile": "Varsayılan profil",
|
||||
"settings.breaker": "Devre kesici",
|
||||
"settings.breaker.threshold": "Hata eşiği",
|
||||
"settings.breaker.cooldown": "Bekleme süresi",
|
||||
"settings.log": "Günlükleme",
|
||||
"settings.log.level": "Günlük seviyesi",
|
||||
"settings.log.bodies": "Mesaj gövdelerini günlükle (gizlilik kapalı)",
|
||||
"settings.telemetry": "Telemetri",
|
||||
"settings.telemetry.metrics": "Prometheus /metrics'i aç",
|
||||
"settings.cortiq": "Yanıt meta verisi",
|
||||
"settings.cortiq.echo": "Yanıtlarda cortiq yönlendirme bloğunu yansıt",
|
||||
"settings.stats": "İstatistikler",
|
||||
"settings.stats.enabled": "İstek istatistiklerini kaydet",
|
||||
"settings.stats.file": "İstatistik dosyası (JSONL)",
|
||||
"settings.stats.retention": "Saklama süresi",
|
||||
"settings.listen": "Dinleme adresi",
|
||||
"settings.export": "Yapılandırmayı dışa aktar",
|
||||
"settings.import": "Yapılandırmayı içe aktar",
|
||||
"settings.needsRestart": "Kaydedildi. Bazı değişiklikler (dinleme adresi) yeniden başlatma gerektirir.",
|
||||
|
||||
// toasts / misc
|
||||
"toast.saved": "Değişiklikler kaydedildi",
|
||||
"toast.deleted": "Silindi",
|
||||
"toast.probing": "Sınanıyor…",
|
||||
"toast.imported": "Yapılandırma içe aktarıldı",
|
||||
};
|
||||
Vendored
+256
@@ -0,0 +1,256 @@
|
||||
// 简体中文 — Simplified Chinese translation. Keys must match en.js exactly.
|
||||
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": "确定",
|
||||
"common.refresh": "刷新",
|
||||
"common.actions": "操作",
|
||||
"common.optional": "可选",
|
||||
"common.search": "搜索",
|
||||
"common.all": "全部",
|
||||
|
||||
// nav
|
||||
"nav.dashboard": "仪表盘",
|
||||
"nav.models": "模型",
|
||||
"nav.routing": "路由",
|
||||
"nav.protocols": "协议",
|
||||
"nav.keys": "API 密钥",
|
||||
"nav.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": "Token 数",
|
||||
"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": "Token",
|
||||
"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} 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": "API 密钥环境变量名",
|
||||
"models.form.apiKeyEnvHint": "持有该提供商密钥的环境变量或存储机密名称。",
|
||||
"models.form.caps": "能力",
|
||||
"models.form.secret": "密钥值",
|
||||
"models.form.secretStored": "已存储",
|
||||
"models.form.secretEnv": "来自环境变量",
|
||||
"models.form.secretMissing": "未设置",
|
||||
"models.form.secretPlaceholder": "设置或替换密钥(只写)",
|
||||
"models.deleteConfirm": "删除模型 \"{id}\"?",
|
||||
|
||||
// routing
|
||||
"routing.title": "路由",
|
||||
"routing.subtitle": "将复杂度层级映射到有序模型列表(优先级 = 回退顺序)。",
|
||||
"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(模型上下文协议)",
|
||||
"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": "最大 Token 数",
|
||||
"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": "Token(输入/输出)",
|
||||
"pg.failover": "故障转移",
|
||||
"pg.error": "请求失败",
|
||||
|
||||
// settings
|
||||
"settings.title": "设置",
|
||||
"settings.subtitle": "网关连接、路由输入、可靠性与可观测性。",
|
||||
"settings.router": "路由器连接",
|
||||
"settings.router.url": "路由器 URL",
|
||||
"settings.router.keyEnv": "路由器密钥环境变量名",
|
||||
"settings.router.timeout": "超时(ms)",
|
||||
"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": "配置已导入",
|
||||
};
|
||||
Reference in New Issue
Block a user