Settings gains a second service button next to restart: stop every managed local model server and exit the gateway process (nothing is respawned; in Docker the restart policy decides). The SPA replaces itself with a static "gateway is off" screen since the API is gone. The restart button is relabeled "Restart everything" to say what it always did — the gateway re-execs itself and managed servers come back with it. Translated in all seven languages.
654 lines
37 KiB
JavaScript
Vendored
654 lines
37 KiB
JavaScript
Vendored
// 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": "Testbereich",
|
||
"nav.settings": "Einstellungen",
|
||
"nav.foot": "Gateway · v{v}",
|
||
"nav.billing": "Router-Key & Abrechnung",
|
||
|
||
// topbar / status
|
||
"status.router": "Router",
|
||
"status.gateway": "Gateway",
|
||
"status.online": "online",
|
||
"status.offline": "offline",
|
||
"status.checking": "Prüfe…",
|
||
"status.noKey": "kein Key",
|
||
"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. Testbereich 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",
|
||
"dash.health.getKey": "Router-Key holen",
|
||
|
||
// 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": "Testbereich",
|
||
"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.stream": "Streamen",
|
||
"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.router.getKey": "Router-Key holen oder aufladen:",
|
||
"settings.router.secret": "Router-Key (Wert)",
|
||
"settings.router.test": "Router testen",
|
||
"router.probe.ok": "Router OK ({ms} ms)",
|
||
"router.probe.noKey": "Router-Key ist nicht gesetzt",
|
||
"router.probe.auth": "Key abgelehnt — ungültig oder widerrufen",
|
||
"router.probe.payment": "Zahlung erforderlich — Tarif abgelaufen oder Kontingent erschöpft",
|
||
"router.probe.quota": "Ratenlimit überschritten",
|
||
"router.probe.timeout": "Router-Zeitüberschreitung",
|
||
"router.probe.unreachable": "Router nicht erreichbar",
|
||
"router.probe.error": "Router-Fehler",
|
||
"router.usage": "Verbrauch",
|
||
"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",
|
||
"dash.cache": "Semantischer Cache",
|
||
"dash.cache.hitRate": "Trefferquote",
|
||
"dash.cache.hits": "Treffer",
|
||
"dash.cache.saved": "Gespart",
|
||
"dash.cache.disabled": "Semantischer Cache ist deaktiviert — in den Einstellungen aktivieren.",
|
||
"settings.cache": "Semantischer Cache",
|
||
"settings.cache.enabled": "Semantischen Cache aktivieren",
|
||
"settings.cache.threshold": "Ähnlichkeitsschwelle",
|
||
"settings.cache.ttl": "Eintrags-TTL",
|
||
"settings.cache.embed": "Embedding-Modell",
|
||
"settings.cache.note": "Cache-Einstellungen werden nach einem Neustart wirksam.",
|
||
|
||
// ── translated from en.js (previously falling back to English) ──
|
||
// nav
|
||
"nav.import": "Modell importieren",
|
||
|
||
// dash
|
||
"dash.clear": "Logs leeren",
|
||
"dash.clearConfirm": "Alle erfassten Statistiken und Logs löschen? Das lässt sich nicht rückgängig machen.",
|
||
"dash.cleared": "Logs geleert",
|
||
|
||
// models
|
||
"models.form.idOrModel": "Gib eine ID oder einen Modellnamen ein",
|
||
"models.form.apiKey": "API-Schlüssel",
|
||
"models.form.apiKeyPlaceholder": "API-Schlüssel einfügen",
|
||
"models.form.apiKeyNotNeeded": "nicht erforderlich (lokaler Server)",
|
||
"models.form.apiKeyHint": "Wird sicher im Gateway gespeichert und nicht erneut angezeigt.",
|
||
"models.form.keyStored": "Ein Schlüssel ist gespeichert — leer lassen, um ihn zu behalten, oder einen neuen einfügen.",
|
||
"models.form.keyFromEnv": "Es wird ein Schlüssel aus einer Umgebungsvariable verwendet.",
|
||
"models.form.paramsTitle": "Generierungs- und Denkparameter (O(1), MTP, Temperatur)",
|
||
"models.form.temperature": "Temperatur",
|
||
"models.form.temperatureHint": "Generierungstemperatur (0.0 = deterministisch, 1.0+ = kreativ).",
|
||
"models.form.topP": "Top-P (Nucleus Sampling)",
|
||
"models.form.topPHint": "Sampling-Schwelle (0.0 .. 1.0).",
|
||
"models.form.maxTokens": "Max. Tokens",
|
||
"models.form.maxTokensHint": "Maximale Anzahl generierter Tokens.",
|
||
"models.form.thinkBudget": "Denkmodus / Think Budget",
|
||
"models.form.thinkBudgetHint": "Token-Budget fürs Nachdenken (0 = aus, N > 0 = max. Reasoning-Tokens).",
|
||
"models.form.systemPrompt": "Standard-System-Prompt",
|
||
"models.form.systemPromptHint": "Wird automatisch vorangestellt, wenn die Anfrage keinen System-Prompt enthält.",
|
||
"models.form.systemPromptPlaceholder": "Du bist ein hilfreicher Assistent…",
|
||
"models.form.testKey": "Testen & Modelle laden",
|
||
"models.form.testing": "wird geprüft…",
|
||
"models.form.foundModels": "{n} Modelle geladen",
|
||
"models.form.modelPlaceholder": "tippen zum Suchen…",
|
||
"models.form.modelHint": "Klicke „Testen & Modelle laden“, um die Liste mit deinem Schlüssel abzurufen, und wähle dann eines aus.",
|
||
"models.managed": "verwaltet",
|
||
"models.managedHint": "Wird vom verwalteten CMF-Server bereitgestellt (Einstellungen → Lokale Modelle). Dort konfigurieren.",
|
||
|
||
// settings
|
||
"settings.router.enabled": "Router verwenden (aus = nur lokale Modelle)",
|
||
"settings.cmf": "Lokale Modelle (CMF)",
|
||
"settings.cmf.localOnly": "Nur lokale Modelle verwenden",
|
||
"settings.cmf.manage": "Lokalen Modellserver starten",
|
||
"settings.cmf.autoInstall": "cortiq automatisch installieren (crates.io)",
|
||
"settings.cmf.autoUpdate": "cortiq automatisch aktualisieren",
|
||
"settings.cmf.model": "Pfad zum lokalen .cmf-Modell",
|
||
"settings.cmf.port": "Port des lokalen Servers",
|
||
"settings.cmf.modelId": "Modell-ID im Pool",
|
||
"settings.cmf.note": "Stellt ein lokales .cmf über cortiq bereit (github.com/infosave2007/cmf). Funktioniert auch, wenn der Router nicht erreichbar ist.",
|
||
"settings.cmf.threads": "Worker-Threads",
|
||
"settings.cmf.gpu": "GPU verwenden (Metal / wgpu)",
|
||
"settings.cmf.speedNote": "Threads parallelisieren die Decode-Matvecs (~3× schneller; 0 = Standard der Runtime). GPU-Offload hilft vor allem beim Prefill langer Prompts — das Decoding ist speicherbandbreitenbegrenzt und daher auf Apple Silicon ungefähr neutral.",
|
||
"settings.cmf.pick": "Modell auswählen",
|
||
"settings.cmf.models": "Lokale Modelle",
|
||
"settings.cmf.modelsHelp": "Jede Zeile ist ein Modell, das das Gateway ausführt (eigenes cortiq serve auf eigenem Port) und im Pool registriert. Füge so viele hinzu, wie du .cmf-Dateien und freie Ports hast.",
|
||
"settings.cmf.rowHint": "ID · .cmf-Datei · Port · Threads · GPU. Änderungen greifen nach einem Neustart; das Löschen einer Zeile stoppt diesen Server.",
|
||
"settings.cmf.addServer": "+ Lokales Modell hinzufügen",
|
||
"settings.cmf.checkPort": "Port prüfen",
|
||
"settings.cmf.portFree": "Port ist frei",
|
||
"settings.cmf.portBusy": "Port ist belegt",
|
||
"settings.cmf.useSuggested": "{port} verwenden",
|
||
"settings.cmf.serving": "{model} läuft auf :{port}",
|
||
"settings.cmf.intro": "Modelle lokal mit der cortiq-Engine ausführen — funktioniert auch offline oder wenn der Router ausfällt.",
|
||
"settings.cmf.runtime": "cortiq-Runtime",
|
||
"settings.cmf.runtimeHelp": "Das Kommandozeilenwerkzeug `cortiq`, das .cmf-Modelle lädt und ausführt. Einmal installieren, bevor du einen lokalen Server startest.",
|
||
"settings.cmf.install": "cortiq installieren",
|
||
"settings.cmf.reinstall": "Neu installieren / aktualisieren",
|
||
"settings.cmf.installing": "wird installiert… (kompiliert, einige Minuten)",
|
||
"settings.cmf.installedOk": "cortiq installiert",
|
||
"settings.cmf.notInstalled": "nicht installiert",
|
||
"settings.cmf.addModel": "Modell hinzufügen",
|
||
"settings.cmf.addModelHelp": "Modelle werden im Tab „Modell importieren“ heruntergeladen und konvertiert (HuggingFace → .cmf). Richte den lokalen Server danach unten auf die .cmf-Datei aus.",
|
||
"settings.cmf.importNote": "Noch kein Modell? Importiere eines:",
|
||
"settings.cmf.importLink": "Import öffnen",
|
||
"settings.cmf.modelHelp": "Pfad zur .cmf-Datei, die bereitgestellt werden soll (z. B. models/qwen.cmf), erzeugt im Import-Tab. Mehrere Modelle für verschiedene Aufgaben? Importiere sie und wechsle diesen Pfad.",
|
||
"settings.cmf.portHelp": "TCP-Port, auf dem der lokale Modellserver lauscht (Standard 8081). Nur ändern, wenn er mit einem anderen Dienst kollidiert.",
|
||
"settings.cmf.threadsHelp": "Wie viele CPU-Kerne für die Generierung genutzt werden. Mehr = schneller (~3× gegenüber einem Kern); 0 überlässt die Wahl der Runtime.",
|
||
"settings.cmf.gpuHelp": "Matrixberechnungen auf die GPU auslagern (Metal/wgpu). Auf Apple Silicon beschleunigt das vor allem lange Prompts — das Decoding ist speicherbandbreitenbegrenzt.",
|
||
"settings.cmf.localOnlyHelp": "Jede Anfrage an das lokale Modell leiten und dabei Router sowie Cloud-Anbieter ignorieren.",
|
||
"settings.cmf.manageHelp": "Das Gateway startet beim Hochfahren `cortiq serve` für die untenstehende .cmf-Datei und routet dorthin. Erfordert ein installiertes cortiq (Schritt 1). Greift nach einem Neustart.",
|
||
"settings.cmf.autoInstallHelp": "Wenn cortiq beim Start fehlt, automatisch von crates.io installieren.",
|
||
"settings.cmf.autoUpdateHelp": "Beim Start cortiq auf die neueste Version aktualisieren, falls eine neuere existiert.",
|
||
"settings.router.enabledHelp": "Den cortiq-Router jede Anfrage klassifizieren lassen (Aufgabentyp + Komplexität) und ein Modell wählen. Aus = nur die lokale Routing-Tabelle verwenden.",
|
||
"settings.router.verifyTlsHelp": "Das TLS-Zertifikat des Routers prüfen. Nur bei einem selbstsignierten oder IP-gebundenen Zertifikat abschalten.",
|
||
"settings.telemetry.metricsHelp": "Prometheus-Metriken unter GET /metrics bereitstellen.",
|
||
"settings.cortiq.echoHelp": "Ein Feld `cortiq` (Aufgabe, Modell, Kosten) zu jedem Antwort-Body hinzufügen. Response-Header werden immer gesendet.",
|
||
"settings.stats.enabledHelp": "Aktuelle Anfragen aufzeichnen, um Dashboard und Diagramme zu speisen.",
|
||
"settings.cache.enabledHelp": "Semantischer Cache: eine gespeicherte Antwort zurückgeben, wenn ein neuer Prompt einem früheren sehr ähnlich ist, und den Modellaufruf überspringen. Erfordert ein Embedding-Modell im Pool.",
|
||
"settings.log.bodiesHelp": "Vollständige Nachrichteninhalte von Anfrage und Antwort loggen. Aus Datenschutzgründen standardmäßig aus.",
|
||
"settings.router.saveKey": "Schlüssel speichern",
|
||
"settings.router.keySaved": "Router-Schlüssel gespeichert",
|
||
"settings.router.keyEmpty": "Füge zuerst den Schlüssel ein",
|
||
"settings.router.secretHelp": "Füge den Schlüssel aus deiner E-Mail von api.allaigate.com ein und klicke auf „Schlüssel speichern“. Das ist KEIN Wert aus „API-Schlüssel“ — die sind für Clients, die dein Gateway aufrufen.",
|
||
"settings.router.keyStoredMask": "•••••••••••• — Schlüssel gespeichert (zum Ersetzen erneut einfügen)",
|
||
"settings.route.strategyHelp": "Welcher Text zur Klassifizierung an den Router geht: last_user = nur die letzte Nutzernachricht; last_user_plus_system = letzte Nutzernachricht + System-Prompt; concat_all = die gesamte Unterhaltung.",
|
||
"settings.route.maxCharsHelp": "Maximale Zeichenzahl dieses Textes, die an den Router gesendet wird (längerer Text wird gekürzt). Mehr = genauere Klassifizierung, aber langsamere und teurere Router-Aufrufe.",
|
||
"settings.route.cacheTtlHelp": "Wie lange eine Routing-Entscheidung für eine identische Anfrage zwischengespeichert wird, bevor der Router erneut gefragt wird (z. B. 60s, 5m).",
|
||
"settings.route.profileHelp": "Standard-Routing-Profil, wenn eine Anfrage keines angibt: cost-saver (am günstigsten), balanced oder quality-first (bestes Modell). Beeinflusst, welches Modell der Router wählt.",
|
||
|
||
// import
|
||
"import.subtitle": "Suche auf HuggingFace, konvertiere in ein lokales .cmf und stelle es bereit.",
|
||
"import.searchPlaceholder": "HuggingFace-Modelle suchen (z. B. qwen3, llama)…",
|
||
"import.searching": "Suche läuft…",
|
||
"import.noResults": "Keine Modelle gefunden.",
|
||
"import.configure": "Konvertierung einrichten",
|
||
"import.outName": "Ausgabename",
|
||
"import.outNameHint": "Name der .cmf-Datei (Buchstaben, Ziffern, - und _).",
|
||
"import.quant": "Quantisierung",
|
||
"import.convert": "Konvertieren & laden",
|
||
"import.converting": "Konvertierung",
|
||
"import.started": "Konvertierung gestartet",
|
||
"import.failed": "Konvertierung fehlgeschlagen — siehe Log.",
|
||
"import.register": "Als lokales Modell registrieren",
|
||
"import.registered": "Als '{id}' registriert. Starte cortiq-server, um es bereitzustellen.",
|
||
"import.jobs": "Downloads & Konvertierungen",
|
||
"import.cancel": "Abbrechen",
|
||
"import.cancelling": "Wird abgebrochen — unvollständige Ausgabe wird entfernt…",
|
||
"import.delete": "Löschen",
|
||
"import.deleteConfirm": "Dieses Modell und seine konvertierte .cmf-Datei von der Festplatte löschen?",
|
||
"import.deleted": "Mitsamt Dateien gelöscht",
|
||
"import.state.running": "läuft",
|
||
"import.state.done": "fertig",
|
||
"import.state.error": "Fehler",
|
||
"import.state.cancelled": "abgebrochen",
|
||
"import.featuredTitle": "Empfohlene fertige .cmf-Modelle",
|
||
"import.featuredSub": "Vorkonvertierte .cmf-Modelle vom infosave-Konto auf HuggingFace — die Liste wird live gelesen, neue Modelle erscheinen von selbst.",
|
||
"import.readyCmfBadge": "Fertiges .cmf",
|
||
"import.directDownload": "Herunterladen",
|
||
"import.q.q8_2f": "8-Bit Zwei-Feld (𝒲×θ) — empfohlen: bestes Verhältnis von Qualität und Größe.",
|
||
"import.q.q8_row": "8-Bit pro Zeile — einfach und robust.",
|
||
"import.q.q4": "4-Bit Block — am kleinsten, geringere Qualität.",
|
||
"import.q.q4_tiled": "4-Bit gekachelt (Q4_TILED) — 1,66× schneller auf der Metal-GPU.",
|
||
"import.q.vbit": "Variabel 3–8 Bit — Bit-Budget pro Experte.",
|
||
"import.q.q1t": "1,58-Bit ternär (Q1T) — BitNet b1.58 mit spärlichen Ausreißern.",
|
||
"import.q.q1s": "1-Bit spärlich (Q1S) — 1-Bit-Basis mit holografischen Ausreißern.",
|
||
"import.q.q1p": "1-Bit PTQ (Q1P) — 1 Bit mit Fehlerdiffusion.",
|
||
"import.q.q1": "1-Bit (Q1) — rein binäres Format.",
|
||
"import.q.f16": "16-Bit — keine Quantisierung.",
|
||
"import.q.f32": "32-Bit — volle Präzision (große Datei).",
|
||
"import.adv.title": "Erweiterte Einstellungen",
|
||
"import.adv.auto": "automatisch",
|
||
"import.adv.linearCore": "Linearer Kern",
|
||
"import.adv.linearHint": "Wie Layer mit linearer Attention übernommen bzw. gefaltet werden.",
|
||
"import.adv.nphase": "vmf_phase Phasen/Kopf",
|
||
"import.adv.vbitShape": "VBIT-Budgetform",
|
||
"import.adv.meanBits": "VBIT mittlere Bits",
|
||
"import.adv.shard": "Shard max. (GB)",
|
||
"import.adv.noShard": "kein Sharding",
|
||
"import.adv.skipMtp": "MTP-Kopf überspringen",
|
||
"import.adv.o1": "O(1)-Attention",
|
||
"import.adv.o1Hint": "Streaming-Attention mit konstantem Speicher: der KV-Cache wird nach dem Prefill freigegeben, lange Kontexte lassen den Speicher also nicht wachsen. Die Gewichte bleiben Byte-identisch — gespeichert wird nur ein Hinweis für die Ladezeit; du kannst jederzeit zurückwechseln (mit --o1 off starten). Auf Qwen3-0.6B validiert: alle Layer ≈ ×1,18 Perplexität.",
|
||
"import.adv.o1Off": "aus — exakte Attention (Standard)",
|
||
"import.adv.o1All": "alle — jeden Softmax-Layer konvertieren",
|
||
"import.adv.o1Deep": "deep N — nur die N tiefsten Layer",
|
||
"import.adv.o1Custom": "benutzerdefiniert — explizite Layer-Liste",
|
||
"import.adv.o1DeepN": "N tiefe Layer",
|
||
"import.adv.o1Layers": "Layer (kommagetrennt)",
|
||
"import.adv.o1mHint": "Landmark-Budget (Standard 32)",
|
||
"import.adv.o1windowHint": "Breite des exakten Fensters (Standard 128)",
|
||
"import.adv.o1sinkHint": "permanente exakte Sink-Keys (Standard 4)",
|
||
|
||
// onboarding
|
||
"onboarding.title": "Ersteinrichtung",
|
||
"onboarding.welcome": "Willkommen bei Cortiq Gateway",
|
||
"onboarding.welcomeSub": "Wähle deine Sprache — du kannst sie jederzeit in der Kopfzeile ändern.",
|
||
"onboarding.next": "Weiter",
|
||
"onboarding.back": "Zurück",
|
||
"onboarding.skip": "Vorerst überspringen",
|
||
"onboarding.skipSetup": "Überspringen",
|
||
"onboarding.finish": "Einrichtung abschließen",
|
||
"onboarding.featuredTitle": "Fertige Modelle (ein Klick)",
|
||
"onboarding.featuredSub": "Das sind bereits konvertierte .cmf-Modelle von infosave auf HuggingFace — einfach herunterladen, keine Konvertierung nötig. Wähle eines oder mehrere für den Sofortstart.",
|
||
"onboarding.download": "Herunterladen",
|
||
"onboarding.hfTitle": "Jedes HuggingFace-Modell — automatisch konvertiert",
|
||
"onboarding.hfSub": "Suche ein beliebiges Modell, wähle eine Quantisierung, und wir konvertieren es automatisch nach .cmf. Keine manuellen Config-Änderungen.",
|
||
"onboarding.noJobs": "Noch keine Downloads.",
|
||
"onboarding.doneTitle": "Alles bereit",
|
||
"onboarding.doneSub": "Heruntergeladene Modelle werden automatisch registriert. Weitere kannst du unter Import oder Modelle hinzufügen.",
|
||
"onboarding.doneHint": "„Einrichtung abschließen“ verbindet jeden fertigen Download als lokales Modell, startet dessen .cmf-Server und richtet das Routing darauf aus. Alles lässt sich später unter Modelle ändern.",
|
||
"onboarding.willRegister": "Werden als lokale Modelle verbunden",
|
||
"onboarding.nothingToRegister": "Noch keine abgeschlossenen Downloads — nichts zu verbinden. Geh einen Schritt zurück und wähle ein Modell.",
|
||
"onboarding.registeredN": "{n} Modell(e) verbunden: {ids}",
|
||
"onboarding.runtimeMissing": "Die cortiq-Runtime ist nicht installiert — installiere sie unter Einstellungen → Lokale Modelle, um diese Modelle bereitzustellen.",
|
||
"onboarding.downloaded": "heruntergeladen",
|
||
"onboarding.update": "Aktualisieren",
|
||
"onboarding.deleteFile": "Die .cmf-Datei von der Festplatte löschen",
|
||
"onboarding.confirmDelete": "„{id}“ löschen? Die .cmf-Datei wird von der Festplatte entfernt.",
|
||
"onboarding.unregistered": "Ebenfalls abgemeldet: {ids}",
|
||
|
||
// playground: media generation + streaming metrics
|
||
"pg.tab.chat": "Chat",
|
||
"pg.tab.image": "Bild",
|
||
"pg.tab.video": "Video",
|
||
"pg.generate": "Generieren",
|
||
"pg.generating": "Wird generiert…",
|
||
"pg.genFailed": "Generierung fehlgeschlagen — siehe Log.",
|
||
"pg.result": "Ergebnis",
|
||
"pg.genMetrics": "Generierungsmetriken",
|
||
"pg.imagePromptPlaceholder": "ein Rotfuchs im Schnee bei Sonnenuntergang, fotorealistisch, detailliertes Fell",
|
||
"pg.videoPromptPlaceholder": "ein Corgi mit Kochmütze wirft einen Pfannkuchen, Brutzeln und ein fröhliches Bellen",
|
||
"pg.imageEmpty": "Das generierte Bild erscheint hier.",
|
||
"pg.videoEmpty": "Der generierte Clip (mit Ton) erscheint hier.",
|
||
"pg.width": "Breite",
|
||
"pg.height": "Höhe",
|
||
"pg.steps": "Schritte",
|
||
"pg.seed": "Seed",
|
||
"pg.randomSeed": "Zufälliger Seed",
|
||
"pg.cfgHint": "Guidance-Stärke; ≤ 1 schaltet CFG ab und halbiert die Arbeit.",
|
||
"pg.frames": "Frames",
|
||
"pg.framesHint": "Bei 24 fps; auf das Raster des Modells gerundet.",
|
||
"pg.quality": "JPEG-Qualität",
|
||
"pg.videoSizeHint": "Vielfache von 32; die trainierte kurze Kante ist 768.",
|
||
"pg.videoStepsHint": "Die Turbo-LoRA ist auf 4 Schritte trainiert.",
|
||
"pg.firstFrame": "Erstes Frame (optional)",
|
||
"pg.lastFrame": "Letztes Frame (optional)",
|
||
"pg.keyframeHint": "Macht den Lauf zu Keyframe-to-Video.",
|
||
"pg.resolution": "Auflösung",
|
||
"pg.genTime": "Generierungszeit",
|
||
"pg.timePerStep": "Pro Schritt",
|
||
"pg.timePerFrame": "Pro Frame",
|
||
"pg.fileSize": "Dateigröße",
|
||
"pg.duration": "Dauer",
|
||
"pg.play": "Abspielen",
|
||
"pg.noMediaModels": "Noch kein lokales {kind}-Modell. Lade eines (z. B. aus der infosave-Sammlung) unter Import herunter:",
|
||
"pg.tokSpeed": "Geschwindigkeit",
|
||
"pg.ttft": "Erstes Token",
|
||
|
||
// ops: logs, system, notices, gallery, chat, snippets, bench
|
||
"nav.logs": "Logs",
|
||
"logs.subtitle": "Jüngstes Gateway-Log — das, was das Terminal zeigen würde.",
|
||
"logs.filterPlaceholder": "filtern…",
|
||
"logs.pause": "Pause",
|
||
"logs.resume": "Fortsetzen",
|
||
"logs.empty": "Nichts gefunden.",
|
||
"notice.openAdmin": "Die Konsole ist ohne Token offen und von anderen Rechnern erreichbar. Setze einen Token, wenn diese Maschine nicht privat ist.",
|
||
"notice.update": "Update verfügbar: v{v}.",
|
||
"dash.sys.title": "System",
|
||
"dash.sys.cores": "Kerne",
|
||
"dash.sys.disk": "Festplatte (Modelle)",
|
||
"dash.sys.free": "frei",
|
||
"dash.sys.gateway": "Gateway",
|
||
"fit.disk": "zu wenig Speicherplatz",
|
||
"fit.diskTitle": "Der Download ist größer als der freie Platz auf der Modell-Festplatte.",
|
||
"fit.ram": "passt evtl. nicht in den RAM",
|
||
"fit.ramTitle": "Das Modell ist nahe an oder größer als der RAM dieser Maschine — es läuft womöglich nicht.",
|
||
"pg.eta": "übrig",
|
||
"pg.min": "Min",
|
||
"pg.queued": "In der Warteschlange — Position {n}. Startet, sobald die aktuelle Generierung fertig ist.",
|
||
"pg.gallery": "Letzte Generierungen",
|
||
"pg.galDeleteConfirm": "Diese Generierung samt Dateien löschen?",
|
||
"pg.clearChat": "Leeren",
|
||
"keys.snip.title": "Deine App verbinden",
|
||
"keys.snip.hint": "Füge eines der Beispiele in dein Projekt ein — nur der Schlüssel-Platzhalter muss ersetzt werden.",
|
||
"keys.snip.withKey": "Die Beispiele unten enthalten bereits den gerade erstellten Schlüssel.",
|
||
"keys.snip.openMode": "Keine API-Schlüssel konfiguriert — das Gateway akzeptiert jeden Wert.",
|
||
"keys.snip.keyPh": "dein API-Schlüssel",
|
||
"settings.restart": "Alles neu starten",
|
||
"settings.restartConfirm": "Gateway und alle lokalen Modellserver neu starten? Laufende Anfragen werden abgebrochen.",
|
||
"settings.restarting": "Neustart — die Seite lädt neu, sobald das Gateway wieder da ist…",
|
||
"settings.shutdown": "Alles stoppen & ausschalten",
|
||
"settings.shutdownConfirm": "Alle lokalen Modellserver stoppen und das Gateway ausschalten? API und dieses Panel antworten erst wieder, wenn Sie das Gateway neu starten.",
|
||
"settings.shutdownDone": "Das Gateway ist ausgeschaltet.",
|
||
"settings.shutdownHint": "Alle lokalen Modellserver sind gestoppt, der Prozess wurde beendet. Starten Sie das Gateway auf dem Server neu, um das Panel zurückzubekommen.",
|
||
"bench.title": "Geschwindigkeit lokaler Modelle",
|
||
"bench.hint": "Führt `cortiq bench` auf dieser Maschine aus — echte tok/s, ein Modell nach dem anderen.",
|
||
"bench.run": "Messen",
|
||
"bench.running": "misst…",
|
||
"bench.failed": "fehlgeschlagen",
|
||
"bench.none": "Noch keine lokalen .cmf-Chat-Modelle.",
|
||
|
||
// task-based routing
|
||
"task.chitchat": "Smalltalk",
|
||
"task.code": "Code",
|
||
"task.creative-writing": "Kreatives Schreiben",
|
||
"task.extraction": "Datenextraktion",
|
||
"task.math": "Mathematik",
|
||
"task.qa": "Fragen & Antworten",
|
||
"task.summarization": "Zusammenfassung",
|
||
"task.translation": "Übersetzung",
|
||
"routing.tasks.title": "Aufgabenbasiertes Routing",
|
||
"routing.tasks.hint": "Die Modelle einer Regel kommen für ihre Aufgabe zuerst; die Komplexitätskette bleibt als Fallback. Leer = nur nach Komplexität.",
|
||
"routing.tasks.inherit": "nach Komplexität (keine Regel)",
|
||
"routing.tasks.share": "{p}% der Anfragen (7 T)",
|
||
"routing.tasks.fromRouter": "Labels live vom Router",
|
||
"routing.tasks.builtin": "Router nicht erreichbar — eingebauter Labelsatz",
|
||
"routing.tasks.addCustom": "Aufgabe hinzufügen",
|
||
"routing.tasks.addPlaceholder": "eigenes Label…",
|
||
|
||
// benchmark view
|
||
"nav.benchmark": "Benchmark",
|
||
"bm.title": "Benchmark",
|
||
"bm.subtitle": "Qualitäts- und Tempo-Proben durch die Live-Pipeline: Antworten per Schlüsselwort geprüft, Schleifen erkannt, tok/s und Zeit bis zum ersten Token je Modell.",
|
||
"bm.models": "Zu testende Modelle",
|
||
"bm.quickMode": "Schnelltest",
|
||
"bm.quickHint": "Die schnelle Teilmenge mit kurzen Antworten — etwa eine Minute pro lokalem Modell.",
|
||
"bm.suiteInfo": "Eingebaute Suite: {q} schnelle / {f} volle Tests, plus Ihre eigenen.",
|
||
"bm.run": "Starten",
|
||
"bm.pickModel": "Wählen Sie mindestens ein Modell.",
|
||
"bm.testOf": "Test {i} von {n}",
|
||
"bm.results": "Ergebnisse",
|
||
"bm.quick": "schnell",
|
||
"bm.test": "Test",
|
||
"bm.cellHint": "Klick auf eine Zelle zeigt die vollständige Antwort.",
|
||
"bm.history": "Frühere Läufe (in diesem Browser gespeichert)",
|
||
"bm.custom": "Eigene Tests",
|
||
"bm.customHint": "Prompt + kommagetrennte Schlüsselwörter, die die Antwort enthalten muss (| für Synonyme). Im Browser gespeichert.",
|
||
"bm.promptPh": "Prompt…",
|
||
"bm.checkPh": "Schlüsselwörter, kommagetrennt",
|
||
"bm.addTest": "Test hinzufügen",
|
||
"bm.emptyAnswer": "leere Antwort",
|
||
"bm.loopDetected": "Schleife erkannt",
|
||
|
||
// benchmark: routing mode, cost, live
|
||
"bm.mode.routing": "Smartes Routing",
|
||
"bm.mode.models": "Einzelne Modelle",
|
||
"bm.mode.routingDesc": "Das Kernfeature des Produkts im Test: jede Probe läuft über cortiq-auto — Sie sehen, welche Aufgabe der Router erkannt hat, welches Modell er wählte, ob das den Erwartungen entspricht und was es gekostet hat.",
|
||
"bm.mode.modelsDesc": "Dieselbe Suite, an gewählte Modelle gepinnt — Qualität, Tempo und Kosten im direkten Vergleich, am Router vorbei.",
|
||
"bm.answersOk": "Antworten korrekt",
|
||
"bm.classAcc": "Aufgaben-Klassifikation",
|
||
"bm.modelDist": "Anfragen gingen an",
|
||
"bm.expectedLbl": "erwartet:",
|
||
"bm.answer": "Antwort",
|
||
"bm.liveRunning": "läuft…",
|
||
"bm.spent": "ausgegeben",
|
||
"bm.verdict": "🏁 Fertig: Antworten {p}, ausgegeben {s}",
|
||
"bm.clearHistory": "Alle löschen",
|
||
|
||
// harness auto-setup (API keys view)
|
||
"keys.h.claude": "Claude Code — ins Terminal einfügen (das Gateway spricht das Anthropic-Protokoll nativ):",
|
||
"keys.h.codex": "Codex — hängt den Provider an ~/.codex/config.toml an und startet:",
|
||
"keys.h.opencode": "OpenCode — schreibt ~/.config/opencode/opencode.json (überschreibt!) und startet:",
|
||
"keys.h.continue": "Continue (VS Code / JetBrains) — hängt das Modell an ~/.continue/config.yaml an:",
|
||
"keys.h.cline1": "Cline (VS Code) — in den Erweiterungseinstellungen wählen:",
|
||
"keys.h.cline2": "Einstellungen → API Provider → OpenAI Compatible, dann die Werte oben einfügen.",
|
||
"keys.h.note": "cortiq-auto = smartes Routing: der Router wählt das Modell pro Anfrage. Für ein festes Modell den exakten Namen angeben. Unter Windows die Skripte in Git Bash / WSL ausführen oder dieselben Variablen über die Systemumgebung setzen.",
|
||
"keys.h.protoOff": "Das Anthropic-Protokoll (/v1/messages) ist deaktiviert — Claude Code kann sich nicht verbinden.",
|
||
"keys.h.enableProto": "Aktivieren",
|
||
"keys.h.st.installed": "Auf der Gateway-Maschine installiert",
|
||
"keys.h.st.configured": "Bereits für dieses Gateway konfiguriert",
|
||
"keys.h.st.notFound": "Auf der Gateway-Maschine nicht gefunden",
|
||
"bm.degraded": "Router degradiert",
|
||
"bm.routerDegraded": "Der Router hat nicht rechtzeitig geantwortet — die Anfrage nutzte die Fallback-Kette; die Klassifikation wird nicht gewertet.",
|
||
"bm.cutByCap": "Budget ging fürs Denken drauf — keine Antwort mehr",
|
||
"shell.uiStale": "Das Gateway wurde aktualisiert — diese Seite zeigt eine ältere Oberfläche.",
|
||
"shell.reload": "Neu laden",
|
||
"keys.col.requests": "Anfragen",
|
||
"keys.col.tokens": "Tokens ein/aus",
|
||
"keys.col.costAll": "$ gesamt",
|
||
"routing.tasks.tier": "Komplexität",
|
||
"routing.tasks.tierAuto": "Auto (Router)",
|
||
"routing.tasks.tierHint": "Welches Modell diese Aufgabe bei welcher Komplexität bedient; \"jede\" führt auf allen Stufen. Reihenfolge = Fallback-Reihenfolge. High eskaliert weiterhin über \"jede\"-Einträge.",
|
||
"routing.tasks.tierAny": "jede Komplexität",
|
||
"routing.tasks.addModel": "Modell",
|
||
"routing.bands.enable": "Eigene Komplexitätsgrenzen",
|
||
"routing.bands.hint": "Ziehen Sie die Griffe: wo low endet und high beginnt — die Griffe schieben einander, die Zahlen aktualisieren sich live. Der kontinuierliche Router-Score wird mit IHREN Grenzen neu eingeteilt; ohne Häkchen gelten die Grenzen des Routers.",
|
||
"tier.low": "leicht",
|
||
"tier.medium": "mittel",
|
||
"tier.high": "schwer",
|
||
"bm.scoreHint": "Der kontinuierliche Komplexitätsscore des Routers (0..1) — die Grenzregler auf der Routing-Seite teilen ihn in Stufen.",
|
||
"settings.cache.noEmbed": "Der Cache ist aktiviert, hat aber KEIN Embedding-Modell — er tut nichts. Fügen Sie dem Pool ein Modell mit kind = \"embedding\" hinzu (z. B. OpenAI text-embedding) oder wählen Sie unten eines.",
|
||
"settings.cache.entries": "Einträge",
|
||
"settings.cache.hits": "Treffer",
|
||
"settings.cache.saved": "gespart",
|
||
"keys.form.budget": "Monatsbudget, $ (0 = unbegrenzt)",
|
||
"keys.form.budgetHint": "Überschreiten die Monatsausgaben des Kontos die Grenze, werden Anfragen mit 429 insufficient_quota abgelehnt.",
|
||
"keys.budgetOf": "Budget {b}/Mon.",
|
||
"dash.kpi.orBalance": "OpenRouter-Guthaben",
|
||
"keys.h.install": "Installieren:",
|
||
"keys.snip.keyInputPh": "API-Schlüssel einfügen",
|
||
"keys.snip.apply": "Schlüssel einsetzen",
|
||
};
|