chain-studio/lib/l10n/app_de.arb
flemming-it 63e19974c0 feat(studio): @-syntax file inputs in flows, copyable doc errors, services-row overflow (v0.40.0)
Three concrete fixes against today's user feedback.

- Flows that take binary inputs (extract / extract-summarize /
  …) work from the Flows tab. The run-flow input dialog now
  accepts the same `@/path/to/file` syntax `fai run --input`
  uses on the CLI: any value beginning with `@` is read as
  bytes and sent as a binary Payload; plain values still flow
  through as text. The dialog hint copy and the example
  placeholder reflect the new syntax. File-read failures
  surface as a SnackBar before the run dialog opens, so a
  typo in the path doesn't reach the hub. Threaded through
  `_FlowRunDialog` and `HubService.runSavedFlow`, which both
  carry separate `textInputs` and `fileInputs` maps now and
  forward to the SDK's mixed-mode runSavedFlow (v0.14.0).

- The Welcome doc-reader's error path uses `FaiErrorBox` so
  the actual underlying error is selectable + copy-to-
  clipboard via the existing widget. Plus the loader throws
  a richer error string that names *both* attempted asset
  paths (`<slug>_<lang>.md` and the EN fallback) and the
  underlying exception each, so the operator can paste a
  diagnostic into a chat without us having to ship a
  separate "how to read Flutter asset errors" doc.

- Doctor's empty Services panel had a horizontal RenderFlex
  overflow at narrow widths because the long mono-spaced
  hint ("add to ~/.fai/config.yaml under services:") and
  the leading icon+text both demanded full intrinsic width
  in a single Row. Now wraps via a `Wrap` widget so the
  hint flows to a second line on narrow viewports and stays
  in the same row when there's space.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-05-09 02:07:31 +02:00

638 lines
34 KiB
Text
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.

{
"@@locale": "de",
"appTitle": "F∆I Studio",
"navWelcome": "Willkommen",
"welcomeHeroTitle": "F∆I Platform",
"welcomeHeroSubtitle": "Deterministische Workflow-Engine für KI-gestützte Dokumentenverarbeitung in regulierten Umgebungen.",
"welcomePillarHubTitle": "Hub",
"welcomePillarHubBody": "Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den State. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.",
"welcomePillarModuleTitle": "Modul",
"welcomePillarModuleBody": "Eine kleine WebAssembly-Komponente, die eine Sache macht. Deklariert Netzwerk-Endpunkte, Dateien und Umgebungsvariablen, auf die sie zugreift; der Hub setzt die Liste durch.",
"welcomePillarFlowTitle": "Flow",
"welcomePillarFlowBody": "Eine YAML-Datei, die Module verkettet. Eingaben rein, Module laufen in der deklarierten Reihenfolge, Ausgaben raus — jeder Schritt in einem hash-verketteten Audit-Log festgehalten.",
"welcomeTrustHeader": "TRUST-POSTURE",
"welcomeTrustSandboxTitle": "Sandbox von Anfang an",
"welcomeTrustSandboxBody": "Jedes Modul bringt eine explizite Berechtigungsliste mit — Netzwerk-Endpunkte, Dateien, Umgebungsvariablen. Der Hub setzt sie durch; ohne Operator-Freigabe verlässt nichts die Sandbox.",
"welcomeTrustAuditTitle": "Manipulationssicheres Audit-Log",
"welcomeTrustAuditBody": "Flow-Läufe, Installationen, Deinstallationen, Freigabe-Entscheidungen — alles wird in ein hash-verkettetes Audit-Log geschrieben. Die Diagnose-Seite verifiziert die Kette bei jedem Laden komplett.",
"welcomeTrustAirgapTitle": "Air-Gap-tauglich",
"welcomeTrustAirgapBody": "Der gesamte Hub steckt in einem einzigen Binary für Linux, macOS und Windows. Sobald ein Modul installiert ist, läuft der Flow, der es nutzt, ohne weiteren Netzwerkzugriff — ideal für regulierte Umgebungen.",
"welcomeDocsHeader": "DOKUMENTATION",
"welcomeDocsBody": "Operator-Erklärungen, inline gerendert. Kein Browser, kein externer Link — air-gap-tauglich.",
"welcomeDocArchitectureTitle": "Architektur in einem Absatz",
"welcomeDocArchitectureBlurb": "Hub, Modul, Flow — und wie die drei zusammenpassen.",
"welcomeDocSecurityTitle": "Sandbox-Modell",
"welcomeDocSecurityBlurb": "Was ein Modul deklariert, was der Operator deckelt, was der Hub durchsetzt.",
"welcomeDocAuditTitle": "Manipulationssicheres Audit-Log",
"welcomeDocAuditBlurb": "Wie die Hash-Kette funktioniert und warum WORM-1 für KRITIS reicht.",
"welcomeDocFlowsTitle": "Flow-Komposition",
"welcomeDocFlowsBlurb": "YAML-Grundlagen, Templating-Referenz, das Extract→Summarize-Beispiel.",
"welcomeDocClose": "Schließen",
"welcomeDocFailedToLoad": "Doku konnte nicht geladen werden: {error}",
"@welcomeDocFailedToLoad": { "placeholders": { "error": { "type": "String" } } },
"welcomeChecklistHeader": "ERSTE SCHRITTE",
"welcomeChecklistBody": "Vier Schritte zu einem funktionierenden Hub. Live-Zustand — nach jeder Änderung aktualisieren.",
"welcomeChecklistAi": "System-AI konfigurieren",
"welcomeChecklistAiHint": "Einstellungen → System-AI. Wird für die KI-Suche und Fehlererklärungen gebraucht.",
"welcomeChecklistMcp": "Öffentliche Capability-Quelle hinzufügen",
"welcomeChecklistMcpHint": "Store → Today-Hero, oder Einstellungen → MCP-Clients. DeepWiki und Semgrep sind je ein Klick.",
"welcomeChecklistModule": "Ein Text-Modul installieren",
"welcomeChecklistModuleHint": "Store → nach „text\" suchen → Installieren. text.extract für PDFs und DOCX ist ein guter Start.",
"welcomeChecklistFlow": "Einen gespeicherten Flow starten",
"welcomeChecklistFlowHint": "Flows → einen wählen → Starten. Der mitgelieferte extract-summarize.yaml ist ein guter erster Lauf.",
"welcomeChecklistAllDone": "Alle vier Schritte erledigt.",
"welcomeChecklistDismiss": "Checkliste ausblenden",
"welcomeChecklistRefresh": "Aktualisieren",
"welcomeChecklistRefreshing": "Prüfe…",
"welcomeChecklistDone": "Erledigt",
"welcomeChecklistTodo": "Offen",
"navDoctor": "Diagnose",
"navModules": "Module",
"navStore": "Store",
"navFlows": "Flows",
"navAudit": "Protokoll",
"navApprovals": "Freigaben",
"connectionConnected": "verbunden",
"connectionUnreachable": "nicht erreichbar",
"connectionConnecting": "verbinde…",
"connectionStartHub": "Hub starten",
"buttonCancel": "Abbrechen",
"buttonSave": "Speichern",
"buttonClose": "Schließen",
"buttonRetry": "Erneut versuchen",
"buttonRefresh": "Aktualisieren",
"buttonInstall": "Installieren",
"buttonUninstall": "Deinstallieren",
"buttonDetails": "Details",
"buttonAdd": "Hinzufügen",
"buttonRemove": "Entfernen",
"buttonOpen": "Öffnen",
"buttonExplain": "Erklären",
"buttonReadDocs": "Doku öffnen",
"buttonCopy": "In Zwischenablage kopieren",
"buttonCopied": "Kopiert",
"settingsTitle": "Hub-Endpunkt",
"settingsHost": "Host",
"settingsPort": "Port",
"settingsTls": "TLS",
"settingsSaveAndConnect": "Speichern & verbinden",
"settingsLanguage": "Sprache",
"settingsLanguageHint": "Sprache der App. Wirkt auf alle Seiten; mehrsprachige Store-Einträge folgen ebenfalls.",
"settingsHubEndpointHint": "Wohin soll Studio sich verbinden? Standard ist der lokale Hub auf 127.0.0.1:50051.",
"settingsTlsSubtitle": "https/grpc-secure",
"settingsPortError": "Port muss 165535 sein",
"channelsBlurb": "Hub-Kanal wechseln (schreibt ~/.fai/current-channel und startet den Daemon neu). Verbinden ändert nur die Wire von Studio.",
"channelsActionsTooltip": "Kanal-Aktionen",
"systemAiHeader": "SYSTEM-AI",
"systemAiEnabled": "aktiv",
"systemAiOff": "aus",
"systemAiEdit": "Bearbeiten…",
"systemAiConfigure": "Konfigurieren…",
"systemAiOffBlurb": "Aus — Fehlererklärungen auf der Protokoll-Seite sind deaktiviert. Klicke Konfigurieren…, um einen Provider zu wählen (Ollama / OpenAI / LM Studio / vLLM / Eigene). Die Operator-Konfig wird direkt überschrieben; kein Daemon-Neustart nötig.",
"mcpServersCount": "{n} {n, plural, =1{Server} other{Server}}",
"@mcpServersCount": { "placeholders": { "n": { "type": "int" } } },
"mcpRediscoverTooltip": "Discovery neu ausführen",
"mcpAddTooltip": "MCP-Server hinzufügen",
"mcpRemoveTooltip": "Server entfernen",
"mcpToolsCount": "{n} Tools",
"@mcpToolsCount": { "placeholders": { "n": { "type": "int" } } },
"n8nEndpointsCount": "{n} {n, plural, =1{Endpunkt} other{Endpunkte}}",
"@n8nEndpointsCount": { "placeholders": { "n": { "type": "int" } } },
"n8nWorkflowsCount": "{n} Workflows",
"@n8nWorkflowsCount": { "placeholders": { "n": { "type": "int" } } },
"n8nRediscoverTooltip": "Discovery neu ausführen",
"n8nAddTooltip": "n8n-Endpunkt hinzufügen",
"n8nRemoveTooltip": "Endpunkt entfernen",
"addMcpTitle": "MCP-Server hinzufügen",
"addMcpIntro": "Tools, die der Server via `tools/list` anbietet, erscheinen im Store als `mcp.<name>.<tool>`-Fähigkeiten.",
"addMcpSuggestionsLabel": "Vorschläge — zum Vorausfüllen klicken",
"addMcpNameLabel": "Name (keine Punkte)",
"addMcpNameHint": "filesystem",
"addMcpEndpointLabel": "Endpunkt",
"addMcpEndpointHint": "http://127.0.0.1:3001/mcp",
"addMcpApiKeyLabel": "API-Key-Umgebungsvariable (optional)",
"addMcpApiKeyHint": "MCP_FILESYSTEM_TOKEN",
"addMcpNotesLabel": "Notizen (optional)",
"addMcpAddButton": "Hinzufügen + Discovery",
"addN8nTitle": "n8n-Endpunkt hinzufügen",
"addN8nIntro": "Aktive Workflows erscheinen im Store als `n8n.<name>.<workflow_slug>`-Fähigkeiten.",
"addN8nNameLabel": "Name (keine Punkte)",
"addN8nNameHint": "ops",
"addN8nBaseUrlLabel": "Basis-URL (ohne /api/v1)",
"addN8nBaseUrlHint": "https://n8n.example.com",
"addN8nApiKeyLabel": "API-Key-Umgebungsvariable (optional)",
"addN8nApiKeyHint": "N8N_OPS_KEY",
"addN8nNotesLabel": "Notizen (optional)",
"addN8nAddButton": "Hinzufügen + Discovery",
"addedMcpToast": "MCP-Server „{name}\" hinzugefügt.",
"@addedMcpToast": { "placeholders": { "name": { "type": "String" } } },
"addedN8nToast": "n8n-Endpunkt „{name}\" hinzugefügt.",
"@addedN8nToast": { "placeholders": { "name": { "type": "String" } } },
"addFailedToast": "Hinzufügen fehlgeschlagen: {error}",
"@addFailedToast": { "placeholders": { "error": { "type": "String" } } },
"removeFailedToast": "Entfernen fehlgeschlagen: {error}",
"@removeFailedToast": { "placeholders": { "error": { "type": "String" } } },
"refreshFailedToast": "Aktualisieren fehlgeschlagen: {error}",
"@refreshFailedToast": { "placeholders": { "error": { "type": "String" } } },
"channelsHeader": "KANÄLE",
"channelsActive": "aktiv",
"channelsRunning": "läuft",
"channelsStopped": "gestoppt",
"channelsConnect": "Studio mit diesem Kanal verbinden",
"channelsSwitch": "Diesen Kanal aktivieren",
"channelsEnableAutostart": "Autostart bei Anmeldung aktivieren",
"channelsDisableAutostart": "Autostart deaktivieren",
"storeSearchHint": "Module suchen — Name, Tagline, Tag, Fähigkeit…",
"storeAskHint": "Was brauchst du? Versuch's mit „ein Modul, das tabellarische Daten liest\" oder tippe einfach einen Begriff.",
"storeAskSubmit": "Suchen",
"storeAskAi": "KI fragen",
"storeAskClear": "Frage zurücksetzen",
"storeAskAiThinking": "Module werden durchsucht…",
"storeAskAiUnavailable": "Konfiguriere eine System-AI in den Einstellungen, um Fragen in normaler Sprache zu stellen.",
"storeAskNoMatches": "Keine Treffer — Frage verfeinern oder im Grid unten stöbern.",
"storeAskAnswerLabel": "KI-Vorschlag",
"storeAskAnswerWhy": "Warum es passt",
"storeAskMatchPill": "Treffer",
"storeFilterLabel": "Filter",
"storeFilterActiveCount": "{n} aktiv",
"@storeFilterActiveCount": { "placeholders": { "n": { "type": "int" } } },
"storeFilterReset": "Filter zurücksetzen",
"storeFilterApply": "Fertig",
"storeFilterStatusGroup": "Status",
"storeFilterSourceGroup": "Quelle",
"storeFilterInstalledGroup": "Nur installierte zeigen",
"storeFeatured": "EMPFOHLEN",
"storeFeaturedHint": "kuratierte Auswahl · klicken für Details",
"storeNoMatches": "Keine Treffer",
"storeNoMatchesHint": "Filter anpassen oder Suche leeren, um alle Einträge zu sehen.",
"storeClearFilters": "Filter zurücksetzen",
"storeStatusAll": "Alle",
"storeStatusPublished": "stabil",
"storeStatusAlpha": "experimentell",
"storeStatusPlanned": "geplant",
"storeInstalledOnly": "Installiert",
"storeCategoryLabel": "Kategorie",
"storeCategoryAll": "Alle Kategorien",
"storeCategoryBridge": "Verbindungen",
"storeCategoryDebug": "Beispiele",
"storeCategoryText": "Text",
"storeCategoryLlm": "KI-Modelle",
"storeCategorySystem": "System",
"storeCategoryAuth": "Authentifizierung",
"storeCategoryStorage": "Speicher",
"storeCategoryChannel": "Kanäle",
"storeCategoryWeb": "Web",
"storeCategoryOrchestrator": "Orchestrierung",
"storeNResults": "{n} Treffer",
"@storeNResults": {
"placeholders": { "n": { "type": "int" } }
},
"storeReloadTooltip": "Aktualisieren",
"storeTodayBadge": "HEUTE",
"storeTodayDeck": "Von der F∆I-Redaktion",
"storeTodayDismissTooltip": "Für diese Sitzung ausblenden",
"storePillInstalled": "installiert",
"storePillUpdate": "Update",
"storeUpdateButton": "Update auf {version}",
"@storeUpdateButton": { "placeholders": { "version": { "type": "String" } } },
"storeUpdateTooltip": "Installiert {installed} — Store bietet v{best}",
"@storeUpdateTooltip": {
"placeholders": {
"installed": { "type": "String" },
"best": { "type": "String" }
}
},
"storeNoTagline": "(keine Beschreibung)",
"storeUninstallTitle": "Modul deinstallieren?",
"storeUninstallBody": "Entfernt {name} aus diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl.",
"@storeUninstallBody": { "placeholders": { "name": { "type": "String" } } },
"storeInstalledToast": "{name} v{version} installiert.",
"@storeInstalledToast": {
"placeholders": {
"name": { "type": "String" },
"version": { "type": "String" }
}
},
"storeInstallFailedToast": "Installation fehlgeschlagen: {error}",
"@storeInstallFailedToast": { "placeholders": { "error": { "type": "String" } } },
"storeUninstalledToast": "{name} v{version} deinstalliert.",
"@storeUninstalledToast": {
"placeholders": {
"name": { "type": "String" },
"version": { "type": "String" }
}
},
"storeUninstallFailedToast": "Deinstallation fehlgeschlagen: {error}",
"@storeUninstallFailedToast": { "placeholders": { "error": { "type": "String" } } },
"storeOpenBrowserFailed": "Browser konnte nicht geöffnet werden: {error}",
"@storeOpenBrowserFailed": { "placeholders": { "error": { "type": "String" } } },
"storeSectionTags": "Tags",
"storeSectionRequiredCapabilities": "Erforderliche Fähigkeiten",
"storeSectionRequiredHostServices": "Erforderliche Host-Dienste",
"storeSectionScreenshots": "Screenshots",
"storeSectionDocumentation": "Dokumentation",
"storeSectionSource": "Quelle",
"storeSectionPermissions": "Deklarierte Berechtigungen",
"storeSectionDirectory": "Modul-Verzeichnis",
"storeSectionPermissionsNone": "(keine — reines Berechnungsmodul)",
"storeInstallingButton": "Installiere…",
"storeNotInstallable": "Nicht installierbar",
"storeNotInstallableTooltip": "Status „{status}\" — Installations-Pfad noch nicht verdrahtet.",
"@storeNotInstallableTooltip": { "placeholders": { "status": { "type": "String" } } },
"storeInstallProgressTitle": "Installation von {name}",
"@storeInstallProgressTitle": { "placeholders": { "name": { "type": "String" } } },
"storeInstallProgressBody": "Holen, verifizieren, entpacken…",
"storeLoadDocs": "Dokumentation laden",
"storeDocsHint": "README inline gerendert; nutzt das Registry-Token des Hubs, falls nötig.",
"storeDocsFetching": "README wird geladen…",
"storeOpenRepoButton": "Repository im Browser öffnen",
"storeDocsErrorNotFound": "Dieses Modul ist nicht im Store-Index des Hubs enthalten.",
"storeDocsErrorNoDocs": "Für dieses Modul ist keine Repository-URL hinterlegt.",
"storeDocsErrorAuth": "Die Registry erfordert Authentifizierung, um dieses README zu laden. Setze FAI_REGISTRY_TOKEN in der Umgebung des Daemons und starte den Hub neu.",
"storeDocsErrorNetwork": "Netzwerkfehler beim Laden des README. {detail}",
"@storeDocsErrorNetwork": { "placeholders": { "detail": { "type": "String" } } },
"storeDocsErrorParse": "README ist kein gültiges UTF-8.",
"storeDocsErrorGeneric": "README konnte nicht geladen werden.",
"storeSourceLabel": "Quelle",
"storeSourceAll": "Alle Quellen",
"storeSourceNative": "Nativ",
"storeSourceMcp": "MCP",
"storeSourceN8n": "n8n",
"storeProvenanceNative": "nativ",
"storeProvenanceMcp": "mcp · {provider}",
"@storeProvenanceMcp": { "placeholders": { "provider": { "type": "String" } } },
"storeProvenanceN8n": "n8n · {provider}",
"@storeProvenanceN8n": { "placeholders": { "provider": { "type": "String" } } },
"storeRecommendedTitle": "Öffentliche Quelle hinzufügen — ein Klick",
"storeRecommendedBody": "Kuratierte MCP-Server über HTTPS erreichbar. Kein Subprozess, kein API-Key, kein Node. Föderierte Fähigkeiten erscheinen sofort im Store.",
"storeRecommendedAddTooltip": "Hinzufügen und entdecken",
"storeRecommendedAdding": "Wird hinzugefügt…",
"storeRecommendedDeepWikiTagline": "GitHub-Repo-Doku-Suche (KI-gestützt)",
"storeRecommendedSemgrepTagline": "Security-Scanning für Code-Schwachstellen",
"storeProviderAddedToast": "{name} hinzugefügt — {n} {n, plural, =1{föderierte Fähigkeit} other{föderierte Fähigkeiten}}.",
"@storeProviderAddedToast": {
"placeholders": {
"name": { "type": "String" },
"n": { "type": "int" }
}
},
"storeProviderAddedZeroToast": "{name} ist eingetragen, aber der Server hat noch keine Fähigkeiten geliefert. Öffne Einstellungen → MCP-Clients, um Discovery erneut zu versuchen oder den Server zu prüfen.",
"@storeProviderAddedZeroToast": {
"placeholders": { "name": { "type": "String" } }
},
"storeProviderAddFailed": "{name} konnte nicht hinzugefügt werden: {error}",
"@storeProviderAddFailed": {
"placeholders": {
"name": { "type": "String" },
"error": { "type": "String" }
}
},
"auditTitle": "Protokoll",
"auditNoEvents": "Noch keine Ereignisse",
"auditNoEventsHint": "Starte einen Flow, um den Audit-Stream zu füllen.\nEreignisse erscheinen innerhalb von Sekunden.",
"auditFilterAll": "alle",
"auditFilterFlow": "Flow",
"auditFilterStep": "Step",
"auditFilterModule": "Modul",
"auditClearLogTooltip": "Protokoll löschen (nur local/dev Kanal)",
"auditClearedToast": "{n} Ereignisse auf Kanal „{channel}\" gelöscht. Kette mit Marker neu geseedet.",
"@auditClearedToast": {
"placeholders": {
"n": { "type": "int" },
"channel": { "type": "String" }
}
},
"auditClearFailed": "Löschen fehlgeschlagen: {detail}",
"@auditClearFailed": { "placeholders": { "detail": { "type": "String" } } },
"auditExplain": "Erklären",
"auditReask": "Neu fragen",
"auditAsking": "Frage läuft…",
"auditSystemAi": "SYSTEM-AI",
"auditCachedPill": "gecacht",
"auditOriginalLatency": "ursprünglich {ms} ms",
"@auditOriginalLatency": { "placeholders": { "ms": { "type": "int" } } },
"auditLatency": "{ms} ms",
"@auditLatency": { "placeholders": { "ms": { "type": "int" } } },
"auditRegenerateTooltip": "Neu generieren — Cache überspringen, Modell erneut fragen",
"auditLiveStatus": "live · Abfrage alle 2s · {n} {n, plural, =1{Ereignis} other{Ereignisse}}",
"@auditLiveStatus": { "placeholders": { "n": { "type": "int" } } },
"auditDisconnected": "getrennt · {error}",
"@auditDisconnected": { "placeholders": { "error": { "type": "String" } } },
"auditHashChainVerified": "Hash-Kette verifiziert",
"auditDetailHeader": "DETAIL",
"auditAskingFull": "Frage an die konfigurierte System-AI läuft…",
"auditFixLabel": "FIX",
"auditCachedTooltipKnown": "Aus dem lokalen Cache geliefert. Ursprünglich erzeugt am {at}{hits}.",
"@auditCachedTooltipKnown": {
"placeholders": {
"at": { "type": "String" },
"hits": { "type": "String" }
}
},
"auditCachedTooltipUnknown": "Aus dem lokalen Cache geliefert. Ursprünglicher Zeitpunkt unbekannt{hits}.",
"@auditCachedTooltipUnknown": { "placeholders": { "hits": { "type": "String" } } },
"auditCachedTooltipHits": " · {n} Treffer",
"@auditCachedTooltipHits": { "placeholders": { "n": { "type": "int" } } },
"auditConfigureSystemAi": "System-AI unter Einstellungen konfigurieren (Cmd+,)",
"auditClearDialogTitle": "Audit-Log löschen?",
"auditClearDialogBody": "Löscht jedes Audit-Event auf dem aktiven Kanal und seedet einen neuen chain.reset-Marker mit Prüfer und Begründung. Auf beta / production verweigert. Nicht umkehrbar.",
"auditClearReviewerLabel": "Prüfer",
"auditClearReasonLabel": "Begründung (im chain.reset-Marker festgehalten)",
"auditClearReasonHelper": "Erforderlich — Auditoren werden das lesen.",
"auditClearLogButton": "Log löschen",
"modulesTitle": "Module",
"modulesNoneTitle": "Noch keine Module",
"modulesNoneHint": "`fai install <capability-name>` ausführen oder ~/.fai/modules/ prüfen.",
"modulesReloadTooltip": "Aktualisieren",
"modulesRecentActivity": "LETZTE AKTIVITÄT",
"modulesRecentActivityHint": "letzte {n} install/uninstall-Ereignisse aus dem Audit-Log",
"@modulesRecentActivityHint": { "placeholders": { "n": { "type": "int" } } },
"modulesActivityInstalled": "installiert",
"modulesActivityUninstalled": "deinstalliert",
"modulesCapabilitiesLabel": "Fähigkeiten",
"modulesUninstallTitle": "Modul deinstallieren?",
"modulesUninstallBody": "Entfernt {name} v{version} von diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl. Ein `module.uninstalled`-Audit-Event wird festgehalten.",
"@modulesUninstallBody": {
"placeholders": {
"name": { "type": "String" },
"version": { "type": "String" }
}
},
"modulesUninstalledToast": "{name} v{version} deinstalliert.",
"@modulesUninstalledToast": {
"placeholders": {
"name": { "type": "String" },
"version": { "type": "String" }
}
},
"modulesUninstallFailed": "Deinstallation fehlgeschlagen: {error}",
"@modulesUninstallFailed": { "placeholders": { "error": { "type": "String" } } },
"modulesUninstalling": "Wird deinstalliert…",
"moduleSheetFailedToLoad": "Laden fehlgeschlagen: {error}",
"@moduleSheetFailedToLoad": { "placeholders": { "error": { "type": "String" } } },
"moduleSheetCapabilities": "Fähigkeiten",
"moduleSheetPermissions": "Deklarierte Berechtigungen",
"moduleSheetNoPermissions": "(keine — reines Berechnungsmodul)",
"flowsTitle": "Flows",
"flowsReloadTooltip": "Aktualisieren",
"flowsNoneTitle": "Keine gespeicherten Flows",
"flowsNoneHint": "Flow speichern mit `fai admin flows save <name> <flow.yaml>`, dann taucht er hier auf.",
"flowsRunDialogTitle": "{name} ausführen",
"@flowsRunDialogTitle": { "placeholders": { "name": { "type": "String" } } },
"flowsRunDialogBody": "Eingaben als key=value, eine pro Zeile. Klartext-Werte landen als Text. Wert mit `@` voranstellen liest die Datei als Bytes — wie `fai run --input document=@/pfad/zu/datei.pdf`.",
"flowsInputsHint": "name=Welt\ndocument=@/Users/ich/Dokumente/beispiel.pdf\nstil=drei Stichpunkte",
"flowsRunButton": "Starten",
"flowsRunningTitle": "{name} läuft",
"@flowsRunningTitle": { "placeholders": { "name": { "type": "String" } } },
"flowsRunning": "Flow läuft…",
"flowsNoOutputs": "Flow abgeschlossen ohne deklarierte Outputs.",
"approvalsTitle": "Freigaben",
"approvalsTabPending": "Offen",
"approvalsTabHistory": "Verlauf",
"approvalsInboxZero": "Posteingang leer",
"approvalsInboxHint": "Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.",
"approvalsReloadTooltip": "Aktualisieren",
"approvalsPillPending": "offen",
"approvalsPillApproved": "freigegeben",
"approvalsPillRejected": "abgelehnt",
"approvalsPillExpired": "abgelaufen",
"approvalsPayloadPreview": "PAYLOAD-VORSCHAU",
"approvalsApproveButton": "Freigeben",
"approvalsRejectButton": "Ablehnen",
"approvalsRejectDialogTitle": "Freigabe ablehnen",
"approvalsRejectReasonLabel": "Begründung (im Audit-Log festgehalten)",
"approvalsApprovedToast": "freigegeben · {flow} {step}",
"@approvalsApprovedToast": {
"placeholders": {
"flow": { "type": "String" },
"step": { "type": "String" }
}
},
"approvalsRejectedToast": "abgelehnt · {flow} {step}",
"@approvalsRejectedToast": {
"placeholders": {
"flow": { "type": "String" },
"step": { "type": "String" }
}
},
"approvalsApproveFailed": "Freigabe fehlgeschlagen: {error}",
"@approvalsApproveFailed": { "placeholders": { "error": { "type": "String" } } },
"approvalsRejectFailed": "Ablehnung fehlgeschlagen: {error}",
"@approvalsRejectFailed": { "placeholders": { "error": { "type": "String" } } },
"approvalsHistoryEmpty": "Noch kein Verlauf",
"approvalsHistoryEmptyHint": "Entschiedene Freigaben (freigegeben / abgelehnt / abgelaufen) erscheinen hier.\nDas Audit-Log enthält den vollständigen hash-verketteten Datensatz.",
"approvalsDialogDecided": "entschieden",
"approvalsDialogCreated": "erstellt",
"approvalsDialogReason": "Begründung",
"approvalsDialogPrompt": "PROMPT",
"approvalsExpiresIn": "{minutes}m",
"@approvalsExpiresIn": { "placeholders": { "minutes": { "type": "int" } } },
"approvalsExpiresInHours": "{hours}h",
"@approvalsExpiresInHours": { "placeholders": { "hours": { "type": "int" } } },
"doctorTitle": "Diagnose",
"doctorSummaryModules": "Module",
"doctorSummaryApprovals": "Freigaben",
"doctorSummaryAudit": "Protokoll",
"doctorSummaryServices": "Dienste",
"doctorSummaryCapabilities": "{n} Fähigkeiten",
"@doctorSummaryCapabilities": { "placeholders": { "n": { "type": "int" } } },
"doctorSummaryPending": "offen",
"doctorSummaryChain": "{verified}/{total} Kette",
"@doctorSummaryChain": {
"placeholders": {
"verified": { "type": "int" },
"total": { "type": "int" }
}
},
"doctorSummaryDeclared": "deklariert",
"doctorModulesPanelSummary": "{n} Module · {m} Fähigkeiten",
"@doctorModulesPanelSummary": {
"placeholders": {
"n": { "type": "int" },
"m": { "type": "int" }
}
},
"doctorApprovalsNone": "Keine offenen Freigaben",
"doctorApprovalsCount": "{n, plural, =1{1 Freigabe wartet auf Prüfung} other{{n} Freigaben warten auf Prüfung}}",
"@doctorApprovalsCount": { "placeholders": { "n": { "type": "int" } } },
"doctorApprovalsAttentionPill": "wichtig",
"doctorServicesEmpty": "Keine Host-Dienste deklariert",
"doctorServicesEmptyHint": "in ~/.fai/config.yaml unter services: hinzufügen",
"doctorPillLoaded": "geladen",
"doctorPillEmpty": "leer",
"doctorRecheckTooltip": "Erneut prüfen",
"doctorEventLogSection": "Audit-Log",
"doctorModulesApprovalsSection": "Module & Freigaben",
"doctorHostServicesSection": "Host-Dienste",
"doctorDaemonFilesSection": "Daemon-Dateien",
"doctorDaemonControlSection": "Daemon-Steuerung",
"doctorChainIntact": "Hash-Kette intakt",
"doctorChainIntactDetail": "{n} Ereignisse · prev_event_sha256 lückenlos verifiziert",
"@doctorChainIntactDetail": { "placeholders": { "n": { "type": "int" } } },
"doctorChainTampered": "Manipulation erkannt",
"doctorChainTamperedDetail": "{verified} von {total} verifiziert vor Mismatch bei {id}",
"@doctorChainTamperedDetail": {
"placeholders": {
"verified": { "type": "int" },
"total": { "type": "int" },
"id": { "type": "String" }
}
},
"doctorChainPillOk": "WORM-1",
"doctorChainPillTamper": "MANIPULIERT",
"doctorVerifyNow": "Jetzt prüfen",
"doctorRestart": "Neustart",
"doctorStart": "Starten",
"doctorStop": "Stoppen",
"doctorStatusAction": "Status",
"doctorRunningOn": "Läuft auf {name}: {endpoint}",
"@doctorRunningOn": {
"placeholders": {
"name": { "type": "String" },
"endpoint": { "type": "String" }
}
},
"doctorStoppedOn": "{name}-Daemon gestoppt",
"@doctorStoppedOn": { "placeholders": { "name": { "type": "String" } } },
"doctorStatusUnknown": "Daemon-Status: …",
"doctorPillRunning": "läuft",
"doctorPillStopped": "gestoppt",
"doctorDaemonControlHint": "Studio ruft das Platform-Binary auf — entspricht `fai daemon …`, sodass CLI und UI im Gleichschritt bleiben.",
"doctorDaemonControlWorking": "Wird ausgeführt…",
"doctorPathLog": "Log",
"doctorPathConfig": "Konfig",
"doctorPathDb": "Audit-DB",
"doctorPathModules": "Module-Verzeichnis",
"doctorPathFlows": "Flow-Verzeichnis",
"doctorPathPid": "PID-Datei",
"doctorPathsEmpty": "Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `fai daemon restart`.",
"doctorOpenError": "Konnte nicht öffnen: {detail}",
"@doctorOpenError": { "placeholders": { "detail": { "type": "String" } } },
"doctorUpdateAvailable": "Update verfügbar — {version}",
"@doctorUpdateAvailable": { "placeholders": { "version": { "type": "String" } } },
"doctorUpdateBody": "Kanal {channel} bietet jetzt {version}. Per Button anwenden — Studio ruft `fai update apply --channel {channel}` auf.",
"@doctorUpdateBody": {
"placeholders": {
"channel": { "type": "String" },
"version": { "type": "String" }
}
},
"doctorUpdateUnreachable": "Release-Host nicht erreichbar",
"doctorUpdateUnreachableBody": "Release-Feed für {channel} konnte nicht erreicht werden.",
"@doctorUpdateUnreachableBody": { "placeholders": { "channel": { "type": "String" } } },
"doctorReleaseNotes": "Notes: {url}",
"@doctorReleaseNotes": { "placeholders": { "url": { "type": "String" } } },
"doctorPillNew": "neu",
"doctorPillOffline": "offline",
"doctorApplyUpdate": "Update anwenden",
"doctorApplying": "Wird angewendet…",
"doctorApplyDone": "Update angewendet. Studio neu starten, um die neue Daemon-Version zu sehen.",
"mcpHeader": "MCP-CLIENTS",
"mcpHint": "Externe MCP-Server bringen ihre Tools als `mcp.<server>.<tool>` Fähigkeiten ein. Einmal konfigurieren, im Store sichtbar.",
"mcpEmpty": "Keine MCP-Server konfiguriert. + klicken zum Hinzufügen.",
"n8nHeader": "N8N-ENDPUNKTE",
"n8nHint": "Aktive n8n-Workflows erscheinen als `n8n.<endpoint>.<slug>` Fähigkeiten. Einmal konfigurieren, im Store sichtbar.",
"n8nEmpty": "Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.",
"hubUnreachable": "Hub nicht erreichbar",
"hubUnreachableHint": "Hub starten mit `fai serve`.",
"languageEnglish": "English",
"languageGerman": "Deutsch",
"searchHint": "Springe überall hin — Module, Store, Flows, Seiten…",
"searchIndexing": "Indiziere…",
"searchNoMatches": "Keine Treffer.",
"searchHintNavigate": "↑↓ navigieren",
"searchHintOpen": "Enter öffnen",
"searchHintClose": "Esc schließen",
"searchGroupPages": "Seiten",
"searchGroupModules": "Module",
"searchGroupStore": "Store",
"searchGroupFlows": "Flows",
"searchSettingsLabel": "Einstellungen",
"searchPageHint": "Seite · ⌘{n}",
"@searchPageHint": { "placeholders": { "n": { "type": "int" } } },
"searchSettingsHint": "Hub-Endpunkt, Kanäle, System-AI · ⌘;",
"searchInstalledModuleHint": "installiertes Modul · v{version}",
"@searchInstalledModuleHint": { "placeholders": { "version": { "type": "String" } } },
"searchStoreUncategorized": "ohne Kategorie",
"searchStoreHintWithTagline": "Store · {tagline}",
"@searchStoreHintWithTagline": { "placeholders": { "tagline": { "type": "String" } } },
"searchStoreHintWithCategory": "Store · {category}",
"@searchStoreHintWithCategory": { "placeholders": { "category": { "type": "String" } } },
"searchSavedFlowHint": "gespeicherter Flow",
"systemAiTitle": "System-AI",
"systemAiIntro": "Die hub-interne LLM, die die Plattform selbst für Fehlererklärungen und Operator-Hilfe nutzt. Standardmäßig aus; hier konfigurieren. Siehe docs/architecture/system-ai.md, was über die Leitung geht.",
"systemAiProviderLabel": "Provider",
"systemAiEndpointLabel": "Endpunkt-URL (bis /v1)",
"systemAiApiKeyRequired": "API-Key-Umgebungsvariable (erforderlich)",
"systemAiApiKeyOptional": "API-Key-Umgebungsvariable (optional)",
"systemAiApiKeyDisclaimer": "Studio liest oder speichert den Key-Wert nie — nur den Namen der Umgebungsvariable. Der Hub liest `${name}` zur Anfragezeit.",
"@systemAiApiKeyDisclaimer": { "placeholders": { "name": { "type": "String" } } },
"systemAiTestConnection": "Verbindung testen",
"systemAiTesting": "Teste…",
"systemAiSave": "Speichern",
"systemAiPrivacyHeader": "PRIVACY-MODUS",
"systemAiPrivacyOffLabel": "Aus",
"systemAiPrivacyOffDesc": "Feature deaktiviert. Keine Anfragen verlassen den Hub.",
"systemAiPrivacyRedactedLabel": "Redigiert",
"systemAiPrivacyRedactedDesc": "Nur event_type / error / Modul-Namen. KRITIS-freundlicher Standard.",
"systemAiPrivacyFullLabel": "Voll",
"systemAiPrivacyFullDesc": "Enthält das Audit-Detail-JSON (nur Hash — keine Roh-Payloads).",
"systemAiConnectionOk": "Verbindung ok",
"systemAiConnectionFailed": "Verbindung fehlgeschlagen",
"systemAiReplyPrefix": "Antwort: {text}",
"@systemAiReplyPrefix": { "placeholders": { "text": { "type": "String" } } },
"systemAiModelLabel": "Modell (erforderlich)",
"systemAiModelHintFallback": "Modell-Identifier, den der Provider erwartet",
"systemAiModelHelperBase": "Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen.",
"systemAiModelHelperOllama": "Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen. Mit Pull von Ollama herunterladen.",
"systemAiRefresh": "Aktualisieren",
"systemAiPull": "Pull",
"systemAiPulling": "Lade…",
"systemAiCouldNotListModels": "Modelle konnten nicht aufgelistet werden: {error}",
"@systemAiCouldNotListModels": { "placeholders": { "error": { "type": "String" } } },
"systemAiNoModelsOllama": "Noch keine Modelle auf dem Ollama-Server. Oben eintippen und Pull klicken.",
"systemAiNoModelsGeneric": "Provider lieferte keine Modelle.",
"systemAiSuitabilityRecommended": "empfohlen",
"systemAiSuitabilityBalanced": "ausgewogen",
"systemAiSuitabilitySmall": "klein — Qualität evtl. eingeschränkt",
"systemAiSuitabilityLarge": "groß — langsamer",
"systemAiSuitabilityHuge": "sehr groß — auf einem Laptop wahrscheinlich zu langsam",
"systemAiSuitabilityUnknown": "Größe unbekannt",
"systemAiHwDetected": "Erkannt: {summary}",
"@systemAiHwDetected": { "placeholders": { "summary": { "type": "String" } } },
"systemAiHwReviewed": " · Kuratierung geprüft {date}",
"@systemAiHwReviewed": { "placeholders": { "date": { "type": "String" } } },
"systemAiLegendRecommended": "empfohlen für diese Hardware{tier}",
"@systemAiLegendRecommended": { "placeholders": { "tier": { "type": "String" } } },
"systemAiLegendBalanced": "ausgewogen (4-8B)",
"systemAiLegendSmallLarge": "klein <3B / groß 9-15B / über Hardware",
"systemAiLegendHuge": "sehr groß >15B",
"systemAiLegendUnknown": "Größe unbekannt",
"systemAiCacheRow": "Cache: {n} {n, plural, =1{gespeicherte Erklärung} other{gespeicherte Erklärungen}}. Identische Prompts treffen den Cache; Modell- oder Privacy-Modus-Wechsel leeren ihn automatisch.",
"@systemAiCacheRow": { "placeholders": { "n": { "type": "int" } } },
"systemAiCacheClear": "Leeren",
"systemAiCacheClearedToast": "{n} gespeicherte System-AI-Erklärungen gelöscht.",
"@systemAiCacheClearedToast": { "placeholders": { "n": { "type": "int" } } },
"systemAiCacheClearFailed": "Cache-Löschen fehlgeschlagen: {error}",
"@systemAiCacheClearFailed": { "placeholders": { "error": { "type": "String" } } },
"systemAiPullEmptyError": "Erst eine Modell-ID eintippen (z.B. gemma3:4b).",
"systemAiPullFailedError": "Pull fehlgeschlagen: {error}",
"@systemAiPullFailedError": { "placeholders": { "error": { "type": "String" } } }
}