// 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 errModuleDownload => 'Modul-Download fehlgeschlagen'; @override String get errModuleDownloadHint => 'Die Bundle-URL des Moduls ist nicht erreichbar (Statuscode unten). Der Hub läuft — URL/Host korrigieren oder anderen Store wählen.'; @override String storeFromSource(String store) { return 'aus $store'; } @override String get guidedSetupTitle => 'Setup-Assistent'; @override String get guidedSetupIntro => 'Beantworten Sie drei Fragen — Ch∆In stellt passende Konfiguration, Modul-Set und Beispiel-Flow zusammen.'; @override String get guidedSetupScenario => 'Szenario'; @override String get guidedSetupIntent => 'Aufgabe'; @override String get guidedSetupTarget => 'Wo läuft es?'; @override String get guidedSetupApproval => 'Menschlichen Freigabe-Schritt vor dem KI-Schritt verlangen'; @override String get guidedSetupDataLocal => 'Daten müssen lokal bleiben (air-gapped)'; @override String get guidedSetupReviewHeading => 'Diesen Plan wird Ch∆In anwenden:'; @override String get guidedSetupApply => 'Setup übernehmen'; @override String get guidedSetupApplied => 'Setup übernommen. Schließe mit den Schritten unten ab:'; @override String get guidedSetupBack => 'Zurück'; @override String get guidedSetupNext => 'Weiter'; @override String get guidedSetupCancel => 'Abbrechen'; @override String get guidedSetupClose => 'Schließen'; @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 Datenverarbeitung in regulierten Umgebungen.'; @override String get welcomePillarHubTitle => 'Hub'; @override String get welcomePillarHubBody => 'Das Programm, das alles ausführt. Es läuft direkt auf Ihrem Rechner, braucht keine Zusatzsoftware und speichert alles Wichtige in einer einzigen Datei.'; @override String get welcomePillarHubTech => 'Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den Zustand. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.'; @override String get welcomePillarModuleTitle => 'Modul'; @override String get welcomePillarModuleBody => 'Ein Baustein, der genau eine Aufgabe erledigt — zum Beispiel Text aus Dokumenten lesen. Jedes Modul sagt vorab, worauf es zugreifen will; mehr erlaubt der Hub nicht.'; @override String get welcomePillarModuleTech => 'Eine kleine WebAssembly-Komponente in einer Sandbox. 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 => 'Ein Ablaufplan, der Module zu festen Schritten verbindet. Eingaben rein, Schritte laufen der Reihe nach, Ergebnis raus — und jeder Schritt wird fälschungssicher protokolliert.'; @override String get welcomePillarFlowTech => 'Eine YAML-Datei, die Module verkettet; jeder Schritt wird in einem hash-verketteten Audit-Log festgehalten, das die Diagnose-Seite komplett verifiziert.'; @override String get welcomePillarTechToggle => 'Für Technik-Interessierte'; @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 => 'Manipulationserkennendes 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 => 'Manipulationserkennendes Audit-Log'; @override String get welcomeDocAuditBlurb => 'Wie die Hash-Kette nachträgliche Änderungen erkennbar macht — und was die Integritätsstufe WORM-1 leistet (und was nicht).'; @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. Tragen Sie 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 klicken Sie 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-KI konfigurieren'; @override String get welcomeChecklistAiHint => 'Einstellungen → System-KI. Wird für die KI-Suche und Fehlererklärungen gebraucht.'; @override String get welcomeChecklistMcp => 'Öffentlichen Werkzeug-Katalog verbinden'; @override String get welcomeChecklistMcpHint => 'Verbindet einen öffentlichen Werkzeug-Katalog (Fachbegriff: MCP) — dessen Fähigkeiten erscheinen dann im Store. Dort hinzufügen oder unter Einstellungen → MCP-Clients.'; @override String get welcomeChecklistModule => 'Ein Text-Modul installieren'; @override String get welcomeChecklistModuleHint => 'Im Store ein Modul aus der Kategorie Ihrer Wahl installieren. Module sind isolierte (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; ein eigener funktioniert genauso.'; @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 zum 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. Klicken Sie auf 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 brauchen Sie? Zum Beispiel „ein Modul, das tabellarische Daten liest\" — oder geben Sie einfach einen Begriff ein.'; @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 => 'Konfigurieren Sie 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 storeStatusAlphaHelp => 'Frühe Version: läuft, wird aber noch weiterentwickelt und ist nicht für den regulierten Produktivbetrieb freigegeben.'; @override String get storeStatusPublishedHelp => 'Vom Herausgeber für den allgemeinen Einsatz freigegeben.'; @override String get storeStatusPlannedHelp => 'Angekündigt, aber noch nicht verfügbar.'; @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 get storeCatDocuments => 'Dokumente'; @override String get storeCatTextLanguage => 'Text & Sprache'; @override String get storeCatData => 'Daten & Formate'; @override String get storeCatAiLlm => 'KI & LLM'; @override String get storeCatWebApi => 'Web & APIs'; @override String get storeCatAnalysisDomain => 'Analyse & Domäne'; @override String get storeCatStudioThemes => 'Studio & Themes'; @override String get storeCatExamplesDev => 'Beispiele & Dev'; @override String get storeCatOther => 'Sonstiges'; @override String get storeSegmentModules => 'Module'; @override String get storeSegmentStudio => 'Studio & Themes'; @override String storeNResults(int n) { return '$n Treffer'; } @override String get storeReloadTooltip => 'Aktualisieren'; @override String get storesManagerButton => 'Store hinzufügen'; @override String get storesManagerTitle => 'Module-Stores'; @override String get storesManagerIntro => 'Der Hub führt die Module aller Stores unten zu einem Index zusammen. Fügen Sie die Index-URL eines Stores hinzu, damit seine Module hier installierbar werden.'; @override String get storesManagerAddSection => 'Store hinzufügen'; @override String get storesManagerNameLabel => 'Name'; @override String get storesManagerUrlLabel => 'Index-URL (https:// oder file://)'; @override String get storesManagerAddAction => 'Hinzufügen'; @override String storesManagerBundled(int count) { return '$count Module · gebündelt'; } @override String storesManagerModuleCount(int count) { return '$count Module'; } @override String get storesManagerAddFailed => 'Store konnte nicht hinzugefügt werden'; @override String get storesManagerRemoveFailed => 'Store konnte nicht entfernt werden'; @override String get storesManagerSuggested => 'Vorgeschlagene Stores'; @override String get storesManagerAddShort => 'Hinzufügen'; @override String get storesManagerPinnedKeyLabel => 'Signatur-Schlüssel anheften (PEM, optional)'; @override String get storesManagerPinnedKeyHint => 'Nur Module, die mit diesem Schlüssel signiert sind, werden aus dieser Quelle angenommen. Fügen Sie den öffentlichen Schlüssel (PEM) des Herausgebers ein — statt des eingebauten Herstellerschlüssels.'; @override String get storesManagerNotAvailable => 'Noch nicht verfügbar'; @override String get storesManagerNotAvailableHint => 'Der Anbieter hat diesen Store-Index noch nicht veröffentlicht. Sobald er das tut, ist er installierbar.'; @override String get storesSuggestedReclaimDesc => 'Recl∆Im — Module für Rechts- und Pflichten-Reform-Mapping'; @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. Setzen Sie CHAIN_REGISTRY_TOKEN in der Umgebung des Daemons und starten Sie 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. Öffnen Sie 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 => 'Starten Sie 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 => 'Schritt'; @override String get auditFilterModule => 'Modul'; @override String get auditFilterTooltip => 'Ereignisse filtern'; @override String get auditClearLogTooltip => 'Protokoll löschen (nur local/dev Kanal)'; @override String get auditMoreTooltip => 'Weitere Aktionen'; @override String get auditSearchHint => 'Ereignisse durchsuchen (Flow, Schritt, Modul, Fehlertext …)'; @override String get auditExportAction => 'Aktuelle Ansicht als JSONL exportieren …'; @override String get auditExportNothing => 'Keine Ereignisse in der aktuellen Ansicht — nichts zu exportieren.'; @override String auditExportSaved(int n, String path) { return '$n Ereignisse exportiert nach $path'; } @override String get auditDevResetAction => 'Entwicklungs-Reset: Protokoll löschen … (nur local/dev)'; @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 .chain-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 authPolicyHeader => 'ZUGRIFFSSCHUTZ DES HUBS'; @override String get authPolicyBlurb => 'Wie der Hub eingehende Aufrufe prüft: aktives Prüfverfahren, Tokens und ihre Rechte (Scopes). Geheimnisse bleiben in Umgebungsvariablen — hier erscheinen nur deren Namen.'; @override String get authPolicyValidatorStatic => 'Prüfverfahren: statische Token-Liste'; @override String get authPolicyValidatorJwt => 'Prüfverfahren: JWT (RS256) über eine externe Identitätsstelle'; @override String get authPolicyAnonymous => 'Keine Tokens konfiguriert — der Hub akzeptiert anonyme Aufrufe. Für lokales Arbeiten in Ordnung; für den Produktivbetrieb Tokens in ~/.chain/config.yaml einrichten.'; @override String get authPolicyReloadRequired => 'Die Konfigurationsdatei (oder eine Umgebungsvariable) wurde seit dem Laden geändert — der Hub erzwingt noch den alten Stand. Unten „Neu laden“ wählen, damit die Änderung wirkt.'; @override String get authPolicyNeedsAdmin => 'Diese Ansicht braucht ein Token mit admin-Recht. Hinterlegen Sie es oben unter „Hub-Authentifizierung“ und laden Sie neu.'; @override String get authPolicyHubTooOld => 'Der verbundene Hub kennt diese Ansicht noch nicht — er ist älter als Studio. Aktualisieren Sie den Hub (chain update apply) und laden Sie neu.'; @override String get authPolicyRetry => 'Erneut versuchen'; @override String get authPolicyReload => 'Tokens neu laden'; @override String authPolicyReloadDone(int n) { return 'Neu geladen — $n Token aktiv.'; } @override String get authPolicyEditHint => 'Bearbeitet wird die Richtlinie in ~/.chain/config.yaml (Abschnitt auth:). Nach einer Änderung oder Token-Rotation hier neu laden — der Hub übernimmt sie ohne Neustart.'; @override String authPolicyEnvSet(String env) { return 'Umgebungsvariable $env ist gesetzt'; } @override String authPolicyEnvMissing(String env) { return 'Umgebungsvariable $env FEHLT — das Token ist nicht nutzbar'; } @override String authPolicyRateLimit(int n) { return '$n/min'; } @override String get authPolicyJwtKeySource => 'Schlüsselquelle'; @override String get authPolicyJwtAudience => 'Audience (aud)'; @override String get authPolicyJwtIssuer => 'Aussteller (iss)'; @override String get authPolicyJwtScopeClaim => 'Scope-Claim'; @override String get authPolicyNotChecked => 'wird nicht geprüft'; @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ählen Sie 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 => 'Sie sind eingerichtet.'; @override String get welcomeChecklistAllSetBody => 'Drei Stränge, an denen Sie als Nächstes ziehen können:'; @override String get welcomeChecklistNextAuditTitle => 'Audit-Log lesen'; @override String get welcomeChecklistNextAuditBody => 'Jede Installation, jeder Flow-Lauf, jede Freigabe landet im hash-verketteten Protokoll. Im Protokoll-Tab sehen Sie, was Ihr Hub gemacht hat.'; @override String get welcomeChecklistNextAuditButton => 'Protokoll öffnen'; @override String get welcomeChecklistNextTodayTitle => 'Daily-Today-Story einrichten'; @override String get welcomeChecklistNextTodayBody => 'Für Fortgeschrittene: das Skript tools/today/propose.sh regelmäßig (Cron) laufen lassen — die Editorial-Karte im Store füllt sich dann mit kuratierten Stories.'; @override String get welcomeChecklistNextTodayButton => 'Today-Doku öffnen'; @override String get welcomeChecklistNextModuleTitle => 'Eigenes Modul bauen'; @override String get welcomeChecklistNextModuleBody => 'Für Entwickler: Mit chain new module entsteht ein fertiges Modul-Gerüst (Rust+WASM). Das module-sdk übernimmt die technische Anbindung; Sie schreiben nur die eigentliche Logik.'; @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. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage 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 => 'ZU PRÜFENDE DATEN'; @override String get approvalsNoPayload => 'Keine Daten zum Prüfen angehängt. Der system.approval-Schritt des Flows bestimmt über sein \"show:\"-Feld, was angezeigt wird — setzen Sie es, um die Daten hinter dieser Entscheidung sichtbar zu machen.'; @override String get approvalsNoDataConfirmTitle => 'Ohne Prüfdaten freigeben?'; @override String get approvalsNoDataConfirmBody => 'Dieser Flow hat bewusst keine Prüfdaten hinterlegt (kein \"show:\" am Freigabe-Schritt). Sie können trotzdem freigeben — entscheiden dann aber, ohne die Daten hinter dieser Entscheidung gesehen zu haben.'; @override String get approvalsNoDataConfirmAction => 'Trotzdem freigeben'; @override String get approvalsRequestFallback => 'Freigabe für diesen Schritt erforderlich'; @override String approvalsFlowStepMeta(String flow, String step) { return 'Flow: $flow · Schritt: $step'; } @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) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: '$n Fähigkeiten', one: '1 Fähigkeit', ); return '$_temp0'; } @override String get doctorSummaryPending => 'offen'; @override String doctorSummaryChain(int verified, int total) { return '$verified von $total Ereignissen geprüft'; } @override String get doctorSummaryDeclared => 'deklariert'; @override String doctorModulesPanelSummary(int n, int m) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: '$n Module', one: '1 Modul', ); String _temp1 = intl.Intl.pluralLogic( m, locale: localeName, other: '$m Fähigkeiten', one: '1 Fähigkeit', ); return '$_temp0 · $_temp1'; } @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) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: 'Ereignisse', one: 'Ereignis', ); return '$n $_temp0 · 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 => 'Integritätskette geprüft'; @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ählen Sie links einen aus oder klicken Sie auf Neuer Flow, um einen neuen anzulegen.'; @override String get flowEditorListEmptyTitle => 'Keine gespeicherten Flows'; @override String get flowEditorListEmptyBody => 'Klicken Sie auf 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 settingsCategoryAbout => 'Über'; @override String get aboutPanelTitle => 'Über Ch∆In'; @override String get aboutPanelBody => 'Produkt-, Hersteller- und Lizenzangaben dieser Installation — alle Werte sind kopierbar.'; @override String get aboutProduct => 'Produkt'; @override String get aboutStudioVersion => 'Studio-Version'; @override String get aboutHubVersion => 'Hub-Version'; @override String get aboutHubVersionUnknown => 'nicht verbunden'; @override String get aboutVendor => 'Hersteller'; @override String get aboutAuthor => 'Autor'; @override String get aboutLicense => 'Lizenz'; @override String get aboutContact => 'Kontakt'; @override String get aboutDocs => 'Dokumentation'; @override String get aboutOpenLink => 'Im Browser öffnen'; @override String get aboutCopyTooltip => 'Kopieren'; @override String get aboutCopiedToast => 'In die Zwischenablage kopiert.'; @override String get sidebarSearchLabel => 'Suchen & Befehle'; @override String installConfirmTitle(String name) { return '„$name\" installieren?'; } @override String get installConfirmVersion => 'Version'; @override String get installConfirmSource => 'Quelle'; @override String get installConfirmSourceBundled => 'Mitgelieferter Store-Index'; @override String get installConfirmLicense => 'Lizenz'; @override String get installConfirmStatus => 'Reifegrad'; @override String get installConfirmNeedsServices => 'Benötigte Dienste'; @override String get installConfirmNeedsCapabilities => 'Benötigte Fähigkeiten'; @override String get installConfirmTrustTitle => 'Vertrauen & Sicherheit'; @override String get installConfirmTrustBody => 'Das Modul läuft in einer Sandbox: Es darf nur auf die Netzwerk-Endpunkte, Dateien und Umgebungsvariablen zugreifen, die es selbst deklariert — der Hub setzt diese Liste durch. Die vollständige Berechtigungsliste sehen Sie nach der Installation in den Modul-Details.'; @override String get installConfirmSignatureNote => 'Signaturen prüft der Hub beim Installieren, sofern die Signaturpflicht im Sicherheitsprofil aktiv ist. Einen Signaturstatus vorab zeigt der Store-Index derzeit noch nicht an (Alpha).'; @override String get settingsSidebarPinnedTitle => 'Navigation immer ausgeklappt'; @override String get settingsSidebarPinnedBody => 'Zeigt die Beschriftungen der Seitenleiste dauerhaft an, statt sie nur beim Überfahren mit der Maus einzublenden.'; @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 Fähigkeiten 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 Sie 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. Geben Sie dem Hub eine .chain-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 .chain-Bundle'; @override String get addSourceHint => 'https://git.flemming.ai/ihre-org/ihr-modul/releases/download/v0.1.0/foo-0.1.0.chain'; @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 .chain-Bundle, das Sie beliebig hosten können (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nehmen Sie 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. Starten Sie die Engine, 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 chainBinaryNotFound => 'Das Programm chain wurde auf diesem Rechner nicht gefunden.'; @override String get chainBinaryNotFoundHint => 'Installieren Sie die Ch∆In-Plattform oder verweisen Sie Studio auf eine vorhandene chain-Datei.'; @override String get chainBinaryLocateButton => 'chain-Programm suchen …'; @override String get chainBinaryInstallDocsButton => 'Installationsanleitung öffnen'; @override String get chainBinaryPickerTitle => 'chain-Programm auswählen'; @override String chainBinarySetOk(String path) { return 'Verwende chain 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. Setzen Sie sie in Ihrer Shell und starten Sie den Daemon neu.'; @override String get sysAiFixNetwork => 'Der Hub erreicht den konfigurierten Endpunkt nicht. Läuft Ihr Anbieter?'; @override String get sysAiFixHttp => 'Der Anbieter hat einen Status außerhalb 2xx geliefert. Prüfen Sie Endpunkt, Modellnamen 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 Ihrem Rechner. Kein API-Schlüssel nötig.'; @override String get providerDescOpenai => 'Gehostete OpenAI-API. Erfordert einen API-Schlüssel. Daten verlassen Ihren Rechner.'; @override String get providerDescLmstudio => 'Lokaler LM-Studio-Server. Die Modelle bleiben auf Ihrem 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 hubAuthRejectedBanner(String endpoint) { return '$endpoint lehnt die Anmeldung ab — Zugriffstoken prüfen'; } @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 => 'Verbinden Sie einen weiteren Hub als Satellit, um Fähigkeiten dort auszuführen. Stellen Sie dazu ein Registrierungs-Token aus.'; @override String get federationPillConnected => 'verbunden'; @override String get federationRegionNone => 'keine Region'; @override String federationCapabilities(int count) { return '$count angebotene Fähigkeiten'; } @override String get federationAddDialogTitle => 'Registrierungs-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 => 'Einmal-Token für die Einrichtung'; @override String get federationConfigLabel => 'Satelliten-Konfiguration (in den Satelliten einfügen)'; @override String get federationCopied => 'In die Zwischenablage kopiert'; @override String get federationEnrollmentHint => 'Übergeben Sie das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte Zertifikatsstelle authentifiziert die erste Verbindung des Satelliten.'; @override String get workspaceAll => 'Alle Projekte'; @override String get workspaceSwitcherTooltip => 'Arbeitsbereich — filtert diese Ansicht und stempelt neue Läufe mit dem gewählten Projekt'; @override String get workspaceProtectedHint => 'Geschützt: logisch getrennt im gemeinsamen Hub — keine harte Prozessgrenze. Kritische Mandate nutzen einen abgeschotteten Bereich.'; @override String get runsTitle => 'Läufe'; @override String get runsReloadTooltip => 'Lauf-Liste neu laden'; @override String get runsEmptyTitle => 'Keine Läufe im Hintergrund'; @override String get runsEmptyHint => 'Hier erscheinen Läufe, die im Hintergrund weiterlaufen, während Sie anderes tun. Diese Funktion ist optional und standardmäßig ausgeschaltet — die Anleitung zeigt Schritt für Schritt, wie sie eingeschaltet wird.'; @override String get runsEmptyEnabledHint => 'Läufe im Hintergrund sind eingeschaltet — es wurde nur noch keiner gestartet. Starten Sie einen Flow mit der Option „im Hintergrund ausführen“, dann erscheint er hier.'; @override String get runsEmptyGuideButton => 'Anleitung öffnen'; @override String get runsCancelButton => 'Abbrechen'; @override String runsCancelSignalled(String flow) { return 'Abbruch für $flow ausgelöst.'; } @override String get runsCancelTooLate => 'Der Lauf war schon fertig — nichts abzubrechen.'; @override String runsCurrentStep(String step) { return 'Schritt: $step'; } @override String get runsPhasePending => 'Wartet'; @override String get runsPhaseRunning => 'Läuft'; @override String get runsPhaseSucceeded => 'Erfolgreich'; @override String get runsPhaseFailed => 'Fehlgeschlagen'; @override String get runsPhaseCancelled => 'Abgebrochen'; @override String get runsPhaseUnknown => 'Unbekannt'; @override String get navRuns => 'Läufe'; @override String get workspaceSealedHeader => 'ABGESCHOTTETE BEREICHE'; @override String get workspaceSealedRunning => 'läuft'; @override String get workspaceSealedStopped => 'gestoppt'; @override String workspaceSealedStarting(String name) { return 'Starte abgeschotteten Bereich „$name“…'; } @override String workspaceSealedStarted(String name) { return 'Abgeschotteter Bereich „$name“ gestartet.'; } @override String workspaceSealedSwitchFailed(String error) { return 'Wechsel in den abgeschotteten Bereich fehlgeschlagen: $error'; } @override String get sealedIdentityBar => 'Abgeschotteter Bereich — isolierter Hub, eigene Daten und Audit-Kette'; @override String get sealedLeave => 'Verlassen'; @override String setupStepOf(int n, int total) { return 'Schritt $n von $total'; } @override String get setupStep1Title => 'Worum geht es?'; @override String get setupStep2Title => 'Was möchten Sie zuerst tun?'; @override String get setupStep3Title => 'Wo läuft es?'; @override String get setupReviewTitle => 'Das wird Ch∆In einrichten'; @override String get setupChooseFreeText => 'Oder beschreiben Sie einfach, was Sie vorhaben'; @override String get setupScenTryingOut => 'Erst mal ausprobieren'; @override String get setupScenTryingOutSub => 'Ein unkomplizierter Arbeitsplatz auf diesem Rechner — ohne Signaturpflicht, ohne Schreibschutz für das Prüfprotokoll. Später jederzeit hochstufbar: die Einrichtung erneut ausführen und ein reguliertes Profil wählen.'; @override String get setupScenTeamHub => 'Ein Team-Server'; @override String get setupScenTeamHubSub => 'Ein abgesicherter Hub für mehrere Personen — signierte Module, Ressourcen-Grenzen.'; @override String get setupScenRegulated => 'Regulierter Produktivbetrieb'; @override String get setupScenRegulatedSub => 'Signierte Module, ein lückenloses, manipulationssicheres Prüfprotokoll und eine menschliche Freigabe vor jedem KI-Schritt.'; @override String get setupScenBuildModules => 'Module entwickeln'; @override String get setupScenBuildModulesSub => 'Eine Entwickler-Einrichtung zum Schreiben und Testen eigener Module.'; @override String get setupIntentHello => 'Das Hallo-Beispiel ausführen'; @override String get setupIntentHelloSub => 'Einfach einen Flow einmal von Anfang bis Ende sehen.'; @override String get setupIntentExtract => 'Text aus Dokumenten extrahieren'; @override String get setupIntentExtractSub => 'Reinen Text aus PDF- und DOCX-Dateien holen.'; @override String get setupIntentExtractSummarize => 'Extrahieren und zusammenfassen'; @override String get setupIntentExtractSummarizeSub => 'Text extrahieren und anschließend zusammenfassen.'; @override String get setupIntentClassify => 'Eingehende Dokumente einsortieren'; @override String get setupIntentClassifySub => 'Text extrahieren und mit einem KI-Schritt klassifizieren.'; @override String get setupIntentBuildModule => 'Ein eigenes Modul bauen'; @override String get setupIntentBuildModuleSub => 'Mit einem Modul-Gerüst starten.'; @override String get setupTargetLaptop => 'Dieser Rechner'; @override String get setupTargetLaptopSub => 'Läuft lokal auf dem Gerät, an dem Sie gerade sitzen.'; @override String get setupTargetHomeServer => 'Ein eigener Server'; @override String get setupTargetHomeServerSub => 'Ein Server im eigenen Haus — startet beim Hochfahren, läuft im Hintergrund.'; @override String get setupTargetAirgapped => 'Ein vollständig lokaler Server (ohne Internet)'; @override String get setupTargetAirgappedSub => 'Ein isolierter Server ohne Internet — die strengste, privateste Betriebsart.'; @override String get setupTargetContainer => 'Ein Container'; @override String get setupTargetContainerSub => 'Docker oder Podman, mit fertigem Compose-Schnipsel.'; @override String get setupApprovalPlain => 'Vor jedem KI-Schritt einen Menschen um Freigabe bitten'; @override String get setupDataLocalPlain => 'Daten dürfen das Haus nie verlassen (vollständig lokal)'; @override String get setupPlanIntroDev => 'Ch∆In richtet einen unkomplizierten Arbeitsplatz ein.'; @override String get setupPlanIntroEnterprise => 'Ch∆In richtet einen abgesicherten Betrieb für ein Team ein.'; @override String get setupPlanIntroAirgapped => 'Ch∆In richtet einen vollständig lokalen, regulierten Betrieb ein.'; @override String get setupPlanSignatures => 'Es werden nur signierte Module zugelassen.'; @override String get setupPlanWorm => 'Das Prüfprotokoll wird zusätzlich manipulationssicher (WORM) gesichert.'; @override String get setupPlanApproval => 'Vor jedem KI-Schritt fragt das System einen Menschen um Freigabe.'; @override String setupPlanModules(String modules) { return 'Diese Module werden vorbereitet: $modules.'; } @override String setupPlanFlow(String flow) { return 'Ein Beispiel-Flow „$flow“ wird angelegt.'; } @override String setupPlanFileChanged(String path) { return 'Geändert wird nur eine Datei: $path.'; } @override String get setupPlanOverwriteWarn => 'Eine vorhandene Konfiguration wird überschrieben.'; @override String get setupApplied => 'Fertig — Ch∆In ist eingerichtet.'; @override String get setupNextTitle => 'Nächste Schritte'; @override String get setupNextHubStart => 'Hub starten'; @override String get setupHubRunning => 'Der Hub läuft.'; @override String get setupStartHubFirst => 'Starten Sie zuerst den Hub — dann lassen sich die Module hier installieren.'; @override String setupActionInstall(String module) { return '$module installieren'; } @override String setupActionInstalled(String module) { return '$module ist installiert.'; } @override String setupActionOpenFlow(String flow) { return 'Beispiel-Flow „$flow“ öffnen'; } @override String get setupModulesOfflineHint => 'Die Module kommen ohne Internet als Offline-Paket auf den Server — die Anleitung dazu steht in der Dokumentation unter „Betrieb ohne Internet“.'; @override String get setupModulesSignedHint => 'Die Module kommen aus einer eigenen, signierten Quelle — nicht aus dem öffentlichen Store.'; @override String get setupSigPublicStoreNotice => 'Diese Einrichtung lässt nur signierte Module zu. Der öffentliche Store liefert zurzeit unsignierte Pakete — die vorbereiteten Module kommen daher aus einer eigenen, signierten Quelle.'; @override String get setupAllowUnsigned => 'Installation aus dem öffentlichen Store erlauben'; @override String get setupAllowUnsignedSub => 'Lockert die Signaturpflicht bewusst. Gut zum Ausprobieren — für den regulierten Betrieb später wieder aktivieren.'; @override String get setupStartCta => 'Einrichtung starten'; @override String get setupGateIntro => 'Bevor es losgeht: drei Fragen, dann richtet Ch∆In diesen Rechner passend ein. Nichts wird ohne Ihre Bestätigung geändert.'; @override String get setupGateSkip => 'Später einrichten'; @override String get settingsRunSetup => 'Einrichtung erneut ausführen…'; @override String get settingsRunSetupHint => 'Öffnet den Einrichtungs-Assistenten (drei Fragen, Vorschau, Übernehmen). Die bestehende Konfiguration wird erst nach Ihrer Bestätigung ersetzt.'; @override String get setupPlanRunbookLocal => 'Eingerichtet wird dieser Rechner; der Hub läuft lokal und wird bei Bedarf gestartet.'; @override String get setupPlanRunbookService => 'Eingerichtet wird dieser Rechner: Der Hub startet künftig automatisch beim Hochfahren (Hintergrund-Dienst). Für einen anderen Server führen Sie die Einrichtung dort aus.'; @override String get setupPlanRunbookAirgap => 'Vorgesehen für einen isolierten Server ohne Internet — Module und Updates kommen als Offline-Paket.'; @override String get setupPlanRunbookContainer => 'Vorgesehen für den Betrieb im Container — ein fertiges Compose-Beispiel wird mitgeliefert.'; @override String get setupPlanAuditChain => 'Jeder Schritt landet in einem lückenlosen, hash-verketteten Prüfprotokoll — Manipulation wird erkennbar.'; @override String setupPlanDocs(int n) { return 'Eine passende Leseliste ($n Kapitel) wird mit dem Einrichtungs-Protokoll unter ~/.chain/ gespeichert.'; } @override String get setupTrustedPublishersHint => 'Wichtig: Hinterlegen Sie beim Hinzufügen der Quelle den Schlüssel des Herausgebers („Signatur-Schlüssel anheften“) — sonst akzeptiert der Hub jede formal gültige Signatur, egal von wem.'; @override String get setupAddSignedSource => 'Signierte Quelle hinzufügen…'; @override String get setupApplyNotes => 'Hinweise aus der Einrichtung'; @override String get setupFreeTextHint => 'z. B.: Eingehende Anträge vorprüfen und unvollständige markieren'; @override String get setupFreeTextSuggest => 'Vorschlagen lassen'; @override String setupFreeTextPrivacyLocal(String model) { return 'Ihre Beschreibung wird lokal auf diesem Rechner verarbeitet ($model).'; } @override String setupFreeTextPrivacyRemote(String model, String provider) { return 'Ihre Beschreibung wird an die eingerichtete System-KI gesendet: $model ($provider).'; } @override String get setupFreeTextUnavailable => 'Für den Freitext-Weg braucht Ch∆In eine eingerichtete System-KI (Einstellungen → System-KI). Die Auswahl oben funktioniert immer — ganz ohne KI.'; @override String setupExecHint(String path) { return 'Für Vorschau und Einrichtung führt Studio das Programm „chain“ aus: $path'; } @override String setupExecHintTcc(String path) { return 'Das Programm liegt unter $path — macOS fragt dafür eventuell einmalig nach Zugriff auf diesen Ordner (z. B. „Dokumente“). Das ist zu erwarten und in Ordnung.'; } @override String get setupNoBinaryStepHint => 'Das Programm „chain“ wurde auf diesem Rechner nicht gefunden — die Vorschau im nächsten Schritt wird fehlschlagen. Unter „Diagnose“ können Sie es auswählen oder Ch∆In installieren.'; @override String get setupNoBinary => 'Das Programm „chain“ wurde auf diesem Rechner nicht gefunden.'; @override String get setupNoBinaryHint => 'Ohne das Programm kann der Assistent die Einrichtung nicht anwenden. Wählen Sie es unter „Diagnose“ aus oder installieren Sie Ch∆In neu.'; @override String get setupCliTooOld => 'Das installierte „chain“-Programm ist älter als Studio und kennt diesen Assistenten noch nicht.'; @override String setupCliTooOldHint(String path) { return 'Gefunden wurde: $path. Bitte Ch∆In aktualisieren (Seite „Diagnose“ → Update, oder im Terminal: chain update apply) und den Assistenten danach erneut öffnen.'; } @override String get setupPreviewFailed => 'Die Plan-Vorschau konnte nicht erstellt werden — das Programm „chain“ meldet einen Fehler.'; @override String get setupApplyFailed => 'Die Einrichtung konnte nicht angewendet werden — das Programm „chain“ meldet einen Fehler.'; @override String setupCliUsedBinary(String path) { return 'Ausgeführt wurde: $path'; } @override String get setupFreeTextParseError => 'Die System-KI hat keinen verwertbaren Vorschlag geliefert. Wählen Sie oben aus dem Menü — oder versuchen Sie es noch einmal.'; @override String get setupReflectionTitle => 'So verstehe ich Ihre Aufgabe'; @override String setupReflectionScenario(String label) { return 'Worum es geht: $label'; } @override String setupReflectionIntent(String label) { return 'Erste Aufgabe: $label'; } @override String setupReflectionTarget(String label) { return 'Umgebung: $label'; } @override String get setupReflectionApproval => 'Vor jedem KI-Schritt wird ein Mensch um Freigabe gebeten.'; @override String get setupReflectionDataLocal => 'Daten bleiben vollständig im Haus.'; @override String get setupReflectionEditHint => 'Es wird nichts ohne Ihre Bestätigung geändert. Passen Sie die Punkte an oder gehen Sie direkt zur Vorschau.'; @override String get setupReflectionAdjust => 'Anpassen'; @override String get setupReflectionToPreview => 'Zur Vorschau'; @override String get setupProfileDev => 'unkomplizierter Arbeitsplatz'; @override String get setupProfileEnterprise => 'abgesicherter Team-Betrieb'; @override String get setupProfileAirgapped => 'vollständig lokaler, regulierter Betrieb'; @override String welcomeChecklistSetupDone(String profile) { return 'Die Grundeinrichtung ($profile) hat der Einrichtungs-Assistent bereits erledigt — hier sehen Sie, was auf dem Hub schon passiert ist.'; } }