chain-studio/lib/l10n/app_de.arb
flemming-it 1903babc5a
Some checks failed
Security / Security check (push) Failing after 2s
feat(settings): multi-version uninstall picker + default_scope editor
Two operator surfaces shipped together:

**Multi-version uninstall picker** — when more than one version
of a `(provider, name)` is installed side-by-side, both the
module-sheet "Uninstall" affordance and the store-detail
"Uninstall" affordance now ask the operator which version to
remove before calling the RPC. The hub's wire-level support for
this (UninstallModuleRequest.version) was already there; Studio
just wasn't using it. Picker pre-selects the highest version so
single-version flows still take one click.

  - `HubService.installedVersions(name)` enumerates the installed
    versions via the capabilities list.
  - `HubService.uninstallModule(name, version: ...)` forwards
    the version into the RPC.
  - `_UninstallVersionPickerDialog` (module sheet) and
    `_StoreUninstallVersionPickerDialog` (store) host the
    picker — separate widgets so each surface can evolve copy
    independently. Uses `RadioGroup<String>` for Flutter
    3.32+ deprecation compliance.

**Default scope editor** — new DEFAULT SCOPE panel in Settings
that calls the freshly-added HubAdmin RPCs
`GetDefaultScope` / `SetDefaultScope`. Operators can:

  - reorder publisher segments with up/down buttons
    (first match wins in the bare-form resolver),
  - delete entries (hub still rejects empty list — Studio
    surfaces the constraint inline),
  - add arbitrary entries via the text field,
  - add catalog-known publishers via suggestion chips
    (sorted alphabetically, populated from the catalog).

Every change persists to `~/.fai/config.yaml` via the hub
and hot-swaps the in-memory copy without a daemon restart.

Bumped pubspec to 0.48.0. dart analyze clean (No issues
found!); flutter test green (11 tests).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-05-29 00:21:51 +02:00

1385 lines
50 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",
"buttonShowDetails": "Details anzeigen",
"buttonHideDetails": "Details ausblenden",
"storeInstallableOnly": "Nur installierbare",
"storePillComingSoon": "Bald verfügbar",
"storeNotInstallableInline": "Dieses Modul ist auf der Roadmap (Status: {status}). Es gibt noch kein installierbares Bundle — Repository verfolgen für Updates.",
"@storeNotInstallableInline": {
"placeholders": {
"status": {
"type": "String"
}
}
},
"mcpSuggestionDeepwikiDesc": "Öffentliches HTTPS — KI-gestützte Doku-Suche in GitHub-Repos. Kein Node, kein API-Key.",
"mcpSuggestionSemgrepDesc": "Öffentliches HTTPS — Security-Scanning von Code-Schwachstellen. Kein Node, kein API-Key.",
"mcpSuggestionFilesystemDesc": "Anthropic — Dateien in /tmp lesen / schreiben. Pfad vor dem Speichern anpassen.",
"mcpSuggestionFetchDesc": "Anthropic — beliebige HTTP(S)-URLs als Markdown abrufen.",
"mcpSuggestionGithubDesc": "Anthropic — Issues, PRs, Repo-Dateien. Braucht einen GitHub-PAT in der Env-Variable.",
"mcpSuggestionPuppeteerDesc": "Anthropic — Headless-Browser-Automation für Screenshots / Scraping.",
"mcpSuggestionPostgresDesc": "Anthropic — Read-only-SQL-Queries gegen eine Postgres-Datenbank. URL anpassen.",
"mcpSuggestionSqliteDesc": "Anthropic — Abfragen gegen eine lokale SQLite-Datei. Pfad anpassen.",
"mcpSuggestionBraveSearchDesc": "Anthropic — Websuche via Brave. API-Key erforderlich.",
"mcpSuggestionMemoryDesc": "Anthropic — persistenter Knowledge-Graph als Agenten-Gedächtnis.",
"mcpSuggestionTimeDesc": "Anthropic — aktuelle Uhrzeit + Zeitzonen-Konvertierung.",
"mcpServerEnLanguageBadge": "Server-Text in Englisch — Studio zeigt ihn wie geliefert.",
"themePluginHeader": "Theme-Plugin",
"themePluginNone": "Standard (kein Plugin)",
"themePluginHint": "Installiertes studio.theme.*-Plugin auswählen, um das ganze Studio umzustylen. Erst eines aus dem Store installieren.",
"themePluginEmpty": "Kein Theme-Plugin installiert. Im Store eines aus der Kategorie studio-plugin auswählen.",
"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": "Pro deklariertem Input ein Feld. Bytes-Inputs öffnen einen Datei-Picker; alle anderen sind Klartext. Der Starten-Button aktiviert sich, wenn alle Pflichtfelder gefüllt sind.",
"flowsLoadingDefinition": "Inputs werden geladen…",
"flowsDefinitionFailed": "Flow-Definition konnte nicht geladen werden",
"flowsNoInputs": "Dieser Flow deklariert keine Inputs. Starten klicken, um loszulegen.",
"flowsTypeBytesPick": "Datei wählen…",
"flowsTypeBytesChange": "Datei ändern",
"flowsTypeBytesNoFile": "Keine Datei ausgewählt",
"flowsTypeBytesSize": "{n} Bytes",
"@flowsTypeBytesSize": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"flowsRunErrorTitle": "Flow-Lauf fehlgeschlagen",
"flowsFileReadFailed": "„{path}\" konnte nicht gelesen werden: {error}",
"@flowsFileReadFailed": {
"placeholders": {
"path": {
"type": "String"
},
"error": {
"type": "String"
}
}
},
"flowsMissingModulesLabel": "Braucht:",
"flowsRunDisabledTooltip": "Erst die fehlenden Module installieren.",
"flowsInstallAllButton": "Alle installieren ({n})",
"@flowsInstallAllButton": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"flowsInstallPillTooltip": "Zum Installieren klicken",
"flowsInstallDepsTitle": "Abhängigkeiten installieren",
"flowsInstallDepsBody": "Die fehlenden Module werden der Reihe nach installiert. Vorhandene Installationen bleiben unberührt.",
"flowsInstallStatusPending": "Wartet",
"flowsInstallStatusInstalling": "Wird installiert…",
"flowsInstallStatusDone": "Installiert v{version}",
"@flowsInstallStatusDone": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"flowsInstallStatusFailed": "Fehlgeschlagen",
"flowsInstallStatusFailedDetail": "{error}",
"@flowsInstallStatusFailedDetail": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"flowsInstallDepsAllDone": "Alle Abhängigkeiten installiert.",
"flowsInstallDepsAnyFailed": "{ok} installiert, {failed} fehlgeschlagen.",
"@flowsInstallDepsAnyFailed": {
"placeholders": {
"ok": {
"type": "int"
},
"failed": {
"type": "int"
}
}
},
"flowsInstallAuthWallButton": "Registry-Token einfügen",
"flowsOpenInEditorTooltip": "YAML-Datei im Standard-Editor öffnen",
"flowsOpenInEditorFailed": "Konnte Datei nicht öffnen: {error}",
"@flowsOpenInEditorFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"registryCredentialsHeader": "REGISTRY-ZUGANGSDATEN",
"registryCredentialsBlurb": "Token zum Herunterladen von .fai-Modulen aus einer Registry mit Anmeldepflicht (Forgejo, private GitHub-Repos). Gespeichert in ~/.fai/registry-token, Modus 0600. Die Umgebungsvariable FAI_REGISTRY_TOKEN hat weiterhin Vorrang, wenn gesetzt.",
"registryTokenStatusConfigured": "Konfiguriert ({chars} Zeichen)",
"@registryTokenStatusConfigured": {
"placeholders": {
"chars": {
"type": "int"
}
}
},
"registryTokenStatusNotSet": "Nicht gesetzt",
"registryTokenFieldLabel": "Token",
"registryTokenFieldHint": "Forgejo- oder GitHub-PAT einfügen",
"registryTokenSaveButton": "Speichern",
"registryTokenClearButton": "Entfernen",
"registryTokenStorageHint": "Lokal gespeichert in ~/.fai/registry-token. Wird nie an einen Remote-Dienst übertragen.",
"registryTokenSavedToast": "Registry-Token gespeichert.",
"registryTokenClearedToast": "Registry-Token entfernt.",
"registryTokenSaveFailedToast": "Speichern fehlgeschlagen: {error}",
"@registryTokenSaveFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"hubAuthTokenHeader": "HUB-AUTHENTIFIZIERUNG",
"hubAuthTokenBlurb": "Bearer-Token für die Studio-Anbindung an einen Hub mit aktivierter auth.tokens-Konfiguration (RBAC Level 2). Gespeichert in ~/.fai/hub-auth-token, Modus 0600. Studio sendet ihn als Authorization: Bearer bei jedem gRPC-Aufruf.",
"hubAuthTokenStatusConfigured": "Eingerichtet ({chars} Zeichen)",
"@hubAuthTokenStatusConfigured": {
"placeholders": {
"chars": {
"type": "int"
}
}
},
"hubAuthTokenStatusNotSet": "Nicht gesetzt (anonym)",
"hubAuthTokenFieldLabel": "Token",
"hubAuthTokenFieldHint": "Token aus dem auth.tokens-Eintrag des Hub-Operators einfügen",
"hubAuthTokenSaveButton": "Speichern",
"hubAuthTokenClearButton": "Entfernen",
"hubAuthTokenStorageHint": "Lokal gespeichert in ~/.fai/hub-auth-token. Studio verbindet nach dem Speichern automatisch neu, der Token wirkt sofort.",
"hubAuthTokenSavedToast": "Hub-Token gespeichert.",
"hubAuthTokenClearedToast": "Hub-Token entfernt.",
"hubAuthTokenSaveFailedToast": "Speichern fehlgeschlagen: {error}",
"@hubAuthTokenSaveFailedToast": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"storeAdvisoryVersionTooltip": "Föderierter Upstream-Dienst — Version ist Richtwert; der Upstream kann ohne Versionsanhebung Kompatibilität brechen.",
"uninstallVersionPickerTitle": "Version zum Entfernen wählen",
"uninstallVersionPickerBody": "Mehrere Versionen von `{module}` sind parallel installiert. Wähle genau die Version aus, die entfernt werden soll — die anderen bleiben bestehen.",
"@uninstallVersionPickerBody": {
"placeholders": {
"module": {
"type": "String"
}
}
},
"uninstallVersionPickerContinue": "Weiter",
"defaultScopeHeader": "STANDARD-SCOPE",
"defaultScopeBlurb": "Geordnete Liste von Publisher-Segmenten, die der Hub konsultiert, wenn ein Flow eine Capability ohne explizites `<provider>/`-Präfix benennt. Erster Treffer gewinnt — die Segmente, die euer Team am häufigsten nutzt, gehören nach oben. Katalog-bekannte Publisher erscheinen als Chips; private Segmente lassen sich frei eintragen.",
"defaultScopeAddLabel": "Publisher-Segment hinzufügen",
"defaultScopeAddHint": "z.B. acme.team",
"defaultScopeAddButton": "Hinzufügen",
"defaultScopeSuggestions": "Katalog-Vorschläge:",
"defaultScopeSavedToast": "Standard-Scope aktualisiert.",
"defaultScopeLoadFailed": "Standard-Scope konnte nicht geladen werden.",
"defaultScopeNonEmptyError": "Standard-Scope darf nicht leer sein — mindestens ein Segment muss erhalten bleiben.",
"maintenanceHeader": "HUB-WARTUNG",
"maintenanceResetBlurb": "Operator-Zustand zurücksetzen und mit einem sauberen Hub neu starten. Stoppt jeden laufenden Daemon, sichert ~/.fai/ atomar in ein Backup, legt es dann neu an — Binary, Channel-Pointer, MCP-/n8n-/System-AI-Konfiguration und Registry-Token bleiben erhalten. Wiederherstellen durch Zurückverschieben des Backup-Ordners.",
"maintenanceKeepModulesTitle": "Installierte Module behalten",
"maintenanceKeepModulesSubtitle": "Standardverhalten löscht ~/.fai/modules/, damit eine frische Installation den Modul-Bezugspfad end-to-end verifizieren kann.",
"maintenanceKeepDataTitle": "Protokoll + gespeicherte Flows behalten",
"maintenanceKeepDataSubtitle": "Standardverhalten löscht ~/.fai/data/, damit die Audit-Kette mit einer neuen Genesis startet und die mitgelieferten Sample-Flows beim ersten Daemon-Start neu importiert werden.",
"maintenanceResetButton": "Hub zurücksetzen",
"maintenanceResetInProgress": "Zurücksetzen…",
"maintenanceResetConfirmTitle": "Hub zurücksetzen?",
"maintenanceResetConfirmBody": "Stoppt jeden Daemon, verschiebt ~/.fai/ in ein Backup mit Zeitstempel und startet sauber neu. Das Backup ist vollständig wiederherstellbar. Fortfahren?",
"maintenanceResetConfirmButton": "Zurücksetzen",
"welcomeChecklistAllSetTitle": "Du bist eingerichtet.",
"welcomeChecklistAllSetBody": "Drei Stränge, an denen du als nächstes ziehen kannst:",
"welcomeChecklistNextAuditTitle": "Audit-Log lesen",
"welcomeChecklistNextAuditBody": "Jede Installation, jeder Flow-Lauf, jede Freigabe landet im hash-verketteten Log. Im Protokoll-Tab siehst du, was dein Hub gemacht hat.",
"welcomeChecklistNextAuditButton": "Protokoll öffnen",
"welcomeChecklistNextTodayTitle": "Daily-Today-Story einrichten",
"welcomeChecklistNextTodayBody": "tools/today/propose.sh per Cron laufen lassen und die Editorial-Karte im Store füllt sich mit operator-kuratierten Stories.",
"welcomeChecklistNextTodayButton": "Today-Doku öffnen",
"welcomeChecklistNextModuleTitle": "Eigenes Modul bauen",
"welcomeChecklistNextModuleBody": "Mit `fai new module <name>` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.",
"welcomeChecklistNextModuleButton": "Doku lesen",
"auditGroupToday": "HEUTE",
"auditGroupYesterday": "GESTERN",
"auditGroupThisWeek": "DIESE WOCHE",
"auditGroupOlder": "ÄLTER",
"auditEventViewFlowRun": "Flow-Lauf ansehen",
"auditFlowRunDialogTitle": "Flow-Lauf · {flow}",
"@auditFlowRunDialogTitle": {
"placeholders": {
"flow": {
"type": "String"
}
}
},
"auditFlowRunDialogSubtitle": "{n} {n, plural, =1{Ereignis} other{Ereignisse}} für Lauf {execution}",
"@auditFlowRunDialogSubtitle": {
"placeholders": {
"n": {
"type": "int"
},
"execution": {
"type": "String"
}
}
},
"approvalsSelectAll": "Alle wählen",
"approvalsClearSelection": "Auswahl aufheben",
"approvalsBatchSelected": "{n} ausgewählt",
"@approvalsBatchSelected": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"approvalsBatchApprove": "Alle freigeben",
"approvalsBatchReject": "Alle ablehnen",
"approvalsBatchApproveDoneToast": "{n} Freigaben erteilt.",
"@approvalsBatchApproveDoneToast": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"approvalsBatchRejectDoneToast": "{n} Freigaben abgelehnt.",
"@approvalsBatchRejectDoneToast": {
"placeholders": {
"n": {
"type": "int"
}
}
},
"approvalsBatchPartialFailure": "{ok} erledigt, {failed} fehlgeschlagen.",
"@approvalsBatchPartialFailure": {
"placeholders": {
"ok": {
"type": "int"
},
"failed": {
"type": "int"
}
}
},
"flowsRunButton": "Starten",
"flowsRunningTitle": "{name} läuft",
"@flowsRunningTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsResultTitle": "{name} — Ergebnis",
"@flowsResultTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsErrorTitle": "{name} — fehlgeschlagen",
"@flowsErrorTitle": {
"placeholders": {
"name": {
"type": "String"
}
}
},
"flowsRunning": "Flow läuft…",
"flowsNoOutputs": "Flow abgeschlossen ohne deklarierte Outputs.",
"errGeneric": "Da ist etwas schiefgegangen.",
"errInvalidArgument": "Ungültige Eingabe.",
"errInvalidArgumentHint": "Werte im Formular prüfen und erneut versuchen.",
"errNotFound": "Nicht gefunden.",
"errNotFoundHint": "Das Angefragte ist nicht hier — entweder entfernt oder nie existiert.",
"errAlreadyExists": "Existiert bereits.",
"errPermissionDenied": "Berechtigung verweigert.",
"errPermissionDeniedHint": "Die Operator-Policy des Hubs blockiert diese Aktion. `~/.fai/config.yaml` prüfen.",
"errFailedPrecondition": "Setup-Problem hat das blockiert.",
"errFailedPreconditionHint": "Der Hub konnte nicht weiter, weil etwas Vorausgesetztes fehlt. Details unten erklären was.",
"errInternal": "Unerwarteter interner Fehler.",
"errInternalHint": "Hub-Logs unter `~/.fai/logs/` prüfen. Wenn das öfter passiert, bitte melden.",
"errUnavailable": "Hub nicht erreichbar.",
"errUnavailableHint": "Sicherstellen, dass `fai serve` (oder `fai daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.",
"errUnauthenticated": "Authentifizierung erforderlich.",
"errUnauthenticatedHint": "`FAI_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.",
"errCopyDetail": "Detail kopieren",
"errDetailCopied": "Detail in die Zwischenablage kopiert.",
"flowsOutputUnknown": "Unbekannter Output-Payload-Typ.",
"flowsOutputBytesUnknownMime": "Binärdaten",
"flowsOutputSaveAs": "Speichern unter…",
"flowsOutputSaveAsTitle": "Flow-Output speichern",
"flowsOutputSavedAt": "Gespeichert: {path}",
"@flowsOutputSavedAt": {
"placeholders": {
"path": {
"type": "String"
}
}
},
"flowsOutputSaveFailed": "Speichern fehlgeschlagen: {error}",
"@flowsOutputSaveFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"flowsOutputOpen": "Öffnen",
"flowsOutputOpenFailed": "Öffnen fehlgeschlagen: {error}",
"@flowsOutputOpenFailed": {
"placeholders": {
"error": {
"type": "String"
}
}
},
"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"
}
}
},
"storeProvenanceTemporal": "temporal · {provider}",
"@storeProvenanceTemporal": {
"placeholders": {
"provider": {
"type": "String"
}
}
},
"storeSourceTemporal": "Temporal"
}