Some checks failed
Security / Security check (push) Failing after 2s
The store detail sheet now carries a data-source block for source.* modules: publisher, upstream url, the terms in plain words, and any attribution the operator has to carry with the output. It sits above maintainers and above the install button, because it is a decision input rather than a footnote. The values are selectable: compliance notes get written by copying, not retyping. A note names whose terms these are, so nobody reads them as the module's own licence. Four guards, including that an empty attribution renders no empty row. Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
4029 lines
113 KiB
Dart
4029 lines
113 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 =>
|
||
'Das Programm, das alles ausführt. Es läuft direkt auf Ihrem Rechner, braucht keine Zusatzsoftware und speichert alles Wichtige in einer einzigen Datei.';
|
||
|
||
@override
|
||
String get welcomePillarHubTech =>
|
||
'Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den Zustand. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.';
|
||
|
||
@override
|
||
String get welcomePillarModuleTitle => 'Modul';
|
||
|
||
@override
|
||
String get welcomePillarModuleBody =>
|
||
'Ein Baustein, der genau eine Aufgabe erledigt — zum Beispiel Text aus Dokumenten lesen. Jedes Modul sagt vorab, worauf es zugreifen will; mehr erlaubt der Hub nicht.';
|
||
|
||
@override
|
||
String get welcomePillarModuleTech =>
|
||
'Eine kleine WebAssembly-Komponente in einer Sandbox. Deklariert Netzwerk-Endpunkte, Dateien und Umgebungsvariablen, auf die sie zugreift; der Hub setzt die Liste durch.';
|
||
|
||
@override
|
||
String get welcomePillarFlowTitle => 'Flow';
|
||
|
||
@override
|
||
String get welcomePillarFlowBody =>
|
||
'Ein Ablaufplan, der Module zu festen Schritten verbindet. Eingaben rein, Schritte laufen der Reihe nach, Ergebnis raus — und jeder Schritt wird fälschungssicher protokolliert.';
|
||
|
||
@override
|
||
String get welcomePillarFlowTech =>
|
||
'Eine YAML-Datei, die Module verkettet; jeder Schritt wird in einem hash-verketteten Audit-Log festgehalten, das die Diagnose-Seite komplett verifiziert.';
|
||
|
||
@override
|
||
String get welcomePillarTechToggle => 'Für Technik-Interessierte';
|
||
|
||
@override
|
||
String get welcomeTrustHeader => 'TRUST-POSTURE';
|
||
|
||
@override
|
||
String get welcomeTrustSandboxTitle => 'Sandbox von Anfang an';
|
||
|
||
@override
|
||
String get welcomeTrustSandboxBody =>
|
||
'Jedes Modul bringt eine explizite Berechtigungsliste mit — Netzwerk-Endpunkte, Dateien, Umgebungsvariablen. Der Hub setzt sie durch; ohne Operator-Freigabe verlässt nichts die Sandbox.';
|
||
|
||
@override
|
||
String get welcomeTrustAuditTitle => 'Manipulationserkennendes Audit-Log';
|
||
|
||
@override
|
||
String get welcomeTrustAuditBody =>
|
||
'Flow-Läufe, Installationen, Deinstallationen, Freigabe-Entscheidungen — alles wird in ein hash-verkettetes Audit-Log geschrieben. Die Diagnose-Seite verifiziert die Kette bei jedem Laden komplett.';
|
||
|
||
@override
|
||
String get welcomeTrustAirgapTitle => 'Air-Gap-tauglich';
|
||
|
||
@override
|
||
String get welcomeTrustAirgapBody =>
|
||
'Der gesamte Hub steckt in einem einzigen Binary für Linux, macOS und Windows. Sobald ein Modul installiert ist, läuft der Flow, der es nutzt, ohne weiteren Netzwerkzugriff — ideal für regulierte Umgebungen.';
|
||
|
||
@override
|
||
String get welcomeDocsHeader => 'DOKUMENTATION';
|
||
|
||
@override
|
||
String get welcomeDocsBody =>
|
||
'Operator-Erklärungen, inline gerendert. Kein Browser, kein externer Link — air-gap-tauglich.';
|
||
|
||
@override
|
||
String get welcomeDocArchitectureTitle => 'Architektur in einem Absatz';
|
||
|
||
@override
|
||
String get welcomeDocArchitectureBlurb =>
|
||
'Hub, Modul, Flow — und wie die drei zusammenpassen.';
|
||
|
||
@override
|
||
String get welcomeDocSecurityTitle => 'Sandbox-Modell';
|
||
|
||
@override
|
||
String get welcomeDocSecurityBlurb =>
|
||
'Was ein Modul deklariert, was der Operator deckelt, was der Hub durchsetzt.';
|
||
|
||
@override
|
||
String get welcomeDocAuditTitle => 'Manipulationserkennendes Audit-Log';
|
||
|
||
@override
|
||
String get welcomeDocAuditBlurb =>
|
||
'Wie die Hash-Kette nachträgliche Änderungen erkennbar macht — und was die Integritätsstufe WORM-1 leistet (und was nicht).';
|
||
|
||
@override
|
||
String get welcomeDocFlowsTitle => 'Flow-Komposition';
|
||
|
||
@override
|
||
String get welcomeDocFlowsBlurb =>
|
||
'YAML-Grundlagen, Templating-Referenz, das Extract→Summarize-Beispiel.';
|
||
|
||
@override
|
||
String get welcomeDocApprovalsTitle => 'Freigaben';
|
||
|
||
@override
|
||
String get welcomeDocApprovalsBlurb =>
|
||
'Human-in-the-Loop-Checkpoints — wann nutzen, wie das Audit-Log sie protokolliert.';
|
||
|
||
@override
|
||
String get welcomeDocFederationTitle => 'Föderation';
|
||
|
||
@override
|
||
String get welcomeDocFederationBlurb =>
|
||
'Weitere Hubs (Satelliten) anbinden, damit ihre Fähigkeiten hier nutzbar werden — was ein Satellit ist und wie die Anbindung abläuft.';
|
||
|
||
@override
|
||
String get welcomeDocRunsTitle => 'Hintergrund-Läufe';
|
||
|
||
@override
|
||
String get welcomeDocRunsBlurb =>
|
||
'Flows, die im Hintergrund weiterlaufen — wozu, wie man die Funktion einschaltet und die Läufe überwacht.';
|
||
|
||
@override
|
||
String get helpTooltip => 'Hilfe';
|
||
|
||
@override
|
||
String get errApprovalRejected => 'Freigabe vom Reviewer abgelehnt.';
|
||
|
||
@override
|
||
String get errApprovalRejectedHint =>
|
||
'Der Reviewer hat den Step abgelehnt. Begründung steht im Audit-Log.';
|
||
|
||
@override
|
||
String get errApprovalTimedOut => 'Freigabe-Timeout abgelaufen.';
|
||
|
||
@override
|
||
String get errApprovalTimedOutHint =>
|
||
'Es wurde nicht rechtzeitig entschieden. Entweder timeout_seconds am Freigabe-Step erhöhen oder den Reviewer informieren.';
|
||
|
||
@override
|
||
String get errOutputTooLarge =>
|
||
'Step-Output hat die Größenbegrenzung überschritten.';
|
||
|
||
@override
|
||
String get errOutputTooLargeHint =>
|
||
'Entweder Output kürzen (Text truncaten, Bytes komprimieren) oder max_output_size_mb in der Operator-Config erhöhen.';
|
||
|
||
@override
|
||
String get errServiceUnavailableForStep => 'Host-Service nicht konfiguriert.';
|
||
|
||
@override
|
||
String get errServiceUnavailableForStepHint =>
|
||
'Das Modul braucht einen Service (z.B. ollama, playwright), den der Operator nicht deklariert hat. Tragen Sie ihn unter services: in ~/.chain/config.yaml ein.';
|
||
|
||
@override
|
||
String get errMissingValue => 'Pflichtwert fehlt.';
|
||
|
||
@override
|
||
String get errMissingValueHint =>
|
||
'Der Step erwartet eine Eingabe, die nicht verdrahtet ist — entweder zur Laufzeit liefern oder den vorgelagerten \$ref korrigieren.';
|
||
|
||
@override
|
||
String get errMcpUnreachable => 'MCP-Endpunkt nicht erreichbar.';
|
||
|
||
@override
|
||
String get errMcpUnreachableHint =>
|
||
'Der MCP-Server hat nicht geantwortet. Endpunkt in Einstellungen → Integrationen prüfen und sicherstellen, dass er läuft.';
|
||
|
||
@override
|
||
String get errCapabilityNotInstalled =>
|
||
'Benötigte Capability nicht installiert.';
|
||
|
||
@override
|
||
String get errCapabilityNotInstalledHint =>
|
||
'Im Text-Tab des Flows klicken Sie auf den Fix-Button — der installiert die Capability, sofern sie im Store ist.';
|
||
|
||
@override
|
||
String get errNoStoreEntry =>
|
||
'Kein Store-Eintrag bietet diese Capability an.';
|
||
|
||
@override
|
||
String get errNoStoreEntryHint =>
|
||
'Drei Wege: lokales Modul installieren (chain install --link <pfad>), den passenden Store hinzufügen (Einstellungen → Stores) oder die Anbindung (MCP/n8n) einrichten, die sie bereitstellt. Falls gerade erst veröffentlicht: zuerst die Store-Seite aktualisieren.';
|
||
|
||
@override
|
||
String get welcomeDocClose => 'Schließen';
|
||
|
||
@override
|
||
String welcomeDocFailedToLoad(String error) {
|
||
return 'Doku konnte nicht geladen werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get welcomeChecklistHeader => 'ERSTE SCHRITTE';
|
||
|
||
@override
|
||
String get welcomeChecklistBody =>
|
||
'Vier Schritte zu einem funktionierenden Hub. Die Liste zeigt den Live-Zustand — nach einer Änderung oben rechts aktualisieren.';
|
||
|
||
@override
|
||
String get welcomeChecklistAi => 'System-KI konfigurieren';
|
||
|
||
@override
|
||
String get welcomeChecklistAiHint =>
|
||
'Einstellungen → System-KI. Wird für die KI-Suche und Fehlererklärungen gebraucht.';
|
||
|
||
@override
|
||
String get welcomeChecklistMcp => 'Öffentlichen Werkzeug-Katalog verbinden';
|
||
|
||
@override
|
||
String get welcomeChecklistMcpHint =>
|
||
'Verbindet einen öffentlichen Werkzeug-Katalog (Fachbegriff: MCP) — dessen Fähigkeiten erscheinen dann im Store. Dort hinzufügen oder unter Einstellungen → MCP-Clients.';
|
||
|
||
@override
|
||
String get welcomeChecklistModule => 'Ein Text-Modul installieren';
|
||
|
||
@override
|
||
String get welcomeChecklistModuleHint =>
|
||
'Im Store ein Modul aus der Kategorie Ihrer Wahl installieren. Module sind isolierte (sandboxed) Ch∆In-Komponenten.';
|
||
|
||
@override
|
||
String get welcomeChecklistFlow => 'Einen gespeicherten Flow starten';
|
||
|
||
@override
|
||
String get welcomeChecklistFlowHint =>
|
||
'Flows → einen wählen → Starten. Studio bringt einige Demo-Flows mit; ein eigener funktioniert genauso.';
|
||
|
||
@override
|
||
String get welcomeChecklistAllDone => 'Alle vier Schritte erledigt.';
|
||
|
||
@override
|
||
String get welcomeChecklistDismiss => 'Checkliste ausblenden';
|
||
|
||
@override
|
||
String get welcomeChecklistRefresh => 'Aktualisieren';
|
||
|
||
@override
|
||
String get welcomeChecklistRefreshing => 'Prüfe…';
|
||
|
||
@override
|
||
String get welcomeChecklistDone => 'Erledigt';
|
||
|
||
@override
|
||
String get welcomeChecklistTodo => 'Offen';
|
||
|
||
@override
|
||
String get navDoctor => 'Diagnose';
|
||
|
||
@override
|
||
String get navModules => 'Module';
|
||
|
||
@override
|
||
String get navStore => 'Store';
|
||
|
||
@override
|
||
String get navFlows => 'Flows';
|
||
|
||
@override
|
||
String get navAudit => 'Protokoll';
|
||
|
||
@override
|
||
String get navApprovals => 'Freigaben';
|
||
|
||
@override
|
||
String get connectionConnected => 'verbunden';
|
||
|
||
@override
|
||
String get connectionUnreachable => 'nicht erreichbar';
|
||
|
||
@override
|
||
String get connectionConnecting => 'verbinde…';
|
||
|
||
@override
|
||
String get connectionStartHub => 'Hub starten';
|
||
|
||
@override
|
||
String get connectionTapToStart => 'antippen zum Starten';
|
||
|
||
@override
|
||
String get sidebarSettingsTooltip => 'Einstellungen (⌘;)';
|
||
|
||
@override
|
||
String get sidebarChannelTooltip =>
|
||
'Aktiver Kanal — klicken zum Wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung';
|
||
|
||
@override
|
||
String get buttonCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String get buttonLearnMore => 'Mehr erfahren';
|
||
|
||
@override
|
||
String get buttonSave => 'Speichern';
|
||
|
||
@override
|
||
String get buttonClose => 'Schließen';
|
||
|
||
@override
|
||
String get buttonRetry => 'Erneut versuchen';
|
||
|
||
@override
|
||
String get buttonRefresh => 'Aktualisieren';
|
||
|
||
@override
|
||
String get buttonInstall => 'Installieren';
|
||
|
||
@override
|
||
String get buttonUninstall => 'Deinstallieren';
|
||
|
||
@override
|
||
String get buttonDetails => 'Details';
|
||
|
||
@override
|
||
String get buttonAdd => 'Hinzufügen';
|
||
|
||
@override
|
||
String get buttonRemove => 'Entfernen';
|
||
|
||
@override
|
||
String get buttonOpen => 'Öffnen';
|
||
|
||
@override
|
||
String get buttonExplain => 'Erklären';
|
||
|
||
@override
|
||
String get buttonReadDocs => 'Doku öffnen';
|
||
|
||
@override
|
||
String get buttonCopy => 'In Zwischenablage kopieren';
|
||
|
||
@override
|
||
String get buttonCopied => 'Kopiert';
|
||
|
||
@override
|
||
String get buttonShowDetails => 'Details anzeigen';
|
||
|
||
@override
|
||
String get buttonHideDetails => 'Details ausblenden';
|
||
|
||
@override
|
||
String get storeInstallableOnly => 'Nur installierbare';
|
||
|
||
@override
|
||
String get storePillComingSoon => 'Bald verfügbar';
|
||
|
||
@override
|
||
String storeNotInstallableInline(String status) {
|
||
return 'Dieses Modul ist auf der Roadmap (Status: $status). Es gibt noch kein installierbares Bundle — Repository verfolgen für Updates.';
|
||
}
|
||
|
||
@override
|
||
String get mcpSuggestionDeepwikiDesc =>
|
||
'Öffentliches HTTPS — KI-gestützte Doku-Suche in GitHub-Repos. Kein Node, kein API-Key.';
|
||
|
||
@override
|
||
String get mcpSuggestionSemgrepDesc =>
|
||
'Öffentliches HTTPS — Security-Scanning von Code-Schwachstellen. Kein Node, kein API-Key.';
|
||
|
||
@override
|
||
String get mcpSuggestionFilesystemDesc =>
|
||
'Anthropic — Dateien in /tmp lesen / schreiben. Pfad vor dem Speichern anpassen.';
|
||
|
||
@override
|
||
String get mcpSuggestionFetchDesc =>
|
||
'Anthropic — beliebige HTTP(S)-URLs als Markdown abrufen.';
|
||
|
||
@override
|
||
String get mcpSuggestionGithubDesc =>
|
||
'Anthropic — Issues, PRs, Repo-Dateien. Braucht einen GitHub-PAT in der Env-Variable.';
|
||
|
||
@override
|
||
String get mcpSuggestionPuppeteerDesc =>
|
||
'Anthropic — Headless-Browser-Automation für Screenshots / Scraping.';
|
||
|
||
@override
|
||
String get mcpSuggestionPostgresDesc =>
|
||
'Anthropic — Read-only-SQL-Queries gegen eine Postgres-Datenbank. URL anpassen.';
|
||
|
||
@override
|
||
String get mcpSuggestionSqliteDesc =>
|
||
'Anthropic — Abfragen gegen eine lokale SQLite-Datei. Pfad anpassen.';
|
||
|
||
@override
|
||
String get mcpSuggestionBraveSearchDesc =>
|
||
'Anthropic — Websuche via Brave. API-Key erforderlich.';
|
||
|
||
@override
|
||
String get mcpSuggestionMemoryDesc =>
|
||
'Anthropic — persistenter Knowledge-Graph als Agenten-Gedächtnis.';
|
||
|
||
@override
|
||
String get mcpSuggestionTimeDesc =>
|
||
'Anthropic — aktuelle Uhrzeit + Zeitzonen-Konvertierung.';
|
||
|
||
@override
|
||
String get mcpServerEnLanguageBadge =>
|
||
'Server-Text in Englisch — Studio zeigt ihn wie geliefert.';
|
||
|
||
@override
|
||
String get themePluginHeader => 'Theme-Plugin (wirkt sofort)';
|
||
|
||
@override
|
||
String themeApplied(String name) {
|
||
return 'Theme aktiv: $name';
|
||
}
|
||
|
||
@override
|
||
String get themePluginFailed =>
|
||
'Theme-Plugin konnte nicht geladen werden — vorheriges Theme bleibt.';
|
||
|
||
@override
|
||
String get themePluginNone => 'Standard (kein Plugin)';
|
||
|
||
@override
|
||
String get themePluginHint =>
|
||
'Built-in- und Plugin-Kacheln bringen handkuratierte Paletten mit. Die Kachel „Eigene Farbe\" leitet aus einer gewählten Seedfarbe eine vollständige Material-3-Palette ab (primary, secondary, tertiary, surface, …) — das ist ein vollwertiges Theme, kein Einzelfarb-Tweak.';
|
||
|
||
@override
|
||
String get themePluginEmpty =>
|
||
'Kein Theme-Plugin installiert. Im Store eines aus der Kategorie studio-plugin auswählen.';
|
||
|
||
@override
|
||
String get themePluginCustom => 'Eigene Farbe';
|
||
|
||
@override
|
||
String get themePluginCustomDialogTitle => 'Eigenes Theme — Seedfarbe wählen';
|
||
|
||
@override
|
||
String get themePluginCustomHexLabel => 'Hex-Farbe';
|
||
|
||
@override
|
||
String get themePluginCustomPreview => 'Live-Vorschau';
|
||
|
||
@override
|
||
String get themePluginCustomCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String get themePluginCustomApply => 'Anwenden';
|
||
|
||
@override
|
||
String get settingsTitle => 'Hub-Endpunkt';
|
||
|
||
@override
|
||
String get settingsHost => 'Host';
|
||
|
||
@override
|
||
String get settingsPort => 'Port';
|
||
|
||
@override
|
||
String get settingsTls => 'TLS';
|
||
|
||
@override
|
||
String get settingsSaveAndConnect => 'Mit Endpunkt verbinden';
|
||
|
||
@override
|
||
String get settingsLanguage => 'Sprache';
|
||
|
||
@override
|
||
String get settingsLanguageHint =>
|
||
'Sprache der App. Wirkt auf alle Seiten; mehrsprachige Store-Einträge folgen ebenfalls.';
|
||
|
||
@override
|
||
String get settingsHubEndpointHint =>
|
||
'Wohin soll Studio sich verbinden? Standard ist der lokale Hub auf 127.0.0.1:50051.';
|
||
|
||
@override
|
||
String get settingsTlsSubtitle => 'https/grpc-secure';
|
||
|
||
@override
|
||
String get settingsPortError => 'Port muss 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 brauchen Sie? Zum Beispiel „ein Modul, das tabellarische Daten liest\" — oder geben Sie einfach einen Begriff ein.';
|
||
|
||
@override
|
||
String get storeAskSubmit => 'Suchen';
|
||
|
||
@override
|
||
String get storeAskAi => 'KI fragen';
|
||
|
||
@override
|
||
String get storeAskClear => 'Frage zurücksetzen';
|
||
|
||
@override
|
||
String get storeAskAiThinking => 'Module werden durchsucht…';
|
||
|
||
@override
|
||
String get storeAskAiUnavailable =>
|
||
'Konfigurieren Sie eine System-AI in den Einstellungen, um Fragen in normaler Sprache zu stellen.';
|
||
|
||
@override
|
||
String get storeAskNoMatches =>
|
||
'Keine Treffer — Frage verfeinern oder im Grid unten stöbern.';
|
||
|
||
@override
|
||
String get storeAskAnswerLabel => 'KI-Vorschlag';
|
||
|
||
@override
|
||
String get storeAskAnswerWhy => 'Warum es passt';
|
||
|
||
@override
|
||
String get storeAskMatchPill => 'Treffer';
|
||
|
||
@override
|
||
String get storeFilterLabel => 'Filter';
|
||
|
||
@override
|
||
String storeFilterActiveCount(int n) {
|
||
return '$n aktiv';
|
||
}
|
||
|
||
@override
|
||
String get storeFilterReset => 'Filter zurücksetzen';
|
||
|
||
@override
|
||
String get storeFilterApply => 'Fertig';
|
||
|
||
@override
|
||
String get storeFilterStatusGroup => 'Status';
|
||
|
||
@override
|
||
String get storeFilterSourceGroup => 'Quelle';
|
||
|
||
@override
|
||
String get storeFilterInstalledGroup => 'Nur installierte zeigen';
|
||
|
||
@override
|
||
String get storeFeatured => 'EMPFOHLEN';
|
||
|
||
@override
|
||
String get storeFeaturedHint => 'kuratierte Auswahl · klicken für Details';
|
||
|
||
@override
|
||
String get storeNoMatches => 'Keine Treffer';
|
||
|
||
@override
|
||
String get storeNoMatchesHint =>
|
||
'Filter anpassen oder Suche leeren, um alle Einträge zu sehen.';
|
||
|
||
@override
|
||
String get storeClearFilters => 'Filter zurücksetzen';
|
||
|
||
@override
|
||
String get storeStatusAll => 'Alle';
|
||
|
||
@override
|
||
String get storeStatusPublished => 'stabil';
|
||
|
||
@override
|
||
String get storeStatusAlpha => 'experimentell';
|
||
|
||
@override
|
||
String get storeStatusAlphaHelp =>
|
||
'Frühe Version: läuft, wird aber noch weiterentwickelt und ist nicht für den regulierten Produktivbetrieb freigegeben.';
|
||
|
||
@override
|
||
String get storeStatusPublishedHelp =>
|
||
'Vom Herausgeber für den allgemeinen Einsatz freigegeben.';
|
||
|
||
@override
|
||
String get storeStatusPlannedHelp =>
|
||
'Angekündigt, aber noch nicht verfügbar.';
|
||
|
||
@override
|
||
String get storeStatusPlanned => 'geplant';
|
||
|
||
@override
|
||
String get storeInstalledOnly => 'Installiert';
|
||
|
||
@override
|
||
String get storeCategoryLabel => 'Kategorie';
|
||
|
||
@override
|
||
String get storeCategoryAll => 'Alle Kategorien';
|
||
|
||
@override
|
||
String get storeCategoryBridge => 'Verbindungen';
|
||
|
||
@override
|
||
String get storeCategoryDebug => 'Beispiele';
|
||
|
||
@override
|
||
String get storeCategoryText => 'Text';
|
||
|
||
@override
|
||
String get storeCategoryLlm => 'KI-Modelle';
|
||
|
||
@override
|
||
String get storeCategorySystem => 'System';
|
||
|
||
@override
|
||
String get storeCategoryAuth => 'Authentifizierung';
|
||
|
||
@override
|
||
String get storeCategoryStorage => 'Speicher';
|
||
|
||
@override
|
||
String get storeCategoryChannel => 'Kanäle';
|
||
|
||
@override
|
||
String get storeCategoryWeb => 'Web';
|
||
|
||
@override
|
||
String get storeCategoryOrchestrator => 'Orchestrierung';
|
||
|
||
@override
|
||
String get storeCategoryDocument => 'Dokument';
|
||
|
||
@override
|
||
String get storeCatDocuments => 'Dokumente';
|
||
|
||
@override
|
||
String get storeCatTextLanguage => 'Text & Sprache';
|
||
|
||
@override
|
||
String get storeCatData => 'Daten & Formate';
|
||
|
||
@override
|
||
String get storeCatAiLlm => 'KI & LLM';
|
||
|
||
@override
|
||
String get storeCatWebApi => 'Web & APIs';
|
||
|
||
@override
|
||
String get storeCatAnalysisDomain => 'Analyse & Domäne';
|
||
|
||
@override
|
||
String get storeCatStudioThemes => 'Studio & Designs';
|
||
|
||
@override
|
||
String get storeCatExamplesDev => 'Beispiele & Dev';
|
||
|
||
@override
|
||
String get storeCatOther => 'Sonstiges';
|
||
|
||
@override
|
||
String get storeSegmentModules => 'Module';
|
||
|
||
@override
|
||
String get storeSegmentStudio => 'Studio & Designs';
|
||
|
||
@override
|
||
String storeNResults(int n) {
|
||
return '$n Treffer';
|
||
}
|
||
|
||
@override
|
||
String get storeReloadTooltip => 'Aktualisieren';
|
||
|
||
@override
|
||
String get storesManagerButton => 'Store hinzufügen';
|
||
|
||
@override
|
||
String get storesManagerTitle => 'Module-Stores';
|
||
|
||
@override
|
||
String get storesManagerIntro =>
|
||
'Der Hub führt die Module aller Stores unten zu einem Index zusammen. Fügen Sie die Index-URL eines Stores hinzu, damit seine Module hier installierbar werden.';
|
||
|
||
@override
|
||
String get storesManagerAddSection => 'Store hinzufügen';
|
||
|
||
@override
|
||
String get storesManagerNameLabel => 'Name';
|
||
|
||
@override
|
||
String get storesManagerUrlLabel => 'Index-URL (https:// oder file://)';
|
||
|
||
@override
|
||
String get storesManagerAddAction => 'Hinzufügen';
|
||
|
||
@override
|
||
String storesManagerBundled(int count) {
|
||
return '$count Module · gebündelt';
|
||
}
|
||
|
||
@override
|
||
String storesManagerModuleCount(int count) {
|
||
return '$count Module';
|
||
}
|
||
|
||
@override
|
||
String get storesManagerAddFailed => 'Store konnte nicht hinzugefügt werden';
|
||
|
||
@override
|
||
String get storesManagerRemoveFailed => 'Store konnte nicht entfernt werden';
|
||
|
||
@override
|
||
String get storesManagerSuggested => 'Vorgeschlagene Stores';
|
||
|
||
@override
|
||
String get storesManagerAddShort => 'Hinzufügen';
|
||
|
||
@override
|
||
String get storesManagerPinnedKeyLabel =>
|
||
'Signatur-Schlüssel anheften (PEM, optional)';
|
||
|
||
@override
|
||
String get storesManagerPinnedKeyHint =>
|
||
'Nur Module, die mit diesem Schlüssel signiert sind, werden aus dieser Quelle angenommen. Fügen Sie den öffentlichen Schlüssel (PEM) des Herausgebers ein — statt des eingebauten Herstellerschlüssels.';
|
||
|
||
@override
|
||
String get storesManagerNotAvailable => 'Noch nicht verfügbar';
|
||
|
||
@override
|
||
String get storesManagerNotAvailableHint =>
|
||
'Der Anbieter hat diesen Store-Index noch nicht veröffentlicht. Sobald er das tut, ist er installierbar.';
|
||
|
||
@override
|
||
String get storesSuggestedReclaimDesc =>
|
||
'Recl∆Im — Module für Rechts- und Pflichten-Reform-Mapping';
|
||
|
||
@override
|
||
String get storeTodayBadge => 'HEUTE';
|
||
|
||
@override
|
||
String get storeFeaturedBadge => 'EMPFOHLEN';
|
||
|
||
@override
|
||
String get storeTodayDeck => 'Von der Ch∆In-Redaktion';
|
||
|
||
@override
|
||
String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden';
|
||
|
||
@override
|
||
String get storePillInstalled => 'installiert';
|
||
|
||
@override
|
||
String get storePillUpdate => 'Update';
|
||
|
||
@override
|
||
String storeUpdateButton(String version) {
|
||
return 'Update auf $version';
|
||
}
|
||
|
||
@override
|
||
String storeUpdateTooltip(String installed, String best) {
|
||
return 'Installiert $installed — Store bietet v$best';
|
||
}
|
||
|
||
@override
|
||
String get storeNoTagline => '(keine Beschreibung)';
|
||
|
||
@override
|
||
String get storeUninstallTitle => 'Modul deinstallieren?';
|
||
|
||
@override
|
||
String storeUninstallBody(String name) {
|
||
return 'Entfernt $name aus diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl.';
|
||
}
|
||
|
||
@override
|
||
String storeInstalledToast(String name, String version) {
|
||
return '$name v$version installiert.';
|
||
}
|
||
|
||
@override
|
||
String storeInstallFailedToast(String error) {
|
||
return 'Installation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String storeUninstalledToast(String name, String version) {
|
||
return '$name v$version deinstalliert.';
|
||
}
|
||
|
||
@override
|
||
String storeUninstallFailedToast(String error) {
|
||
return 'Deinstallation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String storeOpenBrowserFailed(String error) {
|
||
return 'Browser konnte nicht geöffnet werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get storeSectionTags => 'Tags';
|
||
|
||
@override
|
||
String get storeSectionRequiredCapabilities => 'Erforderliche Fähigkeiten';
|
||
|
||
@override
|
||
String get storeSectionRequiredHostServices => 'Erforderliche Host-Dienste';
|
||
|
||
@override
|
||
String get storeSectionScreenshots => 'Screenshots';
|
||
|
||
@override
|
||
String get storeSectionDocumentation => 'Dokumentation';
|
||
|
||
@override
|
||
String get storeSectionSource => 'Quelle';
|
||
|
||
@override
|
||
String get storeSectionPermissions => 'Deklarierte Berechtigungen';
|
||
|
||
@override
|
||
String get storeSectionDirectory => 'Modul-Verzeichnis';
|
||
|
||
@override
|
||
String get storeSectionPermissionsNone => '(keine — reines Berechnungsmodul)';
|
||
|
||
@override
|
||
String get storeInstallingButton => 'Installiere…';
|
||
|
||
@override
|
||
String get storeNotInstallable => 'Nicht installierbar';
|
||
|
||
@override
|
||
String storeNotInstallableTooltip(String status) {
|
||
return 'Status „$status\" — Installations-Pfad noch nicht verdrahtet.';
|
||
}
|
||
|
||
@override
|
||
String storeInstallProgressTitle(String name) {
|
||
return 'Installation von $name';
|
||
}
|
||
|
||
@override
|
||
String get storeInstallProgressBody => 'Holen, verifizieren, entpacken…';
|
||
|
||
@override
|
||
String get installPhaseResolve => 'Modul wird gesucht';
|
||
|
||
@override
|
||
String get installPhaseDownload => 'Wird heruntergeladen';
|
||
|
||
@override
|
||
String get installPhaseInstall => 'Wird geprüft und entpackt';
|
||
|
||
@override
|
||
String get installPhaseDone => 'Fertig';
|
||
|
||
@override
|
||
String installBytes(String done, String total) {
|
||
return '$done von $total MB';
|
||
}
|
||
|
||
@override
|
||
String installElapsed(int seconds) {
|
||
return '$seconds s vergangen';
|
||
}
|
||
|
||
@override
|
||
String get storeLoadDocs => 'Dokumentation laden';
|
||
|
||
@override
|
||
String get storeDocsHint =>
|
||
'README inline gerendert; nutzt das Registry-Token des Hubs, falls nötig.';
|
||
|
||
@override
|
||
String get storeDocsFetching => 'README wird geladen…';
|
||
|
||
@override
|
||
String get storeOpenRepoButton => 'Repository im Browser öffnen';
|
||
|
||
@override
|
||
String get storeDocsErrorNotFound =>
|
||
'Dieses Modul ist nicht im Store-Index des Hubs enthalten.';
|
||
|
||
@override
|
||
String get storeDocsErrorNoDocs =>
|
||
'Für dieses Modul ist keine Repository-URL hinterlegt.';
|
||
|
||
@override
|
||
String get storeDocsErrorAuth =>
|
||
'Die Registry erfordert Authentifizierung, um dieses README zu laden. Setzen Sie CHAIN_REGISTRY_TOKEN in der Umgebung des Daemons und starten Sie den Hub neu.';
|
||
|
||
@override
|
||
String storeDocsErrorNetwork(String detail) {
|
||
return 'Netzwerkfehler beim Laden des README. $detail';
|
||
}
|
||
|
||
@override
|
||
String get storeDocsErrorParse => 'README ist kein gültiges UTF-8.';
|
||
|
||
@override
|
||
String get storeDocsErrorGeneric => 'README konnte nicht geladen werden.';
|
||
|
||
@override
|
||
String get storeSourceLabel => 'Quelle';
|
||
|
||
@override
|
||
String get storeSourceAll => 'Alle Quellen';
|
||
|
||
@override
|
||
String get storeSourceNative => 'Nativ';
|
||
|
||
@override
|
||
String get storeSourceMcp => 'MCP';
|
||
|
||
@override
|
||
String get storeSourceN8n => 'n8n';
|
||
|
||
@override
|
||
String get storeProvenanceNative => 'nativ';
|
||
|
||
@override
|
||
String storeProvenanceMcp(String provider) {
|
||
return 'mcp · $provider';
|
||
}
|
||
|
||
@override
|
||
String storeProvenanceN8n(String provider) {
|
||
return 'n8n · $provider';
|
||
}
|
||
|
||
@override
|
||
String get storeRecommendedTitle =>
|
||
'Öffentliche Quelle hinzufügen — ein Klick';
|
||
|
||
@override
|
||
String get storeRecommendedBody =>
|
||
'Kuratierte MCP-Server über HTTPS erreichbar. Kein Subprozess, kein API-Key, kein Node. Föderierte Fähigkeiten erscheinen sofort im Store.';
|
||
|
||
@override
|
||
String get storeRecommendedAddTooltip => 'Hinzufügen und entdecken';
|
||
|
||
@override
|
||
String get storeRecommendedAdding => 'Wird hinzugefügt…';
|
||
|
||
@override
|
||
String get storeRecommendedDeepWikiTagline =>
|
||
'GitHub-Repo-Doku-Suche (KI-gestützt)';
|
||
|
||
@override
|
||
String get storeRecommendedSemgrepTagline =>
|
||
'Security-Scanning für Code-Schwachstellen';
|
||
|
||
@override
|
||
String storeProviderAddedToast(String name, int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'föderierte Fähigkeiten',
|
||
one: 'föderierte Fähigkeit',
|
||
);
|
||
return '$name hinzugefügt — $n $_temp0.';
|
||
}
|
||
|
||
@override
|
||
String storeProviderAddedZeroToast(String name) {
|
||
return '$name ist eingetragen, aber der Server hat noch keine Fähigkeiten geliefert. Öffnen Sie Einstellungen → MCP-Clients, um Discovery erneut zu versuchen oder den Server zu prüfen.';
|
||
}
|
||
|
||
@override
|
||
String storeProviderAddFailed(String name, String error) {
|
||
return '$name konnte nicht hinzugefügt werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get auditTitle => 'Protokoll';
|
||
|
||
@override
|
||
String get auditNoEvents => 'Noch keine Ereignisse';
|
||
|
||
@override
|
||
String get auditNoEventsHint =>
|
||
'Starten Sie einen Flow, um den Audit-Stream zu füllen.\nEreignisse erscheinen innerhalb von Sekunden.';
|
||
|
||
@override
|
||
String get auditFilterAll => 'Alle';
|
||
|
||
@override
|
||
String get auditFilterFlow => 'Flow';
|
||
|
||
@override
|
||
String get auditFilterStep => 'Schritt';
|
||
|
||
@override
|
||
String get auditFilterModule => 'Modul';
|
||
|
||
@override
|
||
String get auditFilterTooltip => 'Ereignisse filtern';
|
||
|
||
@override
|
||
String get auditClearLogTooltip => 'Protokoll löschen (nur local/dev Kanal)';
|
||
|
||
@override
|
||
String get auditMoreTooltip => 'Weitere Aktionen';
|
||
|
||
@override
|
||
String get auditSearchHint =>
|
||
'Ereignisse durchsuchen (Flow, Schritt, Modul, Fehlertext …)';
|
||
|
||
@override
|
||
String get auditExportAction => 'Aktuelle Ansicht als JSONL exportieren …';
|
||
|
||
@override
|
||
String get auditExportAllAction =>
|
||
'Vollständiges Protokoll als JSONL exportieren …';
|
||
|
||
@override
|
||
String get auditExportAllNothing =>
|
||
'Das Protokoll ist leer — nichts zu exportieren.';
|
||
|
||
@override
|
||
String get auditExportNothing =>
|
||
'Keine Ereignisse in der aktuellen Ansicht — nichts zu exportieren.';
|
||
|
||
@override
|
||
String auditExportSaved(int n, String path) {
|
||
return '$n Ereignisse exportiert nach $path';
|
||
}
|
||
|
||
@override
|
||
String get auditDevResetAction =>
|
||
'Entwicklungs-Reset: Protokoll löschen … (nur local/dev)';
|
||
|
||
@override
|
||
String auditClearedToast(int n, String channel) {
|
||
return '$n Ereignisse auf Kanal „$channel\" gelöscht. Kette mit Marker neu geseedet.';
|
||
}
|
||
|
||
@override
|
||
String auditClearFailed(String detail) {
|
||
return 'Löschen fehlgeschlagen: $detail';
|
||
}
|
||
|
||
@override
|
||
String get auditExplain => 'Erklären';
|
||
|
||
@override
|
||
String get auditReask => 'Neu fragen';
|
||
|
||
@override
|
||
String get auditAsking => 'Frage läuft…';
|
||
|
||
@override
|
||
String get auditSystemAi => 'SYSTEM-AI';
|
||
|
||
@override
|
||
String get auditCachedPill => 'gecacht';
|
||
|
||
@override
|
||
String auditOriginalLatency(int ms) {
|
||
return 'ursprünglich $ms ms';
|
||
}
|
||
|
||
@override
|
||
String auditLatency(int ms) {
|
||
return '$ms ms';
|
||
}
|
||
|
||
@override
|
||
String get auditRegenerateTooltip =>
|
||
'Neu generieren — Cache überspringen, Modell erneut fragen';
|
||
|
||
@override
|
||
String auditLiveStatus(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Ereignisse',
|
||
one: 'Ereignis',
|
||
);
|
||
return 'live · Abfrage alle 2s · $n $_temp0';
|
||
}
|
||
|
||
@override
|
||
String auditDisconnected(String error) {
|
||
return 'getrennt · $error';
|
||
}
|
||
|
||
@override
|
||
String get auditHashChainVerified => 'Hash-Kette geprüft';
|
||
|
||
@override
|
||
String get auditDetailHeader => 'DETAIL';
|
||
|
||
@override
|
||
String get auditAskingFull => 'Frage an die konfigurierte System-AI läuft…';
|
||
|
||
@override
|
||
String get auditFixLabel => 'FIX';
|
||
|
||
@override
|
||
String auditCachedTooltipKnown(String at, String hits) {
|
||
return 'Aus dem lokalen Cache geliefert. Ursprünglich erzeugt am $at$hits.';
|
||
}
|
||
|
||
@override
|
||
String auditCachedTooltipUnknown(String hits) {
|
||
return 'Aus dem lokalen Cache geliefert. Ursprünglicher Zeitpunkt unbekannt$hits.';
|
||
}
|
||
|
||
@override
|
||
String auditCachedTooltipHits(int n) {
|
||
return ' · $n Treffer';
|
||
}
|
||
|
||
@override
|
||
String get auditConfigureSystemAi =>
|
||
'System-AI unter Einstellungen konfigurieren (Cmd+,)';
|
||
|
||
@override
|
||
String get auditClearDialogTitle => 'Audit-Log löschen?';
|
||
|
||
@override
|
||
String get auditClearDialogBody =>
|
||
'Löscht jedes Audit-Event auf dem aktiven Kanal und seedet einen neuen chain.reset-Marker mit Prüfer und Begründung. Auf beta / production verweigert. Nicht umkehrbar.';
|
||
|
||
@override
|
||
String get auditClearReviewerLabel => 'Prüfer';
|
||
|
||
@override
|
||
String get auditClearReviewerHelper =>
|
||
'Wird als ungeprüfte Angabe festgehalten (Präfix „unverified:“) — der Hub übernimmt den Namen unverändert.';
|
||
|
||
@override
|
||
String get auditClearReasonLabel =>
|
||
'Begründung (im chain.reset-Marker festgehalten)';
|
||
|
||
@override
|
||
String get auditClearReasonHelper =>
|
||
'Erforderlich — Auditoren werden das lesen.';
|
||
|
||
@override
|
||
String get auditClearLogButton => 'Log löschen';
|
||
|
||
@override
|
||
String get modulesTitle => 'Module';
|
||
|
||
@override
|
||
String get modulesNoneTitle => 'Noch keine Module';
|
||
|
||
@override
|
||
String get modulesNoneHint =>
|
||
'chain install <capability-name> ausführen oder ~/.chain/modules/ prüfen.';
|
||
|
||
@override
|
||
String get modulesReloadTooltip => 'Aktualisieren';
|
||
|
||
@override
|
||
String get modulesRecentActivity => 'LETZTE AKTIVITÄT';
|
||
|
||
@override
|
||
String modulesRecentActivityHint(int n) {
|
||
return 'letzte $n install/uninstall-Ereignisse aus dem Audit-Log';
|
||
}
|
||
|
||
@override
|
||
String get modulesActivityInstalled => 'installiert';
|
||
|
||
@override
|
||
String get modulesActivityUninstalled => 'deinstalliert';
|
||
|
||
@override
|
||
String get modulesCapabilitiesLabel => 'Fähigkeiten';
|
||
|
||
@override
|
||
String get modulesUninstallTitle => 'Modul deinstallieren?';
|
||
|
||
@override
|
||
String modulesUninstallBody(String name, String version) {
|
||
return 'Entfernt $name v$version von diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl. Ein module.uninstalled-Audit-Event wird festgehalten.';
|
||
}
|
||
|
||
@override
|
||
String modulesUninstalledToast(String name, String version) {
|
||
return '$name v$version deinstalliert.';
|
||
}
|
||
|
||
@override
|
||
String modulesUninstallFailed(String error) {
|
||
return 'Deinstallation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get modulesUninstalling => 'Wird deinstalliert…';
|
||
|
||
@override
|
||
String moduleSheetFailedToLoad(String error) {
|
||
return 'Laden fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get moduleSheetCapabilities => 'Fähigkeiten';
|
||
|
||
@override
|
||
String get moduleSheetPermissions => 'Deklarierte Berechtigungen';
|
||
|
||
@override
|
||
String get moduleSheetNoPermissions => '(keine — reines Berechnungsmodul)';
|
||
|
||
@override
|
||
String get flowsTitle => 'Flows';
|
||
|
||
@override
|
||
String get flowsReloadTooltip => 'Aktualisieren';
|
||
|
||
@override
|
||
String get flowsNoneTitle => 'Keine gespeicherten Flows';
|
||
|
||
@override
|
||
String get flowsNoneHint =>
|
||
'Flow speichern mit chain admin flows save <name> <flow.yaml>, dann taucht er hier auf.';
|
||
|
||
@override
|
||
String flowsRunDialogTitle(String name) {
|
||
return '$name ausführen';
|
||
}
|
||
|
||
@override
|
||
String get flowsRunDialogBody =>
|
||
'Pro deklariertem Input ein Feld. Bytes-Inputs öffnen einen Datei-Picker; alle anderen sind Klartext. Der Starten-Button aktiviert sich, wenn alle Pflichtfelder gefüllt sind.';
|
||
|
||
@override
|
||
String get flowsLoadingDefinition => 'Inputs werden geladen…';
|
||
|
||
@override
|
||
String get flowsDefinitionFailed =>
|
||
'Flow-Definition konnte nicht geladen werden';
|
||
|
||
@override
|
||
String get flowsNoInputs =>
|
||
'Dieser Flow deklariert keine Inputs. Starten klicken, um loszulegen.';
|
||
|
||
@override
|
||
String get flowsTypeBytesPick => 'Datei wählen…';
|
||
|
||
@override
|
||
String get flowsTypeBytesChange => 'Datei ändern';
|
||
|
||
@override
|
||
String get flowsTypeBytesNoFile => 'Keine Datei ausgewählt';
|
||
|
||
@override
|
||
String flowsTypeBytesSize(int n) {
|
||
return '$n Bytes';
|
||
}
|
||
|
||
@override
|
||
String get flowsRunErrorTitle => 'Flow-Lauf fehlgeschlagen';
|
||
|
||
@override
|
||
String flowsFileReadFailed(String path, String error) {
|
||
return '„$path\" konnte nicht gelesen werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get flowsMissingModulesLabel => 'Braucht:';
|
||
|
||
@override
|
||
String get flowsRunDisabledTooltip =>
|
||
'Erst die fehlenden Module installieren.';
|
||
|
||
@override
|
||
String flowsInstallAllButton(int n) {
|
||
return 'Alle installieren ($n)';
|
||
}
|
||
|
||
@override
|
||
String get flowsInstallPillTooltip => 'Zum Installieren klicken';
|
||
|
||
@override
|
||
String get flowsInstallDepsTitle => 'Abhängigkeiten installieren';
|
||
|
||
@override
|
||
String get flowsInstallDepsBody =>
|
||
'Die fehlenden Module werden der Reihe nach installiert. Vorhandene Installationen bleiben unberührt.';
|
||
|
||
@override
|
||
String get flowsInstallStatusPending => 'Wartet';
|
||
|
||
@override
|
||
String get flowsInstallStatusInstalling => 'Wird installiert…';
|
||
|
||
@override
|
||
String flowsInstallStatusDone(String version) {
|
||
return 'Installiert v$version';
|
||
}
|
||
|
||
@override
|
||
String get flowsInstallStatusFailed => 'Fehlgeschlagen';
|
||
|
||
@override
|
||
String flowsInstallStatusFailedDetail(String error) {
|
||
return '$error';
|
||
}
|
||
|
||
@override
|
||
String get flowsInstallDepsAllDone => 'Alle Abhängigkeiten installiert.';
|
||
|
||
@override
|
||
String flowsInstallDepsAnyFailed(int ok, int failed) {
|
||
return '$ok installiert, $failed fehlgeschlagen.';
|
||
}
|
||
|
||
@override
|
||
String get flowsInstallAuthWallButton => 'Registry-Token einfügen';
|
||
|
||
@override
|
||
String get flowsOpenInEditorTooltip => 'Im Studio-Flow-Editor öffnen';
|
||
|
||
@override
|
||
String flowsOpenInEditorFailed(String error) {
|
||
return 'Konnte Datei nicht öffnen: $error';
|
||
}
|
||
|
||
@override
|
||
String get registryCredentialsHeader => 'REGISTRY-ZUGANGSDATEN';
|
||
|
||
@override
|
||
String get registryCredentialsBlurb =>
|
||
'Token zum Herunterladen von .chain-Modulen aus einer Registry mit Anmeldepflicht (Forgejo, private GitHub-Repos). Gespeichert in ~/.chain/registry-token, Modus 0600. Die Umgebungsvariable CHAIN_REGISTRY_TOKEN hat weiterhin Vorrang, wenn gesetzt.';
|
||
|
||
@override
|
||
String registryTokenStatusConfigured(int chars) {
|
||
return 'Konfiguriert ($chars Zeichen)';
|
||
}
|
||
|
||
@override
|
||
String get registryTokenStatusNotSet => 'Nicht gesetzt';
|
||
|
||
@override
|
||
String get registryTokenFieldLabel => 'Token';
|
||
|
||
@override
|
||
String get registryTokenFieldHint => 'Forgejo- oder GitHub-PAT einfügen';
|
||
|
||
@override
|
||
String get registryTokenSaveButton => 'Speichern';
|
||
|
||
@override
|
||
String get registryTokenClearButton => 'Entfernen';
|
||
|
||
@override
|
||
String get registryTokenStorageHint =>
|
||
'Lokal gespeichert in ~/.chain/registry-token. Wird nie an einen Remote-Dienst übertragen.';
|
||
|
||
@override
|
||
String get registryTokenSavedToast => 'Registry-Token gespeichert.';
|
||
|
||
@override
|
||
String get registryTokenClearedToast => 'Registry-Token entfernt.';
|
||
|
||
@override
|
||
String registryTokenSaveFailedToast(String error) {
|
||
return 'Speichern fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get authPolicyHeader => 'ZUGRIFFSSCHUTZ DES HUBS';
|
||
|
||
@override
|
||
String get authPolicyBlurb =>
|
||
'Wie der Hub eingehende Aufrufe prüft: aktives Prüfverfahren, Tokens und ihre Rechte (Scopes). Geheimnisse bleiben in Umgebungsvariablen — hier erscheinen nur deren Namen.';
|
||
|
||
@override
|
||
String get authPolicyValidatorStatic =>
|
||
'Prüfverfahren: statische Token-Liste';
|
||
|
||
@override
|
||
String get authPolicyValidatorJwt =>
|
||
'Prüfverfahren: JWT (RS256) über eine externe Identitätsstelle';
|
||
|
||
@override
|
||
String get authPolicyAnonymous =>
|
||
'Keine Tokens konfiguriert — der Hub akzeptiert anonyme Aufrufe. Für lokales Arbeiten in Ordnung; für den Produktivbetrieb Tokens in ~/.chain/config.yaml einrichten.';
|
||
|
||
@override
|
||
String get authPolicyReloadRequired =>
|
||
'Die Konfigurationsdatei (oder eine Umgebungsvariable) wurde seit dem Laden geändert — der Hub erzwingt noch den alten Stand. Unten „Neu laden“ wählen, damit die Änderung wirkt.';
|
||
|
||
@override
|
||
String get authPolicyNeedsAdmin =>
|
||
'Diese Ansicht braucht ein Token mit admin-Recht. Hinterlegen Sie es oben unter „Hub-Authentifizierung“ und laden Sie neu.';
|
||
|
||
@override
|
||
String get authPolicyHubTooOld =>
|
||
'Der verbundene Hub kennt diese Ansicht noch nicht — er ist älter als Studio. Aktualisieren Sie den Hub (chain update apply) und laden Sie neu.';
|
||
|
||
@override
|
||
String get authPolicyRetry => 'Erneut versuchen';
|
||
|
||
@override
|
||
String get authPolicyReload => 'Tokens neu laden';
|
||
|
||
@override
|
||
String authPolicyReloadDone(int n) {
|
||
return 'Neu geladen — $n Token aktiv.';
|
||
}
|
||
|
||
@override
|
||
String get authPolicyEditHint =>
|
||
'Bearbeitet wird die Richtlinie in ~/.chain/config.yaml (Abschnitt auth:). Nach einer Änderung oder Token-Rotation hier neu laden — der Hub übernimmt sie ohne Neustart.';
|
||
|
||
@override
|
||
String authPolicyEnvSet(String env) {
|
||
return 'Umgebungsvariable $env ist gesetzt';
|
||
}
|
||
|
||
@override
|
||
String authPolicyEnvMissing(String env) {
|
||
return 'Umgebungsvariable $env FEHLT — das Token ist nicht nutzbar';
|
||
}
|
||
|
||
@override
|
||
String authPolicyRateLimit(int n) {
|
||
return '$n/min';
|
||
}
|
||
|
||
@override
|
||
String get authPolicyJwtKeySource => 'Schlüsselquelle';
|
||
|
||
@override
|
||
String get authPolicyJwtAudience => 'Audience (aud)';
|
||
|
||
@override
|
||
String get authPolicyJwtIssuer => 'Aussteller (iss)';
|
||
|
||
@override
|
||
String get authPolicyJwtScopeClaim => 'Scope-Claim';
|
||
|
||
@override
|
||
String get authPolicyNotChecked => 'wird nicht geprüft';
|
||
|
||
@override
|
||
String get hubAuthTokenHeader => 'HUB-AUTHENTIFIZIERUNG';
|
||
|
||
@override
|
||
String get hubAuthTokenBlurb =>
|
||
'Bearer-Token für die Studio-Anbindung an einen Hub mit aktivierter auth.tokens-Konfiguration (RBAC Level 2). Gespeichert in ~/.chain/hub-auth-token, Modus 0600. Studio sendet ihn als Authorization: Bearer bei jedem gRPC-Aufruf.';
|
||
|
||
@override
|
||
String hubAuthTokenStatusConfigured(int chars) {
|
||
return 'Eingerichtet ($chars Zeichen)';
|
||
}
|
||
|
||
@override
|
||
String get hubAuthTokenStatusNotSet => 'Nicht gesetzt (anonym)';
|
||
|
||
@override
|
||
String get hubAuthTokenFieldLabel => 'Token';
|
||
|
||
@override
|
||
String get hubAuthTokenFieldHint =>
|
||
'Token aus dem auth.tokens-Eintrag des Hub-Operators einfügen';
|
||
|
||
@override
|
||
String get hubAuthTokenSaveButton => 'Speichern';
|
||
|
||
@override
|
||
String get hubAuthTokenClearButton => 'Entfernen';
|
||
|
||
@override
|
||
String get hubAuthTokenStorageHint =>
|
||
'Lokal gespeichert in ~/.chain/hub-auth-token. Studio verbindet nach dem Speichern automatisch neu, der Token wirkt sofort.';
|
||
|
||
@override
|
||
String get hubAuthTokenSavedToast => 'Hub-Token gespeichert.';
|
||
|
||
@override
|
||
String get hubAuthTokenClearedToast => 'Hub-Token entfernt.';
|
||
|
||
@override
|
||
String hubAuthTokenSaveFailedToast(String error) {
|
||
return 'Speichern fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get storeAdvisoryVersionTooltip =>
|
||
'Föderierter Upstream-Dienst — Version ist Richtwert; der Upstream kann ohne Versionsanhebung Kompatibilität brechen.';
|
||
|
||
@override
|
||
String get uninstallVersionPickerTitle => 'Version zum Entfernen wählen';
|
||
|
||
@override
|
||
String uninstallVersionPickerBody(String module) {
|
||
return 'Mehrere Versionen von $module sind parallel installiert. Wählen Sie genau die Version aus, die entfernt werden soll — die anderen bleiben bestehen.';
|
||
}
|
||
|
||
@override
|
||
String get uninstallVersionPickerContinue => 'Weiter';
|
||
|
||
@override
|
||
String get defaultScopeHeader => 'STANDARD-SCOPE';
|
||
|
||
@override
|
||
String get defaultScopeBlurb =>
|
||
'Geordnete Liste von Publisher-Segmenten, die der Hub konsultiert, wenn ein Flow eine Capability ohne explizites <provider>/-Präfix benennt. Erster Treffer gewinnt — die Segmente, die euer Team am häufigsten nutzt, gehören nach oben. Katalog-bekannte Publisher erscheinen als Chips; private Segmente lassen sich frei eintragen.';
|
||
|
||
@override
|
||
String get defaultScopeAddLabel => 'Publisher-Segment hinzufügen';
|
||
|
||
@override
|
||
String get defaultScopeAddHint => 'z.B. acme.team';
|
||
|
||
@override
|
||
String get defaultScopeAddButton => 'Hinzufügen';
|
||
|
||
@override
|
||
String get defaultScopeSuggestions => 'Katalog-Vorschläge:';
|
||
|
||
@override
|
||
String get defaultScopeSavedToast => 'Standard-Scope aktualisiert.';
|
||
|
||
@override
|
||
String get defaultScopeLoadFailed =>
|
||
'Standard-Scope konnte nicht geladen werden.';
|
||
|
||
@override
|
||
String get defaultScopeNonEmptyError =>
|
||
'Standard-Scope darf nicht leer sein — mindestens ein Segment muss erhalten bleiben.';
|
||
|
||
@override
|
||
String get maintenanceHeader => 'HUB-WARTUNG';
|
||
|
||
@override
|
||
String get maintenanceResetBlurb =>
|
||
'Operator-Zustand zurücksetzen und mit einem sauberen Hub neu starten. Stoppt jeden laufenden Daemon, sichert ~/.chain/ atomar in ein Backup, legt es dann neu an — Binary, Channel-Pointer, MCP-/n8n-/System-AI-Konfiguration und Registry-Token bleiben erhalten. Wiederherstellen durch Zurückverschieben des Backup-Ordners.';
|
||
|
||
@override
|
||
String get maintenanceKeepModulesTitle => 'Installierte Module behalten';
|
||
|
||
@override
|
||
String get maintenanceKeepModulesSubtitle =>
|
||
'Standardverhalten löscht ~/.chain/modules/, damit eine frische Installation den Modul-Bezugspfad end-to-end verifizieren kann.';
|
||
|
||
@override
|
||
String get maintenanceKeepDataTitle =>
|
||
'Protokoll + gespeicherte Flows behalten';
|
||
|
||
@override
|
||
String get maintenanceKeepDataSubtitle =>
|
||
'Standardverhalten löscht ~/.chain/data/, damit die Audit-Kette mit einer neuen Genesis startet und die mitgelieferten Sample-Flows beim ersten Daemon-Start neu importiert werden.';
|
||
|
||
@override
|
||
String get maintenanceResetButton => 'Hub zurücksetzen';
|
||
|
||
@override
|
||
String get maintenanceResetInProgress => 'Zurücksetzen…';
|
||
|
||
@override
|
||
String get maintenanceResetConfirmTitle => 'Hub zurücksetzen?';
|
||
|
||
@override
|
||
String get maintenanceResetConfirmBody =>
|
||
'Stoppt jeden Daemon, verschiebt ~/.chain/ in ein Backup mit Zeitstempel und startet sauber neu. Das Backup ist vollständig wiederherstellbar. Fortfahren?';
|
||
|
||
@override
|
||
String get maintenanceResetConfirmButton => 'Zurücksetzen';
|
||
|
||
@override
|
||
String get welcomeChecklistAllSetTitle => 'Sie sind eingerichtet.';
|
||
|
||
@override
|
||
String get welcomeChecklistAllSetBody =>
|
||
'Drei Stränge, an denen Sie als Nächstes ziehen können:';
|
||
|
||
@override
|
||
String get welcomeChecklistNextAuditTitle => 'Audit-Log lesen';
|
||
|
||
@override
|
||
String get welcomeChecklistNextAuditBody =>
|
||
'Jede Installation, jeder Flow-Lauf, jede Freigabe landet im hash-verketteten Protokoll. Im Protokoll-Tab sehen Sie, was Ihr Hub gemacht hat.';
|
||
|
||
@override
|
||
String get welcomeChecklistNextAuditButton => 'Protokoll öffnen';
|
||
|
||
@override
|
||
String get welcomeChecklistNextTodayTitle => 'Daily-Today-Story einrichten';
|
||
|
||
@override
|
||
String get welcomeChecklistNextTodayBody =>
|
||
'Für Fortgeschrittene: das Skript tools/today/propose.sh regelmäßig (Cron) laufen lassen — die Editorial-Karte im Store füllt sich dann mit kuratierten Stories.';
|
||
|
||
@override
|
||
String get welcomeChecklistNextTodayButton => 'Today-Doku öffnen';
|
||
|
||
@override
|
||
String get welcomeChecklistNextModuleTitle => 'Eigenes Modul bauen';
|
||
|
||
@override
|
||
String get welcomeChecklistNextModuleBody =>
|
||
'Für Entwickler: Mit chain new module <name> entsteht ein fertiges Modul-Gerüst (Rust+WASM). Das module-sdk übernimmt die technische Anbindung; Sie schreiben nur die eigentliche Logik.';
|
||
|
||
@override
|
||
String get welcomeChecklistNextModuleButton => 'Doku lesen';
|
||
|
||
@override
|
||
String get auditGroupToday => 'HEUTE';
|
||
|
||
@override
|
||
String get auditGroupYesterday => 'GESTERN';
|
||
|
||
@override
|
||
String get auditGroupThisWeek => 'DIESE WOCHE';
|
||
|
||
@override
|
||
String get auditGroupOlder => 'ÄLTER';
|
||
|
||
@override
|
||
String get auditEventViewFlowRun => 'Flow-Lauf ansehen';
|
||
|
||
@override
|
||
String auditFlowRunDialogTitle(String flow) {
|
||
return 'Flow-Lauf · $flow';
|
||
}
|
||
|
||
@override
|
||
String auditFlowRunDialogSubtitle(int n, String execution) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Ereignisse',
|
||
one: 'Ereignis',
|
||
);
|
||
return '$n $_temp0 für Lauf $execution';
|
||
}
|
||
|
||
@override
|
||
String get approvalsSelectAll => 'Alle wählen';
|
||
|
||
@override
|
||
String get approvalsClearSelection => 'Auswahl aufheben';
|
||
|
||
@override
|
||
String approvalsBatchSelected(int n) {
|
||
return '$n ausgewählt';
|
||
}
|
||
|
||
@override
|
||
String get approvalsBatchApprove => 'Alle freigeben';
|
||
|
||
@override
|
||
String get approvalsBatchReject => 'Alle ablehnen';
|
||
|
||
@override
|
||
String approvalsBatchApproveDoneToast(int n) {
|
||
return '$n Freigaben erteilt.';
|
||
}
|
||
|
||
@override
|
||
String approvalsBatchRejectDoneToast(int n) {
|
||
return '$n Freigaben abgelehnt.';
|
||
}
|
||
|
||
@override
|
||
String approvalsBatchPartialFailure(int ok, int failed) {
|
||
return '$ok erledigt, $failed fehlgeschlagen.';
|
||
}
|
||
|
||
@override
|
||
String get flowsRunButton => 'Starten';
|
||
|
||
@override
|
||
String flowsRunningTitle(String name) {
|
||
return '$name läuft';
|
||
}
|
||
|
||
@override
|
||
String flowsResultTitle(String name) {
|
||
return '$name — Ergebnis';
|
||
}
|
||
|
||
@override
|
||
String flowsErrorTitle(String name) {
|
||
return '$name — fehlgeschlagen';
|
||
}
|
||
|
||
@override
|
||
String get flowsRunning => 'Flow läuft…';
|
||
|
||
@override
|
||
String get flowsNoOutputs => 'Flow abgeschlossen ohne deklarierte Outputs.';
|
||
|
||
@override
|
||
String get errGeneric => 'Da ist etwas schiefgegangen.';
|
||
|
||
@override
|
||
String get errInvalidArgument => 'Ungültige Eingabe.';
|
||
|
||
@override
|
||
String get errInvalidArgumentHint =>
|
||
'Werte im Formular prüfen und erneut versuchen.';
|
||
|
||
@override
|
||
String get errNotFound => 'Nicht gefunden.';
|
||
|
||
@override
|
||
String get errNotFoundHint =>
|
||
'Das Angefragte ist nicht hier — entweder entfernt oder nie existiert.';
|
||
|
||
@override
|
||
String get errAlreadyExists => 'Existiert bereits.';
|
||
|
||
@override
|
||
String get errPermissionDenied => 'Berechtigung verweigert.';
|
||
|
||
@override
|
||
String get errPermissionDeniedHint =>
|
||
'Die Operator-Policy des Hubs blockiert diese Aktion. ~/.chain/config.yaml prüfen.';
|
||
|
||
@override
|
||
String get errFailedPrecondition => 'Setup-Problem hat das blockiert.';
|
||
|
||
@override
|
||
String get errFailedPreconditionHint =>
|
||
'Der Hub konnte nicht weiter, weil etwas Vorausgesetztes fehlt. Details unten erklären was.';
|
||
|
||
@override
|
||
String get errInternal => 'Unerwarteter interner Fehler.';
|
||
|
||
@override
|
||
String get errInternalHint =>
|
||
'Hub-Logs unter ~/.chain/logs/ prüfen. Wenn das öfter passiert, bitte melden.';
|
||
|
||
@override
|
||
String get errUnavailable => 'Hub nicht erreichbar.';
|
||
|
||
@override
|
||
String get errUnavailableHint =>
|
||
'Sicherstellen, dass chain serve (oder chain daemon start) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.';
|
||
|
||
@override
|
||
String get errUnauthenticated => 'Authentifizierung erforderlich.';
|
||
|
||
@override
|
||
String get errUnauthenticatedHint =>
|
||
'CHAIN_REGISTRY_TOKEN setzen oder in den Einstellungen anmelden, dann erneut versuchen.';
|
||
|
||
@override
|
||
String get errCopyDetail => 'Detail kopieren';
|
||
|
||
@override
|
||
String get errDetailCopied => 'Detail in die Zwischenablage kopiert.';
|
||
|
||
@override
|
||
String get flowsOutputUnknown => 'Unbekannter Output-Payload-Typ.';
|
||
|
||
@override
|
||
String get flowsOutputBytesUnknownMime => 'Binärdaten';
|
||
|
||
@override
|
||
String get flowsOutputSaveAs => 'Speichern unter…';
|
||
|
||
@override
|
||
String get flowsOutputSaveAsTitle => 'Flow-Output speichern';
|
||
|
||
@override
|
||
String flowsOutputSavedAt(String path) {
|
||
return 'Gespeichert: $path';
|
||
}
|
||
|
||
@override
|
||
String flowsOutputSaveFailed(String error) {
|
||
return 'Speichern fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get flowsOutputOpen => 'Öffnen';
|
||
|
||
@override
|
||
String flowsOutputOpenFailed(String error) {
|
||
return 'Öffnen fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get approvalsTitle => 'Freigaben';
|
||
|
||
@override
|
||
String get approvalsTabPending => 'Offen';
|
||
|
||
@override
|
||
String get approvalsTabHistory => 'Verlauf';
|
||
|
||
@override
|
||
String get approvalsInboxZero => 'Posteingang leer';
|
||
|
||
@override
|
||
String get approvalsInboxHint =>
|
||
'Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.';
|
||
|
||
@override
|
||
String get approvalsReloadTooltip => 'Aktualisieren';
|
||
|
||
@override
|
||
String get approvalsPillPending => 'offen';
|
||
|
||
@override
|
||
String get approvalsPillApproved => 'freigegeben';
|
||
|
||
@override
|
||
String get approvalsPillRejected => 'abgelehnt';
|
||
|
||
@override
|
||
String get approvalsPillExpired => 'abgelaufen';
|
||
|
||
@override
|
||
String get approvalsPayloadPreview => 'ZU PRÜFENDE DATEN';
|
||
|
||
@override
|
||
String get approvalsNoPayload =>
|
||
'Zu dieser Freigabe wurden keine Daten hinterlegt. Sie entscheiden ohne Detailansicht — fragen Sie im Zweifel die Person, die den Vorgang eingerichtet hat. (Technisch: das Feld \"show:\" des Freigabe-Schritts legt fest, was hier erscheint.)';
|
||
|
||
@override
|
||
String get approvalsNoDataConfirmTitle => 'Ohne Prüfdaten freigeben?';
|
||
|
||
@override
|
||
String get approvalsNoDataConfirmBody =>
|
||
'Dieser Flow hat bewusst keine Prüfdaten hinterlegt (kein \"show:\" am Freigabe-Schritt). Sie können trotzdem freigeben — entscheiden dann aber, ohne die Daten hinter dieser Entscheidung gesehen zu haben.';
|
||
|
||
@override
|
||
String get approvalsNoDataConfirmAction => 'Trotzdem freigeben';
|
||
|
||
@override
|
||
String get approvalsRequestFallback =>
|
||
'Freigabe für diesen Schritt erforderlich';
|
||
|
||
@override
|
||
String approvalsFlowStepMeta(String flow, String step) {
|
||
return 'Flow: $flow · Schritt: $step';
|
||
}
|
||
|
||
@override
|
||
String get approvalsIntroHelp =>
|
||
'Hier warten pausierte Vorgänge (Flows) auf Ihre Entscheidung. Jede Karte zeigt, welcher Vorgang an welchem Schritt hält und welche Daten er Ihnen vorlegt — Freigeben setzt ihn fort, Ablehnen stoppt ihn mit Ihrer Begründung.';
|
||
|
||
@override
|
||
String get approvalsReviewerLabel => 'Sie entscheiden als';
|
||
|
||
@override
|
||
String get approvalsReviewerUnverifiedPill => 'nicht überprüft';
|
||
|
||
@override
|
||
String approvalsReviewerRecordedAs(Object value) {
|
||
return 'Wird gespeichert als: $value';
|
||
}
|
||
|
||
@override
|
||
String get approvalsReviewerNoteAnonymous =>
|
||
'Dieser Hub nimmt Aufrufe ohne Zugangsdaten an — eine Entscheidung lässt sich damit niemandem nachweisen. Studio kennzeichnet den Namen deshalb im Eintrag selbst als ungeprüfte Angabe.';
|
||
|
||
@override
|
||
String get approvalsReviewerNoteAuthenticated =>
|
||
'Der Hub prüft Ihren Zugang, übernimmt den Namen aber unverändert von Studio. Bis der Hub die Identität aus dem geprüften Zugang selbst ableitet, kennzeichnet Studio den Namen im Eintrag als ungeprüfte Angabe.';
|
||
|
||
@override
|
||
String get approvalsReviewerNoteUnknown =>
|
||
'Studio konnte die Zugangs-Einstellungen dieses Hubs nicht lesen (dafür braucht es Admin-Rechte). Der Name wird unverändert übernommen und deshalb im Eintrag als ungeprüfte Angabe gekennzeichnet.';
|
||
|
||
@override
|
||
String get approvalsReviewerUnverifiedTooltip =>
|
||
'Ungeprüfte Angabe: Dieser Name stammt vom entscheidenden Studio, nicht vom Hub.';
|
||
|
||
@override
|
||
String get approvalsRejectDialogHelp =>
|
||
'Die Ablehnung stoppt den Vorgang an diesem Schritt und wird mit Ihrer Begründung im Prüfprotokoll festgehalten.';
|
||
|
||
@override
|
||
String get approvalsRejectReasonHelper =>
|
||
'Pflichtfeld — wird im Prüfprotokoll (Audit-Log) festgehalten.';
|
||
|
||
@override
|
||
String get approvalsBatchNoDataTitle => 'Ohne Prüfdaten freigeben?';
|
||
|
||
@override
|
||
String approvalsBatchNoDataBody(num count, Object total) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
count,
|
||
locale: localeName,
|
||
other:
|
||
'Von $total ausgewählten Freigaben haben $count keine Prüfdaten. Sie geben sie ohne Detailansicht frei.',
|
||
one:
|
||
'Von $total ausgewählten Freigaben hat 1 keine Prüfdaten. Sie geben sie ohne Detailansicht frei.',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get approvalsCopyRun => 'Lauf-Kennung kopieren';
|
||
|
||
@override
|
||
String get approvalsRunCopied => 'Lauf-Kennung kopiert';
|
||
|
||
@override
|
||
String get approvalsUnknownReviewer => '(unbekannt)';
|
||
|
||
@override
|
||
String get approvalsOriginLabel => 'HERKUNFT';
|
||
|
||
@override
|
||
String get approvalsOriginProject => 'Projekt';
|
||
|
||
@override
|
||
String get approvalsOriginRequested => 'Angefordert';
|
||
|
||
@override
|
||
String get approvalsOriginRun => 'Lauf';
|
||
|
||
@override
|
||
String get approvalsApproveTooltip => 'Setzt den Flow an diesem Schritt fort';
|
||
|
||
@override
|
||
String get approvalsRejectTooltip => 'Stoppt den Flow — mit Ihrer Begründung';
|
||
|
||
@override
|
||
String get approvalsApproveButton => 'Freigeben';
|
||
|
||
@override
|
||
String get approvalsRejectButton => 'Ablehnen';
|
||
|
||
@override
|
||
String get approvalsRejectDialogTitle => 'Freigabe ablehnen';
|
||
|
||
@override
|
||
String get approvalsRejectReasonLabel => 'Begründung';
|
||
|
||
@override
|
||
String approvalsApprovedToast(String flow, String step) {
|
||
return 'freigegeben · $flow › $step';
|
||
}
|
||
|
||
@override
|
||
String approvalsRejectedToast(String flow, String step) {
|
||
return 'abgelehnt · $flow › $step';
|
||
}
|
||
|
||
@override
|
||
String approvalsApproveFailed(String error) {
|
||
return 'Freigabe fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String approvalsRejectFailed(String error) {
|
||
return 'Ablehnung fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get approvalsHistoryEmpty => 'Noch kein Verlauf';
|
||
|
||
@override
|
||
String get approvalsHistoryEmptyHint =>
|
||
'Entschiedene Freigaben (freigegeben / abgelehnt / abgelaufen) erscheinen hier.\nDas Audit-Log enthält den vollständigen hash-verketteten Datensatz.';
|
||
|
||
@override
|
||
String get approvalsDialogDecided => 'entschieden';
|
||
|
||
@override
|
||
String get approvalsDialogCreated => 'erstellt';
|
||
|
||
@override
|
||
String get approvalsDialogReason => 'Begründung';
|
||
|
||
@override
|
||
String get approvalsDialogPrompt => 'FRAGE';
|
||
|
||
@override
|
||
String approvalsExpiresIn(int minutes) {
|
||
return '${minutes}m';
|
||
}
|
||
|
||
@override
|
||
String approvalsExpiresInHours(int hours) {
|
||
return '${hours}h';
|
||
}
|
||
|
||
@override
|
||
String get doctorTitle => 'Diagnose';
|
||
|
||
@override
|
||
String get doctorSummaryModules => 'Module';
|
||
|
||
@override
|
||
String get doctorSummaryApprovals => 'Freigaben';
|
||
|
||
@override
|
||
String get doctorSummaryAudit => 'Protokoll';
|
||
|
||
@override
|
||
String get doctorSummaryServices => 'Dienste';
|
||
|
||
@override
|
||
String doctorSummaryCapabilities(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: '$n Fähigkeiten',
|
||
one: '1 Fähigkeit',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get doctorSummaryPending => 'offen';
|
||
|
||
@override
|
||
String doctorSummaryChain(int verified, int total) {
|
||
return '$verified von $total Ereignissen geprüft';
|
||
}
|
||
|
||
@override
|
||
String get doctorSummaryDeclared => 'deklariert';
|
||
|
||
@override
|
||
String doctorOllamaSuggest(String endpoint) {
|
||
return 'Die System-KI nutzt Ollama auf $endpoint — als Host-Dienst deklarieren, damit Module und Diagnose ihn kennen?';
|
||
}
|
||
|
||
@override
|
||
String get doctorOllamaDeclareButton => 'Als Host-Dienst deklarieren';
|
||
|
||
@override
|
||
String get doctorOllamaDeclared =>
|
||
'Als Host-Dienst „ollama“ deklariert — wirksam nach einem Daemon-Neustart (Knopf unten auf dieser Seite).';
|
||
|
||
@override
|
||
String updateHintBanner(String local, String latest) {
|
||
return 'Für den Hub ($local) ist Version $latest verfügbar.';
|
||
}
|
||
|
||
@override
|
||
String get updateHintOpenDoctor => 'Diagnose öffnen';
|
||
|
||
@override
|
||
String get updateHintDismiss => 'Später';
|
||
|
||
@override
|
||
String get svcExposureLoopback => 'nur lokal';
|
||
|
||
@override
|
||
String get svcExposurePrivate => 'privates Netz';
|
||
|
||
@override
|
||
String get svcExposurePublic => 'öffentlich erreichbar';
|
||
|
||
@override
|
||
String get svcExposureUnknown => 'Reichweite unbekannt';
|
||
|
||
@override
|
||
String get svcExposurePublicHint =>
|
||
'Dieser Dienst-Endpunkt liegt auf einer öffentlichen Adresse — prüfen Sie, ob er abgesichert ist (TLS, Auth, Firewall).';
|
||
|
||
@override
|
||
String get svcExposureUnknownHint =>
|
||
'Hostname statt IP-Adresse — der Hub löst zur Einstufung bewusst keine Namen auf. Prüfen Sie selbst, wohin der Name zeigt.';
|
||
|
||
@override
|
||
String get doctorLinkStore => 'Store öffnen';
|
||
|
||
@override
|
||
String get doctorLinkApprovals => 'Freigaben öffnen';
|
||
|
||
@override
|
||
String get doctorLinkAudit => 'Protokoll öffnen';
|
||
|
||
@override
|
||
String get doctorLinkConfig => 'Konfiguration ansehen';
|
||
|
||
@override
|
||
String get doctorLinkReleaseNotes => 'Versionshinweise im Browser öffnen';
|
||
|
||
@override
|
||
String doctorModulesPanelSummary(int n, int m) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: '$n Module',
|
||
one: '1 Modul',
|
||
);
|
||
String _temp1 = intl.Intl.pluralLogic(
|
||
m,
|
||
locale: localeName,
|
||
other: '$m Fähigkeiten',
|
||
one: '1 Fähigkeit',
|
||
);
|
||
return '$_temp0 · $_temp1';
|
||
}
|
||
|
||
@override
|
||
String get doctorApprovalsNone => 'Keine offenen Freigaben';
|
||
|
||
@override
|
||
String doctorApprovalsCount(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: '$n Freigaben warten auf Prüfung',
|
||
one: '1 Freigabe wartet auf Prüfung',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get doctorApprovalsAttentionPill => 'wichtig';
|
||
|
||
@override
|
||
String get doctorServicesEmpty => 'Keine Host-Dienste deklariert';
|
||
|
||
@override
|
||
String get doctorServicesEmptyHint =>
|
||
'in ~/.chain/config.yaml unter services: hinzufügen';
|
||
|
||
@override
|
||
String get doctorPillLoaded => 'geladen';
|
||
|
||
@override
|
||
String get doctorPillEmpty => 'leer';
|
||
|
||
@override
|
||
String get doctorRecheckTooltip => 'Erneut prüfen';
|
||
|
||
@override
|
||
String get doctorEventLogSection => 'Audit-Log';
|
||
|
||
@override
|
||
String get doctorModulesApprovalsSection => 'Module & Freigaben';
|
||
|
||
@override
|
||
String get doctorHostServicesSection => 'Host-Dienste';
|
||
|
||
@override
|
||
String get doctorDaemonFilesSection => 'Daemon-Dateien';
|
||
|
||
@override
|
||
String get doctorDaemonControlSection => 'Daemon-Steuerung';
|
||
|
||
@override
|
||
String get doctorChainIntact => 'Hash-Kette intakt';
|
||
|
||
@override
|
||
String doctorChainIntactDetail(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'Ereignisse',
|
||
one: 'Ereignis',
|
||
);
|
||
return '$n $_temp0 · Verkettung lückenlos geprüft';
|
||
}
|
||
|
||
@override
|
||
String get doctorChainTampered => 'Manipulation erkannt';
|
||
|
||
@override
|
||
String doctorChainTamperedDetail(int verified, int total, String id) {
|
||
return '$verified von $total verifiziert vor Mismatch bei $id';
|
||
}
|
||
|
||
@override
|
||
String get doctorChainPillOk => 'Hash-Kette geprüft';
|
||
|
||
@override
|
||
String get doctorChainPillTamper => 'MANIPULIERT';
|
||
|
||
@override
|
||
String get doctorVerifyNow => 'Jetzt prüfen';
|
||
|
||
@override
|
||
String get doctorRestart => 'Neustart';
|
||
|
||
@override
|
||
String get doctorStart => 'Starten';
|
||
|
||
@override
|
||
String get doctorStop => 'Stoppen';
|
||
|
||
@override
|
||
String get doctorStatusAction => 'Status';
|
||
|
||
@override
|
||
String doctorRunningOn(String name, String endpoint) {
|
||
return 'Läuft auf $name: $endpoint';
|
||
}
|
||
|
||
@override
|
||
String doctorStoppedOn(String name) {
|
||
return '$name-Daemon gestoppt';
|
||
}
|
||
|
||
@override
|
||
String get doctorStatusUnknown => 'Daemon-Status: …';
|
||
|
||
@override
|
||
String get doctorPillRunning => 'läuft';
|
||
|
||
@override
|
||
String get doctorPillStopped => 'gestoppt';
|
||
|
||
@override
|
||
String get doctorDaemonControlHint =>
|
||
'Studio ruft das Platform-Binary auf — entspricht chain daemon …, sodass CLI und UI im Gleichschritt bleiben.';
|
||
|
||
@override
|
||
String get doctorDaemonControlWorking => 'Wird ausgeführt…';
|
||
|
||
@override
|
||
String doctorConnLine(String endpoint, String transport, String auth) {
|
||
return 'Verbindung: $endpoint · $transport · $auth';
|
||
}
|
||
|
||
@override
|
||
String get doctorConnTls => 'TLS-verschlüsselt';
|
||
|
||
@override
|
||
String get doctorConnPlainLocal =>
|
||
'unverschlüsselt (bleibt auf diesem Rechner)';
|
||
|
||
@override
|
||
String get doctorConnPlainRemote => 'unverschlüsselt';
|
||
|
||
@override
|
||
String doctorConnToken(int count) {
|
||
return 'Token gesetzt ($count Zeichen)';
|
||
}
|
||
|
||
@override
|
||
String get doctorConnAnonymous => 'ohne Token (anonym)';
|
||
|
||
@override
|
||
String get doctorDbVolatileWarning =>
|
||
'Die Audit-Datenbank liegt in einem temporären Ordner, den das Betriebssystem jederzeit aufräumen kann. Für belastbare Nachweise gehört das Datenverzeichnis des Hubs an einen dauerhaften Ort.';
|
||
|
||
@override
|
||
String get doctorPathLog => 'Log';
|
||
|
||
@override
|
||
String get doctorPathConfig => 'Konfig';
|
||
|
||
@override
|
||
String get doctorPathDb => 'Audit-DB';
|
||
|
||
@override
|
||
String get doctorPathModules => 'Module-Verzeichnis';
|
||
|
||
@override
|
||
String get doctorPathFlows => 'Flow-Verzeichnis';
|
||
|
||
@override
|
||
String get doctorPathPid => 'PID-Datei';
|
||
|
||
@override
|
||
String get doctorPathsEmpty =>
|
||
'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via chain daemon restart.';
|
||
|
||
@override
|
||
String doctorOpenError(String detail) {
|
||
return 'Konnte nicht öffnen: $detail';
|
||
}
|
||
|
||
@override
|
||
String doctorUpdateAvailable(String version) {
|
||
return 'Update verfügbar — $version';
|
||
}
|
||
|
||
@override
|
||
String doctorUpdateBody(String channel, String version) {
|
||
return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft chain update apply --channel $channel auf.';
|
||
}
|
||
|
||
@override
|
||
String get doctorUpdateUnreachable => 'Release-Host nicht erreichbar';
|
||
|
||
@override
|
||
String doctorUpdateUnreachableBody(String channel) {
|
||
return 'Release-Feed für $channel konnte nicht erreicht werden.';
|
||
}
|
||
|
||
@override
|
||
String doctorReleaseNotes(String url) {
|
||
return 'Notes: $url';
|
||
}
|
||
|
||
@override
|
||
String get doctorPillNew => 'neu';
|
||
|
||
@override
|
||
String get doctorPillOffline => 'offline';
|
||
|
||
@override
|
||
String get doctorApplyUpdate => 'Update anwenden';
|
||
|
||
@override
|
||
String get doctorApplying => 'Wird angewendet…';
|
||
|
||
@override
|
||
String get doctorApplyDone =>
|
||
'Update angewendet. Studio neu starten, um die neue Daemon-Version zu sehen.';
|
||
|
||
@override
|
||
String get mcpHeader => 'MCP-CLIENTS';
|
||
|
||
@override
|
||
String get mcpHint =>
|
||
'Externe MCP-Server bringen ihre Tools als mcp.<server>.<tool> Fähigkeiten ein. Einmal konfigurieren, im Store sichtbar.';
|
||
|
||
@override
|
||
String get mcpEmpty =>
|
||
'Keine MCP-Server konfiguriert. + klicken zum Hinzufügen.';
|
||
|
||
@override
|
||
String get n8nHeader => 'N8N-ENDPUNKTE';
|
||
|
||
@override
|
||
String get n8nHint =>
|
||
'Aktive n8n-Workflows erscheinen als n8n.<endpoint>.<slug> Fähigkeiten. Einmal konfigurieren, im Store sichtbar.';
|
||
|
||
@override
|
||
String get n8nEmpty =>
|
||
'Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.';
|
||
|
||
@override
|
||
String get hubUnreachable => 'Hub nicht erreichbar';
|
||
|
||
@override
|
||
String get hubViewTooOldTitle =>
|
||
'Diese Ansicht braucht eine neuere Hub-Version';
|
||
|
||
@override
|
||
String get hubViewTooOldHint =>
|
||
'Der Hub ist verbunden, aber seine Version kennt diese Ansicht noch nicht. Aktualisieren Sie den Hub (Diagnose → Update), dann erscheint der Inhalt hier.';
|
||
|
||
@override
|
||
String get hubViewLoadFailedTitle =>
|
||
'Diese Ansicht konnte nicht geladen werden';
|
||
|
||
@override
|
||
String get hubUnreachableHint => 'Hub starten mit chain serve.';
|
||
|
||
@override
|
||
String get languageEnglish => 'English';
|
||
|
||
@override
|
||
String get languageGerman => 'Deutsch';
|
||
|
||
@override
|
||
String get searchHint =>
|
||
'Springe überall hin — Module, Store, Flows, Seiten…';
|
||
|
||
@override
|
||
String get searchIndexing => 'Indiziere…';
|
||
|
||
@override
|
||
String get searchNoMatches => 'Keine Treffer.';
|
||
|
||
@override
|
||
String get searchHintNavigate => '↑↓ navigieren';
|
||
|
||
@override
|
||
String get searchHintOpen => 'Enter öffnen';
|
||
|
||
@override
|
||
String get searchHintClose => 'Esc schließen';
|
||
|
||
@override
|
||
String get searchGroupPages => 'Seiten';
|
||
|
||
@override
|
||
String get searchGroupWorkspace => 'Projekte & Bereiche';
|
||
|
||
@override
|
||
String get searchWorkspaceHint => 'Kontext wechseln · ⌘P';
|
||
|
||
@override
|
||
String get searchWorkspaceSealedPickerHint => 'Auswahl öffnen · ⌘P';
|
||
|
||
@override
|
||
String get searchGroupModules => 'Module';
|
||
|
||
@override
|
||
String get searchGroupStore => 'Store';
|
||
|
||
@override
|
||
String get searchGroupFlows => 'Flows';
|
||
|
||
@override
|
||
String get searchSettingsLabel => 'Einstellungen';
|
||
|
||
@override
|
||
String searchPageHint(int n) {
|
||
return 'Seite · ⌘$n';
|
||
}
|
||
|
||
@override
|
||
String get searchSettingsHint => 'Hub-Endpunkt, Kanäle, System-AI · ⌘;';
|
||
|
||
@override
|
||
String searchInstalledModuleHint(String version) {
|
||
return 'installiertes Modul · v$version';
|
||
}
|
||
|
||
@override
|
||
String get searchStoreUncategorized => 'ohne Kategorie';
|
||
|
||
@override
|
||
String searchStoreHintWithTagline(String tagline) {
|
||
return 'Store · $tagline';
|
||
}
|
||
|
||
@override
|
||
String searchStoreHintWithCategory(String category) {
|
||
return 'Store · $category';
|
||
}
|
||
|
||
@override
|
||
String get searchSavedFlowHint => 'gespeicherter Flow';
|
||
|
||
@override
|
||
String get systemAiTitle => 'System-AI';
|
||
|
||
@override
|
||
String get systemAiIntro =>
|
||
'Die hub-interne LLM, die die Plattform selbst für Fehlererklärungen und Operator-Hilfe nutzt. Standardmäßig aus; hier konfigurieren. Siehe docs/architecture/system-ai.md, was über die Leitung geht.';
|
||
|
||
@override
|
||
String get systemAiProviderLabel => 'Provider';
|
||
|
||
@override
|
||
String get systemAiEndpointLabel => 'Endpunkt-URL (bis /v1)';
|
||
|
||
@override
|
||
String get systemAiApiKeyRequired =>
|
||
'API-Key-Umgebungsvariable (erforderlich)';
|
||
|
||
@override
|
||
String get systemAiApiKeyOptional => 'API-Key-Umgebungsvariable (optional)';
|
||
|
||
@override
|
||
String systemAiApiKeyDisclaimer(String name) {
|
||
return 'Studio liest oder speichert den Key-Wert nie — nur den Namen der Umgebungsvariable. Der Hub liest \$$name zur Anfragezeit.';
|
||
}
|
||
|
||
@override
|
||
String get systemAiTestConnection => 'Verbindung testen';
|
||
|
||
@override
|
||
String get systemAiTesting => 'Teste…';
|
||
|
||
@override
|
||
String get systemAiSave => 'Speichern';
|
||
|
||
@override
|
||
String get systemAiPrivacyHeader => 'PRIVACY-MODUS';
|
||
|
||
@override
|
||
String get systemAiPrivacyOffLabel => 'Aus';
|
||
|
||
@override
|
||
String get systemAiPrivacyOffDesc =>
|
||
'Feature deaktiviert. Keine Anfragen verlassen den Hub.';
|
||
|
||
@override
|
||
String get systemAiPrivacyRedactedLabel => 'Redigiert';
|
||
|
||
@override
|
||
String get systemAiPrivacyRedactedDesc =>
|
||
'Nur event_type / error / Modul-Namen. KRITIS-freundlicher Standard.';
|
||
|
||
@override
|
||
String get systemAiPrivacyFullLabel => 'Voll';
|
||
|
||
@override
|
||
String get systemAiPrivacyFullDesc =>
|
||
'Enthält das Audit-Detail-JSON (nur Hash — keine Roh-Payloads).';
|
||
|
||
@override
|
||
String get systemAiConnectionOk => 'Verbindung ok';
|
||
|
||
@override
|
||
String get systemAiConnectionFailed => 'Verbindung fehlgeschlagen';
|
||
|
||
@override
|
||
String systemAiReplyPrefix(String text) {
|
||
return 'Antwort: $text';
|
||
}
|
||
|
||
@override
|
||
String get systemAiModelLabel => 'Modell (erforderlich)';
|
||
|
||
@override
|
||
String get systemAiModelHintFallback =>
|
||
'Modell-Identifier, den der Provider erwartet';
|
||
|
||
@override
|
||
String get systemAiModelHelperBase =>
|
||
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen.';
|
||
|
||
@override
|
||
String get systemAiModelHelperOllama =>
|
||
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen. Mit Pull von Ollama herunterladen.';
|
||
|
||
@override
|
||
String get systemAiRefresh => 'Aktualisieren';
|
||
|
||
@override
|
||
String get systemAiPull => 'Pull';
|
||
|
||
@override
|
||
String get systemAiPulling => 'Lade…';
|
||
|
||
@override
|
||
String systemAiCouldNotListModels(String error) {
|
||
return 'Modelle konnten nicht aufgelistet werden: $error';
|
||
}
|
||
|
||
@override
|
||
String get systemAiNoModelsOllama =>
|
||
'Noch keine Modelle auf dem Ollama-Server. Oben eintippen und Pull klicken.';
|
||
|
||
@override
|
||
String get systemAiNoModelsGeneric => 'Provider lieferte keine Modelle.';
|
||
|
||
@override
|
||
String get systemAiSuitabilityRecommended => 'empfohlen';
|
||
|
||
@override
|
||
String get systemAiSuitabilityBalanced => 'ausgewogen';
|
||
|
||
@override
|
||
String get systemAiSuitabilitySmall => 'klein — Qualität evtl. eingeschränkt';
|
||
|
||
@override
|
||
String get systemAiSuitabilityLarge => 'groß — langsamer';
|
||
|
||
@override
|
||
String get systemAiSuitabilityHuge =>
|
||
'sehr groß — auf einem Laptop wahrscheinlich zu langsam';
|
||
|
||
@override
|
||
String get systemAiSuitabilityUnknown => 'Größe unbekannt';
|
||
|
||
@override
|
||
String systemAiHwDetected(String summary) {
|
||
return 'Erkannt: $summary';
|
||
}
|
||
|
||
@override
|
||
String systemAiHwReviewed(String date) {
|
||
return ' · Kuratierung geprüft $date';
|
||
}
|
||
|
||
@override
|
||
String systemAiLegendRecommended(String tier) {
|
||
return 'empfohlen für diese Hardware$tier';
|
||
}
|
||
|
||
@override
|
||
String get systemAiLegendBalanced => 'ausgewogen (4-8B)';
|
||
|
||
@override
|
||
String get systemAiLegendSmallLarge =>
|
||
'klein <3B / groß 9-15B / über Hardware';
|
||
|
||
@override
|
||
String get systemAiLegendHuge => 'sehr groß >15B';
|
||
|
||
@override
|
||
String get systemAiLegendUnknown => 'Größe unbekannt';
|
||
|
||
@override
|
||
String systemAiCacheRow(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: 'gespeicherte Erklärungen',
|
||
one: 'gespeicherte Erklärung',
|
||
);
|
||
return 'Cache: $n $_temp0. Identische Prompts treffen den Cache; Modell- oder Privacy-Modus-Wechsel leeren ihn automatisch.';
|
||
}
|
||
|
||
@override
|
||
String get systemAiCacheClear => 'Leeren';
|
||
|
||
@override
|
||
String systemAiCacheClearedToast(int n) {
|
||
return '$n gespeicherte System-AI-Erklärungen gelöscht.';
|
||
}
|
||
|
||
@override
|
||
String systemAiCacheClearFailed(String error) {
|
||
return 'Cache-Löschen fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get systemAiPullEmptyError =>
|
||
'Erst eine Modell-ID eintippen (z.B. gemma3:4b).';
|
||
|
||
@override
|
||
String systemAiPullFailedError(String error) {
|
||
return 'Pull fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String storeProvenanceTemporal(String provider) {
|
||
return 'temporal · $provider';
|
||
}
|
||
|
||
@override
|
||
String get storeSourceTemporal => 'Temporal';
|
||
|
||
@override
|
||
String get navFlowEditor => 'Editor';
|
||
|
||
@override
|
||
String get flowEditorBackTooltip => 'Zurück';
|
||
|
||
@override
|
||
String get flowEditorNew => 'Neuer Flow';
|
||
|
||
@override
|
||
String get flowEditorSave => 'Speichern';
|
||
|
||
@override
|
||
String get flowEditorRun => 'Ausführen';
|
||
|
||
@override
|
||
String get flowEditorRefresh => 'Datei-Liste neu laden';
|
||
|
||
@override
|
||
String get flowEditorRunOutput => 'LAUF-ERGEBNIS';
|
||
|
||
@override
|
||
String get flowEditorEmptyTitle => 'Kein Flow geöffnet';
|
||
|
||
@override
|
||
String get flowEditorEmptyBody =>
|
||
'Wählen Sie links einen aus oder klicken Sie auf Neuer Flow, um einen neuen anzulegen.';
|
||
|
||
@override
|
||
String get flowEditorListEmptyTitle => 'Keine gespeicherten Flows';
|
||
|
||
@override
|
||
String get flowEditorListEmptyBody =>
|
||
'Klicken Sie auf Neuer Flow, um aus einer Vorlage zu starten.';
|
||
|
||
@override
|
||
String get flowEditorDiscardTitle => 'Ungespeicherte Änderungen verwerfen?';
|
||
|
||
@override
|
||
String get flowEditorDiscardBody =>
|
||
'Beim Wechsel der Datei gehen alle noch nicht gespeicherten Änderungen verloren.';
|
||
|
||
@override
|
||
String get flowEditorDiscardKeep => 'Weiterbearbeiten';
|
||
|
||
@override
|
||
String get flowEditorDiscardThrow => 'Verwerfen';
|
||
|
||
@override
|
||
String get flowEditorNewDialogTitle => 'Neuer Flow';
|
||
|
||
@override
|
||
String get flowEditorNewDialogLabel => 'Flow-Name';
|
||
|
||
@override
|
||
String get flowEditorNewDialogHelper =>
|
||
'Kleinbuchstaben, Ziffern, Bindestrich, Unterstrich';
|
||
|
||
@override
|
||
String get flowEditorNewDialogCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String get flowEditorNewDialogCreate => 'Anlegen';
|
||
|
||
@override
|
||
String flowEditorNewTemplateComment(String name) {
|
||
return 'Von Studios Flow-Editor erstellt. Bearbeiten, speichern, ausführen.';
|
||
}
|
||
|
||
@override
|
||
String flowEditorAlreadyExists(String name) {
|
||
return 'Ein Flow namens \"$name\" existiert bereits.';
|
||
}
|
||
|
||
@override
|
||
String get buttonView => 'Ansehen';
|
||
|
||
@override
|
||
String logViewerTitle(String title, int count) {
|
||
return '$title — letzte $count Zeilen';
|
||
}
|
||
|
||
@override
|
||
String get logViewerEmpty => 'Log-Datei ist leer oder existiert noch nicht.';
|
||
|
||
@override
|
||
String get logViewerCopyAll => 'Alles kopieren';
|
||
|
||
@override
|
||
String get logViewerOpenExternal => 'Im Standardeditor öffnen';
|
||
|
||
@override
|
||
String logViewerLineCount(int count) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
count,
|
||
locale: localeName,
|
||
other: '$count Zeilen',
|
||
one: '1 Zeile',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get doctorPathStudioErrors => 'Studio-Fehler';
|
||
|
||
@override
|
||
String get settingsCategoryGeneral => 'Allgemein';
|
||
|
||
@override
|
||
String get settingsCategoryAppearance => 'Darstellung';
|
||
|
||
@override
|
||
String get settingsCategoryAbout => 'Über';
|
||
|
||
@override
|
||
String get aboutPanelTitle => 'Über Ch∆In';
|
||
|
||
@override
|
||
String get aboutPanelBody =>
|
||
'Produkt-, Hersteller- und Lizenzangaben dieser Installation — alle Werte sind kopierbar.';
|
||
|
||
@override
|
||
String get aboutProduct => 'Produkt';
|
||
|
||
@override
|
||
String get aboutStudioVersion => 'Studio-Version';
|
||
|
||
@override
|
||
String get aboutHubVersion => 'Hub-Version';
|
||
|
||
@override
|
||
String get aboutHubVersionUnknown => 'nicht verbunden';
|
||
|
||
@override
|
||
String get aboutVendor => 'Hersteller';
|
||
|
||
@override
|
||
String get aboutAuthor => 'Autor';
|
||
|
||
@override
|
||
String get aboutLicense => 'Lizenz';
|
||
|
||
@override
|
||
String get aboutContact => 'Kontakt';
|
||
|
||
@override
|
||
String get aboutDocs => 'Dokumentation';
|
||
|
||
@override
|
||
String get aboutOpenLink => 'Im Browser öffnen';
|
||
|
||
@override
|
||
String get aboutCopyTooltip => 'Kopieren';
|
||
|
||
@override
|
||
String get aboutCopiedToast => 'In die Zwischenablage kopiert.';
|
||
|
||
@override
|
||
String get sidebarSearchLabel => 'Suchen & Befehle';
|
||
|
||
@override
|
||
String installConfirmTitle(String name) {
|
||
return '„$name\" installieren?';
|
||
}
|
||
|
||
@override
|
||
String get installConfirmVersion => 'Version';
|
||
|
||
@override
|
||
String get installConfirmSource => 'Quelle';
|
||
|
||
@override
|
||
String get installConfirmSourceBundled => 'Mitgelieferter Store-Index';
|
||
|
||
@override
|
||
String get installConfirmLicense => 'Lizenz';
|
||
|
||
@override
|
||
String get installConfirmStatus => 'Reifegrad';
|
||
|
||
@override
|
||
String get installConfirmNeedsServices => 'Benötigte Dienste';
|
||
|
||
@override
|
||
String get installConfirmNeedsCapabilities => 'Benötigte Fähigkeiten';
|
||
|
||
@override
|
||
String get installConfirmTrustTitle => 'Vertrauen & Sicherheit';
|
||
|
||
@override
|
||
String get installConfirmTrustBody =>
|
||
'Das Modul läuft in einer Sandbox: Es darf nur auf die Netzwerk-Endpunkte, Dateien und Umgebungsvariablen zugreifen, die es selbst deklariert — der Hub setzt diese Liste durch. Die vollständige Berechtigungsliste sehen Sie nach der Installation in den Modul-Details.';
|
||
|
||
@override
|
||
String get storeSectionMaintainers => 'Maintainer';
|
||
|
||
@override
|
||
String get storeSectionDataSource => 'Datenquelle';
|
||
|
||
@override
|
||
String get storeDataSourceLicense => 'Bedingungen';
|
||
|
||
@override
|
||
String get storeDataSourceAttribution => 'Namensnennung erforderlich';
|
||
|
||
@override
|
||
String get storeDataSourceNote =>
|
||
'Diese Bedingungen gelten für das Material, das dieses Modul abruft, nicht für das Modul selbst. Es lädt in Ihrem Auftrag und liefert keine Kopie der Daten mit.';
|
||
|
||
@override
|
||
String get storeMaintainersNone => 'nicht angegeben';
|
||
|
||
@override
|
||
String get installConfirmMaintainers => 'Maintainer';
|
||
|
||
@override
|
||
String get storePolicyUnverifiedNotice =>
|
||
'Die Signaturpflicht ist in der Hub-Richtlinie ausgeschaltet — Installationen werden nicht kryptografisch geprüft. Der Installations-Dialog zeigt den Status je Modul; für geprüfte Installationen security.require_signatures aktivieren.';
|
||
|
||
@override
|
||
String get verifPillBlocked => 'blockiert';
|
||
|
||
@override
|
||
String get verifPinnedKey =>
|
||
'Signatur wird geprüft — hinterlegter Store-Schlüssel';
|
||
|
||
@override
|
||
String get verifPinnedKeyBody =>
|
||
'Der Hub verifiziert das Paket beim Installieren gegen den fest hinterlegten Schlüssel dieser Quelle. Ein manipuliertes Paket wird abgelehnt.';
|
||
|
||
@override
|
||
String get verifTrustedPublishers =>
|
||
'Signatur wird geprüft — vertrauenswürdige Herausgeber';
|
||
|
||
@override
|
||
String get verifTrustedPublishersBody =>
|
||
'Der Hub verifiziert die Signatur beim Installieren gegen die Liste vertrauenswürdiger Herausgeber. Ein Paket ohne gültige Signatur wird abgelehnt.';
|
||
|
||
@override
|
||
String get verifUnverified => 'Wird ohne Signaturprüfung installiert';
|
||
|
||
@override
|
||
String get verifUnverifiedBody =>
|
||
'Die Signaturpflicht ist in der Hub-Richtlinie ausgeschaltet — dieses Paket wird beim Installieren nicht kryptografisch geprüft. Für geprüfte Installationen security.require_signatures aktivieren.';
|
||
|
||
@override
|
||
String get verifBlocked => 'Installation würde abgelehnt';
|
||
|
||
@override
|
||
String get verifBlockedBody =>
|
||
'Die Richtlinie verlangt Signaturen, aber für diese Quelle ist kein Schlüsselmaterial hinterlegt — der Hub würde die Installation verweigern.';
|
||
|
||
@override
|
||
String get verifFederated =>
|
||
'Über Integration angebunden — keine Paket-Signatur';
|
||
|
||
@override
|
||
String get verifFederatedBody =>
|
||
'Dieser Eintrag ist kein installierbares Paket, sondern läuft über eine konfigurierte Integration (z. B. MCP oder n8n). Eine Paket-Signatur gibt es hier nicht; es gilt das Vertrauen in die Integration.';
|
||
|
||
@override
|
||
String get installConfirmSignatureNote =>
|
||
'Signaturen prüft der Hub beim Installieren, sofern die Signaturpflicht im Sicherheitsprofil aktiv ist. Einen Signaturstatus vorab zeigt der Store-Index derzeit noch nicht an (Alpha).';
|
||
|
||
@override
|
||
String get settingsSidebarPinnedTitle => 'Navigation immer ausgeklappt';
|
||
|
||
@override
|
||
String get settingsSidebarPinnedBody =>
|
||
'Zeigt die Beschriftungen der Seitenleiste dauerhaft an, statt sie nur beim Überfahren mit der Maus einzublenden.';
|
||
|
||
@override
|
||
String get settingsCategoryAi => 'System-KI';
|
||
|
||
@override
|
||
String get settingsCategoryIntegrations => 'Integrationen';
|
||
|
||
@override
|
||
String get settingsCategorySecurity => 'Sicherheit';
|
||
|
||
@override
|
||
String get settingsCategoryMaintenance => 'Wartung';
|
||
|
||
@override
|
||
String get settingsAiPanelTitle => 'System-KI';
|
||
|
||
@override
|
||
String get settingsAiPanelBody =>
|
||
'Operator-verwalteter LLM-Endpunkt, den Studio für die KI-Helfer nutzt (System-KI-Edit, Install-Vorschläge, Doctor-Zusammenfassung). Kein Flow ruft das jemals auf; Module sprechen mit ihrem eigenen LLM.';
|
||
|
||
@override
|
||
String get settingsIntegrationsPanelTitle => 'Integrationen';
|
||
|
||
@override
|
||
String get settingsIntegrationsPanelBody =>
|
||
'Externe Tool-Server, deren Fähigkeiten der Hub föderiert. MCP-Server bieten Tool-Endpunkte; n8n-Endpunkte stellen gehostete Workflows bereit.';
|
||
|
||
@override
|
||
String get settingsSecurityPanelTitle => 'Sicherheit & Zugangsdaten';
|
||
|
||
@override
|
||
String get settingsSecurityPanelBody =>
|
||
'Tokens, die der Hub für Sie verwahrt. Liegen in ~/.chain/ mit Modus 0600; werden nie als Telemetrie versendet.';
|
||
|
||
@override
|
||
String get settingsMaintenancePanelTitle => 'Wartung';
|
||
|
||
@override
|
||
String get settingsMaintenancePanelBody =>
|
||
'Destruktive Aktionen, abgesichert durch explizite Bestätigungs-Dialoge. Nutzen z.B. beim Re-Pilot-Testen oder Debuggen.';
|
||
|
||
@override
|
||
String get tooltipMoveUp => 'Nach oben';
|
||
|
||
@override
|
||
String get tooltipMoveDown => 'Nach unten';
|
||
|
||
@override
|
||
String get tooltipRemove => 'Entfernen';
|
||
|
||
@override
|
||
String get daemonActionEnableAutostart => 'Autostart aktivieren';
|
||
|
||
@override
|
||
String get daemonActionDisableAutostart => 'Autostart deaktivieren';
|
||
|
||
@override
|
||
String get daemonActionRestart => 'Daemon neu starten';
|
||
|
||
@override
|
||
String get daemonActionStart => 'Daemon starten';
|
||
|
||
@override
|
||
String get daemonActionStop => 'Daemon stoppen';
|
||
|
||
@override
|
||
String get daemonActionStatus => 'Daemon-Status';
|
||
|
||
@override
|
||
String daemonActionResultOk(String label) {
|
||
return 'OK · $label';
|
||
}
|
||
|
||
@override
|
||
String daemonActionResultFailed(String label) {
|
||
return 'Fehlgeschlagen · $label';
|
||
}
|
||
|
||
@override
|
||
String get addSourceTitle => 'Modul-Quelle hinzufügen';
|
||
|
||
@override
|
||
String addSourceIntro(String capability) {
|
||
return '$capability ist nicht im öffentlichen Store. Geben Sie dem Hub eine .chain-Bundle-URL oder einen lokalen Bundle-Pfad — der Hub lädt es herunter, prüft (sha256 + Signatur) und installiert.';
|
||
}
|
||
|
||
@override
|
||
String get addSourceField => 'URL oder Pfad zum .chain-Bundle';
|
||
|
||
@override
|
||
String get addSourceHint =>
|
||
'https://git.flemming.ai/ihre-org/ihr-modul/releases/download/v0.1.0/foo-0.1.0.chain';
|
||
|
||
@override
|
||
String get addSourceHowItWorksTitle => 'Wie private Module funktionieren';
|
||
|
||
@override
|
||
String get addSourceHowItWorksBody =>
|
||
'Ein Modul ist ein Verzeichnis mit module.yaml + WASM-Artefakt. Zum Teilen: chain pack <verzeichnis> baut ein .chain-Bundle, das Sie beliebig hosten können (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nehmen Sie das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:';
|
||
|
||
@override
|
||
String get addSourceCliExample => 'chain install --link /pfad/zum/modul';
|
||
|
||
@override
|
||
String get addSourceInstallButton => 'Installieren';
|
||
|
||
@override
|
||
String get addSourceCancel => 'Abbrechen';
|
||
|
||
@override
|
||
String installFailed(String error) {
|
||
return 'Installation fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get welcomeHubDownTitle => 'Der Hub läuft noch nicht';
|
||
|
||
@override
|
||
String get welcomeHubDownBody =>
|
||
'Studio spricht mit einem lokalen Hub — der Engine, die Module lädt und Flows ausführt. Sie ist gerade nicht erreichbar. Starten Sie die Engine, um loszulegen.';
|
||
|
||
@override
|
||
String get welcomeHubDownStart => 'Hub starten';
|
||
|
||
@override
|
||
String get welcomeHubDownStarting => 'Wird gestartet …';
|
||
|
||
@override
|
||
String get welcomeHubDownDocsLink =>
|
||
'Klappt der Start nicht? Zur Erste-Schritte-Anleitung';
|
||
|
||
@override
|
||
String welcomeHubDownEndpoint(String endpoint) {
|
||
return 'Endpunkt: $endpoint';
|
||
}
|
||
|
||
@override
|
||
String get daemonStartRequested =>
|
||
'Start des Daemons angefordert. Verbinde neu …';
|
||
|
||
@override
|
||
String daemonStartFailed(String detail) {
|
||
return 'Daemon konnte nicht gestartet werden: $detail';
|
||
}
|
||
|
||
@override
|
||
String get chainBinaryNotFound =>
|
||
'Das Programm chain wurde auf diesem Rechner nicht gefunden.';
|
||
|
||
@override
|
||
String get chainBinaryNotFoundHint =>
|
||
'Installieren Sie die Ch∆In-Plattform oder verweisen Sie Studio auf eine vorhandene chain-Datei.';
|
||
|
||
@override
|
||
String get chainBinaryLocateButton => 'chain-Programm suchen …';
|
||
|
||
@override
|
||
String get chainBinaryInstallDocsButton => 'Installationsanleitung öffnen';
|
||
|
||
@override
|
||
String get chainBinaryPickerTitle => 'chain-Programm auswählen';
|
||
|
||
@override
|
||
String chainBinarySetOk(String path) {
|
||
return 'Verwende chain unter $path';
|
||
}
|
||
|
||
@override
|
||
String get sysAiFixParse =>
|
||
'Der Anbieter hat in einem unerwarteten Format geantwortet. Anbieter, die nicht OpenAI-kompatibel sind, brauchen ggf. einen Übersetzungs-Proxy.';
|
||
|
||
@override
|
||
String sysAiFixUnknown(String kind) {
|
||
return 'Unerwarteter Fehler ($kind). Siehe System-KI-Dokumentation.';
|
||
}
|
||
|
||
@override
|
||
String get sysAiFixDisabled =>
|
||
'Richte die System-KI in den Einstellungen (Cmd+,) → Bereich System-KI ein.';
|
||
|
||
@override
|
||
String get sysAiFixEnvMissing =>
|
||
'Die Umgebungsvariable für den API-Schlüssel ist leer. Setzen Sie sie in Ihrer Shell und starten Sie den Daemon neu.';
|
||
|
||
@override
|
||
String get sysAiFixNetwork =>
|
||
'Der Hub erreicht den konfigurierten Endpunkt nicht. Läuft Ihr Anbieter?';
|
||
|
||
@override
|
||
String get sysAiFixHttp =>
|
||
'Der Anbieter hat einen Status außerhalb 2xx geliefert. Prüfen Sie Endpunkt, Modellnamen und API-Schlüssel.';
|
||
|
||
@override
|
||
String get sysAiFixEmptyResponse =>
|
||
'Der Anbieter hat keinen Inhalt geliefert. Probiere ein anderes Modell oder formuliere den Prompt um.';
|
||
|
||
@override
|
||
String channelSwitchOk(String name) {
|
||
return 'Aktiver Kanal auf \"$name\" umgeschaltet. Daemon neu gestartet.';
|
||
}
|
||
|
||
@override
|
||
String channelSwitchFailed(String detail) {
|
||
return 'Kanalwechsel fehlgeschlagen: $detail';
|
||
}
|
||
|
||
@override
|
||
String get providerDescOllama =>
|
||
'Lokales ollama serve. Die Modelle bleiben auf Ihrem Rechner. Kein API-Schlüssel nötig.';
|
||
|
||
@override
|
||
String get providerDescOpenai =>
|
||
'Gehostete OpenAI-API. Erfordert einen API-Schlüssel. Daten verlassen Ihren Rechner.';
|
||
|
||
@override
|
||
String get providerDescLmstudio =>
|
||
'Lokaler LM-Studio-Server. Die Modelle bleiben auf Ihrem Rechner. Kein API-Schlüssel nötig.';
|
||
|
||
@override
|
||
String get providerDescVllm =>
|
||
'Selbst gehostetes vLLM oder ein anderer OpenAI-kompatibler Server. Endpunkt erforderlich.';
|
||
|
||
@override
|
||
String get providerDescCustom =>
|
||
'Alles andere, das die OpenAI-kompatible Chat-Completions-Schnittstelle spricht (LiteLLM-Proxy, interner Spiegel, …).';
|
||
|
||
@override
|
||
String welcomeDocLoadFailedBody(
|
||
String slug,
|
||
String locale,
|
||
String attempted,
|
||
String underlying,
|
||
) {
|
||
return 'Die mitgelieferte Doku \"$slug\" ($locale) konnte nicht geladen werden.\nVersucht: $attempted\nUrsache: $underlying\nMeist ist der installierte Studio-Build älter als das Doku-Bundle. Baue Studio neu oder öffne die Online-Kopie.';
|
||
}
|
||
|
||
@override
|
||
String hubUnreachableBanner(String endpoint) {
|
||
return '$endpoint nicht erreichbar — Einstellungen öffnen';
|
||
}
|
||
|
||
@override
|
||
String get hubUnreachableOpenSettings => 'Einstellungen öffnen';
|
||
|
||
@override
|
||
String hubAuthRejectedBanner(String endpoint) {
|
||
return '$endpoint lehnt die Anmeldung ab — Zugriffstoken prüfen';
|
||
}
|
||
|
||
@override
|
||
String get navFederation => 'Föderation';
|
||
|
||
@override
|
||
String get federationTitle => 'Föderation';
|
||
|
||
@override
|
||
String get federationReloadTooltip => 'Satelliten neu laden';
|
||
|
||
@override
|
||
String get federationAddSatellite => 'Satellit hinzufügen';
|
||
|
||
@override
|
||
String get federationEmptyTitle => 'Keine Satelliten verbunden';
|
||
|
||
@override
|
||
String get federationEmptyHint =>
|
||
'Verbinden Sie einen weiteren Hub als Satellit, um Fähigkeiten dort auszuführen. Stellen Sie dazu ein Registrierungs-Token aus.';
|
||
|
||
@override
|
||
String get federationPillConnected => 'verbunden';
|
||
|
||
@override
|
||
String get federationRegionNone => 'keine Region';
|
||
|
||
@override
|
||
String federationCapabilities(int count) {
|
||
return '$count angebotene Fähigkeiten';
|
||
}
|
||
|
||
@override
|
||
String get federationAddDialogTitle => 'Registrierungs-Token ausstellen';
|
||
|
||
@override
|
||
String get federationNameLabel => 'Satelliten-Name';
|
||
|
||
@override
|
||
String get federationAddIntro =>
|
||
'Ein Satellit ist ein weiterer Hub, den dieser Hub anbindet — dessen Fähigkeiten werden dann hier in Flows nutzbar. Sie vergeben einen Namen und erhalten ein einmaliges Token, mit dem sich der Satellit bei diesem Hub anmeldet.';
|
||
|
||
@override
|
||
String get federationNameHelp =>
|
||
'Frei wählbarer Name, um diesen Satelliten in der Liste wiederzuerkennen (z. B. Standort oder Zweck). Rein zur Anzeige — ändert nichts an der Technik.';
|
||
|
||
@override
|
||
String get federationIssueButton => 'Ausstellen';
|
||
|
||
@override
|
||
String federationIssueFailed(String error) {
|
||
return 'Token konnte nicht ausgestellt werden: $error';
|
||
}
|
||
|
||
@override
|
||
String federationEnrollmentTitle(String name) {
|
||
return '$name einrichten';
|
||
}
|
||
|
||
@override
|
||
String get federationTokenLabel => 'Einmal-Token für die Einrichtung';
|
||
|
||
@override
|
||
String get federationConfigLabel =>
|
||
'Satelliten-Konfiguration (in den Satelliten einfügen)';
|
||
|
||
@override
|
||
String get federationCopied => 'In die Zwischenablage kopiert';
|
||
|
||
@override
|
||
String get federationEnrollmentHint =>
|
||
'Übergeben Sie das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte Zertifikatsstelle authentifiziert die erste Verbindung des Satelliten.';
|
||
|
||
@override
|
||
String get workspaceAll => 'Alle Projekte';
|
||
|
||
@override
|
||
String get workspaceDefaultProject => 'Allgemein';
|
||
|
||
@override
|
||
String get workspaceSwitcherTooltip =>
|
||
'Arbeitskontext wählen — gilt überall: filtert Flows, Läufe, Audit und Freigaben und stempelt neue Läufe mit dem gewählten Projekt';
|
||
|
||
@override
|
||
String get workspaceAnchorCaption => 'Kontext';
|
||
|
||
@override
|
||
String workspaceStartConfirmTitle(String name) {
|
||
return 'Bereich „$name“ starten?';
|
||
}
|
||
|
||
@override
|
||
String get workspaceStartConfirmBody =>
|
||
'Dieser abgeschottete Bereich ist gerade gestoppt. Studio startet seine eigene Hub-Instanz auf diesem Rechner und verbindet sich mit ihr — laufende Bereiche wechseln ohne diese Rückfrage.';
|
||
|
||
@override
|
||
String get workspaceStartConfirmAction => 'Starten und verbinden';
|
||
|
||
@override
|
||
String get workspaceSealedAggregateWhy =>
|
||
'Namen bleiben zusammengefasst, weil sie Mandanten verraten können.';
|
||
|
||
@override
|
||
String get workspaceSealedAggregateSettings =>
|
||
'Immer anzeigen: Einstellungen → Sicherheit';
|
||
|
||
@override
|
||
String get workspaceProtectedHint =>
|
||
'Geschützt: logisch getrennt im gemeinsamen Hub — keine harte Prozessgrenze. Kritische Mandate nutzen einen abgeschotteten Bereich.';
|
||
|
||
@override
|
||
String get runsTitle => 'Läufe';
|
||
|
||
@override
|
||
String get runsReloadTooltip => 'Lauf-Liste neu laden';
|
||
|
||
@override
|
||
String get runsEmptyTitle => 'Keine Läufe im Hintergrund';
|
||
|
||
@override
|
||
String get runsEmptyHint =>
|
||
'Hier erscheinen Läufe, die im Hintergrund weiterlaufen, während Sie anderes tun. Diese Funktion ist optional und standardmäßig ausgeschaltet — die Anleitung zeigt Schritt für Schritt, wie sie eingeschaltet wird.';
|
||
|
||
@override
|
||
String get runsEmptyEnabledHint =>
|
||
'Läufe im Hintergrund sind eingeschaltet — es wurde nur noch keiner gestartet. Starten Sie einen Flow mit der Option „im Hintergrund ausführen“, dann erscheint er hier.';
|
||
|
||
@override
|
||
String get runsEmptyGuideButton => 'Anleitung öffnen';
|
||
|
||
@override
|
||
String runsEmptyFilteredTitle(String name) {
|
||
return 'Keine Läufe in Projekt „$name“';
|
||
}
|
||
|
||
@override
|
||
String get runsEmptyFilteredHint =>
|
||
'Der Arbeitskontext filtert diese Liste — in anderen Projekten kann es Läufe geben.';
|
||
|
||
@override
|
||
String get runsEmptyShowAll => 'Alle Projekte anzeigen';
|
||
|
||
@override
|
||
String get runsHubTooOldTitle =>
|
||
'Diese Ansicht braucht eine neuere Hub-Version';
|
||
|
||
@override
|
||
String get runsHubTooOldHint =>
|
||
'Der Hub ist verbunden, aber seine Version kennt die Laufübersicht noch nicht. Aktualisieren Sie den Hub, dann erscheinen die Läufe hier.';
|
||
|
||
@override
|
||
String get runsHubTooOldButton => 'Diagnose öffnen';
|
||
|
||
@override
|
||
String get runsHubUpdateButton => 'Hub jetzt aktualisieren';
|
||
|
||
@override
|
||
String get runsHubUpdateStarted => 'Hub wird aktualisiert…';
|
||
|
||
@override
|
||
String get runsLoadFailedTitle => 'Läufe konnten nicht geladen werden';
|
||
|
||
@override
|
||
String get runsCancelButton => 'Abbrechen';
|
||
|
||
@override
|
||
String runsCancelSignalled(String flow) {
|
||
return 'Abbruch für $flow ausgelöst.';
|
||
}
|
||
|
||
@override
|
||
String get runsCancelTooLate =>
|
||
'Der Lauf war schon fertig — nichts abzubrechen.';
|
||
|
||
@override
|
||
String runsCurrentStep(String step) {
|
||
return 'Schritt: $step';
|
||
}
|
||
|
||
@override
|
||
String get runsPhasePending => 'Wartet';
|
||
|
||
@override
|
||
String get runsPhaseRunning => 'Läuft';
|
||
|
||
@override
|
||
String get runsPhaseSucceeded => 'Erfolgreich';
|
||
|
||
@override
|
||
String get runsPhaseFailed => 'Fehlgeschlagen';
|
||
|
||
@override
|
||
String get runsPhaseCancelled => 'Abgebrochen';
|
||
|
||
@override
|
||
String get runsPhaseUnknown => 'Unbekannt';
|
||
|
||
@override
|
||
String get navRuns => 'Läufe';
|
||
|
||
@override
|
||
String get workspaceSealedHeader => 'ABGESCHOTTETE BEREICHE';
|
||
|
||
@override
|
||
String workspaceSealedAggregate(int n) {
|
||
String _temp0 = intl.Intl.pluralLogic(
|
||
n,
|
||
locale: localeName,
|
||
other: '$n abgeschottete Bereiche',
|
||
one: '1 abgeschotteter Bereich',
|
||
);
|
||
return '$_temp0';
|
||
}
|
||
|
||
@override
|
||
String get workspaceSealedRevealAction => 'Namen einblenden';
|
||
|
||
@override
|
||
String get settingsSealedNamesTitle =>
|
||
'Abgeschottete Bereiche direkt mit Namen anzeigen';
|
||
|
||
@override
|
||
String get settingsSealedNamesBody =>
|
||
'Bereichsnamen können schutzwürdig sein (Kunden-/Mandantenbezug). Standardmäßig zeigt der Projekt-Umschalter sie nur zusammengefasst; die Namen erscheinen erst nach einem Klick.';
|
||
|
||
@override
|
||
String get workspaceSealedRunning => 'läuft';
|
||
|
||
@override
|
||
String get workspaceSealedStopped => 'gestoppt';
|
||
|
||
@override
|
||
String get workspaceSealedRunningHint =>
|
||
'Der abgeschottete Bereich läuft als eigener Hub-Prozess. Auswählen wechselt hinein.';
|
||
|
||
@override
|
||
String get workspaceSealedStoppedHint =>
|
||
'Der abgeschottete Bereich ist gerade nicht gestartet. Auswählen startet ihn und wechselt hinein.';
|
||
|
||
@override
|
||
String workspaceSealedStarting(String name) {
|
||
return 'Starte abgeschotteten Bereich „$name“…';
|
||
}
|
||
|
||
@override
|
||
String workspaceSealedStarted(String name) {
|
||
return 'Abgeschotteter Bereich „$name“ gestartet.';
|
||
}
|
||
|
||
@override
|
||
String workspaceSealedSwitchFailed(String error) {
|
||
return 'Wechsel in den abgeschotteten Bereich fehlgeschlagen: $error';
|
||
}
|
||
|
||
@override
|
||
String get sealedIdentityBar =>
|
||
'Abgeschotteter Bereich — isolierter Hub, eigene Daten und Audit-Kette';
|
||
|
||
@override
|
||
String get sealedSwitchingBar =>
|
||
'Verbindung wird umgeschaltet — Daten erscheinen erst nach Abschluss';
|
||
|
||
@override
|
||
String get sealedLeave => 'Verlassen';
|
||
|
||
@override
|
||
String setupStepOf(int n, int total) {
|
||
return 'Schritt $n von $total';
|
||
}
|
||
|
||
@override
|
||
String get setupStep1Title => 'Worum geht es?';
|
||
|
||
@override
|
||
String get setupStep2Title => 'Was möchten Sie zuerst tun?';
|
||
|
||
@override
|
||
String get setupStep3Title => 'Wo läuft es?';
|
||
|
||
@override
|
||
String get setupReviewTitle => 'Das wird Ch∆In einrichten';
|
||
|
||
@override
|
||
String get setupChooseFreeText =>
|
||
'Oder beschreiben Sie einfach, was Sie vorhaben';
|
||
|
||
@override
|
||
String get setupScenTryingOut => 'Erst mal ausprobieren';
|
||
|
||
@override
|
||
String get setupScenTryingOutSub =>
|
||
'Ein unkomplizierter Arbeitsplatz auf diesem Rechner — ohne Signaturpflicht, ohne Schreibschutz für das Prüfprotokoll. Später jederzeit hochstufbar: die Einrichtung erneut ausführen und ein reguliertes Profil wählen.';
|
||
|
||
@override
|
||
String get setupScenTeamHub => 'Ein Team-Server';
|
||
|
||
@override
|
||
String get setupScenTeamHubSub =>
|
||
'Ein abgesicherter Hub für mehrere Personen — signierte Module, Ressourcen-Grenzen.';
|
||
|
||
@override
|
||
String get setupScenRegulated => 'Regulierter Produktivbetrieb';
|
||
|
||
@override
|
||
String get setupScenRegulatedSub =>
|
||
'Signierte Module, ein lückenloses, manipulationssicheres Prüfprotokoll und eine menschliche Freigabe vor jedem KI-Schritt.';
|
||
|
||
@override
|
||
String get setupScenBuildModules => 'Module entwickeln';
|
||
|
||
@override
|
||
String get setupScenBuildModulesSub =>
|
||
'Eine Entwickler-Einrichtung zum Schreiben und Testen eigener Module.';
|
||
|
||
@override
|
||
String get setupIntentHello => 'Das Hallo-Beispiel ausführen';
|
||
|
||
@override
|
||
String get setupIntentHelloSub =>
|
||
'Einfach einen Flow einmal von Anfang bis Ende sehen.';
|
||
|
||
@override
|
||
String get setupIntentExtract => 'Text aus Dokumenten extrahieren';
|
||
|
||
@override
|
||
String get setupIntentExtractSub =>
|
||
'Reinen Text aus PDF- und DOCX-Dateien holen.';
|
||
|
||
@override
|
||
String get setupIntentExtractSummarize => 'Extrahieren und zusammenfassen';
|
||
|
||
@override
|
||
String get setupIntentExtractSummarizeSub =>
|
||
'Text extrahieren und anschließend zusammenfassen.';
|
||
|
||
@override
|
||
String get setupIntentClassify => 'Eingehende Dokumente einsortieren';
|
||
|
||
@override
|
||
String get setupIntentClassifySub =>
|
||
'Text extrahieren und mit einem KI-Schritt klassifizieren.';
|
||
|
||
@override
|
||
String get setupIntentBuildModule => 'Ein eigenes Modul bauen';
|
||
|
||
@override
|
||
String get setupIntentBuildModuleSub => 'Mit einem Modul-Gerüst starten.';
|
||
|
||
@override
|
||
String get setupTargetLaptop => 'Dieser Rechner';
|
||
|
||
@override
|
||
String get setupTargetLaptopSub =>
|
||
'Läuft lokal auf dem Gerät, an dem Sie gerade sitzen.';
|
||
|
||
@override
|
||
String get setupTargetHomeServer => 'Ein eigener Server';
|
||
|
||
@override
|
||
String get setupTargetHomeServerSub =>
|
||
'Ein Server im eigenen Haus — startet beim Hochfahren, läuft im Hintergrund.';
|
||
|
||
@override
|
||
String get setupTargetAirgapped =>
|
||
'Ein vollständig lokaler Server (ohne Internet)';
|
||
|
||
@override
|
||
String get setupTargetAirgappedSub =>
|
||
'Ein isolierter Server ohne Internet — die strengste, privateste Betriebsart.';
|
||
|
||
@override
|
||
String get setupTargetContainer => 'Ein Container';
|
||
|
||
@override
|
||
String get setupTargetContainerSub =>
|
||
'Docker oder Podman, mit fertigem Compose-Schnipsel.';
|
||
|
||
@override
|
||
String get setupApprovalPlain =>
|
||
'Vor jedem KI-Schritt einen Menschen um Freigabe bitten';
|
||
|
||
@override
|
||
String get setupDataLocalPlain =>
|
||
'Daten dürfen das Haus nie verlassen (vollständig lokal)';
|
||
|
||
@override
|
||
String get setupPlanIntroDev =>
|
||
'Ch∆In richtet einen unkomplizierten Arbeitsplatz ein.';
|
||
|
||
@override
|
||
String get setupPlanIntroEnterprise =>
|
||
'Ch∆In richtet einen abgesicherten Betrieb für ein Team ein.';
|
||
|
||
@override
|
||
String get setupPlanIntroAirgapped =>
|
||
'Ch∆In richtet einen vollständig lokalen, regulierten Betrieb ein.';
|
||
|
||
@override
|
||
String get setupPlanSignatures =>
|
||
'Es werden nur signierte Module zugelassen.';
|
||
|
||
@override
|
||
String get setupPlanWorm =>
|
||
'Das Prüfprotokoll wird zusätzlich manipulationssicher (WORM) gesichert.';
|
||
|
||
@override
|
||
String get setupPlanApproval =>
|
||
'Vor jedem KI-Schritt fragt das System einen Menschen um Freigabe.';
|
||
|
||
@override
|
||
String setupPlanModules(String modules) {
|
||
return 'Diese Module werden vorbereitet: $modules.';
|
||
}
|
||
|
||
@override
|
||
String setupPlanFlow(String flow) {
|
||
return 'Ein Beispiel-Flow „$flow“ wird angelegt.';
|
||
}
|
||
|
||
@override
|
||
String setupPlanFileChanged(String path) {
|
||
return 'Geändert wird nur eine Datei: $path.';
|
||
}
|
||
|
||
@override
|
||
String get setupPlanOverwriteWarn =>
|
||
'Eine vorhandene Konfiguration wird überschrieben.';
|
||
|
||
@override
|
||
String get setupApplied => 'Fertig — Ch∆In ist eingerichtet.';
|
||
|
||
@override
|
||
String get setupNextTitle => 'Nächste Schritte';
|
||
|
||
@override
|
||
String get setupNextHubStart => 'Hub starten';
|
||
|
||
@override
|
||
String get setupHubRunning => 'Der Hub läuft.';
|
||
|
||
@override
|
||
String get setupStartHubFirst =>
|
||
'Starten Sie zuerst den Hub — dann lassen sich die Module hier installieren.';
|
||
|
||
@override
|
||
String setupActionInstall(String module) {
|
||
return '$module installieren';
|
||
}
|
||
|
||
@override
|
||
String setupActionInstalled(String module) {
|
||
return '$module ist installiert.';
|
||
}
|
||
|
||
@override
|
||
String setupActionOpenFlow(String flow) {
|
||
return 'Beispiel-Flow „$flow“ öffnen';
|
||
}
|
||
|
||
@override
|
||
String get setupModulesOfflineHint =>
|
||
'Die Module kommen ohne Internet als Offline-Paket auf den Server — die Anleitung dazu steht in der Dokumentation unter „Betrieb ohne Internet“.';
|
||
|
||
@override
|
||
String get setupModulesSignedHint =>
|
||
'Die Module kommen aus einer eigenen, signierten Quelle — nicht aus dem öffentlichen Store.';
|
||
|
||
@override
|
||
String get setupSigPublicStoreNotice =>
|
||
'Diese Einrichtung lässt nur signierte Module zu. Der öffentliche Store liefert zurzeit unsignierte Pakete — die vorbereiteten Module kommen daher aus einer eigenen, signierten Quelle.';
|
||
|
||
@override
|
||
String get setupAllowUnsigned =>
|
||
'Installation aus dem öffentlichen Store erlauben';
|
||
|
||
@override
|
||
String get setupAllowUnsignedSub =>
|
||
'Lockert die Signaturpflicht bewusst. Gut zum Ausprobieren — für den regulierten Betrieb später wieder aktivieren.';
|
||
|
||
@override
|
||
String get setupStartCta => 'Einrichtung starten';
|
||
|
||
@override
|
||
String get setupGateIntro =>
|
||
'Bevor es losgeht: drei Fragen, dann richtet Ch∆In diesen Rechner passend ein. Nichts wird ohne Ihre Bestätigung geändert.';
|
||
|
||
@override
|
||
String get setupGateSkip => 'Später einrichten';
|
||
|
||
@override
|
||
String get settingsRunSetup => 'Einrichtung erneut ausführen…';
|
||
|
||
@override
|
||
String get settingsRunSetupHint =>
|
||
'Öffnet den Einrichtungs-Assistenten (drei Fragen, Vorschau, Übernehmen). Die bestehende Konfiguration wird erst nach Ihrer Bestätigung ersetzt.';
|
||
|
||
@override
|
||
String get setupPlanRunbookLocal =>
|
||
'Eingerichtet wird dieser Rechner; der Hub läuft lokal und wird bei Bedarf gestartet.';
|
||
|
||
@override
|
||
String get setupPlanRunbookService =>
|
||
'Eingerichtet wird dieser Rechner: Der Hub startet künftig automatisch beim Hochfahren (Hintergrund-Dienst). Für einen anderen Server führen Sie die Einrichtung dort aus.';
|
||
|
||
@override
|
||
String get setupPlanRunbookAirgap =>
|
||
'Vorgesehen für einen isolierten Server ohne Internet — Module und Updates kommen als Offline-Paket.';
|
||
|
||
@override
|
||
String get setupPlanRunbookContainer =>
|
||
'Vorgesehen für den Betrieb im Container — ein fertiges Compose-Beispiel wird mitgeliefert.';
|
||
|
||
@override
|
||
String get setupPlanAuditChain =>
|
||
'Jeder Schritt landet in einem lückenlosen, hash-verketteten Prüfprotokoll — Manipulation wird erkennbar.';
|
||
|
||
@override
|
||
String setupPlanDocs(int n) {
|
||
return 'Eine passende Leseliste ($n Kapitel) wird mit dem Einrichtungs-Protokoll unter ~/.chain/ gespeichert.';
|
||
}
|
||
|
||
@override
|
||
String get setupTrustedPublishersHint =>
|
||
'Wichtig: Hinterlegen Sie beim Hinzufügen der Quelle den Schlüssel des Herausgebers („Signatur-Schlüssel anheften“) — sonst akzeptiert der Hub jede formal gültige Signatur, egal von wem.';
|
||
|
||
@override
|
||
String get setupAddSignedSource => 'Signierte Quelle hinzufügen…';
|
||
|
||
@override
|
||
String get setupApplyNotes => 'Hinweise aus der Einrichtung';
|
||
|
||
@override
|
||
String get setupFreeTextHint =>
|
||
'z. B.: Eingehende Anträge vorprüfen und unvollständige markieren';
|
||
|
||
@override
|
||
String get setupFreeTextSuggest => 'Vorschlagen lassen';
|
||
|
||
@override
|
||
String setupFreeTextPrivacyLocal(String model) {
|
||
return 'Ihre Beschreibung wird direkt auf diesem Rechner verarbeitet — durch das lokale KI-Modell $model. Nichts verlässt das Gerät.';
|
||
}
|
||
|
||
@override
|
||
String setupFreeTextPrivacyRemote(String model, String provider) {
|
||
return 'Ihre Beschreibung wird an die eingerichtete System-KI gesendet: $model ($provider).';
|
||
}
|
||
|
||
@override
|
||
String get setupFreeTextUnavailable =>
|
||
'Für den Freitext-Weg braucht Ch∆In eine eingerichtete System-KI (Einstellungen → System-KI). Die Auswahl oben funktioniert immer — ganz ohne KI.';
|
||
|
||
@override
|
||
String setupExecHint(String path) {
|
||
return 'Für Vorschau und Einrichtung führt Studio das Programm „chain“ aus: $path';
|
||
}
|
||
|
||
@override
|
||
String setupExecHintTcc(String path) {
|
||
return 'Das Programm liegt unter $path — macOS fragt dafür eventuell einmalig nach Zugriff auf diesen Ordner (z. B. „Dokumente“). Das ist zu erwarten und in Ordnung.';
|
||
}
|
||
|
||
@override
|
||
String get setupNoBinaryStepHint =>
|
||
'Das Programm „chain“ wurde auf diesem Rechner nicht gefunden — die Vorschau im nächsten Schritt wird fehlschlagen. Unter „Diagnose“ können Sie es auswählen oder Ch∆In installieren.';
|
||
|
||
@override
|
||
String get setupNoBinary =>
|
||
'Das Programm „chain“ wurde auf diesem Rechner nicht gefunden.';
|
||
|
||
@override
|
||
String get setupNoBinaryHint =>
|
||
'Ohne das Programm kann der Assistent die Einrichtung nicht anwenden. Wählen Sie es unter „Diagnose“ aus oder installieren Sie Ch∆In neu.';
|
||
|
||
@override
|
||
String get setupCliTooOld =>
|
||
'Das installierte „chain“-Programm ist älter als Studio und kennt diesen Assistenten noch nicht.';
|
||
|
||
@override
|
||
String setupCliTooOldHint(String path) {
|
||
return 'Gefunden wurde: $path. Bitte Ch∆In aktualisieren (Seite „Diagnose“ → Update, oder im Terminal: chain update apply) und den Assistenten danach erneut öffnen.';
|
||
}
|
||
|
||
@override
|
||
String get setupPreviewFailed =>
|
||
'Die Plan-Vorschau konnte nicht erstellt werden — das Programm „chain“ meldet einen Fehler.';
|
||
|
||
@override
|
||
String get setupApplyFailed =>
|
||
'Die Einrichtung konnte nicht angewendet werden — das Programm „chain“ meldet einen Fehler.';
|
||
|
||
@override
|
||
String setupCliUsedBinary(String path) {
|
||
return 'Ausgeführt wurde: $path';
|
||
}
|
||
|
||
@override
|
||
String get setupFreeTextParseError =>
|
||
'Die System-KI hat keinen verwertbaren Vorschlag geliefert. Wählen Sie oben aus dem Menü — oder versuchen Sie es noch einmal.';
|
||
|
||
@override
|
||
String get setupReflectionTitle => 'So verstehe ich Ihre Aufgabe';
|
||
|
||
@override
|
||
String setupReflectionScenario(String label) {
|
||
return 'Worum es geht: $label';
|
||
}
|
||
|
||
@override
|
||
String setupReflectionIntent(String label) {
|
||
return 'Erste Aufgabe: $label';
|
||
}
|
||
|
||
@override
|
||
String setupReflectionTarget(String label) {
|
||
return 'Umgebung: $label';
|
||
}
|
||
|
||
@override
|
||
String get setupReflectionApproval =>
|
||
'Vor jedem KI-Schritt wird ein Mensch um Freigabe gebeten.';
|
||
|
||
@override
|
||
String get setupReflectionDataLocal => 'Daten bleiben vollständig im Haus.';
|
||
|
||
@override
|
||
String get setupReflectionEditHint =>
|
||
'Es wird nichts ohne Ihre Bestätigung geändert. Passen Sie die Punkte an oder gehen Sie direkt zur Vorschau.';
|
||
|
||
@override
|
||
String get setupReflectionAdjust => 'Anpassen';
|
||
|
||
@override
|
||
String get setupReflectionToPreview => 'Zur Vorschau';
|
||
|
||
@override
|
||
String get setupProfileDev => 'unkomplizierter Arbeitsplatz';
|
||
|
||
@override
|
||
String get setupProfileEnterprise => 'abgesicherter Team-Betrieb';
|
||
|
||
@override
|
||
String get setupProfileAirgapped =>
|
||
'vollständig lokaler, regulierter Betrieb';
|
||
|
||
@override
|
||
String welcomeChecklistSetupDone(String profile) {
|
||
return 'Die Grundeinrichtung ($profile) hat der Einrichtungs-Assistent bereits erledigt — hier sehen Sie, was auf dem Hub schon passiert ist.';
|
||
}
|
||
}
|