Files
cortiq-gateway/web/js/i18n/de.js
T
infosave2007 255d989e83 feat(admin): power controls — stop everything & power off, restart everything
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.
2026-08-08 17:33:56 +03:00

654 lines
37 KiB
JavaScript
Vendored
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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",
};