Fifteen changes aimed at the first day of real use: - Import and media jobs persist to <data>/jobs-*.json and reload on start (running ones settle as errors); the Register button no longer vanishes because the gateway restarted. - Docker ships the cortiq binary (built in the builder stage) — local .cmf chat models and image/video generation now work in containers, where auto-install never could (no cargo in the runtime image). libvulkan1 added for optional GPU offload. - Open admin console on 0.0.0.0 without a token now warns in the log and shows a dismissible banner — the VPS footgun is at least labeled. - "Restart gateway" button in Settings: stops managed model servers, spawns a fresh copy (bind retried while the port frees), Docker relies on the container restart policy instead. - Dashboard "System" panel: CPU sparkline + load, RAM (with the gateway's own RSS), free disk at the models dir — sampled by sysinfo every 2 s. - Featured model cards warn "not enough disk" / "may not fit in RAM" before the download, from the same live snapshot. - Log viewer in the sidebar: a 500-line in-memory ring fed by a second ANSI-free tracing layer; filter, level, pause, copy. - Update check: crates.io polled twice a day, the console shows an "update available" notice. - Media generations queue up (with position shown) instead of being rejected; progress gained an honest ETA from measured throughput. - Generation gallery under the image/video tabs: lazy PPM thumbnails, click to reopen with seed/steps, delete. - Playground chat is a real dialogue now: history is resent, bubbles, Clear, Cmd/Ctrl+Enter. - "Connect your app" snippets (curl / Python / JS) on the keys page, with the real key inlined right after creation. - One-click benchmark on the Models page via `cortiq bench --json`. - Config export now downloads the actual gateway.toml (comments intact); import accepts TOML (validated, hot-reloaded) and the legacy JSON. - Streaming token counts are exact when the model server provides usage (cortiq-server patch, shipped separately); the gateway fallback now counts content chunks (1/token on cortiq) instead of chars/4. Wizard's Finish lands on the Playground. 37 new strings in all 7 languages.
549 lines
30 KiB
JavaScript
Vendored
549 lines
30 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": "Gateway neu starten",
|
||
"settings.restartConfirm": "Gateway neu starten? Laufende Anfragen brechen ab; lokale Modellserver starten ebenfalls neu.",
|
||
"settings.restarting": "Neustart — die Seite lädt neu, sobald das Gateway wieder da ist…",
|
||
"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.",
|
||
};
|