Some checks are pending
Security / Security check (push) Waiting to run
Stefan's live findings, all four addressed at the root:
- 'In 3 Fragen loslegen' read like ad copy → the entry is now plainly
'Einrichtung starten' / 'Start setup'.
- The setup button sat permanently on the Welcome page of a running
app ('setup after the app runs is backwards' — reported twice). A
fresh install now starts INSIDE the setup: SetupGateScreen hosts
the wizard embedded as the page (new embedded/onFinished modes on
GuidedSetupDialog), with an explicit 'Später einrichten' skip.
Welcome loses the setup button entirely and stays a calm intro.
- Re-running the setup later lives in Settings → General ('Run setup
again…'), the single post-first-run home.
- 'You must grant access first and only then see what will be done':
the preview used to spawn the chain CLI, whose first run could pop
the macOS permission prompt BEFORE the plan was ever shown. The
preview now calls the new PlanSetup RPC over the live hub
connection (no subprocess, nothing granted); the CLI remains only
a fallback when no hub is reachable — and applying stays the
explicit, separate step.
Widget tests: gate hosts the wizard + skip/cancel leave it; CLI-path
tests drive the fallback through the new hub-preview test seam.
Suite 76 green, analyze clean.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
3442 lines
94 KiB
Dart
3442 lines
94 KiB
Dart
// 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 =>
|
||
'Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den State. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.';
|
||
|
||
@override
|
||
String get welcomePillarModuleTitle => 'Modul';
|
||
|
||
@override
|
||
String get welcomePillarModuleBody =>
|
||
'Eine kleine WebAssembly-Komponente, die eine Sache macht. Deklariert Netzwerk-Endpunkte, Dateien und Umgebungsvariablen, auf die sie zugreift; der Hub setzt die Liste durch.';
|
||
|
||
@override
|
||
String get welcomePillarFlowTitle => 'Flow';
|
||
|
||
@override
|
||
String get welcomePillarFlowBody =>
|
||
'Eine YAML-Datei, die Module verkettet. Eingaben rein, Module laufen in der deklarierten Reihenfolge, Ausgaben raus — jeder Schritt in einem hash-verketteten Audit-Log festgehalten.';
|
||
|
||
@override
|
||
String get welcomeTrustHeader => 'TRUST-POSTURE';
|
||
|
||
@override
|
||
String get welcomeTrustSandboxTitle => 'Sandbox von Anfang an';
|
||
|
||
@override
|
||
String get welcomeTrustSandboxBody =>
|
||
'Jedes Modul bringt eine explizite Berechtigungsliste mit — Netzwerk-Endpunkte, Dateien, Umgebungsvariablen. Der Hub setzt sie durch; ohne Operator-Freigabe verlässt nichts die Sandbox.';
|
||
|
||
@override
|
||
String get welcomeTrustAuditTitle => 'Manipulationserkennendes Audit-Log';
|
||
|
||
@override
|
||
String get welcomeTrustAuditBody =>
|
||
'Flow-Läufe, Installationen, Deinstallationen, Freigabe-Entscheidungen — alles wird in ein hash-verkettetes Audit-Log geschrieben. Die Diagnose-Seite verifiziert die Kette bei jedem Laden komplett.';
|
||
|
||
@override
|
||
String get welcomeTrustAirgapTitle => 'Air-Gap-tauglich';
|
||
|
||
@override
|
||
String get welcomeTrustAirgapBody =>
|
||
'Der gesamte Hub steckt in einem einzigen Binary für Linux, macOS und Windows. Sobald ein Modul installiert ist, läuft der Flow, der es nutzt, ohne weiteren Netzwerkzugriff — ideal für regulierte Umgebungen.';
|
||
|
||
@override
|
||
String get welcomeDocsHeader => 'DOKUMENTATION';
|
||
|
||
@override
|
||
String get welcomeDocsBody =>
|
||
'Operator-Erklärungen, inline gerendert. Kein Browser, kein externer Link — air-gap-tauglich.';
|
||
|
||
@override
|
||
String get welcomeDocArchitectureTitle => 'Architektur in einem Absatz';
|
||
|
||
@override
|
||
String get welcomeDocArchitectureBlurb =>
|
||
'Hub, Modul, Flow — und wie die drei zusammenpassen.';
|
||
|
||
@override
|
||
String get welcomeDocSecurityTitle => 'Sandbox-Modell';
|
||
|
||
@override
|
||
String get welcomeDocSecurityBlurb =>
|
||
'Was ein Modul deklariert, was der Operator deckelt, was der Hub durchsetzt.';
|
||
|
||
@override
|
||
String get welcomeDocAuditTitle => 'Manipulationserkennendes Audit-Log';
|
||
|
||
@override
|
||
String get welcomeDocAuditBlurb =>
|
||
'Wie die Hash-Kette nachträgliche Änderungen erkennbar macht — und was die Integritätsstufe WORM-1 leistet (und was nicht).';
|
||
|
||
@override
|
||
String get welcomeDocFlowsTitle => 'Flow-Komposition';
|
||
|
||
@override
|
||
String get welcomeDocFlowsBlurb =>
|
||
'YAML-Grundlagen, Templating-Referenz, das Extract→Summarize-Beispiel.';
|
||
|
||
@override
|
||
String get welcomeDocApprovalsTitle => 'Freigaben';
|
||
|
||
@override
|
||
String get welcomeDocApprovalsBlurb =>
|
||
'Human-in-the-Loop-Checkpoints — wann nutzen, wie das Audit-Log sie protokolliert.';
|
||
|
||
@override
|
||
String get helpTooltip => 'Hilfe';
|
||
|
||
@override
|
||
String get errApprovalRejected => 'Freigabe vom Reviewer abgelehnt.';
|
||
|
||
@override
|
||
String get errApprovalRejectedHint =>
|
||
'Der Reviewer hat den Step abgelehnt. Begründung steht im Audit-Log.';
|
||
|
||
@override
|
||
String get errApprovalTimedOut => 'Freigabe-Timeout abgelaufen.';
|
||
|
||
@override
|
||
String get errApprovalTimedOutHint =>
|
||
'Es wurde nicht rechtzeitig entschieden. Entweder `timeout_seconds` am Freigabe-Step erhöhen oder den Reviewer informieren.';
|
||
|
||
@override
|
||
String get errOutputTooLarge =>
|
||
'Step-Output hat die Größenbegrenzung überschritten.';
|
||
|
||
@override
|
||
String get errOutputTooLargeHint =>
|
||
'Entweder Output kürzen (Text truncaten, Bytes komprimieren) oder `max_output_size_mb` in der Operator-Config erhöhen.';
|
||
|
||
@override
|
||
String get errServiceUnavailableForStep => 'Host-Service nicht konfiguriert.';
|
||
|
||
@override
|
||
String get errServiceUnavailableForStepHint =>
|
||
'Das Modul braucht einen Service (z.B. ollama, playwright), den der Operator nicht deklariert hat. Tragen Sie ihn unter `services:` in ~/.chain/config.yaml ein.';
|
||
|
||
@override
|
||
String get errMissingValue => 'Pflichtwert fehlt.';
|
||
|
||
@override
|
||
String get errMissingValueHint =>
|
||
'Der Step erwartet eine Eingabe, die nicht verdrahtet ist — entweder zur Laufzeit liefern oder den vorgelagerten `\$ref` korrigieren.';
|
||
|
||
@override
|
||
String get errMcpUnreachable => 'MCP-Endpunkt nicht erreichbar.';
|
||
|
||
@override
|
||
String get errMcpUnreachableHint =>
|
||
'Der MCP-Server hat nicht geantwortet. Endpunkt in Einstellungen → Integrationen prüfen und sicherstellen, dass er läuft.';
|
||
|
||
@override
|
||
String get errCapabilityNotInstalled =>
|
||
'Benötigte Capability nicht installiert.';
|
||
|
||
@override
|
||
String get errCapabilityNotInstalledHint =>
|
||
'Im Text-Tab des Flows klicken Sie auf den Fix-Button — der installiert die Capability, sofern sie im Store ist.';
|
||
|
||
@override
|
||
String get welcomeDocClose => 'Schließen';
|
||
|
||
@override
|
||
String welcomeDocFailedToLoad(String error) {
|
||
return 'Doku konnte nicht geladen werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get welcomeChecklistHeader => 'ERSTE SCHRITTE';
|
||
|
||
@override
|
||
String get welcomeChecklistBody =>
|
||
'Vier Schritte zu einem funktionierenden Hub. Live-Zustand — nach jeder Änderung aktualisieren.';
|
||
|
||
@override
|
||
String get welcomeChecklistAi => 'System-KI konfigurieren';
|
||
|
||
@override
|
||
String get welcomeChecklistAiHint =>
|
||
'Einstellungen → System-KI. Wird für die KI-Suche und Fehlererklärungen gebraucht.';
|
||
|
||
@override
|
||
String get welcomeChecklistMcp => 'Öffentliche Capability-Quelle hinzufügen';
|
||
|
||
@override
|
||
String get welcomeChecklistMcpHint =>
|
||
'Verbindet einen öffentlichen Werkzeug-Katalog (MCP) — dessen Bausteine erscheinen dann im Store. Dort hinzufügen oder unter Einstellungen → MCP-Clients.';
|
||
|
||
@override
|
||
String get welcomeChecklistModule => 'Ein Text-Modul installieren';
|
||
|
||
@override
|
||
String get welcomeChecklistModuleHint =>
|
||
'Im Store ein Modul aus der Kategorie Ihrer Wahl installieren. Module sind isolierte (sandboxed) Ch∆In-Komponenten.';
|
||
|
||
@override
|
||
String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten';
|
||
|
||
@override
|
||
String get welcomeChecklistFlowHint =>
|
||
'Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; ein eigener funktioniert genauso.';
|
||
|
||
@override
|
||
String get welcomeChecklistAllDone => 'Alle vier Schritte erledigt.';
|
||
|
||
@override
|
||
String get welcomeChecklistDismiss => 'Checkliste ausblenden';
|
||
|
||
@override
|
||
String get welcomeChecklistRefresh => 'Aktualisieren';
|
||
|
||
@override
|
||
String get welcomeChecklistRefreshing => 'Prüfe…';
|
||
|
||
@override
|
||
String get welcomeChecklistDone => 'Erledigt';
|
||
|
||
@override
|
||
String get welcomeChecklistTodo => 'Offen';
|
||
|
||
@override
|
||
String get navDoctor => 'Diagnose';
|
||
|
||
@override
|
||
String get navModules => 'Module';
|
||
|
||
@override
|
||
String get navStore => 'Store';
|
||
|
||
@override
|
||
String get navFlows => 'Flows';
|
||
|
||
@override
|
||
String get navAudit => 'Protokoll';
|
||
|
||
@override
|
||
String get navApprovals => 'Freigaben';
|
||
|
||
@override
|
||
String get connectionConnected => 'verbunden';
|
||
|
||
@override
|
||
String get connectionUnreachable => 'nicht erreichbar';
|
||
|
||
@override
|
||
String get connectionConnecting => 'verbinde…';
|
||
|
||
@override
|
||
String get connectionStartHub => 'Hub starten';
|
||
|
||
@override
|
||
String get connectionTapToStart => 'antippen zum Starten';
|
||
|
||
@override
|
||
String get sidebarSettingsTooltip => 'Einstellungen (⌘;)';
|
||
|
||
@override
|
||
String get sidebarChannelTooltip =>
|
||
'Aktiver Kanal — klicken zum Wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung';
|
||
|
||
@override
|
||
String get buttonCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String get buttonSave => 'Speichern';
|
||
|
||
@override
|
||
String get buttonClose => 'Schließen';
|
||
|
||
@override
|
||
String get buttonRetry => 'Erneut versuchen';
|
||
|
||
@override
|
||
String get buttonRefresh => 'Aktualisieren';
|
||
|
||
@override
|
||
String get buttonInstall => 'Installieren';
|
||
|
||
@override
|
||
String get buttonUninstall => 'Deinstallieren';
|
||
|
||
@override
|
||
String get buttonDetails => 'Details';
|
||
|
||
@override
|
||
String get buttonAdd => 'Hinzufügen';
|
||
|
||
@override
|
||
String get buttonRemove => 'Entfernen';
|
||
|
||
@override
|
||
String get buttonOpen => 'Öffnen';
|
||
|
||
@override
|
||
String get buttonExplain => 'Erklären';
|
||
|
||
@override
|
||
String get buttonReadDocs => 'Doku öffnen';
|
||
|
||
@override
|
||
String get buttonCopy => 'In Zwischenablage kopieren';
|
||
|
||
@override
|
||
String get buttonCopied => 'Kopiert';
|
||
|
||
@override
|
||
String get buttonShowDetails => 'Details anzeigen';
|
||
|
||
@override
|
||
String get buttonHideDetails => 'Details ausblenden';
|
||
|
||
@override
|
||
String get storeInstallableOnly => 'Nur installierbare';
|
||
|
||
@override
|
||
String get storePillComingSoon => 'Bald verfügbar';
|
||
|
||
@override
|
||
String storeNotInstallableInline(String status) {
|
||
return 'Dieses Modul ist auf der Roadmap (Status: $status). Es gibt noch kein installierbares Bundle — Repository verfolgen für Updates.';
|
||
}
|
||
|
||
@override
|
||
String get mcpSuggestionDeepwikiDesc =>
|
||
'Öffentliches HTTPS — KI-gestützte Doku-Suche in GitHub-Repos. Kein Node, kein API-Key.';
|
||
|
||
@override
|
||
String get mcpSuggestionSemgrepDesc =>
|
||
'Öffentliches HTTPS — Security-Scanning von Code-Schwachstellen. Kein Node, kein API-Key.';
|
||
|
||
@override
|
||
String get mcpSuggestionFilesystemDesc =>
|
||
'Anthropic — Dateien in /tmp lesen / schreiben. Pfad vor dem Speichern anpassen.';
|
||
|
||
@override
|
||
String get mcpSuggestionFetchDesc =>
|
||
'Anthropic — beliebige HTTP(S)-URLs als Markdown abrufen.';
|
||
|
||
@override
|
||
String get mcpSuggestionGithubDesc =>
|
||
'Anthropic — Issues, PRs, Repo-Dateien. Braucht einen GitHub-PAT in der Env-Variable.';
|
||
|
||
@override
|
||
String get mcpSuggestionPuppeteerDesc =>
|
||
'Anthropic — Headless-Browser-Automation für Screenshots / Scraping.';
|
||
|
||
@override
|
||
String get mcpSuggestionPostgresDesc =>
|
||
'Anthropic — Read-only-SQL-Queries gegen eine Postgres-Datenbank. URL anpassen.';
|
||
|
||
@override
|
||
String get mcpSuggestionSqliteDesc =>
|
||
'Anthropic — Abfragen gegen eine lokale SQLite-Datei. Pfad anpassen.';
|
||
|
||
@override
|
||
String get mcpSuggestionBraveSearchDesc =>
|
||
'Anthropic — Websuche via Brave. API-Key erforderlich.';
|
||
|
||
@override
|
||
String get mcpSuggestionMemoryDesc =>
|
||
'Anthropic — persistenter Knowledge-Graph als Agenten-Gedächtnis.';
|
||
|
||
@override
|
||
String get mcpSuggestionTimeDesc =>
|
||
'Anthropic — aktuelle Uhrzeit + Zeitzonen-Konvertierung.';
|
||
|
||
@override
|
||
String get mcpServerEnLanguageBadge =>
|
||
'Server-Text in Englisch — Studio zeigt ihn wie geliefert.';
|
||
|
||
@override
|
||
String get themePluginHeader => 'Theme-Plugin (wirkt sofort)';
|
||
|
||
@override
|
||
String themeApplied(String name) {
|
||
return 'Theme aktiv: $name';
|
||
}
|
||
|
||
@override
|
||
String get themePluginFailed =>
|
||
'Theme-Plugin konnte nicht geladen werden — vorheriges Theme bleibt.';
|
||
|
||
@override
|
||
String get themePluginNone => 'Standard (kein Plugin)';
|
||
|
||
@override
|
||
String get themePluginHint =>
|
||
'Built-in- und Plugin-Kacheln bringen handkuratierte Paletten mit. Die Kachel „Eigene Farbe\" leitet aus einer gewählten Seedfarbe eine vollständige Material-3-Palette ab (primary, secondary, tertiary, surface, …) — das ist ein vollwertiges Theme, kein Einzelfarb-Tweak.';
|
||
|
||
@override
|
||
String get themePluginEmpty =>
|
||
'Kein Theme-Plugin installiert. Im Store eines aus der Kategorie studio-plugin auswählen.';
|
||
|
||
@override
|
||
String get themePluginCustom => 'Eigene Farbe';
|
||
|
||
@override
|
||
String get themePluginCustomDialogTitle => 'Eigenes Theme — Seedfarbe wählen';
|
||
|
||
@override
|
||
String get themePluginCustomHexLabel => 'Hex-Farbe';
|
||
|
||
@override
|
||
String get themePluginCustomPreview => 'Live-Vorschau';
|
||
|
||
@override
|
||
String get themePluginCustomCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String get themePluginCustomApply => 'Anwenden';
|
||
|
||
@override
|
||
String get settingsTitle => 'Hub-Endpunkt';
|
||
|
||
@override
|
||
String get settingsHost => 'Host';
|
||
|
||
@override
|
||
String get settingsPort => 'Port';
|
||
|
||
@override
|
||
String get settingsTls => 'TLS';
|
||
|
||
@override
|
||
String get settingsSaveAndConnect => 'Mit Endpoint verbinden';
|
||
|
||
@override
|
||
String get settingsLanguage => 'Sprache';
|
||
|
||
@override
|
||
String get settingsLanguageHint =>
|
||
'Sprache der App. Wirkt auf alle Seiten; mehrsprachige Store-Einträge folgen ebenfalls.';
|
||
|
||
@override
|
||
String get settingsHubEndpointHint =>
|
||
'Wohin soll Studio sich verbinden? Standard ist der lokale Hub auf 127.0.0.1:50051.';
|
||
|
||
@override
|
||
String get settingsTlsSubtitle => 'https/grpc-secure';
|
||
|
||
@override
|
||
String get settingsPortError => 'Port muss 1–65535 sein';
|
||
|
||
@override
|
||
String get channelsBlurb =>
|
||
'Hub-Kanal wechseln (schreibt ~/.chain/current-channel und startet den Daemon neu). Verbinden ändert nur die Wire von Studio.';
|
||
|
||
@override
|
||
String get channelsActionsTooltip => 'Kanal-Aktionen';
|
||
|
||
@override
|
||
String get systemAiHeader => 'SYSTEM-AI';
|
||
|
||
@override
|
||
String get systemAiEnabled => 'aktiv';
|
||
|
||
@override
|
||
String get systemAiOff => 'aus';
|
||
|
||
@override
|
||
String get systemAiEdit => 'Bearbeiten…';
|
||
|
||
@override
|
||
String get systemAiConfigure => 'Konfigurieren…';
|
||
|
||
@override
|
||
String get systemAiOffBlurb =>
|
||
'Aus — Fehlererklärungen auf der Protokoll-Seite sind deaktiviert. Klicken Sie auf Konfigurieren…, um einen Provider zu wählen (Ollama / OpenAI / LM Studio / vLLM / Eigene). Die Operator-Konfig wird direkt überschrieben; kein Daemon-Neustart nötig.';
|
||
|
||
@override
|
||
String mcpServersCount(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Server',
|
||
one: 'Server',
|
||
);
|
||
return '$n $_temp0';
|
||
}
|
||
|
||
@override
|
||
String get mcpRediscoverTooltip => 'Discovery neu ausführen';
|
||
|
||
@override
|
||
String get mcpAddTooltip => 'MCP-Server hinzufügen';
|
||
|
||
@override
|
||
String get mcpRemoveTooltip => 'Server entfernen';
|
||
|
||
@override
|
||
String mcpToolsCount(int n) {
|
||
return '$n Tools';
|
||
}
|
||
|
||
@override
|
||
String n8nEndpointsCount(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Endpunkte',
|
||
one: 'Endpunkt',
|
||
);
|
||
return '$n $_temp0';
|
||
}
|
||
|
||
@override
|
||
String n8nWorkflowsCount(int n) {
|
||
return '$n Workflows';
|
||
}
|
||
|
||
@override
|
||
String get n8nRediscoverTooltip => 'Discovery neu ausführen';
|
||
|
||
@override
|
||
String get n8nAddTooltip => 'n8n-Endpunkt hinzufügen';
|
||
|
||
@override
|
||
String get n8nRemoveTooltip => 'Endpunkt entfernen';
|
||
|
||
@override
|
||
String get addMcpTitle => 'MCP-Server hinzufügen';
|
||
|
||
@override
|
||
String get addMcpIntro =>
|
||
'Tools, die der Server via `tools/list` anbietet, erscheinen im Store als `mcp.<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 brauchst du? Versuch\'s mit „ein Modul, das tabellarische Daten liest\" oder tippe einfach einen Begriff.';
|
||
|
||
@override
|
||
String get storeAskSubmit => 'Suchen';
|
||
|
||
@override
|
||
String get storeAskAi => 'KI fragen';
|
||
|
||
@override
|
||
String get storeAskClear => 'Frage zurücksetzen';
|
||
|
||
@override
|
||
String get storeAskAiThinking => 'Module werden durchsucht…';
|
||
|
||
@override
|
||
String get storeAskAiUnavailable =>
|
||
'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 storeStatusPlanned => 'geplant';
|
||
|
||
@override
|
||
String get storeInstalledOnly => 'Installiert';
|
||
|
||
@override
|
||
String get storeCategoryLabel => 'Kategorie';
|
||
|
||
@override
|
||
String get storeCategoryAll => 'Alle Kategorien';
|
||
|
||
@override
|
||
String get storeCategoryBridge => 'Verbindungen';
|
||
|
||
@override
|
||
String get storeCategoryDebug => 'Beispiele';
|
||
|
||
@override
|
||
String get storeCategoryText => 'Text';
|
||
|
||
@override
|
||
String get storeCategoryLlm => 'KI-Modelle';
|
||
|
||
@override
|
||
String get storeCategorySystem => 'System';
|
||
|
||
@override
|
||
String get storeCategoryAuth => 'Authentifizierung';
|
||
|
||
@override
|
||
String get storeCategoryStorage => 'Speicher';
|
||
|
||
@override
|
||
String get storeCategoryChannel => 'Kanäle';
|
||
|
||
@override
|
||
String get storeCategoryWeb => 'Web';
|
||
|
||
@override
|
||
String get storeCategoryOrchestrator => 'Orchestrierung';
|
||
|
||
@override
|
||
String get storeCatDocuments => 'Dokumente';
|
||
|
||
@override
|
||
String get storeCatTextLanguage => 'Text & Sprache';
|
||
|
||
@override
|
||
String get storeCatData => 'Daten & Formate';
|
||
|
||
@override
|
||
String get storeCatAiLlm => 'KI & LLM';
|
||
|
||
@override
|
||
String get storeCatWebApi => 'Web & APIs';
|
||
|
||
@override
|
||
String get storeCatAnalysisDomain => 'Analyse & Domäne';
|
||
|
||
@override
|
||
String get storeCatStudioThemes => 'Studio & Themes';
|
||
|
||
@override
|
||
String get storeCatExamplesDev => 'Beispiele & Dev';
|
||
|
||
@override
|
||
String get storeCatOther => 'Sonstiges';
|
||
|
||
@override
|
||
String get storeSegmentModules => 'Module';
|
||
|
||
@override
|
||
String get storeSegmentStudio => 'Studio & Themes';
|
||
|
||
@override
|
||
String storeNResults(int n) {
|
||
return '$n Treffer';
|
||
}
|
||
|
||
@override
|
||
String get storeReloadTooltip => 'Aktualisieren';
|
||
|
||
@override
|
||
String get storesManagerButton => 'Store hinzufügen';
|
||
|
||
@override
|
||
String get storesManagerTitle => 'Module-Stores';
|
||
|
||
@override
|
||
String get storesManagerIntro =>
|
||
'Der Hub führt die Module aller Stores unten zu einem Index zusammen. Fügen Sie die Index-URL eines Stores hinzu, damit seine Module hier installierbar werden.';
|
||
|
||
@override
|
||
String get storesManagerAddSection => 'Store hinzufügen';
|
||
|
||
@override
|
||
String get storesManagerNameLabel => 'Name';
|
||
|
||
@override
|
||
String get storesManagerUrlLabel => 'Index-URL (https:// oder file://)';
|
||
|
||
@override
|
||
String get storesManagerAddAction => 'Hinzufügen';
|
||
|
||
@override
|
||
String storesManagerBundled(int count) {
|
||
return '$count Module · gebündelt';
|
||
}
|
||
|
||
@override
|
||
String storesManagerModuleCount(int count) {
|
||
return '$count Module';
|
||
}
|
||
|
||
@override
|
||
String get storesManagerAddFailed => 'Store konnte nicht hinzugefügt werden';
|
||
|
||
@override
|
||
String get storesManagerRemoveFailed => 'Store konnte nicht entfernt werden';
|
||
|
||
@override
|
||
String get storesManagerSuggested => 'Vorgeschlagene Stores';
|
||
|
||
@override
|
||
String get storesManagerAddShort => 'Hinzufügen';
|
||
|
||
@override
|
||
String get storesManagerPinnedKeyLabel =>
|
||
'Signatur-Schlüssel anheften (PEM, optional)';
|
||
|
||
@override
|
||
String get storesManagerPinnedKeyHint =>
|
||
'Nur Module, die mit diesem Schlüssel signiert sind, werden aus dieser Quelle angenommen. Fügen Sie den öffentlichen Schlüssel (PEM) des Herausgebers ein — statt des eingebauten Herstellerschlüssels.';
|
||
|
||
@override
|
||
String get storesManagerNotAvailable => 'Noch nicht verfügbar';
|
||
|
||
@override
|
||
String get storesManagerNotAvailableHint =>
|
||
'Der Anbieter hat diesen Store-Index noch nicht veröffentlicht. Sobald er das tut, ist er installierbar.';
|
||
|
||
@override
|
||
String get storesSuggestedReclaimDesc =>
|
||
'Recl∆Im — Module für Rechts- und Pflichten-Reform-Mapping';
|
||
|
||
@override
|
||
String get storeTodayBadge => 'HEUTE';
|
||
|
||
@override
|
||
String get storeTodayDeck => 'Von der Ch∆In-Redaktion';
|
||
|
||
@override
|
||
String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden';
|
||
|
||
@override
|
||
String get storePillInstalled => 'installiert';
|
||
|
||
@override
|
||
String get storePillUpdate => 'Update';
|
||
|
||
@override
|
||
String storeUpdateButton(String version) {
|
||
return 'Update auf $version';
|
||
}
|
||
|
||
@override
|
||
String storeUpdateTooltip(String installed, String best) {
|
||
return 'Installiert $installed — Store bietet v$best';
|
||
}
|
||
|
||
@override
|
||
String get storeNoTagline => '(keine Beschreibung)';
|
||
|
||
@override
|
||
String get storeUninstallTitle => 'Modul deinstallieren?';
|
||
|
||
@override
|
||
String storeUninstallBody(String name) {
|
||
return 'Entfernt $name aus diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl.';
|
||
}
|
||
|
||
@override
|
||
String storeInstalledToast(String name, String version) {
|
||
return '$name v$version installiert.';
|
||
}
|
||
|
||
@override
|
||
String storeInstallFailedToast(String error) {
|
||
return 'Installation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String storeUninstalledToast(String name, String version) {
|
||
return '$name v$version deinstalliert.';
|
||
}
|
||
|
||
@override
|
||
String storeUninstallFailedToast(String error) {
|
||
return 'Deinstallation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String storeOpenBrowserFailed(String error) {
|
||
return 'Browser konnte nicht geöffnet werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get storeSectionTags => 'Tags';
|
||
|
||
@override
|
||
String get storeSectionRequiredCapabilities => 'Erforderliche Fähigkeiten';
|
||
|
||
@override
|
||
String get storeSectionRequiredHostServices => 'Erforderliche Host-Dienste';
|
||
|
||
@override
|
||
String get storeSectionScreenshots => 'Screenshots';
|
||
|
||
@override
|
||
String get storeSectionDocumentation => 'Dokumentation';
|
||
|
||
@override
|
||
String get storeSectionSource => 'Quelle';
|
||
|
||
@override
|
||
String get storeSectionPermissions => 'Deklarierte Berechtigungen';
|
||
|
||
@override
|
||
String get storeSectionDirectory => 'Modul-Verzeichnis';
|
||
|
||
@override
|
||
String get storeSectionPermissionsNone => '(keine — reines Berechnungsmodul)';
|
||
|
||
@override
|
||
String get storeInstallingButton => 'Installiere…';
|
||
|
||
@override
|
||
String get storeNotInstallable => 'Nicht installierbar';
|
||
|
||
@override
|
||
String storeNotInstallableTooltip(String status) {
|
||
return 'Status „$status\" — Installations-Pfad noch nicht verdrahtet.';
|
||
}
|
||
|
||
@override
|
||
String storeInstallProgressTitle(String name) {
|
||
return 'Installation von $name';
|
||
}
|
||
|
||
@override
|
||
String get storeInstallProgressBody => 'Holen, verifizieren, entpacken…';
|
||
|
||
@override
|
||
String get storeLoadDocs => 'Dokumentation laden';
|
||
|
||
@override
|
||
String get storeDocsHint =>
|
||
'README inline gerendert; nutzt das Registry-Token des Hubs, falls nötig.';
|
||
|
||
@override
|
||
String get storeDocsFetching => 'README wird geladen…';
|
||
|
||
@override
|
||
String get storeOpenRepoButton => 'Repository im Browser öffnen';
|
||
|
||
@override
|
||
String get storeDocsErrorNotFound =>
|
||
'Dieses Modul ist nicht im Store-Index des Hubs enthalten.';
|
||
|
||
@override
|
||
String get storeDocsErrorNoDocs =>
|
||
'Für dieses Modul ist keine Repository-URL hinterlegt.';
|
||
|
||
@override
|
||
String get storeDocsErrorAuth =>
|
||
'Die Registry erfordert Authentifizierung, um dieses README zu laden. Setzen Sie CHAIN_REGISTRY_TOKEN in der Umgebung des Daemons und starten Sie den Hub neu.';
|
||
|
||
@override
|
||
String storeDocsErrorNetwork(String detail) {
|
||
return 'Netzwerkfehler beim Laden des README. $detail';
|
||
}
|
||
|
||
@override
|
||
String get storeDocsErrorParse => 'README ist kein gültiges UTF-8.';
|
||
|
||
@override
|
||
String get storeDocsErrorGeneric => 'README konnte nicht geladen werden.';
|
||
|
||
@override
|
||
String get storeSourceLabel => 'Quelle';
|
||
|
||
@override
|
||
String get storeSourceAll => 'Alle Quellen';
|
||
|
||
@override
|
||
String get storeSourceNative => 'Nativ';
|
||
|
||
@override
|
||
String get storeSourceMcp => 'MCP';
|
||
|
||
@override
|
||
String get storeSourceN8n => 'n8n';
|
||
|
||
@override
|
||
String get storeProvenanceNative => 'nativ';
|
||
|
||
@override
|
||
String storeProvenanceMcp(String provider) {
|
||
return 'mcp · $provider';
|
||
}
|
||
|
||
@override
|
||
String storeProvenanceN8n(String provider) {
|
||
return 'n8n · $provider';
|
||
}
|
||
|
||
@override
|
||
String get storeRecommendedTitle =>
|
||
'Öffentliche Quelle hinzufügen — ein Klick';
|
||
|
||
@override
|
||
String get storeRecommendedBody =>
|
||
'Kuratierte MCP-Server über HTTPS erreichbar. Kein Subprozess, kein API-Key, kein Node. Föderierte Fähigkeiten erscheinen sofort im Store.';
|
||
|
||
@override
|
||
String get storeRecommendedAddTooltip => 'Hinzufügen und entdecken';
|
||
|
||
@override
|
||
String get storeRecommendedAdding => 'Wird hinzugefügt…';
|
||
|
||
@override
|
||
String get storeRecommendedDeepWikiTagline =>
|
||
'GitHub-Repo-Doku-Suche (KI-gestützt)';
|
||
|
||
@override
|
||
String get storeRecommendedSemgrepTagline =>
|
||
'Security-Scanning für Code-Schwachstellen';
|
||
|
||
@override
|
||
String storeProviderAddedToast(String name, int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'föderierte Fähigkeiten',
|
||
one: 'föderierte Fähigkeit',
|
||
);
|
||
return '$name hinzugefügt — $n $_temp0.';
|
||
}
|
||
|
||
@override
|
||
String storeProviderAddedZeroToast(String name) {
|
||
return '$name ist eingetragen, aber der Server hat noch keine Fähigkeiten geliefert. Öffnen Sie Einstellungen → MCP-Clients, um Discovery erneut zu versuchen oder den Server zu prüfen.';
|
||
}
|
||
|
||
@override
|
||
String storeProviderAddFailed(String name, String error) {
|
||
return '$name konnte nicht hinzugefügt werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get auditTitle => 'Protokoll';
|
||
|
||
@override
|
||
String get auditNoEvents => 'Noch keine Ereignisse';
|
||
|
||
@override
|
||
String get auditNoEventsHint =>
|
||
'Starten Sie einen Flow, um den Audit-Stream zu füllen.\nEreignisse erscheinen innerhalb von Sekunden.';
|
||
|
||
@override
|
||
String get auditFilterAll => 'alle';
|
||
|
||
@override
|
||
String get auditFilterFlow => 'Flow';
|
||
|
||
@override
|
||
String get auditFilterStep => 'Schritt';
|
||
|
||
@override
|
||
String get auditFilterModule => 'Modul';
|
||
|
||
@override
|
||
String get auditFilterTooltip => 'Ereignisse filtern';
|
||
|
||
@override
|
||
String get auditClearLogTooltip => 'Protokoll löschen (nur local/dev Kanal)';
|
||
|
||
@override
|
||
String auditClearedToast(int n, String channel) {
|
||
return '$n Ereignisse auf Kanal „$channel\" gelöscht. Kette mit Marker neu geseedet.';
|
||
}
|
||
|
||
@override
|
||
String auditClearFailed(String detail) {
|
||
return 'Löschen fehlgeschlagen: $detail';
|
||
}
|
||
|
||
@override
|
||
String get auditExplain => 'Erklären';
|
||
|
||
@override
|
||
String get auditReask => 'Neu fragen';
|
||
|
||
@override
|
||
String get auditAsking => 'Frage läuft…';
|
||
|
||
@override
|
||
String get auditSystemAi => 'SYSTEM-AI';
|
||
|
||
@override
|
||
String get auditCachedPill => 'gecacht';
|
||
|
||
@override
|
||
String auditOriginalLatency(int ms) {
|
||
return 'ursprünglich $ms ms';
|
||
}
|
||
|
||
@override
|
||
String auditLatency(int ms) {
|
||
return '$ms ms';
|
||
}
|
||
|
||
@override
|
||
String get auditRegenerateTooltip =>
|
||
'Neu generieren — Cache überspringen, Modell erneut fragen';
|
||
|
||
@override
|
||
String auditLiveStatus(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Ereignisse',
|
||
one: 'Ereignis',
|
||
);
|
||
return 'live · Abfrage alle 2s · $n $_temp0';
|
||
}
|
||
|
||
@override
|
||
String auditDisconnected(String error) {
|
||
return 'getrennt · $error';
|
||
}
|
||
|
||
@override
|
||
String get auditHashChainVerified => 'Hash-Kette verifiziert';
|
||
|
||
@override
|
||
String get auditDetailHeader => 'DETAIL';
|
||
|
||
@override
|
||
String get auditAskingFull => 'Frage an die konfigurierte System-AI läuft…';
|
||
|
||
@override
|
||
String get auditFixLabel => 'FIX';
|
||
|
||
@override
|
||
String auditCachedTooltipKnown(String at, String hits) {
|
||
return 'Aus dem lokalen Cache geliefert. Ursprünglich erzeugt am $at$hits.';
|
||
}
|
||
|
||
@override
|
||
String auditCachedTooltipUnknown(String hits) {
|
||
return 'Aus dem lokalen Cache geliefert. Ursprünglicher Zeitpunkt unbekannt$hits.';
|
||
}
|
||
|
||
@override
|
||
String auditCachedTooltipHits(int n) {
|
||
return ' · $n Treffer';
|
||
}
|
||
|
||
@override
|
||
String get auditConfigureSystemAi =>
|
||
'System-AI unter Einstellungen konfigurieren (Cmd+,)';
|
||
|
||
@override
|
||
String get auditClearDialogTitle => 'Audit-Log löschen?';
|
||
|
||
@override
|
||
String get auditClearDialogBody =>
|
||
'Löscht jedes Audit-Event auf dem aktiven Kanal und seedet einen neuen chain.reset-Marker mit Prüfer und Begründung. Auf beta / production verweigert. Nicht umkehrbar.';
|
||
|
||
@override
|
||
String get auditClearReviewerLabel => 'Prüfer';
|
||
|
||
@override
|
||
String get auditClearReasonLabel =>
|
||
'Begründung (im chain.reset-Marker festgehalten)';
|
||
|
||
@override
|
||
String get auditClearReasonHelper =>
|
||
'Erforderlich — Auditoren werden das lesen.';
|
||
|
||
@override
|
||
String get auditClearLogButton => 'Log löschen';
|
||
|
||
@override
|
||
String get modulesTitle => 'Module';
|
||
|
||
@override
|
||
String get modulesNoneTitle => 'Noch keine Module';
|
||
|
||
@override
|
||
String get modulesNoneHint =>
|
||
'`chain install <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. Neue `system.approval@^0`-Schritte landen automatisch hier.';
|
||
|
||
@override
|
||
String get approvalsReloadTooltip => 'Aktualisieren';
|
||
|
||
@override
|
||
String get approvalsPillPending => 'offen';
|
||
|
||
@override
|
||
String get approvalsPillApproved => 'freigegeben';
|
||
|
||
@override
|
||
String get approvalsPillRejected => 'abgelehnt';
|
||
|
||
@override
|
||
String get approvalsPillExpired => 'abgelaufen';
|
||
|
||
@override
|
||
String get approvalsPayloadPreview => 'ZU PRÜFENDE DATEN';
|
||
|
||
@override
|
||
String get approvalsNoPayload =>
|
||
'Keine Daten zum Prüfen angehängt. Der system.approval-Schritt des Flows bestimmt über sein \"show:\"-Feld, was angezeigt wird — setze es, um die Daten hinter dieser Entscheidung sichtbar zu machen.';
|
||
|
||
@override
|
||
String get approvalsNoDataConfirmTitle => 'Ohne Prüfdaten freigeben?';
|
||
|
||
@override
|
||
String get approvalsNoDataConfirmBody =>
|
||
'Dieser Flow hat bewusst keine Prüfdaten hinterlegt (kein \"show:\" am Freigabe-Schritt). Sie können trotzdem freigeben — entscheiden dann aber, ohne die Daten hinter dieser Entscheidung gesehen zu haben.';
|
||
|
||
@override
|
||
String get approvalsNoDataConfirmAction => 'Trotzdem freigeben';
|
||
|
||
@override
|
||
String get approvalsRequestFallback =>
|
||
'Freigabe für diesen Schritt erforderlich';
|
||
|
||
@override
|
||
String approvalsFlowStepMeta(String flow, String step) {
|
||
return 'Flow: $flow · Schritt: $step';
|
||
}
|
||
|
||
@override
|
||
String get approvalsApproveButton => 'Freigeben';
|
||
|
||
@override
|
||
String get approvalsRejectButton => 'Ablehnen';
|
||
|
||
@override
|
||
String get approvalsRejectDialogTitle => 'Freigabe ablehnen';
|
||
|
||
@override
|
||
String get approvalsRejectReasonLabel =>
|
||
'Begründung (im Audit-Log festgehalten)';
|
||
|
||
@override
|
||
String approvalsApprovedToast(String flow, String step) {
|
||
return 'freigegeben · $flow › $step';
|
||
}
|
||
|
||
@override
|
||
String approvalsRejectedToast(String flow, String step) {
|
||
return 'abgelehnt · $flow › $step';
|
||
}
|
||
|
||
@override
|
||
String approvalsApproveFailed(String error) {
|
||
return 'Freigabe fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String approvalsRejectFailed(String error) {
|
||
return 'Ablehnung fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get approvalsHistoryEmpty => 'Noch kein Verlauf';
|
||
|
||
@override
|
||
String get approvalsHistoryEmptyHint =>
|
||
'Entschiedene Freigaben (freigegeben / abgelehnt / abgelaufen) erscheinen hier.\nDas Audit-Log enthält den vollständigen hash-verketteten Datensatz.';
|
||
|
||
@override
|
||
String get approvalsDialogDecided => 'entschieden';
|
||
|
||
@override
|
||
String get approvalsDialogCreated => 'erstellt';
|
||
|
||
@override
|
||
String get approvalsDialogReason => 'Begründung';
|
||
|
||
@override
|
||
String get approvalsDialogPrompt => 'PROMPT';
|
||
|
||
@override
|
||
String approvalsExpiresIn(int minutes) {
|
||
return '${minutes}m';
|
||
}
|
||
|
||
@override
|
||
String approvalsExpiresInHours(int hours) {
|
||
return '${hours}h';
|
||
}
|
||
|
||
@override
|
||
String get doctorTitle => 'Diagnose';
|
||
|
||
@override
|
||
String get doctorSummaryModules => 'Module';
|
||
|
||
@override
|
||
String get doctorSummaryApprovals => 'Freigaben';
|
||
|
||
@override
|
||
String get doctorSummaryAudit => 'Protokoll';
|
||
|
||
@override
|
||
String get doctorSummaryServices => 'Dienste';
|
||
|
||
@override
|
||
String doctorSummaryCapabilities(int n) {
|
||
return '$n Fähigkeiten';
|
||
}
|
||
|
||
@override
|
||
String get doctorSummaryPending => 'offen';
|
||
|
||
@override
|
||
String doctorSummaryChain(int verified, int total) {
|
||
return '$verified/$total Kette';
|
||
}
|
||
|
||
@override
|
||
String get doctorSummaryDeclared => 'deklariert';
|
||
|
||
@override
|
||
String doctorModulesPanelSummary(int n, int m) {
|
||
return '$n Module · $m Fähigkeiten';
|
||
}
|
||
|
||
@override
|
||
String get doctorApprovalsNone => 'Keine offenen Freigaben';
|
||
|
||
@override
|
||
String doctorApprovalsCount(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: '$n Freigaben warten auf Prüfung',
|
||
one: '1 Freigabe wartet auf Prüfung',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get doctorApprovalsAttentionPill => 'wichtig';
|
||
|
||
@override
|
||
String get doctorServicesEmpty => 'Keine Host-Dienste deklariert';
|
||
|
||
@override
|
||
String get doctorServicesEmptyHint =>
|
||
'in ~/.chain/config.yaml unter services: hinzufügen';
|
||
|
||
@override
|
||
String get doctorPillLoaded => 'geladen';
|
||
|
||
@override
|
||
String get doctorPillEmpty => 'leer';
|
||
|
||
@override
|
||
String get doctorRecheckTooltip => 'Erneut prüfen';
|
||
|
||
@override
|
||
String get doctorEventLogSection => 'Audit-Log';
|
||
|
||
@override
|
||
String get doctorModulesApprovalsSection => 'Module & Freigaben';
|
||
|
||
@override
|
||
String get doctorHostServicesSection => 'Host-Dienste';
|
||
|
||
@override
|
||
String get doctorDaemonFilesSection => 'Daemon-Dateien';
|
||
|
||
@override
|
||
String get doctorDaemonControlSection => 'Daemon-Steuerung';
|
||
|
||
@override
|
||
String get doctorChainIntact => 'Hash-Kette intakt';
|
||
|
||
@override
|
||
String doctorChainIntactDetail(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Ereignisse',
|
||
one: 'Ereignis',
|
||
);
|
||
return '$n $_temp0 · prev_event_sha256 lückenlos verifiziert';
|
||
}
|
||
|
||
@override
|
||
String get doctorChainTampered => 'Manipulation erkannt';
|
||
|
||
@override
|
||
String doctorChainTamperedDetail(int verified, int total, String id) {
|
||
return '$verified von $total verifiziert vor Mismatch bei $id';
|
||
}
|
||
|
||
@override
|
||
String get doctorChainPillOk => 'Integritätskette v1';
|
||
|
||
@override
|
||
String get doctorChainPillTamper => 'MANIPULIERT';
|
||
|
||
@override
|
||
String get doctorVerifyNow => 'Jetzt prüfen';
|
||
|
||
@override
|
||
String get doctorRestart => 'Neustart';
|
||
|
||
@override
|
||
String get doctorStart => 'Starten';
|
||
|
||
@override
|
||
String get doctorStop => 'Stoppen';
|
||
|
||
@override
|
||
String get doctorStatusAction => 'Status';
|
||
|
||
@override
|
||
String doctorRunningOn(String name, String endpoint) {
|
||
return 'Läuft auf $name: $endpoint';
|
||
}
|
||
|
||
@override
|
||
String doctorStoppedOn(String name) {
|
||
return '$name-Daemon gestoppt';
|
||
}
|
||
|
||
@override
|
||
String get doctorStatusUnknown => 'Daemon-Status: …';
|
||
|
||
@override
|
||
String get doctorPillRunning => 'läuft';
|
||
|
||
@override
|
||
String get doctorPillStopped => 'gestoppt';
|
||
|
||
@override
|
||
String get doctorDaemonControlHint =>
|
||
'Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.';
|
||
|
||
@override
|
||
String get doctorDaemonControlWorking => 'Wird ausgeführt…';
|
||
|
||
@override
|
||
String get doctorPathLog => 'Log';
|
||
|
||
@override
|
||
String get doctorPathConfig => 'Konfig';
|
||
|
||
@override
|
||
String get doctorPathDb => 'Audit-DB';
|
||
|
||
@override
|
||
String get doctorPathModules => 'Module-Verzeichnis';
|
||
|
||
@override
|
||
String get doctorPathFlows => 'Flow-Verzeichnis';
|
||
|
||
@override
|
||
String get doctorPathPid => 'PID-Datei';
|
||
|
||
@override
|
||
String get doctorPathsEmpty =>
|
||
'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.';
|
||
|
||
@override
|
||
String doctorOpenError(String detail) {
|
||
return 'Konnte nicht öffnen: $detail';
|
||
}
|
||
|
||
@override
|
||
String doctorUpdateAvailable(String version) {
|
||
return 'Update verfügbar — $version';
|
||
}
|
||
|
||
@override
|
||
String doctorUpdateBody(String channel, String version) {
|
||
return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `chain update apply --channel $channel` auf.';
|
||
}
|
||
|
||
@override
|
||
String get doctorUpdateUnreachable => 'Release-Host nicht erreichbar';
|
||
|
||
@override
|
||
String doctorUpdateUnreachableBody(String channel) {
|
||
return 'Release-Feed für $channel konnte nicht erreicht werden.';
|
||
}
|
||
|
||
@override
|
||
String doctorReleaseNotes(String url) {
|
||
return 'Notes: $url';
|
||
}
|
||
|
||
@override
|
||
String get doctorPillNew => 'neu';
|
||
|
||
@override
|
||
String get doctorPillOffline => 'offline';
|
||
|
||
@override
|
||
String get doctorApplyUpdate => 'Update anwenden';
|
||
|
||
@override
|
||
String get doctorApplying => 'Wird angewendet…';
|
||
|
||
@override
|
||
String get doctorApplyDone =>
|
||
'Update angewendet. Studio neu starten, um die neue Daemon-Version zu sehen.';
|
||
|
||
@override
|
||
String get mcpHeader => 'MCP-CLIENTS';
|
||
|
||
@override
|
||
String get mcpHint =>
|
||
'Externe MCP-Server bringen ihre Tools als `mcp.<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 hubUnreachableHint => 'Hub starten mit `chain serve`.';
|
||
|
||
@override
|
||
String get languageEnglish => 'English';
|
||
|
||
@override
|
||
String get languageGerman => 'Deutsch';
|
||
|
||
@override
|
||
String get searchHint =>
|
||
'Springe überall hin — Module, Store, Flows, Seiten…';
|
||
|
||
@override
|
||
String get searchIndexing => 'Indiziere…';
|
||
|
||
@override
|
||
String get searchNoMatches => 'Keine Treffer.';
|
||
|
||
@override
|
||
String get searchHintNavigate => '↑↓ navigieren';
|
||
|
||
@override
|
||
String get searchHintOpen => 'Enter öffnen';
|
||
|
||
@override
|
||
String get searchHintClose => 'Esc schließen';
|
||
|
||
@override
|
||
String get searchGroupPages => 'Seiten';
|
||
|
||
@override
|
||
String get searchGroupModules => 'Module';
|
||
|
||
@override
|
||
String get searchGroupStore => 'Store';
|
||
|
||
@override
|
||
String get searchGroupFlows => 'Flows';
|
||
|
||
@override
|
||
String get searchSettingsLabel => 'Einstellungen';
|
||
|
||
@override
|
||
String searchPageHint(int n) {
|
||
return 'Seite · ⌘$n';
|
||
}
|
||
|
||
@override
|
||
String get searchSettingsHint => 'Hub-Endpunkt, Kanäle, System-AI · ⌘;';
|
||
|
||
@override
|
||
String searchInstalledModuleHint(String version) {
|
||
return 'installiertes Modul · v$version';
|
||
}
|
||
|
||
@override
|
||
String get searchStoreUncategorized => 'ohne Kategorie';
|
||
|
||
@override
|
||
String searchStoreHintWithTagline(String tagline) {
|
||
return 'Store · $tagline';
|
||
}
|
||
|
||
@override
|
||
String searchStoreHintWithCategory(String category) {
|
||
return 'Store · $category';
|
||
}
|
||
|
||
@override
|
||
String get searchSavedFlowHint => 'gespeicherter Flow';
|
||
|
||
@override
|
||
String get systemAiTitle => 'System-AI';
|
||
|
||
@override
|
||
String get systemAiIntro =>
|
||
'Die hub-interne LLM, die die Plattform selbst für Fehlererklärungen und Operator-Hilfe nutzt. Standardmäßig aus; hier konfigurieren. Siehe docs/architecture/system-ai.md, was über die Leitung geht.';
|
||
|
||
@override
|
||
String get systemAiProviderLabel => 'Provider';
|
||
|
||
@override
|
||
String get systemAiEndpointLabel => 'Endpunkt-URL (bis /v1)';
|
||
|
||
@override
|
||
String get systemAiApiKeyRequired =>
|
||
'API-Key-Umgebungsvariable (erforderlich)';
|
||
|
||
@override
|
||
String get systemAiApiKeyOptional => 'API-Key-Umgebungsvariable (optional)';
|
||
|
||
@override
|
||
String systemAiApiKeyDisclaimer(String name) {
|
||
return 'Studio liest oder speichert den Key-Wert nie — nur den Namen der Umgebungsvariable. Der Hub liest `\$$name` zur Anfragezeit.';
|
||
}
|
||
|
||
@override
|
||
String get systemAiTestConnection => 'Verbindung testen';
|
||
|
||
@override
|
||
String get systemAiTesting => 'Teste…';
|
||
|
||
@override
|
||
String get systemAiSave => 'Speichern';
|
||
|
||
@override
|
||
String get systemAiPrivacyHeader => 'PRIVACY-MODUS';
|
||
|
||
@override
|
||
String get systemAiPrivacyOffLabel => 'Aus';
|
||
|
||
@override
|
||
String get systemAiPrivacyOffDesc =>
|
||
'Feature deaktiviert. Keine Anfragen verlassen den Hub.';
|
||
|
||
@override
|
||
String get systemAiPrivacyRedactedLabel => 'Redigiert';
|
||
|
||
@override
|
||
String get systemAiPrivacyRedactedDesc =>
|
||
'Nur event_type / error / Modul-Namen. KRITIS-freundlicher Standard.';
|
||
|
||
@override
|
||
String get systemAiPrivacyFullLabel => 'Voll';
|
||
|
||
@override
|
||
String get systemAiPrivacyFullDesc =>
|
||
'Enthält das Audit-Detail-JSON (nur Hash — keine Roh-Payloads).';
|
||
|
||
@override
|
||
String get systemAiConnectionOk => 'Verbindung ok';
|
||
|
||
@override
|
||
String get systemAiConnectionFailed => 'Verbindung fehlgeschlagen';
|
||
|
||
@override
|
||
String systemAiReplyPrefix(String text) {
|
||
return 'Antwort: $text';
|
||
}
|
||
|
||
@override
|
||
String get systemAiModelLabel => 'Modell (erforderlich)';
|
||
|
||
@override
|
||
String get systemAiModelHintFallback =>
|
||
'Modell-Identifier, den der Provider erwartet';
|
||
|
||
@override
|
||
String get systemAiModelHelperBase =>
|
||
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen.';
|
||
|
||
@override
|
||
String get systemAiModelHelperOllama =>
|
||
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen. Mit Pull von Ollama herunterladen.';
|
||
|
||
@override
|
||
String get systemAiRefresh => 'Aktualisieren';
|
||
|
||
@override
|
||
String get systemAiPull => 'Pull';
|
||
|
||
@override
|
||
String get systemAiPulling => 'Lade…';
|
||
|
||
@override
|
||
String systemAiCouldNotListModels(String error) {
|
||
return 'Modelle konnten nicht aufgelistet werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get systemAiNoModelsOllama =>
|
||
'Noch keine Modelle auf dem Ollama-Server. Oben eintippen und Pull klicken.';
|
||
|
||
@override
|
||
String get systemAiNoModelsGeneric => 'Provider lieferte keine Modelle.';
|
||
|
||
@override
|
||
String get systemAiSuitabilityRecommended => 'empfohlen';
|
||
|
||
@override
|
||
String get systemAiSuitabilityBalanced => 'ausgewogen';
|
||
|
||
@override
|
||
String get systemAiSuitabilitySmall => 'klein — Qualität evtl. eingeschränkt';
|
||
|
||
@override
|
||
String get systemAiSuitabilityLarge => 'groß — langsamer';
|
||
|
||
@override
|
||
String get systemAiSuitabilityHuge =>
|
||
'sehr groß — auf einem Laptop wahrscheinlich zu langsam';
|
||
|
||
@override
|
||
String get systemAiSuitabilityUnknown => 'Größe unbekannt';
|
||
|
||
@override
|
||
String systemAiHwDetected(String summary) {
|
||
return 'Erkannt: $summary';
|
||
}
|
||
|
||
@override
|
||
String systemAiHwReviewed(String date) {
|
||
return ' · Kuratierung geprüft $date';
|
||
}
|
||
|
||
@override
|
||
String systemAiLegendRecommended(String tier) {
|
||
return 'empfohlen für diese Hardware$tier';
|
||
}
|
||
|
||
@override
|
||
String get systemAiLegendBalanced => 'ausgewogen (4-8B)';
|
||
|
||
@override
|
||
String get systemAiLegendSmallLarge =>
|
||
'klein <3B / groß 9-15B / über Hardware';
|
||
|
||
@override
|
||
String get systemAiLegendHuge => 'sehr groß >15B';
|
||
|
||
@override
|
||
String get systemAiLegendUnknown => 'Größe unbekannt';
|
||
|
||
@override
|
||
String systemAiCacheRow(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'gespeicherte Erklärungen',
|
||
one: 'gespeicherte Erklärung',
|
||
);
|
||
return 'Cache: $n $_temp0. Identische Prompts treffen den Cache; Modell- oder Privacy-Modus-Wechsel leeren ihn automatisch.';
|
||
}
|
||
|
||
@override
|
||
String get systemAiCacheClear => 'Leeren';
|
||
|
||
@override
|
||
String systemAiCacheClearedToast(int n) {
|
||
return '$n gespeicherte System-AI-Erklärungen gelöscht.';
|
||
}
|
||
|
||
@override
|
||
String systemAiCacheClearFailed(String error) {
|
||
return 'Cache-Löschen fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get systemAiPullEmptyError =>
|
||
'Erst eine Modell-ID eintippen (z.B. gemma3:4b).';
|
||
|
||
@override
|
||
String systemAiPullFailedError(String error) {
|
||
return 'Pull fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String storeProvenanceTemporal(String provider) {
|
||
return 'temporal · $provider';
|
||
}
|
||
|
||
@override
|
||
String get storeSourceTemporal => 'Temporal';
|
||
|
||
@override
|
||
String get navFlowEditor => 'Editor';
|
||
|
||
@override
|
||
String get flowEditorBackTooltip => 'Zurück';
|
||
|
||
@override
|
||
String get flowEditorNew => 'Neuer Flow';
|
||
|
||
@override
|
||
String get flowEditorSave => 'Speichern';
|
||
|
||
@override
|
||
String get flowEditorRun => 'Ausführen';
|
||
|
||
@override
|
||
String get flowEditorRefresh => 'Datei-Liste neu laden';
|
||
|
||
@override
|
||
String get flowEditorRunOutput => 'LAUF-ERGEBNIS';
|
||
|
||
@override
|
||
String get flowEditorEmptyTitle => 'Kein Flow geöffnet';
|
||
|
||
@override
|
||
String get flowEditorEmptyBody =>
|
||
'Wählen Sie links einen aus oder klicken Sie auf Neuer Flow, um einen neuen anzulegen.';
|
||
|
||
@override
|
||
String get flowEditorListEmptyTitle => 'Keine gespeicherten Flows';
|
||
|
||
@override
|
||
String get flowEditorListEmptyBody =>
|
||
'Klicken Sie auf Neuer Flow, um aus einer Vorlage zu starten.';
|
||
|
||
@override
|
||
String get flowEditorDiscardTitle => 'Ungespeicherte Änderungen verwerfen?';
|
||
|
||
@override
|
||
String get flowEditorDiscardBody =>
|
||
'Beim Wechsel der Datei gehen alle noch nicht gespeicherten Änderungen verloren.';
|
||
|
||
@override
|
||
String get flowEditorDiscardKeep => 'Weiterbearbeiten';
|
||
|
||
@override
|
||
String get flowEditorDiscardThrow => 'Verwerfen';
|
||
|
||
@override
|
||
String get flowEditorNewDialogTitle => 'Neuer Flow';
|
||
|
||
@override
|
||
String get flowEditorNewDialogLabel => 'Flow-Name';
|
||
|
||
@override
|
||
String get flowEditorNewDialogHelper =>
|
||
'Kleinbuchstaben, Ziffern, Bindestrich, Unterstrich';
|
||
|
||
@override
|
||
String get flowEditorNewDialogCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String get flowEditorNewDialogCreate => 'Anlegen';
|
||
|
||
@override
|
||
String flowEditorNewTemplateComment(String name) {
|
||
return 'Von Studios Flow-Editor erstellt. Bearbeiten, speichern, ausführen.';
|
||
}
|
||
|
||
@override
|
||
String flowEditorAlreadyExists(String name) {
|
||
return 'Ein Flow namens \"$name\" existiert bereits.';
|
||
}
|
||
|
||
@override
|
||
String get buttonView => 'Ansehen';
|
||
|
||
@override
|
||
String logViewerTitle(String title, int count) {
|
||
return '$title — letzte $count Zeilen';
|
||
}
|
||
|
||
@override
|
||
String get logViewerEmpty => 'Log-Datei ist leer oder existiert noch nicht.';
|
||
|
||
@override
|
||
String get logViewerCopyAll => 'Alles kopieren';
|
||
|
||
@override
|
||
String get logViewerOpenExternal => 'Im Standardeditor öffnen';
|
||
|
||
@override
|
||
String logViewerLineCount(int count) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
count,
|
||
locale: localeName,
|
||
other: '$count Zeilen',
|
||
one: '1 Zeile',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get doctorPathStudioErrors => 'Studio-Fehler';
|
||
|
||
@override
|
||
String get settingsCategoryGeneral => 'Allgemein';
|
||
|
||
@override
|
||
String get settingsCategoryAppearance => 'Darstellung';
|
||
|
||
@override
|
||
String get settingsCategoryAi => 'System-KI';
|
||
|
||
@override
|
||
String get settingsCategoryIntegrations => 'Integrationen';
|
||
|
||
@override
|
||
String get settingsCategorySecurity => 'Sicherheit';
|
||
|
||
@override
|
||
String get settingsCategoryMaintenance => 'Wartung';
|
||
|
||
@override
|
||
String get settingsAiPanelTitle => 'System-KI';
|
||
|
||
@override
|
||
String get settingsAiPanelBody =>
|
||
'Operator-verwalteter LLM-Endpunkt, den Studio für die KI-Helfer nutzt (System-KI-Edit, Install-Vorschläge, Doctor-Zusammenfassung). Kein Flow ruft das jemals auf; Module sprechen mit ihrem eigenen LLM.';
|
||
|
||
@override
|
||
String get settingsIntegrationsPanelTitle => 'Integrationen';
|
||
|
||
@override
|
||
String get settingsIntegrationsPanelBody =>
|
||
'Externe Tool-Server, deren Capabilities der Hub föderiert. MCP-Server bieten Tool-Endpunkte; n8n-Endpunkte stellen gehostete Workflows bereit.';
|
||
|
||
@override
|
||
String get settingsSecurityPanelTitle => 'Sicherheit & Zugangsdaten';
|
||
|
||
@override
|
||
String get settingsSecurityPanelBody =>
|
||
'Tokens, die der Hub für dich verwahrt. Liegen in ~/.chain/ mit Modus 0600; werden nie als Telemetrie versendet.';
|
||
|
||
@override
|
||
String get settingsMaintenancePanelTitle => 'Wartung';
|
||
|
||
@override
|
||
String get settingsMaintenancePanelBody =>
|
||
'Destruktive Aktionen, abgesichert durch explizite Bestätigungs-Dialoge. Nutzen z.B. beim Re-Pilot-Testen oder Debuggen.';
|
||
|
||
@override
|
||
String get tooltipMoveUp => 'Nach oben';
|
||
|
||
@override
|
||
String get tooltipMoveDown => 'Nach unten';
|
||
|
||
@override
|
||
String get tooltipRemove => 'Entfernen';
|
||
|
||
@override
|
||
String get daemonActionEnableAutostart => 'Autostart aktivieren';
|
||
|
||
@override
|
||
String get daemonActionDisableAutostart => 'Autostart deaktivieren';
|
||
|
||
@override
|
||
String get daemonActionRestart => 'Daemon neu starten';
|
||
|
||
@override
|
||
String get daemonActionStart => 'Daemon starten';
|
||
|
||
@override
|
||
String get daemonActionStop => 'Daemon stoppen';
|
||
|
||
@override
|
||
String get daemonActionStatus => 'Daemon-Status';
|
||
|
||
@override
|
||
String daemonActionResultOk(String label) {
|
||
return 'OK · $label';
|
||
}
|
||
|
||
@override
|
||
String daemonActionResultFailed(String label) {
|
||
return 'Fehlgeschlagen · $label';
|
||
}
|
||
|
||
@override
|
||
String get addSourceTitle => 'Modul-Quelle hinzufügen';
|
||
|
||
@override
|
||
String addSourceIntro(String capability) {
|
||
return '`$capability` ist nicht im öffentlichen Store. Zeig dem Hub eine `.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? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:';
|
||
|
||
@override
|
||
String get addSourceCliExample => 'chain install --link /pfad/zum/modul';
|
||
|
||
@override
|
||
String get addSourceInstallButton => 'Installieren';
|
||
|
||
@override
|
||
String get addSourceCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String installFailed(String error) {
|
||
return 'Installation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get welcomeHubDownTitle => 'Der Hub läuft noch nicht';
|
||
|
||
@override
|
||
String get welcomeHubDownBody =>
|
||
'Studio spricht mit einem lokalen Hub — der Engine, die Module lädt und Flows ausführt. Sie ist gerade nicht erreichbar. 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 dein 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 Capabilities dort auszuführen. Stellen Sie dazu ein Enrollment-Token aus.';
|
||
|
||
@override
|
||
String get federationPillConnected => 'verbunden';
|
||
|
||
@override
|
||
String get federationRegionNone => 'keine Region';
|
||
|
||
@override
|
||
String federationCapabilities(int count) {
|
||
return '$count angebotene Capabilities';
|
||
}
|
||
|
||
@override
|
||
String get federationAddDialogTitle => 'Enrollment-Token ausstellen';
|
||
|
||
@override
|
||
String get federationNameLabel => 'Satelliten-Name';
|
||
|
||
@override
|
||
String get federationIssueButton => 'Ausstellen';
|
||
|
||
@override
|
||
String federationIssueFailed(String error) {
|
||
return 'Token konnte nicht ausgestellt werden: $error';
|
||
}
|
||
|
||
@override
|
||
String federationEnrollmentTitle(String name) {
|
||
return '$name einrichten';
|
||
}
|
||
|
||
@override
|
||
String get federationTokenLabel => 'Bootstrap-Token (einmalig)';
|
||
|
||
@override
|
||
String get federationConfigLabel =>
|
||
'Satelliten-Konfiguration (in den Satelliten einfügen)';
|
||
|
||
@override
|
||
String get federationCopied => 'In die Zwischenablage kopiert';
|
||
|
||
@override
|
||
String get federationEnrollmentHint =>
|
||
'Übergib das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte CA authentifiziert den ersten Connect des Satelliten.';
|
||
|
||
@override
|
||
String get workspaceAll => 'Alle Projekte';
|
||
|
||
@override
|
||
String get workspaceSwitcherTooltip =>
|
||
'Arbeitsbereich — filtert diese Ansicht und stempelt neue Läufe mit dem gewählten Projekt';
|
||
|
||
@override
|
||
String get workspaceProtectedHint =>
|
||
'Geschützt: logisch getrennt im gemeinsamen Hub — keine harte Prozessgrenze. Kritische Mandate nutzen einen abgeschotteten Bereich.';
|
||
|
||
@override
|
||
String get runsTitle => 'Läufe';
|
||
|
||
@override
|
||
String get runsReloadTooltip => 'Lauf-Liste neu laden';
|
||
|
||
@override
|
||
String get runsEmptyTitle => 'Keine abgekoppelten Läufe';
|
||
|
||
@override
|
||
String get runsEmptyHint =>
|
||
'Mit detach gestartete Läufe stehen hier, bis sie fertig sind. Abgekoppelte Aufrufe sind optional — dazu detached.enabled in der Betreiber-Konfiguration aktivieren.';
|
||
|
||
@override
|
||
String get runsCancelButton => 'Abbrechen';
|
||
|
||
@override
|
||
String runsCancelSignalled(String flow) {
|
||
return 'Abbruch für $flow ausgelöst.';
|
||
}
|
||
|
||
@override
|
||
String get runsCancelTooLate =>
|
||
'Der Lauf war schon fertig — nichts abzubrechen.';
|
||
|
||
@override
|
||
String runsCurrentStep(String step) {
|
||
return 'Schritt: $step';
|
||
}
|
||
|
||
@override
|
||
String get runsPhasePending => 'Wartet';
|
||
|
||
@override
|
||
String get runsPhaseRunning => 'Läuft';
|
||
|
||
@override
|
||
String get runsPhaseSucceeded => 'Erfolgreich';
|
||
|
||
@override
|
||
String get runsPhaseFailed => 'Fehlgeschlagen';
|
||
|
||
@override
|
||
String get runsPhaseCancelled => 'Abgebrochen';
|
||
|
||
@override
|
||
String get runsPhaseUnknown => 'Unbekannt';
|
||
|
||
@override
|
||
String get navRuns => 'Läufe';
|
||
|
||
@override
|
||
String get workspaceSealedHeader => 'ABGESCHOTTETE BEREICHE';
|
||
|
||
@override
|
||
String get workspaceSealedRunning => 'läuft';
|
||
|
||
@override
|
||
String get workspaceSealedStopped => 'gestoppt';
|
||
|
||
@override
|
||
String workspaceSealedStarting(String name) {
|
||
return 'Starte abgeschotteten Bereich „$name“…';
|
||
}
|
||
|
||
@override
|
||
String workspaceSealedStarted(String name) {
|
||
return 'Abgeschotteter Bereich „$name“ gestartet.';
|
||
}
|
||
|
||
@override
|
||
String workspaceSealedSwitchFailed(String error) {
|
||
return 'Wechsel in den abgeschotteten Bereich fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get sealedIdentityBar =>
|
||
'Abgeschotteter Bereich — isolierter Hub, eigene Daten und Audit-Kette';
|
||
|
||
@override
|
||
String get sealedLeave => 'Verlassen';
|
||
|
||
@override
|
||
String setupStepOf(int n, int total) {
|
||
return 'Schritt $n von $total';
|
||
}
|
||
|
||
@override
|
||
String get setupStep1Title => 'Worum geht es?';
|
||
|
||
@override
|
||
String get setupStep2Title => 'Was möchten Sie zuerst tun?';
|
||
|
||
@override
|
||
String get setupStep3Title => 'Wo läuft es?';
|
||
|
||
@override
|
||
String get setupReviewTitle => 'Das wird Ch∆In einrichten';
|
||
|
||
@override
|
||
String get setupChooseFreeText =>
|
||
'Oder beschreiben Sie einfach, was Sie vorhaben';
|
||
|
||
@override
|
||
String get setupScenTryingOut => 'Erst mal ausprobieren';
|
||
|
||
@override
|
||
String get setupScenTryingOutSub =>
|
||
'Ein unkomplizierter Arbeitsplatz auf diesem Rechner — ohne Signaturpflicht, ohne Schreibschutz für das Prüfprotokoll.';
|
||
|
||
@override
|
||
String get setupScenTeamHub => 'Ein Team-Server';
|
||
|
||
@override
|
||
String get setupScenTeamHubSub =>
|
||
'Ein abgesicherter Hub für mehrere Personen — signierte Module, Ressourcen-Grenzen.';
|
||
|
||
@override
|
||
String get setupScenRegulated => 'Regulierter Produktivbetrieb';
|
||
|
||
@override
|
||
String get setupScenRegulatedSub =>
|
||
'Signierte Module, ein lückenloses, manipulationssicheres Prüfprotokoll und eine menschliche Freigabe vor jedem KI-Schritt.';
|
||
|
||
@override
|
||
String get setupScenBuildModules => 'Module entwickeln';
|
||
|
||
@override
|
||
String get setupScenBuildModulesSub =>
|
||
'Eine Entwickler-Einrichtung zum Schreiben und Testen eigener Module.';
|
||
|
||
@override
|
||
String get setupIntentHello => 'Das Hallo-Beispiel ausführen';
|
||
|
||
@override
|
||
String get setupIntentHelloSub =>
|
||
'Einfach einen Flow einmal von Anfang bis Ende sehen.';
|
||
|
||
@override
|
||
String get setupIntentExtract => 'Text aus Dokumenten extrahieren';
|
||
|
||
@override
|
||
String get setupIntentExtractSub =>
|
||
'Reinen Text aus PDF- und DOCX-Dateien holen.';
|
||
|
||
@override
|
||
String get setupIntentExtractSummarize => 'Extrahieren und zusammenfassen';
|
||
|
||
@override
|
||
String get setupIntentExtractSummarizeSub =>
|
||
'Text extrahieren und anschließend zusammenfassen.';
|
||
|
||
@override
|
||
String get setupIntentClassify => 'Eingehende Dokumente einsortieren';
|
||
|
||
@override
|
||
String get setupIntentClassifySub =>
|
||
'Text extrahieren und mit einem KI-Schritt klassifizieren.';
|
||
|
||
@override
|
||
String get setupIntentBuildModule => 'Ein eigenes Modul bauen';
|
||
|
||
@override
|
||
String get setupIntentBuildModuleSub => 'Mit einem Modul-Gerüst starten.';
|
||
|
||
@override
|
||
String get setupTargetLaptop => 'Dieser Rechner';
|
||
|
||
@override
|
||
String get setupTargetLaptopSub =>
|
||
'Läuft lokal auf dem Gerät, an dem Sie gerade sitzen.';
|
||
|
||
@override
|
||
String get setupTargetHomeServer => 'Ein eigener Server';
|
||
|
||
@override
|
||
String get setupTargetHomeServerSub =>
|
||
'Ein Server im eigenen Haus — startet beim Hochfahren, läuft im Hintergrund.';
|
||
|
||
@override
|
||
String get setupTargetAirgapped =>
|
||
'Ein vollständig lokaler Server (ohne Internet)';
|
||
|
||
@override
|
||
String get setupTargetAirgappedSub =>
|
||
'Ein isolierter Server ohne Internet — die strengste, privateste Betriebsart.';
|
||
|
||
@override
|
||
String get setupTargetContainer => 'Ein Container';
|
||
|
||
@override
|
||
String get setupTargetContainerSub =>
|
||
'Docker oder Podman, mit fertigem Compose-Schnipsel.';
|
||
|
||
@override
|
||
String get setupApprovalPlain =>
|
||
'Vor jedem KI-Schritt einen Menschen um Freigabe bitten';
|
||
|
||
@override
|
||
String get setupDataLocalPlain =>
|
||
'Daten dürfen das Haus nie verlassen (vollständig lokal)';
|
||
|
||
@override
|
||
String get setupPlanIntroDev =>
|
||
'Ch∆In richtet einen unkomplizierten Arbeitsplatz ein.';
|
||
|
||
@override
|
||
String get setupPlanIntroEnterprise =>
|
||
'Ch∆In richtet einen abgesicherten Betrieb für ein Team ein.';
|
||
|
||
@override
|
||
String get setupPlanIntroAirgapped =>
|
||
'Ch∆In richtet einen vollständig lokalen, regulierten Betrieb ein.';
|
||
|
||
@override
|
||
String get setupPlanSignatures =>
|
||
'Es werden nur signierte Module zugelassen.';
|
||
|
||
@override
|
||
String get setupPlanWorm =>
|
||
'Das Prüfprotokoll wird zusätzlich manipulationssicher (WORM) gesichert.';
|
||
|
||
@override
|
||
String get setupPlanApproval =>
|
||
'Vor jedem KI-Schritt fragt das System einen Menschen um Freigabe.';
|
||
|
||
@override
|
||
String setupPlanModules(String modules) {
|
||
return 'Diese Module werden vorbereitet: $modules.';
|
||
}
|
||
|
||
@override
|
||
String setupPlanFlow(String flow) {
|
||
return 'Ein Beispiel-Flow „$flow“ wird angelegt.';
|
||
}
|
||
|
||
@override
|
||
String setupPlanFileChanged(String path) {
|
||
return 'Geändert wird nur eine Datei: $path.';
|
||
}
|
||
|
||
@override
|
||
String get setupPlanOverwriteWarn =>
|
||
'Eine vorhandene Konfiguration wird überschrieben.';
|
||
|
||
@override
|
||
String get setupApplied => 'Fertig — Ch∆In ist eingerichtet.';
|
||
|
||
@override
|
||
String get setupNextTitle => 'Nächste Schritte';
|
||
|
||
@override
|
||
String get setupNextHubStart => 'Hub starten';
|
||
|
||
@override
|
||
String get setupHubRunning => 'Der Hub läuft.';
|
||
|
||
@override
|
||
String get setupStartHubFirst =>
|
||
'Starten Sie zuerst den Hub — dann lassen sich die Module hier installieren.';
|
||
|
||
@override
|
||
String setupActionInstall(String module) {
|
||
return '$module installieren';
|
||
}
|
||
|
||
@override
|
||
String setupActionInstalled(String module) {
|
||
return '$module ist installiert.';
|
||
}
|
||
|
||
@override
|
||
String setupActionOpenFlow(String flow) {
|
||
return 'Beispiel-Flow „$flow“ öffnen';
|
||
}
|
||
|
||
@override
|
||
String get setupModulesOfflineHint =>
|
||
'Die Module kommen ohne Internet als Offline-Paket auf den Server — die Anleitung dazu steht in der Dokumentation unter „Betrieb ohne Internet“.';
|
||
|
||
@override
|
||
String get setupModulesSignedHint =>
|
||
'Die Module kommen aus einer eigenen, signierten Quelle — nicht aus dem öffentlichen Store.';
|
||
|
||
@override
|
||
String get setupSigPublicStoreNotice =>
|
||
'Diese Einrichtung lässt nur signierte Module zu. Der öffentliche Store liefert zurzeit unsignierte Pakete — die vorbereiteten Module kommen daher aus einer eigenen, signierten Quelle.';
|
||
|
||
@override
|
||
String get setupAllowUnsigned =>
|
||
'Installation aus dem öffentlichen Store erlauben';
|
||
|
||
@override
|
||
String get setupAllowUnsignedSub =>
|
||
'Lockert die Signaturpflicht bewusst. Gut zum Ausprobieren — für den regulierten Betrieb später wieder aktivieren.';
|
||
|
||
@override
|
||
String get setupStartCta => 'Einrichtung starten';
|
||
|
||
@override
|
||
String get setupGateIntro =>
|
||
'Bevor es losgeht: drei Fragen, dann richtet Ch∆In diesen Rechner passend ein. Nichts wird ohne Ihre Bestätigung geändert.';
|
||
|
||
@override
|
||
String get setupGateSkip => 'Später einrichten';
|
||
|
||
@override
|
||
String get settingsRunSetup => 'Einrichtung erneut ausführen…';
|
||
|
||
@override
|
||
String get settingsRunSetupHint =>
|
||
'Öffnet den Einrichtungs-Assistenten (drei Fragen, Vorschau, Übernehmen). Die bestehende Konfiguration wird erst nach Ihrer Bestätigung ersetzt.';
|
||
|
||
@override
|
||
String get setupPlanRunbookLocal =>
|
||
'Eingerichtet wird dieser Rechner; der Hub läuft lokal und wird bei Bedarf gestartet.';
|
||
|
||
@override
|
||
String get setupPlanRunbookService =>
|
||
'Eingerichtet wird dieser Rechner: Der Hub startet künftig automatisch beim Hochfahren (Hintergrund-Dienst). Für einen anderen Server führen Sie die Einrichtung dort aus.';
|
||
|
||
@override
|
||
String get setupPlanRunbookAirgap =>
|
||
'Vorgesehen für einen isolierten Server ohne Internet — Module und Updates kommen als Offline-Paket.';
|
||
|
||
@override
|
||
String get setupPlanRunbookContainer =>
|
||
'Vorgesehen für den Betrieb im Container — ein fertiges Compose-Beispiel wird mitgeliefert.';
|
||
|
||
@override
|
||
String get setupPlanAuditChain =>
|
||
'Jeder Schritt landet in einem lückenlosen, hash-verketteten Prüfprotokoll — Manipulation wird erkennbar.';
|
||
|
||
@override
|
||
String setupPlanDocs(int n) {
|
||
return 'Eine passende Leseliste ($n Kapitel) wird mit dem Einrichtungs-Protokoll unter ~/.chain/ gespeichert.';
|
||
}
|
||
|
||
@override
|
||
String get setupTrustedPublishersHint =>
|
||
'Wichtig: Hinterlegen Sie beim Hinzufügen der Quelle den Schlüssel des Herausgebers („Signatur-Schlüssel anheften“) — sonst akzeptiert der Hub jede formal gültige Signatur, egal von wem.';
|
||
|
||
@override
|
||
String get setupAddSignedSource => 'Signierte Quelle hinzufügen…';
|
||
|
||
@override
|
||
String get setupApplyNotes => 'Hinweise aus der Einrichtung';
|
||
|
||
@override
|
||
String get setupFreeTextHint =>
|
||
'z. B.: Eingehende Anträge vorprüfen und unvollständige markieren';
|
||
|
||
@override
|
||
String get setupFreeTextSuggest => 'Vorschlagen lassen';
|
||
|
||
@override
|
||
String setupFreeTextPrivacyLocal(String model) {
|
||
return 'Ihre Beschreibung wird lokal auf diesem Rechner verarbeitet ($model).';
|
||
}
|
||
|
||
@override
|
||
String setupFreeTextPrivacyRemote(String model, String provider) {
|
||
return 'Ihre Beschreibung wird an die eingerichtete System-KI gesendet: $model ($provider).';
|
||
}
|
||
|
||
@override
|
||
String get setupFreeTextUnavailable =>
|
||
'Für den Freitext-Weg braucht Ch∆In eine eingerichtete System-KI (Einstellungen → System-KI). Die Auswahl oben funktioniert immer — ganz ohne KI.';
|
||
|
||
@override
|
||
String setupExecHint(String path) {
|
||
return 'Für Vorschau und Einrichtung führt Studio das Programm „chain“ aus: $path';
|
||
}
|
||
|
||
@override
|
||
String setupExecHintTcc(String path) {
|
||
return 'Das Programm liegt unter $path — macOS fragt dafür eventuell einmalig nach Zugriff auf diesen Ordner (z. B. „Dokumente“). Das ist zu erwarten und in Ordnung.';
|
||
}
|
||
|
||
@override
|
||
String get setupNoBinaryStepHint =>
|
||
'Das Programm „chain“ wurde auf diesem Rechner nicht gefunden — die Vorschau im nächsten Schritt wird fehlschlagen. Unter „Diagnose“ können Sie es auswählen oder Ch∆In installieren.';
|
||
|
||
@override
|
||
String get setupNoBinary =>
|
||
'Das Programm „chain“ wurde auf diesem Rechner nicht gefunden.';
|
||
|
||
@override
|
||
String get setupNoBinaryHint =>
|
||
'Ohne das Programm kann der Assistent die Einrichtung nicht anwenden. Wählen Sie es unter „Diagnose“ aus oder installieren Sie Ch∆In neu.';
|
||
|
||
@override
|
||
String get setupCliTooOld =>
|
||
'Das installierte „chain“-Programm ist älter als Studio und kennt diesen Assistenten noch nicht.';
|
||
|
||
@override
|
||
String setupCliTooOldHint(String path) {
|
||
return 'Gefunden wurde: $path. Bitte Ch∆In aktualisieren (Seite „Diagnose“ → Update, oder im Terminal: chain update apply) und den Assistenten danach erneut öffnen.';
|
||
}
|
||
|
||
@override
|
||
String get setupPreviewFailed =>
|
||
'Die Plan-Vorschau konnte nicht erstellt werden — das Programm „chain“ meldet einen Fehler.';
|
||
|
||
@override
|
||
String get setupApplyFailed =>
|
||
'Die Einrichtung konnte nicht angewendet werden — das Programm „chain“ meldet einen Fehler.';
|
||
|
||
@override
|
||
String setupCliUsedBinary(String path) {
|
||
return 'Ausgeführt wurde: $path';
|
||
}
|
||
|
||
@override
|
||
String get setupFreeTextParseError =>
|
||
'Die System-KI hat keinen verwertbaren Vorschlag geliefert. Wählen Sie oben aus dem Menü — oder versuchen Sie es noch einmal.';
|
||
|
||
@override
|
||
String get setupReflectionTitle => 'So verstehe ich Ihre Aufgabe';
|
||
|
||
@override
|
||
String setupReflectionScenario(String label) {
|
||
return 'Worum es geht: $label';
|
||
}
|
||
|
||
@override
|
||
String setupReflectionIntent(String label) {
|
||
return 'Erste Aufgabe: $label';
|
||
}
|
||
|
||
@override
|
||
String setupReflectionTarget(String label) {
|
||
return 'Umgebung: $label';
|
||
}
|
||
|
||
@override
|
||
String get setupReflectionApproval =>
|
||
'Vor jedem KI-Schritt wird ein Mensch um Freigabe gebeten.';
|
||
|
||
@override
|
||
String get setupReflectionDataLocal => 'Daten bleiben vollständig im Haus.';
|
||
|
||
@override
|
||
String get setupReflectionEditHint =>
|
||
'Es wird nichts ohne Ihre Bestätigung geändert. Passen Sie die Punkte an oder gehen Sie direkt zur Vorschau.';
|
||
|
||
@override
|
||
String get setupReflectionAdjust => 'Anpassen';
|
||
|
||
@override
|
||
String get setupReflectionToPreview => 'Zur Vorschau';
|
||
|
||
@override
|
||
String get setupProfileDev => 'unkomplizierter Arbeitsplatz';
|
||
|
||
@override
|
||
String get setupProfileEnterprise => 'abgesicherter Team-Betrieb';
|
||
|
||
@override
|
||
String get setupProfileAirgapped =>
|
||
'vollständig lokaler, regulierter Betrieb';
|
||
|
||
@override
|
||
String welcomeChecklistSetupDone(String profile) {
|
||
return 'Die Grundeinrichtung ($profile) hat der Einrichtungs-Assistent bereits erledigt — hier sehen Sie, was auf dem Hub schon passiert ist.';
|
||
}
|
||
}
|