chain-studio/lib/l10n/app_localizations_de.dart
flemming-it 35a79d0bb6
Some checks failed
Security / Security check (push) Failing after 2s
feat(studio): show a source module's data terms before the install button
The store detail sheet now carries a data-source block for source.*
modules: publisher, upstream url, the terms in plain words, and any
attribution the operator has to carry with the output. It sits above
maintainers and above the install button, because it is a decision
input rather than a footnote.

The values are selectable: compliance notes get written by copying,
not retyping. A note names whose terms these are, so nobody reads them
as the module's own licence. Four guards, including that an empty
attribution renders no empty row.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-09-09 12:36:45 +02:00

4029 lines
113 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 <pfad>), 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 165535 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.<name>.<tool>-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.<name>.<workflow_slug>-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 installPhaseResolve => 'Modul wird gesucht';
@override
String get installPhaseDownload => 'Wird heruntergeladen';
@override
String get installPhaseInstall => 'Wird geprüft und entpackt';
@override
String get installPhaseDone => 'Fertig';
@override
String installBytes(String done, String total) {
return '$done von $total MB';
}
@override
String installElapsed(int seconds) {
return '$seconds s vergangen';
}
@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 <capability-name> 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 <name> <flow.yaml>, 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 <provider>/-Präfix benennt. Erster Treffer gewinnt — die Segmente, die euer Team am häufigsten nutzt, gehören nach oben. Katalog-bekannte Publisher erscheinen als Chips; private Segmente lassen sich frei eintragen.';
@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 <name> 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.<server>.<tool> 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.<endpoint>.<slug> 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 storeSectionDataSource => 'Datenquelle';
@override
String get storeDataSourceLicense => 'Bedingungen';
@override
String get storeDataSourceAttribution => 'Namensnennung erforderlich';
@override
String get storeDataSourceNote =>
'Diese Bedingungen gelten für das Material, das dieses Modul abruft, nicht für das Modul selbst. Es lädt in Ihrem Auftrag und liefert keine Kopie der Daten mit.';
@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 <verzeichnis> 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 => 'Kontext';
@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.';
}
}