// 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 welcomeDocFederationTitle => 'Föderation'; @override String get welcomeDocFederationBlurb => 'Weitere Hubs (Satelliten) anbinden, damit ihre Fähigkeiten hier nutzbar werden — was ein Satellit ist und wie die Anbindung abläuft.'; @override String get welcomeDocRunsTitle => 'Hintergrund-Läufe'; @override String get welcomeDocRunsBlurb => 'Flows, die im Hintergrund weiterlaufen — wozu, wie man die Funktion einschaltet und die Läufe überwacht.'; @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 errNoStoreEntry => 'Kein Store-Eintrag bietet diese Capability an.'; @override String get errNoStoreEntryHint => 'Drei Wege: lokales Modul installieren (chain install --link ), den passenden Store hinzufügen (Einstellungen → Stores) oder die Anbindung (MCP/n8n) einrichten, die sie bereitstellt. Falls gerade erst veröffentlicht: zuerst die Store-Seite aktualisieren.'; @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. Die Liste zeigt den Live-Zustand — nach einer Änderung oben rechts 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 buttonLearnMore => 'Mehr erfahren'; @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 Endpunkt 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 storeCategoryDocument => 'Dokument'; @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 & Designs'; @override String get storeCatExamplesDev => 'Beispiele & Dev'; @override String get storeCatOther => 'Sonstiges'; @override String get storeSegmentModules => 'Module'; @override String get storeSegmentStudio => 'Studio & Designs'; @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 storeFeaturedBadge => 'EMPFOHLEN'; @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 auditExportAllAction => 'Vollständiges Protokoll als JSONL exportieren …'; @override String get auditExportAllNothing => 'Das Protokoll ist leer — nichts zu 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 geprüft'; @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 auditClearReviewerHelper => 'Wird als ungeprüfte Angabe festgehalten (Präfix „unverified:“) — der Hub übernimmt den Namen unverändert.'; @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 => 'Zu dieser Freigabe wurden keine Daten hinterlegt. Sie entscheiden ohne Detailansicht — fragen Sie im Zweifel die Person, die den Vorgang eingerichtet hat. (Technisch: das Feld \"show:\" des Freigabe-Schritts legt fest, was hier erscheint.)'; @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 approvalsIntroHelp => 'Hier warten pausierte Vorgänge (Flows) auf Ihre Entscheidung. Jede Karte zeigt, welcher Vorgang an welchem Schritt hält und welche Daten er Ihnen vorlegt — Freigeben setzt ihn fort, Ablehnen stoppt ihn mit Ihrer Begründung.'; @override String get approvalsReviewerLabel => 'Sie entscheiden als'; @override String get approvalsReviewerUnverifiedPill => 'nicht überprüft'; @override String approvalsReviewerRecordedAs(Object value) { return 'Wird gespeichert als: $value'; } @override String get approvalsReviewerNoteAnonymous => 'Dieser Hub nimmt Aufrufe ohne Zugangsdaten an — eine Entscheidung lässt sich damit niemandem nachweisen. Studio kennzeichnet den Namen deshalb im Eintrag selbst als ungeprüfte Angabe.'; @override String get approvalsReviewerNoteAuthenticated => 'Der Hub prüft Ihren Zugang, übernimmt den Namen aber unverändert von Studio. Bis der Hub die Identität aus dem geprüften Zugang selbst ableitet, kennzeichnet Studio den Namen im Eintrag als ungeprüfte Angabe.'; @override String get approvalsReviewerNoteUnknown => 'Studio konnte die Zugangs-Einstellungen dieses Hubs nicht lesen (dafür braucht es Admin-Rechte). Der Name wird unverändert übernommen und deshalb im Eintrag als ungeprüfte Angabe gekennzeichnet.'; @override String get approvalsReviewerUnverifiedTooltip => 'Ungeprüfte Angabe: Dieser Name stammt vom entscheidenden Studio, nicht vom Hub.'; @override String get approvalsRejectDialogHelp => 'Die Ablehnung stoppt den Vorgang an diesem Schritt und wird mit Ihrer Begründung im Prüfprotokoll festgehalten.'; @override String get approvalsRejectReasonHelper => 'Pflichtfeld — wird im Prüfprotokoll (Audit-Log) festgehalten.'; @override String get approvalsBatchNoDataTitle => 'Ohne Prüfdaten freigeben?'; @override String approvalsBatchNoDataBody(num count, Object total) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, other: 'Von $total ausgewählten Freigaben haben $count keine Prüfdaten. Sie geben sie ohne Detailansicht frei.', one: 'Von $total ausgewählten Freigaben hat 1 keine Prüfdaten. Sie geben sie ohne Detailansicht frei.', ); return '$_temp0'; } @override String get approvalsCopyRun => 'Lauf-Kennung kopieren'; @override String get approvalsRunCopied => 'Lauf-Kennung kopiert'; @override String get approvalsUnknownReviewer => '(unbekannt)'; @override String get approvalsOriginLabel => 'HERKUNFT'; @override String get approvalsOriginProject => 'Projekt'; @override String get approvalsOriginRequested => 'Angefordert'; @override String get approvalsOriginRun => 'Lauf'; @override String get approvalsApproveTooltip => 'Setzt den Flow an diesem Schritt fort'; @override String get approvalsRejectTooltip => 'Stoppt den Flow — mit Ihrer Begründung'; @override String get approvalsApproveButton => 'Freigeben'; @override String get approvalsRejectButton => 'Ablehnen'; @override String get approvalsRejectDialogTitle => 'Freigabe ablehnen'; @override String get approvalsRejectReasonLabel => 'Begründung'; @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 => 'FRAGE'; @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 doctorOllamaSuggest(String endpoint) { return 'Die System-KI nutzt Ollama auf $endpoint — als Host-Dienst deklarieren, damit Module und Diagnose ihn kennen?'; } @override String get doctorOllamaDeclareButton => 'Als Host-Dienst deklarieren'; @override String get doctorOllamaDeclared => 'Als Host-Dienst „ollama“ deklariert — wirksam nach einem Daemon-Neustart (Knopf unten auf dieser Seite).'; @override String updateHintBanner(String local, String latest) { return 'Für den Hub ($local) ist Version $latest verfügbar.'; } @override String get updateHintOpenDoctor => 'Diagnose öffnen'; @override String get updateHintDismiss => 'Später'; @override String get svcExposureLoopback => 'nur lokal'; @override String get svcExposurePrivate => 'privates Netz'; @override String get svcExposurePublic => 'öffentlich erreichbar'; @override String get svcExposureUnknown => 'Reichweite unbekannt'; @override String get svcExposurePublicHint => 'Dieser Dienst-Endpunkt liegt auf einer öffentlichen Adresse — prüfen Sie, ob er abgesichert ist (TLS, Auth, Firewall).'; @override String get svcExposureUnknownHint => 'Hostname statt IP-Adresse — der Hub löst zur Einstufung bewusst keine Namen auf. Prüfen Sie selbst, wohin der Name zeigt.'; @override String get doctorLinkStore => 'Store öffnen'; @override String get doctorLinkApprovals => 'Freigaben öffnen'; @override String get doctorLinkAudit => 'Protokoll öffnen'; @override String get doctorLinkConfig => 'Konfiguration ansehen'; @override String get doctorLinkReleaseNotes => 'Versionshinweise im Browser öffnen'; @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 · Verkettung lückenlos geprüft'; } @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 => 'Hash-Kette 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 doctorConnLine(String endpoint, String transport, String auth) { return 'Verbindung: $endpoint · $transport · $auth'; } @override String get doctorConnTls => 'TLS-verschlüsselt'; @override String get doctorConnPlainLocal => 'unverschlüsselt (bleibt auf diesem Rechner)'; @override String get doctorConnPlainRemote => 'unverschlüsselt'; @override String doctorConnToken(int count) { return 'Token gesetzt ($count Zeichen)'; } @override String get doctorConnAnonymous => 'ohne Token (anonym)'; @override String get doctorDbVolatileWarning => 'Die Audit-Datenbank liegt in einem temporären Ordner, den das Betriebssystem jederzeit aufräumen kann. Für belastbare Nachweise gehört das Datenverzeichnis des Hubs an einen dauerhaften Ort.'; @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 hubViewTooOldTitle => 'Diese Ansicht braucht eine neuere Hub-Version'; @override String get hubViewTooOldHint => 'Der Hub ist verbunden, aber seine Version kennt diese Ansicht noch nicht. Aktualisieren Sie den Hub (Diagnose → Update), dann erscheint der Inhalt hier.'; @override String get hubViewLoadFailedTitle => 'Diese Ansicht konnte nicht geladen werden'; @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 searchGroupWorkspace => 'Projekte & Bereiche'; @override String get searchWorkspaceHint => 'Kontext wechseln · ⌘P'; @override String get searchWorkspaceSealedPickerHint => 'Auswahl öffnen · ⌘P'; @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 storeSectionMaintainers => 'Maintainer'; @override String get storeMaintainersNone => 'nicht angegeben'; @override String get installConfirmMaintainers => 'Maintainer'; @override String get storePolicyUnverifiedNotice => 'Die Signaturpflicht ist in der Hub-Richtlinie ausgeschaltet — Installationen werden nicht kryptografisch geprüft. Der Installations-Dialog zeigt den Status je Modul; für geprüfte Installationen security.require_signatures aktivieren.'; @override String get verifPillBlocked => 'blockiert'; @override String get verifPinnedKey => 'Signatur wird geprüft — hinterlegter Store-Schlüssel'; @override String get verifPinnedKeyBody => 'Der Hub verifiziert das Paket beim Installieren gegen den fest hinterlegten Schlüssel dieser Quelle. Ein manipuliertes Paket wird abgelehnt.'; @override String get verifTrustedPublishers => 'Signatur wird geprüft — vertrauenswürdige Herausgeber'; @override String get verifTrustedPublishersBody => 'Der Hub verifiziert die Signatur beim Installieren gegen die Liste vertrauenswürdiger Herausgeber. Ein Paket ohne gültige Signatur wird abgelehnt.'; @override String get verifUnverified => 'Wird ohne Signaturprüfung installiert'; @override String get verifUnverifiedBody => 'Die Signaturpflicht ist in der Hub-Richtlinie ausgeschaltet — dieses Paket wird beim Installieren nicht kryptografisch geprüft. Für geprüfte Installationen security.require_signatures aktivieren.'; @override String get verifBlocked => 'Installation würde abgelehnt'; @override String get verifBlockedBody => 'Die Richtlinie verlangt Signaturen, aber für diese Quelle ist kein Schlüsselmaterial hinterlegt — der Hub würde die Installation verweigern.'; @override String get verifFederated => 'Über Integration angebunden — keine Paket-Signatur'; @override String get verifFederatedBody => 'Dieser Eintrag ist kein installierbares Paket, sondern läuft über eine konfigurierte Integration (z. B. MCP oder n8n). Eine Paket-Signatur gibt es hier nicht; es gilt das Vertrauen in die Integration.'; @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 federationAddIntro => 'Ein Satellit ist ein weiterer Hub, den dieser Hub anbindet — dessen Fähigkeiten werden dann hier in Flows nutzbar. Sie vergeben einen Namen und erhalten ein einmaliges Token, mit dem sich der Satellit bei diesem Hub anmeldet.'; @override String get federationNameHelp => 'Frei wählbarer Name, um diesen Satelliten in der Liste wiederzuerkennen (z. B. Standort oder Zweck). Rein zur Anzeige — ändert nichts an der Technik.'; @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 workspaceDefaultProject => 'Allgemein'; @override String get workspaceSwitcherTooltip => 'Arbeitskontext wählen — gilt überall: filtert Flows, Läufe, Audit und Freigaben und stempelt neue Läufe mit dem gewählten Projekt'; @override String get workspaceAnchorCaption => 'Projekt / Bereich'; @override String workspaceStartConfirmTitle(String name) { return 'Bereich „$name“ starten?'; } @override String get workspaceStartConfirmBody => 'Dieser abgeschottete Bereich ist gerade gestoppt. Studio startet seine eigene Hub-Instanz auf diesem Rechner und verbindet sich mit ihr — laufende Bereiche wechseln ohne diese Rückfrage.'; @override String get workspaceStartConfirmAction => 'Starten und verbinden'; @override String get workspaceSealedAggregateWhy => 'Namen bleiben zusammengefasst, weil sie Mandanten verraten können.'; @override String get workspaceSealedAggregateSettings => 'Immer anzeigen: Einstellungen → Sicherheit'; @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 runsEmptyFilteredTitle(String name) { return 'Keine Läufe in Projekt „$name“'; } @override String get runsEmptyFilteredHint => 'Der Arbeitskontext filtert diese Liste — in anderen Projekten kann es Läufe geben.'; @override String get runsEmptyShowAll => 'Alle Projekte anzeigen'; @override String get runsHubTooOldTitle => 'Diese Ansicht braucht eine neuere Hub-Version'; @override String get runsHubTooOldHint => 'Der Hub ist verbunden, aber seine Version kennt die Laufübersicht noch nicht. Aktualisieren Sie den Hub, dann erscheinen die Läufe hier.'; @override String get runsHubTooOldButton => 'Diagnose öffnen'; @override String get runsHubUpdateButton => 'Hub jetzt aktualisieren'; @override String get runsHubUpdateStarted => 'Hub wird aktualisiert…'; @override String get runsLoadFailedTitle => 'Läufe konnten nicht geladen werden'; @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 workspaceSealedAggregate(int n) { String _temp0 = intl.Intl.pluralLogic( n, locale: localeName, other: '$n abgeschottete Bereiche', one: '1 abgeschotteter Bereich', ); return '$_temp0'; } @override String get workspaceSealedRevealAction => 'Namen einblenden'; @override String get settingsSealedNamesTitle => 'Abgeschottete Bereiche direkt mit Namen anzeigen'; @override String get settingsSealedNamesBody => 'Bereichsnamen können schutzwürdig sein (Kunden-/Mandantenbezug). Standardmäßig zeigt der Projekt-Umschalter sie nur zusammengefasst; die Namen erscheinen erst nach einem Klick.'; @override String get workspaceSealedRunning => 'läuft'; @override String get workspaceSealedStopped => 'gestoppt'; @override String get workspaceSealedRunningHint => 'Der abgeschottete Bereich läuft als eigener Hub-Prozess. Auswählen wechselt hinein.'; @override String get workspaceSealedStoppedHint => 'Der abgeschottete Bereich ist gerade nicht gestartet. Auswählen startet ihn und wechselt hinein.'; @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 sealedSwitchingBar => 'Verbindung wird umgeschaltet — Daten erscheinen erst nach Abschluss'; @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 direkt auf diesem Rechner verarbeitet — durch das lokale KI-Modell $model. Nichts verlässt das Gerät.'; } @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.'; } }