Files
cortiq-gateway/web/js/i18n/de.js
T
infosave2007 a77beeabab feat(playground): image & video generation tabs + real chat metrics
The infosave collection now ships media models (Lumina-Image-2.0, MiniMax-H3
Turbo) that cortiq runs via `imagine`/`animate` CLI, not `cortiq serve`. The
gateway grows a media API: local .cmf files are classified by `cortiq info`
(chat/image/video, cached), generations run as tracked jobs with step progress
parsed from stdout, one at a time, cancellable, outputs under <data>/media.

The playground becomes three tabs. Image: width/height/steps/CFG/seed, live
progress, result rendered from P6 PPM to a canvas in the browser (PNG export
via toBlob). Video: frames/steps/quality/seed plus optional first/last
keyframes (rasterized to PPM client-side); the MJPEG+PCM AVI is decoded in JS
and played on a canvas synced to the wav — no ffmpeg on either side (mp4 remux
happens opportunistically when ffmpeg exists). A metrics card shows resolution,
steps, seed, total time, time per step/frame and file size.

Chat metrics: the local cortiq server sends no usage chunk in streams, so
token counts showed 0/0. tap_stream now injects one OpenAI-shaped usage event
ahead of [DONE] with the gateway's ~4-chars/token estimate, flagged
`cortiq_estimated`; the UI renders it as "≈ N / M" and adds tok/s and
time-to-first-token. Registration skips media packs (a `cortiq serve` entry
for a diffusion model would only fail) in both Register and the wizard's
Finish.

36 new UI strings translated across all 7 languages.
2026-08-07 15:55:06 +03:00

510 lines
28 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",
};