// ignore: unused_import import 'package:intl/intl.dart' as intl; import 'app_localizations.dart'; // ignore_for_file: type=lint /// The translations for German (`de`). class AppLocalizationsDe extends AppLocalizations { AppLocalizationsDe([String locale = 'de']) : super(locale); @override String get appTitle => 'Ch∆In Studio'; @override String get navWelcome => 'Willkommen'; @override String get welcomeHeroTitle => 'Ch∆In Platform'; @override String get welcomeHeroSubtitle => 'Deterministische Workflow-Engine für KI-gestützte Dokumentenverarbeitung in regulierten Umgebungen.'; @override String get welcomePillarHubTitle => 'Hub'; @override String get 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.'; @override String get welcomePillarModuleTitle => 'Modul'; @override String get 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.'; @override String get welcomePillarFlowTitle => 'Flow'; @override String get 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.'; @override String get welcomeTrustHeader => 'TRUST-POSTURE'; @override String get welcomeTrustSandboxTitle => 'Sandbox von Anfang an'; @override String get 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.'; @override String get welcomeTrustAuditTitle => 'Manipulationssicheres Audit-Log'; @override String get 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.'; @override String get welcomeTrustAirgapTitle => 'Air-Gap-tauglich'; @override String get 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.'; @override String get welcomeDocsHeader => 'DOKUMENTATION'; @override String get welcomeDocsBody => 'Operator-Erklärungen, inline gerendert. Kein Browser, kein externer Link — air-gap-tauglich.'; @override String get welcomeDocArchitectureTitle => 'Architektur in einem Absatz'; @override String get welcomeDocArchitectureBlurb => 'Hub, Modul, Flow — und wie die drei zusammenpassen.'; @override String get welcomeDocSecurityTitle => 'Sandbox-Modell'; @override String get welcomeDocSecurityBlurb => 'Was ein Modul deklariert, was der Operator deckelt, was der Hub durchsetzt.'; @override String get welcomeDocAuditTitle => 'Manipulationssicheres Audit-Log'; @override String get welcomeDocAuditBlurb => 'Wie die Hash-Kette funktioniert und warum WORM-1 für KRITIS reicht.'; @override String get welcomeDocFlowsTitle => 'Flow-Komposition'; @override String get welcomeDocFlowsBlurb => 'YAML-Grundlagen, Templating-Referenz, das Extract→Summarize-Beispiel.'; @override String get welcomeDocApprovalsTitle => 'Freigaben'; @override String get welcomeDocApprovalsBlurb => 'Human-in-the-Loop-Checkpoints — wann nutzen, wie das Audit-Log sie protokolliert.'; @override String get helpTooltip => 'Hilfe'; @override String get errApprovalRejected => 'Freigabe vom Reviewer abgelehnt.'; @override String get errApprovalRejectedHint => 'Der Reviewer hat den Step abgelehnt. Begründung steht im Audit-Log.'; @override String get errApprovalTimedOut => 'Freigabe-Timeout abgelaufen.'; @override String get errApprovalTimedOutHint => 'Es wurde nicht rechtzeitig entschieden. Entweder `timeout_seconds` am Freigabe-Step erhöhen oder den Reviewer informieren.'; @override String get errOutputTooLarge => 'Step-Output hat die Größenbegrenzung überschritten.'; @override String get errOutputTooLargeHint => 'Entweder Output kürzen (Text truncaten, Bytes komprimieren) oder `max_output_size_mb` in der Operator-Config erhöhen.'; @override String get errServiceUnavailableForStep => 'Host-Service nicht konfiguriert.'; @override String get errServiceUnavailableForStepHint => 'Das Modul braucht einen Service (z.B. ollama, playwright), den der Operator nicht deklariert hat. Trage ihn unter `services:` in ~/.chain/config.yaml ein.'; @override String get errMissingValue => 'Pflichtwert fehlt.'; @override String get errMissingValueHint => 'Der Step erwartet eine Eingabe, die nicht verdrahtet ist — entweder zur Laufzeit liefern oder den vorgelagerten `\$ref` korrigieren.'; @override String get errMcpUnreachable => 'MCP-Endpunkt nicht erreichbar.'; @override String get errMcpUnreachableHint => 'Der MCP-Server hat nicht geantwortet. Endpunkt in Einstellungen → Integrationen prüfen und sicherstellen, dass er läuft.'; @override String get errCapabilityNotInstalled => 'Benötigte Capability nicht installiert.'; @override String get errCapabilityNotInstalledHint => 'Im Text-Tab des Flows klickst du auf den Fix-Button — der installiert die Capability, sofern sie im Store ist.'; @override String get welcomeDocClose => 'Schließen'; @override String welcomeDocFailedToLoad(String error) { return 'Doku konnte nicht geladen werden: $error'; } @override String get welcomeChecklistHeader => 'ERSTE SCHRITTE'; @override String get welcomeChecklistBody => 'Vier Schritte zu einem funktionierenden Hub. Live-Zustand — nach jeder Änderung aktualisieren.'; @override String get welcomeChecklistAi => 'System-AI konfigurieren'; @override String get welcomeChecklistAiHint => 'Einstellungen → System-AI. Wird für die KI-Suche und Fehlererklärungen gebraucht.'; @override String get welcomeChecklistMcp => 'Öffentliche Capability-Quelle hinzufügen'; @override String get welcomeChecklistMcpHint => 'Im Store eine MCP-Quelle hinzufügen oder unter Einstellungen → MCP-Clients konfigurieren.'; @override String get welcomeChecklistModule => 'Ein Text-Modul installieren'; @override String get welcomeChecklistModuleHint => 'Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind sandboxed Ch∆In-Komponenten.'; @override String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten'; @override String get welcomeChecklistFlowHint => 'Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; auch ein eigener tut\'s.'; @override String get welcomeChecklistAllDone => 'Alle vier Schritte erledigt.'; @override String get welcomeChecklistDismiss => 'Checkliste ausblenden'; @override String get welcomeChecklistRefresh => 'Aktualisieren'; @override String get welcomeChecklistRefreshing => 'Prüfe…'; @override String get welcomeChecklistDone => 'Erledigt'; @override String get welcomeChecklistTodo => 'Offen'; @override String get navDoctor => 'Diagnose'; @override String get navModules => 'Module'; @override String get navStore => 'Store'; @override String get navFlows => 'Flows'; @override String get navAudit => 'Protokoll'; @override String get navApprovals => 'Freigaben'; @override String get connectionConnected => 'verbunden'; @override String get connectionUnreachable => 'nicht erreichbar'; @override String get connectionConnecting => 'verbinde…'; @override String get connectionStartHub => 'Hub starten'; @override String get connectionTapToStart => 'antippen zum Starten'; @override String get sidebarSettingsTooltip => 'Einstellungen (⌘;)'; @override String get sidebarChannelTooltip => 'Aktiver Kanal — klicken um in Einstellungen (⌘;) zu wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung'; @override String get buttonCancel => 'Abbrechen'; @override String get buttonSave => 'Speichern'; @override String get buttonClose => 'Schließen'; @override String get buttonRetry => 'Erneut versuchen'; @override String get buttonRefresh => 'Aktualisieren'; @override String get buttonInstall => 'Installieren'; @override String get buttonUninstall => 'Deinstallieren'; @override String get buttonDetails => 'Details'; @override String get buttonAdd => 'Hinzufügen'; @override String get buttonRemove => 'Entfernen'; @override String get buttonOpen => 'Öffnen'; @override String get buttonExplain => 'Erklären'; @override String get buttonReadDocs => 'Doku öffnen'; @override String get buttonCopy => 'In Zwischenablage kopieren'; @override String get buttonCopied => 'Kopiert'; @override String get buttonShowDetails => 'Details anzeigen'; @override String get buttonHideDetails => 'Details ausblenden'; @override String get storeInstallableOnly => 'Nur installierbare'; @override String get storePillComingSoon => 'Bald verfügbar'; @override String storeNotInstallableInline(String status) { return 'Dieses Modul ist auf der Roadmap (Status: $status). Es gibt noch kein installierbares Bundle — Repository verfolgen für Updates.'; } @override String get mcpSuggestionDeepwikiDesc => 'Öffentliches HTTPS — KI-gestützte Doku-Suche in GitHub-Repos. Kein Node, kein API-Key.'; @override String get mcpSuggestionSemgrepDesc => 'Öffentliches HTTPS — Security-Scanning von Code-Schwachstellen. Kein Node, kein API-Key.'; @override String get mcpSuggestionFilesystemDesc => 'Anthropic — Dateien in /tmp lesen / schreiben. Pfad vor dem Speichern anpassen.'; @override String get mcpSuggestionFetchDesc => 'Anthropic — beliebige HTTP(S)-URLs als Markdown abrufen.'; @override String get mcpSuggestionGithubDesc => 'Anthropic — Issues, PRs, Repo-Dateien. Braucht einen GitHub-PAT in der Env-Variable.'; @override String get mcpSuggestionPuppeteerDesc => 'Anthropic — Headless-Browser-Automation für Screenshots / Scraping.'; @override String get mcpSuggestionPostgresDesc => 'Anthropic — Read-only-SQL-Queries gegen eine Postgres-Datenbank. URL anpassen.'; @override String get mcpSuggestionSqliteDesc => 'Anthropic — Abfragen gegen eine lokale SQLite-Datei. Pfad anpassen.'; @override String get mcpSuggestionBraveSearchDesc => 'Anthropic — Websuche via Brave. API-Key erforderlich.'; @override String get mcpSuggestionMemoryDesc => 'Anthropic — persistenter Knowledge-Graph als Agenten-Gedächtnis.'; @override String get mcpSuggestionTimeDesc => 'Anthropic — aktuelle Uhrzeit + Zeitzonen-Konvertierung.'; @override String get mcpServerEnLanguageBadge => 'Server-Text in Englisch — Studio zeigt ihn wie geliefert.'; @override String get themePluginHeader => 'Theme-Plugin (wirkt sofort)'; @override String themeApplied(String name) { return 'Theme aktiv: $name'; } @override String get themePluginFailed => 'Theme-Plugin konnte nicht geladen werden — vorheriges Theme bleibt.'; @override String get themePluginNone => 'Standard (kein Plugin)'; @override String get themePluginHint => 'Built-in- und Plugin-Kacheln bringen handkuratierte Paletten mit. Die Kachel „Eigene Farbe\" leitet aus einer gewählten Seedfarbe eine vollständige Material-3-Palette ab (primary, secondary, tertiary, surface, …) — das ist ein vollwertiges Theme, kein Einzelfarb-Tweak.'; @override String get themePluginEmpty => 'Kein Theme-Plugin installiert. Im Store eines aus der Kategorie studio-plugin auswählen.'; @override String get themePluginCustom => 'Eigene Farbe'; @override String get themePluginCustomDialogTitle => 'Eigenes Theme — Seedfarbe wählen'; @override String get themePluginCustomHexLabel => 'Hex-Farbe'; @override String get themePluginCustomPreview => 'Live-Vorschau'; @override String get themePluginCustomCancel => 'Abbrechen'; @override String get themePluginCustomApply => 'Anwenden'; @override String get settingsTitle => 'Hub-Endpunkt'; @override String get settingsHost => 'Host'; @override String get settingsPort => 'Port'; @override String get settingsTls => 'TLS'; @override String get settingsSaveAndConnect => 'Mit Endpoint verbinden'; @override String get settingsLanguage => 'Sprache'; @override String get settingsLanguageHint => 'Sprache der App. Wirkt auf alle Seiten; mehrsprachige Store-Einträge folgen ebenfalls.'; @override String get settingsHubEndpointHint => 'Wohin soll Studio sich verbinden? Standard ist der lokale Hub auf 127.0.0.1:50051.'; @override String get settingsTlsSubtitle => 'https/grpc-secure'; @override String get settingsPortError => 'Port muss 1–65535 sein'; @override String get channelsBlurb => 'Hub-Kanal wechseln (schreibt ~/.chain/current-channel und startet den Daemon neu). Verbinden ändert nur die Wire von Studio.'; @override String get channelsActionsTooltip => 'Kanal-Aktionen'; @override String get systemAiHeader => 'SYSTEM-AI'; @override String get systemAiEnabled => 'aktiv'; @override String get systemAiOff => 'aus'; @override String get systemAiEdit => 'Bearbeiten…'; @override String get systemAiConfigure => 'Konfigurieren…'; @override String get 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.'; @override String mcpServersCount(int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'Server', one: 'Server', ); return '$n $_temp0'; } @override String get mcpRediscoverTooltip => 'Discovery neu ausführen'; @override String get mcpAddTooltip => 'MCP-Server hinzufügen'; @override String get mcpRemoveTooltip => 'Server entfernen'; @override String mcpToolsCount(int n) { return '$n Tools'; } @override String n8nEndpointsCount(int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'Endpunkte', one: 'Endpunkt', ); return '$n $_temp0'; } @override String n8nWorkflowsCount(int n) { return '$n Workflows'; } @override String get n8nRediscoverTooltip => 'Discovery neu ausführen'; @override String get n8nAddTooltip => 'n8n-Endpunkt hinzufügen'; @override String get n8nRemoveTooltip => 'Endpunkt entfernen'; @override String get addMcpTitle => 'MCP-Server hinzufügen'; @override String get addMcpIntro => 'Tools, die der Server via `tools/list` anbietet, erscheinen im Store als `mcp..`-Fähigkeiten.'; @override String get addMcpSuggestionsLabel => 'Vorschläge — zum Vorausfüllen klicken'; @override String get addMcpNameLabel => 'Name (keine Punkte)'; @override String get addMcpNameHint => 'filesystem'; @override String get addMcpEndpointLabel => 'Endpunkt'; @override String get addMcpEndpointHint => 'http://127.0.0.1:3001/mcp'; @override String get addMcpApiKeyLabel => 'API-Key-Umgebungsvariable (optional)'; @override String get addMcpApiKeyHint => 'MCP_FILESYSTEM_TOKEN'; @override String get addMcpNotesLabel => 'Notizen (optional)'; @override String get addMcpAddButton => 'Hinzufügen + Discovery'; @override String get addN8nTitle => 'n8n-Endpunkt hinzufügen'; @override String get addN8nIntro => 'Aktive Workflows erscheinen im Store als `n8n..`-Fähigkeiten.'; @override String get addN8nNameLabel => 'Name (keine Punkte)'; @override String get addN8nNameHint => 'ops'; @override String get addN8nBaseUrlLabel => 'Basis-URL (ohne /api/v1)'; @override String get addN8nBaseUrlHint => 'https://n8n.example.com'; @override String get addN8nApiKeyLabel => 'API-Key-Umgebungsvariable (optional)'; @override String get addN8nApiKeyHint => 'N8N_OPS_KEY'; @override String get addN8nNotesLabel => 'Notizen (optional)'; @override String get addN8nAddButton => 'Hinzufügen + Discovery'; @override String addedMcpToast(String name) { return 'MCP-Server „$name\" hinzugefügt.'; } @override String addedN8nToast(String name) { return 'n8n-Endpunkt „$name\" hinzugefügt.'; } @override String addFailedToast(String error) { return 'Hinzufügen fehlgeschlagen: $error'; } @override String removeFailedToast(String error) { return 'Entfernen fehlgeschlagen: $error'; } @override String refreshFailedToast(String error) { return 'Aktualisieren fehlgeschlagen: $error'; } @override String get channelsHeader => 'KANÄLE'; @override String get channelsActive => 'aktiv'; @override String get channelsRunning => 'läuft'; @override String get channelsStopped => 'gestoppt'; @override String get channelsConnect => 'Studio mit diesem Kanal verbinden'; @override String get channelsSwitch => 'Diesen Kanal aktivieren'; @override String get channelsEnableAutostart => 'Autostart bei Anmeldung aktivieren'; @override String get channelsDisableAutostart => 'Autostart deaktivieren'; @override String get storeSearchHint => 'Module suchen — Name, Tagline, Tag, Fähigkeit…'; @override String get storeAskHint => 'Was brauchst du? Versuch\'s mit „ein Modul, das tabellarische Daten liest\" oder tippe einfach einen Begriff.'; @override String get storeAskSubmit => 'Suchen'; @override String get storeAskAi => 'KI fragen'; @override String get storeAskClear => 'Frage zurücksetzen'; @override String get storeAskAiThinking => 'Module werden durchsucht…'; @override String get storeAskAiUnavailable => 'Konfiguriere eine System-AI in den Einstellungen, um Fragen in normaler Sprache zu stellen.'; @override String get storeAskNoMatches => 'Keine Treffer — Frage verfeinern oder im Grid unten stöbern.'; @override String get storeAskAnswerLabel => 'KI-Vorschlag'; @override String get storeAskAnswerWhy => 'Warum es passt'; @override String get storeAskMatchPill => 'Treffer'; @override String get storeFilterLabel => 'Filter'; @override String storeFilterActiveCount(int n) { return '$n aktiv'; } @override String get storeFilterReset => 'Filter zurücksetzen'; @override String get storeFilterApply => 'Fertig'; @override String get storeFilterStatusGroup => 'Status'; @override String get storeFilterSourceGroup => 'Quelle'; @override String get storeFilterInstalledGroup => 'Nur installierte zeigen'; @override String get storeFeatured => 'EMPFOHLEN'; @override String get storeFeaturedHint => 'kuratierte Auswahl · klicken für Details'; @override String get storeNoMatches => 'Keine Treffer'; @override String get storeNoMatchesHint => 'Filter anpassen oder Suche leeren, um alle Einträge zu sehen.'; @override String get storeClearFilters => 'Filter zurücksetzen'; @override String get storeStatusAll => 'Alle'; @override String get storeStatusPublished => 'stabil'; @override String get storeStatusAlpha => 'experimentell'; @override String get storeStatusPlanned => 'geplant'; @override String get storeInstalledOnly => 'Installiert'; @override String get storeCategoryLabel => 'Kategorie'; @override String get storeCategoryAll => 'Alle Kategorien'; @override String get storeCategoryBridge => 'Verbindungen'; @override String get storeCategoryDebug => 'Beispiele'; @override String get storeCategoryText => 'Text'; @override String get storeCategoryLlm => 'KI-Modelle'; @override String get storeCategorySystem => 'System'; @override String get storeCategoryAuth => 'Authentifizierung'; @override String get storeCategoryStorage => 'Speicher'; @override String get storeCategoryChannel => 'Kanäle'; @override String get storeCategoryWeb => 'Web'; @override String get storeCategoryOrchestrator => 'Orchestrierung'; @override String storeNResults(int n) { return '$n Treffer'; } @override String get storeReloadTooltip => 'Aktualisieren'; @override String get storeTodayBadge => 'HEUTE'; @override String get storeTodayDeck => 'Von der Ch∆In-Redaktion'; @override String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden'; @override String get storePillInstalled => 'installiert'; @override String get storePillUpdate => 'Update'; @override String storeUpdateButton(String version) { return 'Update auf $version'; } @override String storeUpdateTooltip(String installed, String best) { return 'Installiert $installed — Store bietet v$best'; } @override String get storeNoTagline => '(keine Beschreibung)'; @override String get storeUninstallTitle => 'Modul deinstallieren?'; @override String storeUninstallBody(String name) { return 'Entfernt $name aus diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl.'; } @override String storeInstalledToast(String name, String version) { return '$name v$version installiert.'; } @override String storeInstallFailedToast(String error) { return 'Installation fehlgeschlagen: $error'; } @override String storeUninstalledToast(String name, String version) { return '$name v$version deinstalliert.'; } @override String storeUninstallFailedToast(String error) { return 'Deinstallation fehlgeschlagen: $error'; } @override String storeOpenBrowserFailed(String error) { return 'Browser konnte nicht geöffnet werden: $error'; } @override String get storeSectionTags => 'Tags'; @override String get storeSectionRequiredCapabilities => 'Erforderliche Fähigkeiten'; @override String get storeSectionRequiredHostServices => 'Erforderliche Host-Dienste'; @override String get storeSectionScreenshots => 'Screenshots'; @override String get storeSectionDocumentation => 'Dokumentation'; @override String get storeSectionSource => 'Quelle'; @override String get storeSectionPermissions => 'Deklarierte Berechtigungen'; @override String get storeSectionDirectory => 'Modul-Verzeichnis'; @override String get storeSectionPermissionsNone => '(keine — reines Berechnungsmodul)'; @override String get storeInstallingButton => 'Installiere…'; @override String get storeNotInstallable => 'Nicht installierbar'; @override String storeNotInstallableTooltip(String status) { return 'Status „$status\" — Installations-Pfad noch nicht verdrahtet.'; } @override String storeInstallProgressTitle(String name) { return 'Installation von $name'; } @override String get storeInstallProgressBody => 'Holen, verifizieren, entpacken…'; @override String get storeLoadDocs => 'Dokumentation laden'; @override String get storeDocsHint => 'README inline gerendert; nutzt das Registry-Token des Hubs, falls nötig.'; @override String get storeDocsFetching => 'README wird geladen…'; @override String get storeOpenRepoButton => 'Repository im Browser öffnen'; @override String get storeDocsErrorNotFound => 'Dieses Modul ist nicht im Store-Index des Hubs enthalten.'; @override String get storeDocsErrorNoDocs => 'Für dieses Modul ist keine Repository-URL hinterlegt.'; @override String get storeDocsErrorAuth => 'Die Registry erfordert Authentifizierung, um dieses README zu laden. Setze CHAIN_REGISTRY_TOKEN in der Umgebung des Daemons und starte den Hub neu.'; @override String storeDocsErrorNetwork(String detail) { return 'Netzwerkfehler beim Laden des README. $detail'; } @override String get storeDocsErrorParse => 'README ist kein gültiges UTF-8.'; @override String get storeDocsErrorGeneric => 'README konnte nicht geladen werden.'; @override String get storeSourceLabel => 'Quelle'; @override String get storeSourceAll => 'Alle Quellen'; @override String get storeSourceNative => 'Nativ'; @override String get storeSourceMcp => 'MCP'; @override String get storeSourceN8n => 'n8n'; @override String get storeProvenanceNative => 'nativ'; @override String storeProvenanceMcp(String provider) { return 'mcp · $provider'; } @override String storeProvenanceN8n(String provider) { return 'n8n · $provider'; } @override String get storeRecommendedTitle => 'Öffentliche Quelle hinzufügen — ein Klick'; @override String get storeRecommendedBody => 'Kuratierte MCP-Server über HTTPS erreichbar. Kein Subprozess, kein API-Key, kein Node. Föderierte Fähigkeiten erscheinen sofort im Store.'; @override String get storeRecommendedAddTooltip => 'Hinzufügen und entdecken'; @override String get storeRecommendedAdding => 'Wird hinzugefügt…'; @override String get storeRecommendedDeepWikiTagline => 'GitHub-Repo-Doku-Suche (KI-gestützt)'; @override String get storeRecommendedSemgrepTagline => 'Security-Scanning für Code-Schwachstellen'; @override String storeProviderAddedToast(String name, int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'föderierte Fähigkeiten', one: 'föderierte Fähigkeit', ); return '$name hinzugefügt — $n $_temp0.'; } @override String storeProviderAddedZeroToast(String name) { return '$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.'; } @override String storeProviderAddFailed(String name, String error) { return '$name konnte nicht hinzugefügt werden: $error'; } @override String get auditTitle => 'Protokoll'; @override String get auditNoEvents => 'Noch keine Ereignisse'; @override String get auditNoEventsHint => 'Starte einen Flow, um den Audit-Stream zu füllen.\nEreignisse erscheinen innerhalb von Sekunden.'; @override String get auditFilterAll => 'alle'; @override String get auditFilterFlow => 'Flow'; @override String get auditFilterStep => 'Step'; @override String get auditFilterModule => 'Modul'; @override String get auditClearLogTooltip => 'Protokoll löschen (nur local/dev Kanal)'; @override String auditClearedToast(int n, String channel) { return '$n Ereignisse auf Kanal „$channel\" gelöscht. Kette mit Marker neu geseedet.'; } @override String auditClearFailed(String detail) { return 'Löschen fehlgeschlagen: $detail'; } @override String get auditExplain => 'Erklären'; @override String get auditReask => 'Neu fragen'; @override String get auditAsking => 'Frage läuft…'; @override String get auditSystemAi => 'SYSTEM-AI'; @override String get auditCachedPill => 'gecacht'; @override String auditOriginalLatency(int ms) { return 'ursprünglich $ms ms'; } @override String auditLatency(int ms) { return '$ms ms'; } @override String get auditRegenerateTooltip => 'Neu generieren — Cache überspringen, Modell erneut fragen'; @override String auditLiveStatus(int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'Ereignisse', one: 'Ereignis', ); return 'live · Abfrage alle 2s · $n $_temp0'; } @override String auditDisconnected(String error) { return 'getrennt · $error'; } @override String get auditHashChainVerified => 'Hash-Kette verifiziert'; @override String get auditDetailHeader => 'DETAIL'; @override String get auditAskingFull => 'Frage an die konfigurierte System-AI läuft…'; @override String get auditFixLabel => 'FIX'; @override String auditCachedTooltipKnown(String at, String hits) { return 'Aus dem lokalen Cache geliefert. Ursprünglich erzeugt am $at$hits.'; } @override String auditCachedTooltipUnknown(String hits) { return 'Aus dem lokalen Cache geliefert. Ursprünglicher Zeitpunkt unbekannt$hits.'; } @override String auditCachedTooltipHits(int n) { return ' · $n Treffer'; } @override String get auditConfigureSystemAi => 'System-AI unter Einstellungen konfigurieren (Cmd+,)'; @override String get auditClearDialogTitle => 'Audit-Log löschen?'; @override String get 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.'; @override String get auditClearReviewerLabel => 'Prüfer'; @override String get auditClearReasonLabel => 'Begründung (im chain.reset-Marker festgehalten)'; @override String get auditClearReasonHelper => 'Erforderlich — Auditoren werden das lesen.'; @override String get auditClearLogButton => 'Log löschen'; @override String get modulesTitle => 'Module'; @override String get modulesNoneTitle => 'Noch keine Module'; @override String get modulesNoneHint => '`chain install ` ausführen oder ~/.chain/modules/ prüfen.'; @override String get modulesReloadTooltip => 'Aktualisieren'; @override String get modulesRecentActivity => 'LETZTE AKTIVITÄT'; @override String modulesRecentActivityHint(int n) { return 'letzte $n install/uninstall-Ereignisse aus dem Audit-Log'; } @override String get modulesActivityInstalled => 'installiert'; @override String get modulesActivityUninstalled => 'deinstalliert'; @override String get modulesCapabilitiesLabel => 'Fähigkeiten'; @override String get modulesUninstallTitle => 'Modul deinstallieren?'; @override String modulesUninstallBody(String name, String version) { return 'Entfernt $name v$version von diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl. Ein `module.uninstalled`-Audit-Event wird festgehalten.'; } @override String modulesUninstalledToast(String name, String version) { return '$name v$version deinstalliert.'; } @override String modulesUninstallFailed(String error) { return 'Deinstallation fehlgeschlagen: $error'; } @override String get modulesUninstalling => 'Wird deinstalliert…'; @override String moduleSheetFailedToLoad(String error) { return 'Laden fehlgeschlagen: $error'; } @override String get moduleSheetCapabilities => 'Fähigkeiten'; @override String get moduleSheetPermissions => 'Deklarierte Berechtigungen'; @override String get moduleSheetNoPermissions => '(keine — reines Berechnungsmodul)'; @override String get flowsTitle => 'Flows'; @override String get flowsReloadTooltip => 'Aktualisieren'; @override String get flowsNoneTitle => 'Keine gespeicherten Flows'; @override String get flowsNoneHint => 'Flow speichern mit `chain admin flows save `, dann taucht er hier auf.'; @override String flowsRunDialogTitle(String name) { return '$name ausführen'; } @override String get 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.'; @override String get flowsLoadingDefinition => 'Inputs werden geladen…'; @override String get flowsDefinitionFailed => 'Flow-Definition konnte nicht geladen werden'; @override String get flowsNoInputs => 'Dieser Flow deklariert keine Inputs. Starten klicken, um loszulegen.'; @override String get flowsTypeBytesPick => 'Datei wählen…'; @override String get flowsTypeBytesChange => 'Datei ändern'; @override String get flowsTypeBytesNoFile => 'Keine Datei ausgewählt'; @override String flowsTypeBytesSize(int n) { return '$n Bytes'; } @override String get flowsRunErrorTitle => 'Flow-Lauf fehlgeschlagen'; @override String flowsFileReadFailed(String path, String error) { return '„$path\" konnte nicht gelesen werden: $error'; } @override String get flowsMissingModulesLabel => 'Braucht:'; @override String get flowsRunDisabledTooltip => 'Erst die fehlenden Module installieren.'; @override String flowsInstallAllButton(int n) { return 'Alle installieren ($n)'; } @override String get flowsInstallPillTooltip => 'Zum Installieren klicken'; @override String get flowsInstallDepsTitle => 'Abhängigkeiten installieren'; @override String get flowsInstallDepsBody => 'Die fehlenden Module werden der Reihe nach installiert. Vorhandene Installationen bleiben unberührt.'; @override String get flowsInstallStatusPending => 'Wartet'; @override String get flowsInstallStatusInstalling => 'Wird installiert…'; @override String flowsInstallStatusDone(String version) { return 'Installiert v$version'; } @override String get flowsInstallStatusFailed => 'Fehlgeschlagen'; @override String flowsInstallStatusFailedDetail(String error) { return '$error'; } @override String get flowsInstallDepsAllDone => 'Alle Abhängigkeiten installiert.'; @override String flowsInstallDepsAnyFailed(int ok, int failed) { return '$ok installiert, $failed fehlgeschlagen.'; } @override String get flowsInstallAuthWallButton => 'Registry-Token einfügen'; @override String get flowsOpenInEditorTooltip => 'Im Studio-Flow-Editor öffnen'; @override String flowsOpenInEditorFailed(String error) { return 'Konnte Datei nicht öffnen: $error'; } @override String get registryCredentialsHeader => 'REGISTRY-ZUGANGSDATEN'; @override String get registryCredentialsBlurb => 'Token zum Herunterladen von .fai-Modulen aus einer Registry mit Anmeldepflicht (Forgejo, private GitHub-Repos). Gespeichert in ~/.chain/registry-token, Modus 0600. Die Umgebungsvariable CHAIN_REGISTRY_TOKEN hat weiterhin Vorrang, wenn gesetzt.'; @override String registryTokenStatusConfigured(int chars) { return 'Konfiguriert ($chars Zeichen)'; } @override String get registryTokenStatusNotSet => 'Nicht gesetzt'; @override String get registryTokenFieldLabel => 'Token'; @override String get registryTokenFieldHint => 'Forgejo- oder GitHub-PAT einfügen'; @override String get registryTokenSaveButton => 'Speichern'; @override String get registryTokenClearButton => 'Entfernen'; @override String get registryTokenStorageHint => 'Lokal gespeichert in ~/.chain/registry-token. Wird nie an einen Remote-Dienst übertragen.'; @override String get registryTokenSavedToast => 'Registry-Token gespeichert.'; @override String get registryTokenClearedToast => 'Registry-Token entfernt.'; @override String registryTokenSaveFailedToast(String error) { return 'Speichern fehlgeschlagen: $error'; } @override String get hubAuthTokenHeader => 'HUB-AUTHENTIFIZIERUNG'; @override String get hubAuthTokenBlurb => 'Bearer-Token für die Studio-Anbindung an einen Hub mit aktivierter auth.tokens-Konfiguration (RBAC Level 2). Gespeichert in ~/.chain/hub-auth-token, Modus 0600. Studio sendet ihn als Authorization: Bearer bei jedem gRPC-Aufruf.'; @override String hubAuthTokenStatusConfigured(int chars) { return 'Eingerichtet ($chars Zeichen)'; } @override String get hubAuthTokenStatusNotSet => 'Nicht gesetzt (anonym)'; @override String get hubAuthTokenFieldLabel => 'Token'; @override String get hubAuthTokenFieldHint => 'Token aus dem auth.tokens-Eintrag des Hub-Operators einfügen'; @override String get hubAuthTokenSaveButton => 'Speichern'; @override String get hubAuthTokenClearButton => 'Entfernen'; @override String get hubAuthTokenStorageHint => 'Lokal gespeichert in ~/.chain/hub-auth-token. Studio verbindet nach dem Speichern automatisch neu, der Token wirkt sofort.'; @override String get hubAuthTokenSavedToast => 'Hub-Token gespeichert.'; @override String get hubAuthTokenClearedToast => 'Hub-Token entfernt.'; @override String hubAuthTokenSaveFailedToast(String error) { return 'Speichern fehlgeschlagen: $error'; } @override String get storeAdvisoryVersionTooltip => 'Föderierter Upstream-Dienst — Version ist Richtwert; der Upstream kann ohne Versionsanhebung Kompatibilität brechen.'; @override String get uninstallVersionPickerTitle => 'Version zum Entfernen wählen'; @override String uninstallVersionPickerBody(String module) { return 'Mehrere Versionen von `$module` sind parallel installiert. Wähle genau die Version aus, die entfernt werden soll — die anderen bleiben bestehen.'; } @override String get uninstallVersionPickerContinue => 'Weiter'; @override String get defaultScopeHeader => 'STANDARD-SCOPE'; @override String get defaultScopeBlurb => 'Geordnete Liste von Publisher-Segmenten, die der Hub konsultiert, wenn ein Flow eine Capability ohne explizites `/`-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.'; @override String get defaultScopeAddLabel => 'Publisher-Segment hinzufügen'; @override String get defaultScopeAddHint => 'z.B. acme.team'; @override String get defaultScopeAddButton => 'Hinzufügen'; @override String get defaultScopeSuggestions => 'Katalog-Vorschläge:'; @override String get defaultScopeSavedToast => 'Standard-Scope aktualisiert.'; @override String get defaultScopeLoadFailed => 'Standard-Scope konnte nicht geladen werden.'; @override String get defaultScopeNonEmptyError => 'Standard-Scope darf nicht leer sein — mindestens ein Segment muss erhalten bleiben.'; @override String get maintenanceHeader => 'HUB-WARTUNG'; @override String get maintenanceResetBlurb => 'Operator-Zustand zurücksetzen und mit einem sauberen Hub neu starten. Stoppt jeden laufenden Daemon, sichert ~/.chain/ 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.'; @override String get maintenanceKeepModulesTitle => 'Installierte Module behalten'; @override String get maintenanceKeepModulesSubtitle => 'Standardverhalten löscht ~/.chain/modules/, damit eine frische Installation den Modul-Bezugspfad end-to-end verifizieren kann.'; @override String get maintenanceKeepDataTitle => 'Protokoll + gespeicherte Flows behalten'; @override String get maintenanceKeepDataSubtitle => 'Standardverhalten löscht ~/.chain/data/, damit die Audit-Kette mit einer neuen Genesis startet und die mitgelieferten Sample-Flows beim ersten Daemon-Start neu importiert werden.'; @override String get maintenanceResetButton => 'Hub zurücksetzen'; @override String get maintenanceResetInProgress => 'Zurücksetzen…'; @override String get maintenanceResetConfirmTitle => 'Hub zurücksetzen?'; @override String get maintenanceResetConfirmBody => 'Stoppt jeden Daemon, verschiebt ~/.chain/ in ein Backup mit Zeitstempel und startet sauber neu. Das Backup ist vollständig wiederherstellbar. Fortfahren?'; @override String get maintenanceResetConfirmButton => 'Zurücksetzen'; @override String get welcomeChecklistAllSetTitle => 'Du bist eingerichtet.'; @override String get welcomeChecklistAllSetBody => 'Drei Stränge, an denen du als nächstes ziehen kannst:'; @override String get welcomeChecklistNextAuditTitle => 'Audit-Log lesen'; @override String get welcomeChecklistNextAuditBody => 'Jede Installation, jeder Flow-Lauf, jede Freigabe landet im hash-verketteten Log. Im Protokoll-Tab siehst du, was dein Hub gemacht hat.'; @override String get welcomeChecklistNextAuditButton => 'Protokoll öffnen'; @override String get welcomeChecklistNextTodayTitle => 'Daily-Today-Story einrichten'; @override String get welcomeChecklistNextTodayBody => 'tools/today/propose.sh per Cron laufen lassen und die Editorial-Karte im Store füllt sich mit operator-kuratierten Stories.'; @override String get welcomeChecklistNextTodayButton => 'Today-Doku öffnen'; @override String get welcomeChecklistNextModuleTitle => 'Eigenes Modul bauen'; @override String get welcomeChecklistNextModuleBody => 'Mit `chain new module ` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.'; @override String get welcomeChecklistNextModuleButton => 'Doku lesen'; @override String get auditGroupToday => 'HEUTE'; @override String get auditGroupYesterday => 'GESTERN'; @override String get auditGroupThisWeek => 'DIESE WOCHE'; @override String get auditGroupOlder => 'ÄLTER'; @override String get auditEventViewFlowRun => 'Flow-Lauf ansehen'; @override String auditFlowRunDialogTitle(String flow) { return 'Flow-Lauf · $flow'; } @override String auditFlowRunDialogSubtitle(int n, String execution) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'Ereignisse', one: 'Ereignis', ); return '$n $_temp0 für Lauf $execution'; } @override String get approvalsSelectAll => 'Alle wählen'; @override String get approvalsClearSelection => 'Auswahl aufheben'; @override String approvalsBatchSelected(int n) { return '$n ausgewählt'; } @override String get approvalsBatchApprove => 'Alle freigeben'; @override String get approvalsBatchReject => 'Alle ablehnen'; @override String approvalsBatchApproveDoneToast(int n) { return '$n Freigaben erteilt.'; } @override String approvalsBatchRejectDoneToast(int n) { return '$n Freigaben abgelehnt.'; } @override String approvalsBatchPartialFailure(int ok, int failed) { return '$ok erledigt, $failed fehlgeschlagen.'; } @override String get flowsRunButton => 'Starten'; @override String flowsRunningTitle(String name) { return '$name läuft'; } @override String flowsResultTitle(String name) { return '$name — Ergebnis'; } @override String flowsErrorTitle(String name) { return '$name — fehlgeschlagen'; } @override String get flowsRunning => 'Flow läuft…'; @override String get flowsNoOutputs => 'Flow abgeschlossen ohne deklarierte Outputs.'; @override String get errGeneric => 'Da ist etwas schiefgegangen.'; @override String get errInvalidArgument => 'Ungültige Eingabe.'; @override String get errInvalidArgumentHint => 'Werte im Formular prüfen und erneut versuchen.'; @override String get errNotFound => 'Nicht gefunden.'; @override String get errNotFoundHint => 'Das Angefragte ist nicht hier — entweder entfernt oder nie existiert.'; @override String get errAlreadyExists => 'Existiert bereits.'; @override String get errPermissionDenied => 'Berechtigung verweigert.'; @override String get errPermissionDeniedHint => 'Die Operator-Policy des Hubs blockiert diese Aktion. `~/.chain/config.yaml` prüfen.'; @override String get errFailedPrecondition => 'Setup-Problem hat das blockiert.'; @override String get errFailedPreconditionHint => 'Der Hub konnte nicht weiter, weil etwas Vorausgesetztes fehlt. Details unten erklären was.'; @override String get errInternal => 'Unerwarteter interner Fehler.'; @override String get errInternalHint => 'Hub-Logs unter `~/.chain/logs/` prüfen. Wenn das öfter passiert, bitte melden.'; @override String get errUnavailable => 'Hub nicht erreichbar.'; @override String get errUnavailableHint => 'Sicherstellen, dass `chain serve` (oder `chain daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.'; @override String get errUnauthenticated => 'Authentifizierung erforderlich.'; @override String get errUnauthenticatedHint => '`CHAIN_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.'; @override String get errCopyDetail => 'Detail kopieren'; @override String get errDetailCopied => 'Detail in die Zwischenablage kopiert.'; @override String get flowsOutputUnknown => 'Unbekannter Output-Payload-Typ.'; @override String get flowsOutputBytesUnknownMime => 'Binärdaten'; @override String get flowsOutputSaveAs => 'Speichern unter…'; @override String get flowsOutputSaveAsTitle => 'Flow-Output speichern'; @override String flowsOutputSavedAt(String path) { return 'Gespeichert: $path'; } @override String flowsOutputSaveFailed(String error) { return 'Speichern fehlgeschlagen: $error'; } @override String get flowsOutputOpen => 'Öffnen'; @override String flowsOutputOpenFailed(String error) { return 'Öffnen fehlgeschlagen: $error'; } @override String get approvalsTitle => 'Freigaben'; @override String get approvalsTabPending => 'Offen'; @override String get approvalsTabHistory => 'Verlauf'; @override String get approvalsInboxZero => 'Posteingang leer'; @override String get approvalsInboxHint => 'Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.'; @override String get approvalsReloadTooltip => 'Aktualisieren'; @override String get approvalsPillPending => 'offen'; @override String get approvalsPillApproved => 'freigegeben'; @override String get approvalsPillRejected => 'abgelehnt'; @override String get approvalsPillExpired => 'abgelaufen'; @override String get approvalsPayloadPreview => 'PAYLOAD-VORSCHAU'; @override String get approvalsApproveButton => 'Freigeben'; @override String get approvalsRejectButton => 'Ablehnen'; @override String get approvalsRejectDialogTitle => 'Freigabe ablehnen'; @override String get approvalsRejectReasonLabel => 'Begründung (im Audit-Log festgehalten)'; @override String approvalsApprovedToast(String flow, String step) { return 'freigegeben · $flow › $step'; } @override String approvalsRejectedToast(String flow, String step) { return 'abgelehnt · $flow › $step'; } @override String approvalsApproveFailed(String error) { return 'Freigabe fehlgeschlagen: $error'; } @override String approvalsRejectFailed(String error) { return 'Ablehnung fehlgeschlagen: $error'; } @override String get approvalsHistoryEmpty => 'Noch kein Verlauf'; @override String get approvalsHistoryEmptyHint => 'Entschiedene Freigaben (freigegeben / abgelehnt / abgelaufen) erscheinen hier.\nDas Audit-Log enthält den vollständigen hash-verketteten Datensatz.'; @override String get approvalsDialogDecided => 'entschieden'; @override String get approvalsDialogCreated => 'erstellt'; @override String get approvalsDialogReason => 'Begründung'; @override String get approvalsDialogPrompt => 'PROMPT'; @override String approvalsExpiresIn(int minutes) { return '${minutes}m'; } @override String approvalsExpiresInHours(int hours) { return '${hours}h'; } @override String get doctorTitle => 'Diagnose'; @override String get doctorSummaryModules => 'Module'; @override String get doctorSummaryApprovals => 'Freigaben'; @override String get doctorSummaryAudit => 'Protokoll'; @override String get doctorSummaryServices => 'Dienste'; @override String doctorSummaryCapabilities(int n) { return '$n Fähigkeiten'; } @override String get doctorSummaryPending => 'offen'; @override String doctorSummaryChain(int verified, int total) { return '$verified/$total Kette'; } @override String get doctorSummaryDeclared => 'deklariert'; @override String doctorModulesPanelSummary(int n, int m) { return '$n Module · $m Fähigkeiten'; } @override String get doctorApprovalsNone => 'Keine offenen Freigaben'; @override String doctorApprovalsCount(int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: '$n Freigaben warten auf Prüfung', one: '1 Freigabe wartet auf Prüfung', ); return '$_temp0'; } @override String get doctorApprovalsAttentionPill => 'wichtig'; @override String get doctorServicesEmpty => 'Keine Host-Dienste deklariert'; @override String get doctorServicesEmptyHint => 'in ~/.chain/config.yaml unter services: hinzufügen'; @override String get doctorPillLoaded => 'geladen'; @override String get doctorPillEmpty => 'leer'; @override String get doctorRecheckTooltip => 'Erneut prüfen'; @override String get doctorEventLogSection => 'Audit-Log'; @override String get doctorModulesApprovalsSection => 'Module & Freigaben'; @override String get doctorHostServicesSection => 'Host-Dienste'; @override String get doctorDaemonFilesSection => 'Daemon-Dateien'; @override String get doctorDaemonControlSection => 'Daemon-Steuerung'; @override String get doctorChainIntact => 'Hash-Kette intakt'; @override String doctorChainIntactDetail(int n) { return '$n Ereignisse · prev_event_sha256 lückenlos verifiziert'; } @override String get doctorChainTampered => 'Manipulation erkannt'; @override String doctorChainTamperedDetail(int verified, int total, String id) { return '$verified von $total verifiziert vor Mismatch bei $id'; } @override String get doctorChainPillOk => 'WORM-1'; @override String get doctorChainPillTamper => 'MANIPULIERT'; @override String get doctorVerifyNow => 'Jetzt prüfen'; @override String get doctorRestart => 'Neustart'; @override String get doctorStart => 'Starten'; @override String get doctorStop => 'Stoppen'; @override String get doctorStatusAction => 'Status'; @override String doctorRunningOn(String name, String endpoint) { return 'Läuft auf $name: $endpoint'; } @override String doctorStoppedOn(String name) { return '$name-Daemon gestoppt'; } @override String get doctorStatusUnknown => 'Daemon-Status: …'; @override String get doctorPillRunning => 'läuft'; @override String get doctorPillStopped => 'gestoppt'; @override String get doctorDaemonControlHint => 'Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.'; @override String get doctorDaemonControlWorking => 'Wird ausgeführt…'; @override String get doctorPathLog => 'Log'; @override String get doctorPathConfig => 'Konfig'; @override String get doctorPathDb => 'Audit-DB'; @override String get doctorPathModules => 'Module-Verzeichnis'; @override String get doctorPathFlows => 'Flow-Verzeichnis'; @override String get doctorPathPid => 'PID-Datei'; @override String get doctorPathsEmpty => 'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.'; @override String doctorOpenError(String detail) { return 'Konnte nicht öffnen: $detail'; } @override String doctorUpdateAvailable(String version) { return 'Update verfügbar — $version'; } @override String doctorUpdateBody(String channel, String version) { return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `chain update apply --channel $channel` auf.'; } @override String get doctorUpdateUnreachable => 'Release-Host nicht erreichbar'; @override String doctorUpdateUnreachableBody(String channel) { return 'Release-Feed für $channel konnte nicht erreicht werden.'; } @override String doctorReleaseNotes(String url) { return 'Notes: $url'; } @override String get doctorPillNew => 'neu'; @override String get doctorPillOffline => 'offline'; @override String get doctorApplyUpdate => 'Update anwenden'; @override String get doctorApplying => 'Wird angewendet…'; @override String get doctorApplyDone => 'Update angewendet. Studio neu starten, um die neue Daemon-Version zu sehen.'; @override String get mcpHeader => 'MCP-CLIENTS'; @override String get mcpHint => 'Externe MCP-Server bringen ihre Tools als `mcp..` Fähigkeiten ein. Einmal konfigurieren, im Store sichtbar.'; @override String get mcpEmpty => 'Keine MCP-Server konfiguriert. + klicken zum Hinzufügen.'; @override String get n8nHeader => 'N8N-ENDPUNKTE'; @override String get n8nHint => 'Aktive n8n-Workflows erscheinen als `n8n..` Fähigkeiten. Einmal konfigurieren, im Store sichtbar.'; @override String get n8nEmpty => 'Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.'; @override String get hubUnreachable => 'Hub nicht erreichbar'; @override String get hubUnreachableHint => 'Hub starten mit `chain serve`.'; @override String get languageEnglish => 'English'; @override String get languageGerman => 'Deutsch'; @override String get searchHint => 'Springe überall hin — Module, Store, Flows, Seiten…'; @override String get searchIndexing => 'Indiziere…'; @override String get searchNoMatches => 'Keine Treffer.'; @override String get searchHintNavigate => '↑↓ navigieren'; @override String get searchHintOpen => 'Enter öffnen'; @override String get searchHintClose => 'Esc schließen'; @override String get searchGroupPages => 'Seiten'; @override String get searchGroupModules => 'Module'; @override String get searchGroupStore => 'Store'; @override String get searchGroupFlows => 'Flows'; @override String get searchSettingsLabel => 'Einstellungen'; @override String searchPageHint(int n) { return 'Seite · ⌘$n'; } @override String get searchSettingsHint => 'Hub-Endpunkt, Kanäle, System-AI · ⌘;'; @override String searchInstalledModuleHint(String version) { return 'installiertes Modul · v$version'; } @override String get searchStoreUncategorized => 'ohne Kategorie'; @override String searchStoreHintWithTagline(String tagline) { return 'Store · $tagline'; } @override String searchStoreHintWithCategory(String category) { return 'Store · $category'; } @override String get searchSavedFlowHint => 'gespeicherter Flow'; @override String get systemAiTitle => 'System-AI'; @override String get 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.'; @override String get systemAiProviderLabel => 'Provider'; @override String get systemAiEndpointLabel => 'Endpunkt-URL (bis /v1)'; @override String get systemAiApiKeyRequired => 'API-Key-Umgebungsvariable (erforderlich)'; @override String get systemAiApiKeyOptional => 'API-Key-Umgebungsvariable (optional)'; @override String systemAiApiKeyDisclaimer(String name) { return 'Studio liest oder speichert den Key-Wert nie — nur den Namen der Umgebungsvariable. Der Hub liest `\$$name` zur Anfragezeit.'; } @override String get systemAiTestConnection => 'Verbindung testen'; @override String get systemAiTesting => 'Teste…'; @override String get systemAiSave => 'Speichern'; @override String get systemAiPrivacyHeader => 'PRIVACY-MODUS'; @override String get systemAiPrivacyOffLabel => 'Aus'; @override String get systemAiPrivacyOffDesc => 'Feature deaktiviert. Keine Anfragen verlassen den Hub.'; @override String get systemAiPrivacyRedactedLabel => 'Redigiert'; @override String get systemAiPrivacyRedactedDesc => 'Nur event_type / error / Modul-Namen. KRITIS-freundlicher Standard.'; @override String get systemAiPrivacyFullLabel => 'Voll'; @override String get systemAiPrivacyFullDesc => 'Enthält das Audit-Detail-JSON (nur Hash — keine Roh-Payloads).'; @override String get systemAiConnectionOk => 'Verbindung ok'; @override String get systemAiConnectionFailed => 'Verbindung fehlgeschlagen'; @override String systemAiReplyPrefix(String text) { return 'Antwort: $text'; } @override String get systemAiModelLabel => 'Modell (erforderlich)'; @override String get systemAiModelHintFallback => 'Modell-Identifier, den der Provider erwartet'; @override String get systemAiModelHelperBase => 'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen.'; @override String get systemAiModelHelperOllama => 'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen. Mit Pull von Ollama herunterladen.'; @override String get systemAiRefresh => 'Aktualisieren'; @override String get systemAiPull => 'Pull'; @override String get systemAiPulling => 'Lade…'; @override String systemAiCouldNotListModels(String error) { return 'Modelle konnten nicht aufgelistet werden: $error'; } @override String get systemAiNoModelsOllama => 'Noch keine Modelle auf dem Ollama-Server. Oben eintippen und Pull klicken.'; @override String get systemAiNoModelsGeneric => 'Provider lieferte keine Modelle.'; @override String get systemAiSuitabilityRecommended => 'empfohlen'; @override String get systemAiSuitabilityBalanced => 'ausgewogen'; @override String get systemAiSuitabilitySmall => 'klein — Qualität evtl. eingeschränkt'; @override String get systemAiSuitabilityLarge => 'groß — langsamer'; @override String get systemAiSuitabilityHuge => 'sehr groß — auf einem Laptop wahrscheinlich zu langsam'; @override String get systemAiSuitabilityUnknown => 'Größe unbekannt'; @override String systemAiHwDetected(String summary) { return 'Erkannt: $summary'; } @override String systemAiHwReviewed(String date) { return ' · Kuratierung geprüft $date'; } @override String systemAiLegendRecommended(String tier) { return 'empfohlen für diese Hardware$tier'; } @override String get systemAiLegendBalanced => 'ausgewogen (4-8B)'; @override String get systemAiLegendSmallLarge => 'klein <3B / groß 9-15B / über Hardware'; @override String get systemAiLegendHuge => 'sehr groß >15B'; @override String get systemAiLegendUnknown => 'Größe unbekannt'; @override String systemAiCacheRow(int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'gespeicherte Erklärungen', one: 'gespeicherte Erklärung', ); return 'Cache: $n $_temp0. Identische Prompts treffen den Cache; Modell- oder Privacy-Modus-Wechsel leeren ihn automatisch.'; } @override String get systemAiCacheClear => 'Leeren'; @override String systemAiCacheClearedToast(int n) { return '$n gespeicherte System-AI-Erklärungen gelöscht.'; } @override String systemAiCacheClearFailed(String error) { return 'Cache-Löschen fehlgeschlagen: $error'; } @override String get systemAiPullEmptyError => 'Erst eine Modell-ID eintippen (z.B. gemma3:4b).'; @override String systemAiPullFailedError(String error) { return 'Pull fehlgeschlagen: $error'; } @override String storeProvenanceTemporal(String provider) { return 'temporal · $provider'; } @override String get storeSourceTemporal => 'Temporal'; @override String get navFlowEditor => 'Editor'; @override String get flowEditorBackTooltip => 'Zurück'; @override String get flowEditorNew => 'Neuer Flow'; @override String get flowEditorSave => 'Speichern'; @override String get flowEditorRun => 'Ausführen'; @override String get flowEditorRefresh => 'Datei-Liste neu laden'; @override String get flowEditorRunOutput => 'LAUF-ERGEBNIS'; @override String get flowEditorEmptyTitle => 'Kein Flow geöffnet'; @override String get flowEditorEmptyBody => 'Wähle links einen aus oder klicke Neuer Flow um einen neuen anzulegen.'; @override String get flowEditorListEmptyTitle => 'Keine gespeicherten Flows'; @override String get flowEditorListEmptyBody => 'Klicke Neuer Flow um aus einer Vorlage zu starten.'; @override String get flowEditorDiscardTitle => 'Ungespeicherte Änderungen verwerfen?'; @override String get flowEditorDiscardBody => 'Beim Wechsel der Datei gehen alle noch nicht gespeicherten Änderungen verloren.'; @override String get flowEditorDiscardKeep => 'Weiterbearbeiten'; @override String get flowEditorDiscardThrow => 'Verwerfen'; @override String get flowEditorNewDialogTitle => 'Neuer Flow'; @override String get flowEditorNewDialogLabel => 'Flow-Name'; @override String get flowEditorNewDialogHelper => 'Kleinbuchstaben, Ziffern, Bindestrich, Unterstrich'; @override String get flowEditorNewDialogCancel => 'Abbrechen'; @override String get flowEditorNewDialogCreate => 'Anlegen'; @override String flowEditorNewTemplateComment(String name) { return 'Von Studios Flow-Editor erstellt. Bearbeiten, speichern, ausführen.'; } @override String flowEditorAlreadyExists(String name) { return 'Ein Flow namens \"$name\" existiert bereits.'; } @override String get buttonView => 'Ansehen'; @override String logViewerTitle(String title, int count) { return '$title — letzte $count Zeilen'; } @override String get logViewerEmpty => 'Log-Datei ist leer oder existiert noch nicht.'; @override String get logViewerCopyAll => 'Alles kopieren'; @override String get logViewerOpenExternal => 'Im Standardeditor öffnen'; @override String logViewerLineCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, other: '$count Zeilen', one: '1 Zeile', ); return '$_temp0'; } @override String get doctorPathStudioErrors => 'Studio-Fehler'; @override String get settingsCategoryGeneral => 'Allgemein'; @override String get settingsCategoryAppearance => 'Darstellung'; @override String get settingsCategoryAi => 'System-KI'; @override String get settingsCategoryIntegrations => 'Integrationen'; @override String get settingsCategorySecurity => 'Sicherheit'; @override String get settingsCategoryMaintenance => 'Wartung'; @override String get settingsAiPanelTitle => 'System-KI'; @override String get settingsAiPanelBody => 'Operator-verwalteter LLM-Endpunkt, den Studio für die KI-Helfer nutzt (System-KI-Edit, Install-Vorschläge, Doctor-Zusammenfassung). Kein Flow ruft das jemals auf; Module sprechen mit ihrem eigenen LLM.'; @override String get settingsIntegrationsPanelTitle => 'Integrationen'; @override String get settingsIntegrationsPanelBody => 'Externe Tool-Server, deren Capabilities der Hub föderiert. MCP-Server bieten Tool-Endpunkte; n8n-Endpunkte stellen gehostete Workflows bereit.'; @override String get settingsSecurityPanelTitle => 'Sicherheit & Zugangsdaten'; @override String get settingsSecurityPanelBody => 'Tokens, die der Hub für dich verwahrt. Liegen in ~/.chain/ mit Modus 0600; werden nie als Telemetrie versendet.'; @override String get settingsMaintenancePanelTitle => 'Wartung'; @override String get settingsMaintenancePanelBody => 'Destruktive Aktionen, abgesichert durch explizite Bestätigungs-Dialoge. Nutzen z.B. beim Re-Pilot-Testen oder Debuggen.'; @override String get tooltipMoveUp => 'Nach oben'; @override String get tooltipMoveDown => 'Nach unten'; @override String get tooltipRemove => 'Entfernen'; @override String get daemonActionEnableAutostart => 'Autostart aktivieren'; @override String get daemonActionDisableAutostart => 'Autostart deaktivieren'; @override String get daemonActionRestart => 'Daemon neu starten'; @override String get daemonActionStart => 'Daemon starten'; @override String get daemonActionStop => 'Daemon stoppen'; @override String get daemonActionStatus => 'Daemon-Status'; @override String daemonActionResultOk(String label) { return 'OK · $label'; } @override String daemonActionResultFailed(String label) { return 'Fehlgeschlagen · $label'; } @override String get addSourceTitle => 'Modul-Quelle hinzufügen'; @override String addSourceIntro(String capability) { return '`$capability` ist nicht im öffentlichen Store. Zeig dem Hub eine `.fai`-Bundle-URL oder einen lokalen Bundle-Pfad — der Hub lädt es herunter, prüft (sha256 + Signatur) und installiert.'; } @override String get addSourceField => 'URL oder Pfad zum .fai-Bundle'; @override String get addSourceHint => 'https://git.flemming.ai/deine-org/dein-modul/releases/download/v0.1.0/foo-0.1.0.fai'; @override String get addSourceHowItWorksTitle => 'Wie private Module funktionieren'; @override String get addSourceHowItWorksBody => 'Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: `chain pack ` baut ein `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:'; @override String get addSourceCliExample => 'chain install --link /pfad/zum/modul'; @override String get addSourceInstallButton => 'Installieren'; @override String get addSourceCancel => 'Abbrechen'; @override String installFailed(String error) { return 'Installation fehlgeschlagen: $error'; } @override String get welcomeHubDownTitle => 'Der Hub läuft noch nicht'; @override String get welcomeHubDownBody => 'Studio spricht mit einem lokalen Hub — der Engine, die Module lädt und Flows ausführt. Sie ist gerade nicht erreichbar. Starte sie, um loszulegen.'; @override String get welcomeHubDownStart => 'Hub starten'; @override String get welcomeHubDownStarting => 'Wird gestartet …'; @override String get welcomeHubDownDocsLink => 'Klappt der Start nicht? Zur Erste-Schritte-Anleitung'; @override String welcomeHubDownEndpoint(String endpoint) { return 'Endpunkt: $endpoint'; } @override String get daemonStartRequested => 'Start des Daemons angefordert. Verbinde neu …'; @override String daemonStartFailed(String detail) { return 'Daemon konnte nicht gestartet werden: $detail'; } @override String get faiBinaryNotFound => 'Das Programm `fai` wurde auf diesem Rechner nicht gefunden.'; @override String get faiBinaryNotFoundHint => 'Installiere die Ch∆In-Plattform oder verweise Studio auf eine vorhandene `fai`-Datei.'; @override String get faiBinaryLocateButton => '`fai`-Programm suchen …'; @override String get faiBinaryInstallDocsButton => 'Installationsanleitung öffnen'; @override String get faiBinaryPickerTitle => '`fai`-Programm auswählen'; @override String faiBinarySetOk(String path) { return 'Verwende `fai` unter $path'; } @override String get sysAiFixParse => 'Der Anbieter hat in einem unerwarteten Format geantwortet. Anbieter, die nicht OpenAI-kompatibel sind, brauchen ggf. einen Übersetzungs-Proxy.'; @override String sysAiFixUnknown(String kind) { return 'Unerwarteter Fehler ($kind). Siehe System-KI-Dokumentation.'; } @override String get sysAiFixDisabled => 'Richte die System-KI in den Einstellungen (Cmd+,) → Bereich System-KI ein.'; @override String get sysAiFixEnvMissing => 'Die Umgebungsvariable für den API-Schlüssel ist leer. Setze sie in deiner Shell und starte den Daemon neu.'; @override String get sysAiFixNetwork => 'Der Hub erreicht den konfigurierten Endpunkt nicht. Läuft dein Anbieter?'; @override String get sysAiFixHttp => 'Der Anbieter hat einen Status außerhalb 2xx geliefert. Prüfe Endpunkt, Modellname und API-Schlüssel.'; @override String get sysAiFixEmptyResponse => 'Der Anbieter hat keinen Inhalt geliefert. Probiere ein anderes Modell oder formuliere den Prompt um.'; @override String channelSwitchOk(String name) { return 'Aktiver Kanal auf \"$name\" umgeschaltet. Daemon neu gestartet.'; } @override String channelSwitchFailed(String detail) { return 'Kanalwechsel fehlgeschlagen: $detail'; } @override String get providerDescOllama => 'Lokales `ollama serve`. Die Modelle bleiben auf deinem Rechner. Kein API-Schlüssel nötig.'; @override String get providerDescOpenai => 'Gehostete OpenAI-API. Erfordert einen API-Schlüssel. Daten verlassen deinen Rechner.'; @override String get providerDescLmstudio => 'Lokaler LM-Studio-Server. Die Modelle bleiben auf deinem Rechner. Kein API-Schlüssel nötig.'; @override String get providerDescVllm => 'Selbst gehostetes vLLM oder ein anderer OpenAI-kompatibler Server. Endpunkt erforderlich.'; @override String get providerDescCustom => 'Alles andere, das die OpenAI-kompatible Chat-Completions-Schnittstelle spricht (LiteLLM-Proxy, interner Spiegel, …).'; @override String welcomeDocLoadFailedBody( String slug, String locale, String attempted, String underlying, ) { return 'Die mitgelieferte Doku \"$slug\" ($locale) konnte nicht geladen werden.\nVersucht: $attempted\nUrsache: $underlying\nMeist ist der installierte Studio-Build älter als das Doku-Bundle. Baue Studio neu oder öffne die Online-Kopie.'; } @override String hubUnreachableBanner(String endpoint) { return '$endpoint nicht erreichbar — Einstellungen öffnen'; } @override String get hubUnreachableOpenSettings => 'Einstellungen öffnen'; @override String get navFederation => 'Föderation'; @override String get federationTitle => 'Föderation'; @override String get federationReloadTooltip => 'Satelliten neu laden'; @override String get federationAddSatellite => 'Satellit hinzufügen'; @override String get federationEmptyTitle => 'Keine Satelliten verbunden'; @override String get federationEmptyHint => 'Verbinde einen weiteren Hub als Satellit, um Capabilities dort auszuführen. Stelle dazu ein Enrollment-Token aus.'; @override String get federationPillConnected => 'verbunden'; @override String get federationRegionNone => 'keine Region'; @override String federationCapabilities(int count) { return '$count angebotene Capabilities'; } @override String get federationAddDialogTitle => 'Enrollment-Token ausstellen'; @override String get federationNameLabel => 'Satelliten-Name'; @override String get federationIssueButton => 'Ausstellen'; @override String federationIssueFailed(String error) { return 'Token konnte nicht ausgestellt werden: $error'; } @override String federationEnrollmentTitle(String name) { return '$name einrichten'; } @override String get federationTokenLabel => 'Bootstrap-Token (einmalig)'; @override String get federationConfigLabel => 'Satelliten-Konfiguration (in den Satelliten einfügen)'; @override String get federationCopied => 'In die Zwischenablage kopiert'; @override String get federationEnrollmentHint => 'Übergib das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte CA macht den ersten Connect des Satelliten manipulationssicher.'; }