chain-studio/lib/l10n/app_localizations_de.dart
flemming-it 7625509237
Some checks are pending
Security / Security check (push) Waiting to run
feat(studio): optional pinned-key field in the store-add form
The module-store manager's 'Add a store' form gains an optional PEM
public-key field; when set it pins that publisher key to the store
(per-store signing trust). Localized DE/EN.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-06-19 02:54:50 +02:00

2774 lines
74 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

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

// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for German (`de`).
class AppLocalizationsDe extends AppLocalizations {
AppLocalizationsDe([String locale = 'de']) : super(locale);
@override
String get 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 Dokumentenverarbeitung in regulierten Umgebungen.';
@override
String get welcomePillarHubTitle => 'Hub';
@override
String get welcomePillarHubBody =>
'Ein Rust-Binary, das Module lädt und Flows ausführt. SQLite für den State. Kein Docker, kein Message-Broker, keine Hintergrunddienste, die gepflegt werden müssen.';
@override
String get welcomePillarModuleTitle => 'Modul';
@override
String get welcomePillarModuleBody =>
'Eine kleine WebAssembly-Komponente, die eine Sache macht. Deklariert Netzwerk-Endpunkte, Dateien und Umgebungsvariablen, auf die sie zugreift; der Hub setzt die Liste durch.';
@override
String get welcomePillarFlowTitle => 'Flow';
@override
String get welcomePillarFlowBody =>
'Eine YAML-Datei, die Module verkettet. Eingaben rein, Module laufen in der deklarierten Reihenfolge, Ausgaben raus — jeder Schritt in einem hash-verketteten Audit-Log festgehalten.';
@override
String get welcomeTrustHeader => 'TRUST-POSTURE';
@override
String get welcomeTrustSandboxTitle => 'Sandbox von Anfang an';
@override
String get welcomeTrustSandboxBody =>
'Jedes Modul bringt eine explizite Berechtigungsliste mit — Netzwerk-Endpunkte, Dateien, Umgebungsvariablen. Der Hub setzt sie durch; ohne Operator-Freigabe verlässt nichts die Sandbox.';
@override
String get welcomeTrustAuditTitle => 'Manipulationssicheres 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 => 'Manipulationssicheres Audit-Log';
@override
String get welcomeDocAuditBlurb =>
'Wie die Hash-Kette funktioniert und warum WORM-1 für KRITIS reicht.';
@override
String get welcomeDocFlowsTitle => 'Flow-Komposition';
@override
String get welcomeDocFlowsBlurb =>
'YAML-Grundlagen, Templating-Referenz, das Extract→Summarize-Beispiel.';
@override
String get welcomeDocApprovalsTitle => 'Freigaben';
@override
String get welcomeDocApprovalsBlurb =>
'Human-in-the-Loop-Checkpoints — wann nutzen, wie das Audit-Log sie protokolliert.';
@override
String get helpTooltip => 'Hilfe';
@override
String get errApprovalRejected => 'Freigabe vom Reviewer abgelehnt.';
@override
String get errApprovalRejectedHint =>
'Der Reviewer hat den Step abgelehnt. Begründung steht im Audit-Log.';
@override
String get errApprovalTimedOut => 'Freigabe-Timeout abgelaufen.';
@override
String get errApprovalTimedOutHint =>
'Es wurde nicht rechtzeitig entschieden. Entweder `timeout_seconds` am Freigabe-Step erhöhen oder den Reviewer informieren.';
@override
String get errOutputTooLarge =>
'Step-Output hat die Größenbegrenzung überschritten.';
@override
String get errOutputTooLargeHint =>
'Entweder Output kürzen (Text truncaten, Bytes komprimieren) oder `max_output_size_mb` in der Operator-Config erhöhen.';
@override
String get errServiceUnavailableForStep => 'Host-Service nicht konfiguriert.';
@override
String get errServiceUnavailableForStepHint =>
'Das Modul braucht einen Service (z.B. ollama, playwright), den der Operator nicht deklariert hat. Trage 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 klickst du auf den Fix-Button — der installiert die Capability, sofern sie im Store ist.';
@override
String get welcomeDocClose => 'Schließen';
@override
String welcomeDocFailedToLoad(String error) {
return 'Doku konnte nicht geladen werden: $error';
}
@override
String get welcomeChecklistHeader => 'ERSTE SCHRITTE';
@override
String get welcomeChecklistBody =>
'Vier Schritte zu einem funktionierenden Hub. Live-Zustand — nach jeder Änderung aktualisieren.';
@override
String get welcomeChecklistAi => 'System-AI konfigurieren';
@override
String get welcomeChecklistAiHint =>
'Einstellungen → System-AI. Wird für die KI-Suche und Fehlererklärungen gebraucht.';
@override
String get welcomeChecklistMcp => 'Öffentliche Capability-Quelle hinzufügen';
@override
String get welcomeChecklistMcpHint =>
'Im Store eine MCP-Quelle hinzufügen oder unter Einstellungen → MCP-Clients konfigurieren.';
@override
String get welcomeChecklistModule => 'Ein Text-Modul installieren';
@override
String get welcomeChecklistModuleHint =>
'Im Store ein Modul aus der Kategorie deiner Wahl installieren. Module sind 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; auch ein eigener tut\'s.';
@override
String get welcomeChecklistAllDone => 'Alle vier Schritte erledigt.';
@override
String get welcomeChecklistDismiss => 'Checkliste ausblenden';
@override
String get welcomeChecklistRefresh => 'Aktualisieren';
@override
String get welcomeChecklistRefreshing => 'Prüfe…';
@override
String get welcomeChecklistDone => 'Erledigt';
@override
String get welcomeChecklistTodo => 'Offen';
@override
String get navDoctor => 'Diagnose';
@override
String get navModules => 'Module';
@override
String get navStore => 'Store';
@override
String get navFlows => 'Flows';
@override
String get navAudit => 'Protokoll';
@override
String get navApprovals => 'Freigaben';
@override
String get connectionConnected => 'verbunden';
@override
String get connectionUnreachable => 'nicht erreichbar';
@override
String get connectionConnecting => 'verbinde…';
@override
String get connectionStartHub => 'Hub starten';
@override
String get connectionTapToStart => 'antippen zum Starten';
@override
String get sidebarSettingsTooltip => 'Einstellungen (⌘;)';
@override
String get sidebarChannelTooltip =>
'Aktiver Kanal — klicken zum Wechseln.\nproduction = stabil · beta = Vorabversion · dev = laufend · local = Arbeitsumgebung';
@override
String get buttonCancel => 'Abbrechen';
@override
String get buttonSave => 'Speichern';
@override
String get buttonClose => 'Schließen';
@override
String get buttonRetry => 'Erneut versuchen';
@override
String get buttonRefresh => 'Aktualisieren';
@override
String get buttonInstall => 'Installieren';
@override
String get buttonUninstall => 'Deinstallieren';
@override
String get buttonDetails => 'Details';
@override
String get buttonAdd => 'Hinzufügen';
@override
String get buttonRemove => 'Entfernen';
@override
String get buttonOpen => 'Öffnen';
@override
String get buttonExplain => 'Erklären';
@override
String get buttonReadDocs => 'Doku öffnen';
@override
String get buttonCopy => 'In Zwischenablage kopieren';
@override
String get buttonCopied => 'Kopiert';
@override
String get buttonShowDetails => 'Details anzeigen';
@override
String get buttonHideDetails => 'Details ausblenden';
@override
String get storeInstallableOnly => 'Nur installierbare';
@override
String get storePillComingSoon => 'Bald verfügbar';
@override
String storeNotInstallableInline(String status) {
return 'Dieses Modul ist auf der Roadmap (Status: $status). Es gibt noch kein installierbares Bundle — Repository verfolgen für Updates.';
}
@override
String get mcpSuggestionDeepwikiDesc =>
'Öffentliches HTTPS — KI-gestützte Doku-Suche in GitHub-Repos. Kein Node, kein API-Key.';
@override
String get mcpSuggestionSemgrepDesc =>
'Öffentliches HTTPS — Security-Scanning von Code-Schwachstellen. Kein Node, kein API-Key.';
@override
String get mcpSuggestionFilesystemDesc =>
'Anthropic — Dateien in /tmp lesen / schreiben. Pfad vor dem Speichern anpassen.';
@override
String get mcpSuggestionFetchDesc =>
'Anthropic — beliebige HTTP(S)-URLs als Markdown abrufen.';
@override
String get mcpSuggestionGithubDesc =>
'Anthropic — Issues, PRs, Repo-Dateien. Braucht einen GitHub-PAT in der Env-Variable.';
@override
String get mcpSuggestionPuppeteerDesc =>
'Anthropic — Headless-Browser-Automation für Screenshots / Scraping.';
@override
String get mcpSuggestionPostgresDesc =>
'Anthropic — Read-only-SQL-Queries gegen eine Postgres-Datenbank. URL anpassen.';
@override
String get mcpSuggestionSqliteDesc =>
'Anthropic — Abfragen gegen eine lokale SQLite-Datei. Pfad anpassen.';
@override
String get mcpSuggestionBraveSearchDesc =>
'Anthropic — Websuche via Brave. API-Key erforderlich.';
@override
String get mcpSuggestionMemoryDesc =>
'Anthropic — persistenter Knowledge-Graph als Agenten-Gedächtnis.';
@override
String get mcpSuggestionTimeDesc =>
'Anthropic — aktuelle Uhrzeit + Zeitzonen-Konvertierung.';
@override
String get mcpServerEnLanguageBadge =>
'Server-Text in Englisch — Studio zeigt ihn wie geliefert.';
@override
String get themePluginHeader => 'Theme-Plugin (wirkt sofort)';
@override
String themeApplied(String name) {
return 'Theme aktiv: $name';
}
@override
String get themePluginFailed =>
'Theme-Plugin konnte nicht geladen werden — vorheriges Theme bleibt.';
@override
String get themePluginNone => 'Standard (kein Plugin)';
@override
String get themePluginHint =>
'Built-in- und Plugin-Kacheln bringen handkuratierte Paletten mit. Die Kachel „Eigene Farbe\" leitet aus einer gewählten Seedfarbe eine vollständige Material-3-Palette ab (primary, secondary, tertiary, surface, …) — das ist ein vollwertiges Theme, kein Einzelfarb-Tweak.';
@override
String get themePluginEmpty =>
'Kein Theme-Plugin installiert. Im Store eines aus der Kategorie studio-plugin auswählen.';
@override
String get themePluginCustom => 'Eigene Farbe';
@override
String get themePluginCustomDialogTitle => 'Eigenes Theme — Seedfarbe wählen';
@override
String get themePluginCustomHexLabel => 'Hex-Farbe';
@override
String get themePluginCustomPreview => 'Live-Vorschau';
@override
String get themePluginCustomCancel => 'Abbrechen';
@override
String get themePluginCustomApply => 'Anwenden';
@override
String get settingsTitle => 'Hub-Endpunkt';
@override
String get settingsHost => 'Host';
@override
String get settingsPort => 'Port';
@override
String get settingsTls => 'TLS';
@override
String get settingsSaveAndConnect => 'Mit Endpoint verbinden';
@override
String get settingsLanguage => 'Sprache';
@override
String get settingsLanguageHint =>
'Sprache der App. Wirkt auf alle Seiten; mehrsprachige Store-Einträge folgen ebenfalls.';
@override
String get settingsHubEndpointHint =>
'Wohin soll Studio sich verbinden? Standard ist der lokale Hub auf 127.0.0.1:50051.';
@override
String get settingsTlsSubtitle => 'https/grpc-secure';
@override
String get settingsPortError => 'Port muss 165535 sein';
@override
String get channelsBlurb =>
'Hub-Kanal wechseln (schreibt ~/.chain/current-channel und startet den Daemon neu). Verbinden ändert nur die Wire von Studio.';
@override
String get channelsActionsTooltip => 'Kanal-Aktionen';
@override
String get systemAiHeader => 'SYSTEM-AI';
@override
String get systemAiEnabled => 'aktiv';
@override
String get systemAiOff => 'aus';
@override
String get systemAiEdit => 'Bearbeiten…';
@override
String get systemAiConfigure => 'Konfigurieren…';
@override
String get systemAiOffBlurb =>
'Aus — Fehlererklärungen auf der Protokoll-Seite sind deaktiviert. Klicke Konfigurieren…, um einen Provider zu wählen (Ollama / OpenAI / LM Studio / vLLM / Eigene). Die Operator-Konfig wird direkt überschrieben; kein Daemon-Neustart nötig.';
@override
String mcpServersCount(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: 'Server',
one: 'Server',
);
return '$n $_temp0';
}
@override
String get mcpRediscoverTooltip => 'Discovery neu ausführen';
@override
String get mcpAddTooltip => 'MCP-Server hinzufügen';
@override
String get mcpRemoveTooltip => 'Server entfernen';
@override
String mcpToolsCount(int n) {
return '$n Tools';
}
@override
String n8nEndpointsCount(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: 'Endpunkte',
one: 'Endpunkt',
);
return '$n $_temp0';
}
@override
String n8nWorkflowsCount(int n) {
return '$n Workflows';
}
@override
String get n8nRediscoverTooltip => 'Discovery neu ausführen';
@override
String get n8nAddTooltip => 'n8n-Endpunkt hinzufügen';
@override
String get n8nRemoveTooltip => 'Endpunkt entfernen';
@override
String get addMcpTitle => 'MCP-Server hinzufügen';
@override
String get addMcpIntro =>
'Tools, die der Server via `tools/list` anbietet, erscheinen im Store als `mcp.<name>.<tool>`-Fähigkeiten.';
@override
String get addMcpSuggestionsLabel => 'Vorschläge — zum Vorausfüllen klicken';
@override
String get addMcpNameLabel => 'Name (keine Punkte)';
@override
String get addMcpNameHint => 'filesystem';
@override
String get addMcpEndpointLabel => 'Endpunkt';
@override
String get addMcpEndpointHint => 'http://127.0.0.1:3001/mcp';
@override
String get addMcpApiKeyLabel => 'API-Key-Umgebungsvariable (optional)';
@override
String get addMcpApiKeyHint => 'MCP_FILESYSTEM_TOKEN';
@override
String get addMcpNotesLabel => 'Notizen (optional)';
@override
String get addMcpAddButton => 'Hinzufügen + Discovery';
@override
String get addN8nTitle => 'n8n-Endpunkt hinzufügen';
@override
String get addN8nIntro =>
'Aktive Workflows erscheinen im Store als `n8n.<name>.<workflow_slug>`-Fähigkeiten.';
@override
String get addN8nNameLabel => 'Name (keine Punkte)';
@override
String get addN8nNameHint => 'ops';
@override
String get addN8nBaseUrlLabel => 'Basis-URL (ohne /api/v1)';
@override
String get addN8nBaseUrlHint => 'https://n8n.example.com';
@override
String get addN8nApiKeyLabel => 'API-Key-Umgebungsvariable (optional)';
@override
String get addN8nApiKeyHint => 'N8N_OPS_KEY';
@override
String get addN8nNotesLabel => 'Notizen (optional)';
@override
String get addN8nAddButton => 'Hinzufügen + Discovery';
@override
String addedMcpToast(String name) {
return 'MCP-Server „$name\" hinzugefügt.';
}
@override
String addedN8nToast(String name) {
return 'n8n-Endpunkt „$name\" hinzugefügt.';
}
@override
String addFailedToast(String error) {
return 'Hinzufügen fehlgeschlagen: $error';
}
@override
String removeFailedToast(String error) {
return 'Entfernen fehlgeschlagen: $error';
}
@override
String refreshFailedToast(String error) {
return 'Aktualisieren fehlgeschlagen: $error';
}
@override
String get channelsHeader => 'KANÄLE';
@override
String get channelsActive => 'aktiv';
@override
String get channelsRunning => 'läuft';
@override
String get channelsStopped => 'gestoppt';
@override
String get channelsConnect => 'Studio mit diesem Kanal verbinden';
@override
String get channelsSwitch => 'Diesen Kanal aktivieren';
@override
String get channelsEnableAutostart => 'Autostart bei Anmeldung aktivieren';
@override
String get channelsDisableAutostart => 'Autostart deaktivieren';
@override
String get storeSearchHint =>
'Module suchen — Name, Tagline, Tag, Fähigkeit…';
@override
String get storeAskHint =>
'Was brauchst du? Versuch\'s mit „ein Modul, das tabellarische Daten liest\" oder tippe einfach einen Begriff.';
@override
String get storeAskSubmit => 'Suchen';
@override
String get storeAskAi => 'KI fragen';
@override
String get storeAskClear => 'Frage zurücksetzen';
@override
String get storeAskAiThinking => 'Module werden durchsucht…';
@override
String get storeAskAiUnavailable =>
'Konfiguriere eine System-AI in den Einstellungen, um Fragen in normaler Sprache zu stellen.';
@override
String get storeAskNoMatches =>
'Keine Treffer — Frage verfeinern oder im Grid unten stöbern.';
@override
String get storeAskAnswerLabel => 'KI-Vorschlag';
@override
String get storeAskAnswerWhy => 'Warum es passt';
@override
String get storeAskMatchPill => 'Treffer';
@override
String get storeFilterLabel => 'Filter';
@override
String storeFilterActiveCount(int n) {
return '$n aktiv';
}
@override
String get storeFilterReset => 'Filter zurücksetzen';
@override
String get storeFilterApply => 'Fertig';
@override
String get storeFilterStatusGroup => 'Status';
@override
String get storeFilterSourceGroup => 'Quelle';
@override
String get storeFilterInstalledGroup => 'Nur installierte zeigen';
@override
String get storeFeatured => 'EMPFOHLEN';
@override
String get storeFeaturedHint => 'kuratierte Auswahl · klicken für Details';
@override
String get storeNoMatches => 'Keine Treffer';
@override
String get storeNoMatchesHint =>
'Filter anpassen oder Suche leeren, um alle Einträge zu sehen.';
@override
String get storeClearFilters => 'Filter zurücksetzen';
@override
String get storeStatusAll => 'Alle';
@override
String get storeStatusPublished => 'stabil';
@override
String get storeStatusAlpha => 'experimentell';
@override
String get storeStatusPlanned => 'geplant';
@override
String get storeInstalledOnly => 'Installiert';
@override
String get storeCategoryLabel => 'Kategorie';
@override
String get storeCategoryAll => 'Alle Kategorien';
@override
String get storeCategoryBridge => 'Verbindungen';
@override
String get storeCategoryDebug => 'Beispiele';
@override
String get storeCategoryText => 'Text';
@override
String get storeCategoryLlm => 'KI-Modelle';
@override
String get storeCategorySystem => 'System';
@override
String get storeCategoryAuth => 'Authentifizierung';
@override
String get storeCategoryStorage => 'Speicher';
@override
String get storeCategoryChannel => 'Kanäle';
@override
String get storeCategoryWeb => 'Web';
@override
String get storeCategoryOrchestrator => 'Orchestrierung';
@override
String 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üge 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 =>
'Angepinnter Public-Key — PEM (optional)';
@override
String get storesManagerPinnedKeyHint =>
'Signierte Module dieses Stores werden gegen diesen Key geprüft statt gegen den eingebauten Vendor-Key. Füge einen PEM-Public-Key ein.';
@override
String get storesManagerNotAvailable => 'Noch nicht verfügbar';
@override
String get storesManagerNotAvailableHint =>
'Der Anbieter hat diesen Store-Index noch nicht veröffentlicht. Sobald er das tut, ist er installierbar.';
@override
String get storesSuggestedReclaimDesc =>
'Recl∆Im — Module für Rechts- und Pflichten-Reform-Mapping';
@override
String get storeTodayBadge => 'HEUTE';
@override
String get storeTodayDeck => 'Von der Ch∆In-Redaktion';
@override
String get storeTodayDismissTooltip => 'Für diese Sitzung ausblenden';
@override
String get storePillInstalled => 'installiert';
@override
String get storePillUpdate => 'Update';
@override
String storeUpdateButton(String version) {
return 'Update auf $version';
}
@override
String storeUpdateTooltip(String installed, String best) {
return 'Installiert $installed — Store bietet v$best';
}
@override
String get storeNoTagline => '(keine Beschreibung)';
@override
String get storeUninstallTitle => 'Modul deinstallieren?';
@override
String storeUninstallBody(String name) {
return 'Entfernt $name aus diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl.';
}
@override
String storeInstalledToast(String name, String version) {
return '$name v$version installiert.';
}
@override
String storeInstallFailedToast(String error) {
return 'Installation fehlgeschlagen: $error';
}
@override
String storeUninstalledToast(String name, String version) {
return '$name v$version deinstalliert.';
}
@override
String storeUninstallFailedToast(String error) {
return 'Deinstallation fehlgeschlagen: $error';
}
@override
String storeOpenBrowserFailed(String error) {
return 'Browser konnte nicht geöffnet werden: $error';
}
@override
String get storeSectionTags => 'Tags';
@override
String get storeSectionRequiredCapabilities => 'Erforderliche Fähigkeiten';
@override
String get storeSectionRequiredHostServices => 'Erforderliche Host-Dienste';
@override
String get storeSectionScreenshots => 'Screenshots';
@override
String get storeSectionDocumentation => 'Dokumentation';
@override
String get storeSectionSource => 'Quelle';
@override
String get storeSectionPermissions => 'Deklarierte Berechtigungen';
@override
String get storeSectionDirectory => 'Modul-Verzeichnis';
@override
String get storeSectionPermissionsNone => '(keine — reines Berechnungsmodul)';
@override
String get storeInstallingButton => 'Installiere…';
@override
String get storeNotInstallable => 'Nicht installierbar';
@override
String storeNotInstallableTooltip(String status) {
return 'Status „$status\" — Installations-Pfad noch nicht verdrahtet.';
}
@override
String storeInstallProgressTitle(String name) {
return 'Installation von $name';
}
@override
String get storeInstallProgressBody => 'Holen, verifizieren, entpacken…';
@override
String get storeLoadDocs => 'Dokumentation laden';
@override
String get storeDocsHint =>
'README inline gerendert; nutzt das Registry-Token des Hubs, falls nötig.';
@override
String get storeDocsFetching => 'README wird geladen…';
@override
String get storeOpenRepoButton => 'Repository im Browser öffnen';
@override
String get storeDocsErrorNotFound =>
'Dieses Modul ist nicht im Store-Index des Hubs enthalten.';
@override
String get storeDocsErrorNoDocs =>
'Für dieses Modul ist keine Repository-URL hinterlegt.';
@override
String get storeDocsErrorAuth =>
'Die Registry erfordert Authentifizierung, um dieses README zu laden. Setze CHAIN_REGISTRY_TOKEN in der Umgebung des Daemons und starte 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. Öffne 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 =>
'Starte 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 => 'Step';
@override
String get auditFilterModule => 'Modul';
@override
String get auditClearLogTooltip => 'Protokoll löschen (nur local/dev Kanal)';
@override
String auditClearedToast(int n, String channel) {
return '$n Ereignisse auf Kanal „$channel\" gelöscht. Kette mit Marker neu geseedet.';
}
@override
String auditClearFailed(String detail) {
return 'Löschen fehlgeschlagen: $detail';
}
@override
String get auditExplain => 'Erklären';
@override
String get auditReask => 'Neu fragen';
@override
String get auditAsking => 'Frage läuft…';
@override
String get auditSystemAi => 'SYSTEM-AI';
@override
String get auditCachedPill => 'gecacht';
@override
String auditOriginalLatency(int ms) {
return 'ursprünglich $ms ms';
}
@override
String auditLatency(int ms) {
return '$ms ms';
}
@override
String get auditRegenerateTooltip =>
'Neu generieren — Cache überspringen, Modell erneut fragen';
@override
String auditLiveStatus(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: 'Ereignisse',
one: 'Ereignis',
);
return 'live · Abfrage alle 2s · $n $_temp0';
}
@override
String auditDisconnected(String error) {
return 'getrennt · $error';
}
@override
String get auditHashChainVerified => 'Hash-Kette verifiziert';
@override
String get auditDetailHeader => 'DETAIL';
@override
String get auditAskingFull => 'Frage an die konfigurierte System-AI läuft…';
@override
String get auditFixLabel => 'FIX';
@override
String auditCachedTooltipKnown(String at, String hits) {
return 'Aus dem lokalen Cache geliefert. Ursprünglich erzeugt am $at$hits.';
}
@override
String auditCachedTooltipUnknown(String hits) {
return 'Aus dem lokalen Cache geliefert. Ursprünglicher Zeitpunkt unbekannt$hits.';
}
@override
String auditCachedTooltipHits(int n) {
return ' · $n Treffer';
}
@override
String get auditConfigureSystemAi =>
'System-AI unter Einstellungen konfigurieren (Cmd+,)';
@override
String get auditClearDialogTitle => 'Audit-Log löschen?';
@override
String get auditClearDialogBody =>
'Löscht jedes Audit-Event auf dem aktiven Kanal und seedet einen neuen chain.reset-Marker mit Prüfer und Begründung. Auf beta / production verweigert. Nicht umkehrbar.';
@override
String get auditClearReviewerLabel => 'Prüfer';
@override
String get auditClearReasonLabel =>
'Begründung (im chain.reset-Marker festgehalten)';
@override
String get auditClearReasonHelper =>
'Erforderlich — Auditoren werden das lesen.';
@override
String get auditClearLogButton => 'Log löschen';
@override
String get modulesTitle => 'Module';
@override
String get modulesNoneTitle => 'Noch keine Module';
@override
String get modulesNoneHint =>
'`chain install <capability-name>` ausführen oder ~/.chain/modules/ prüfen.';
@override
String get modulesReloadTooltip => 'Aktualisieren';
@override
String get modulesRecentActivity => 'LETZTE AKTIVITÄT';
@override
String modulesRecentActivityHint(int n) {
return 'letzte $n install/uninstall-Ereignisse aus dem Audit-Log';
}
@override
String get modulesActivityInstalled => 'installiert';
@override
String get modulesActivityUninstalled => 'deinstalliert';
@override
String get modulesCapabilitiesLabel => 'Fähigkeiten';
@override
String get modulesUninstallTitle => 'Modul deinstallieren?';
@override
String modulesUninstallBody(String name, String version) {
return 'Entfernt $name v$version von diesem Hub. Flows, die es verwenden, schlagen beim nächsten Lauf fehl. Ein `module.uninstalled`-Audit-Event wird festgehalten.';
}
@override
String modulesUninstalledToast(String name, String version) {
return '$name v$version deinstalliert.';
}
@override
String modulesUninstallFailed(String error) {
return 'Deinstallation fehlgeschlagen: $error';
}
@override
String get modulesUninstalling => 'Wird deinstalliert…';
@override
String moduleSheetFailedToLoad(String error) {
return 'Laden fehlgeschlagen: $error';
}
@override
String get moduleSheetCapabilities => 'Fähigkeiten';
@override
String get moduleSheetPermissions => 'Deklarierte Berechtigungen';
@override
String get moduleSheetNoPermissions => '(keine — reines Berechnungsmodul)';
@override
String get flowsTitle => 'Flows';
@override
String get flowsReloadTooltip => 'Aktualisieren';
@override
String get flowsNoneTitle => 'Keine gespeicherten Flows';
@override
String get flowsNoneHint =>
'Flow speichern mit `chain admin flows save <name> <flow.yaml>`, dann taucht er hier auf.';
@override
String flowsRunDialogTitle(String name) {
return '$name ausführen';
}
@override
String get flowsRunDialogBody =>
'Pro deklariertem Input ein Feld. Bytes-Inputs öffnen einen Datei-Picker; alle anderen sind Klartext. Der Starten-Button aktiviert sich, wenn alle Pflichtfelder gefüllt sind.';
@override
String get flowsLoadingDefinition => 'Inputs werden geladen…';
@override
String get flowsDefinitionFailed =>
'Flow-Definition konnte nicht geladen werden';
@override
String get flowsNoInputs =>
'Dieser Flow deklariert keine Inputs. Starten klicken, um loszulegen.';
@override
String get flowsTypeBytesPick => 'Datei wählen…';
@override
String get flowsTypeBytesChange => 'Datei ändern';
@override
String get flowsTypeBytesNoFile => 'Keine Datei ausgewählt';
@override
String flowsTypeBytesSize(int n) {
return '$n Bytes';
}
@override
String get flowsRunErrorTitle => 'Flow-Lauf fehlgeschlagen';
@override
String flowsFileReadFailed(String path, String error) {
return '$path\" konnte nicht gelesen werden: $error';
}
@override
String get flowsMissingModulesLabel => 'Braucht:';
@override
String get flowsRunDisabledTooltip =>
'Erst die fehlenden Module installieren.';
@override
String flowsInstallAllButton(int n) {
return 'Alle installieren ($n)';
}
@override
String get flowsInstallPillTooltip => 'Zum Installieren klicken';
@override
String get flowsInstallDepsTitle => 'Abhängigkeiten installieren';
@override
String get flowsInstallDepsBody =>
'Die fehlenden Module werden der Reihe nach installiert. Vorhandene Installationen bleiben unberührt.';
@override
String get flowsInstallStatusPending => 'Wartet';
@override
String get flowsInstallStatusInstalling => 'Wird installiert…';
@override
String flowsInstallStatusDone(String version) {
return 'Installiert v$version';
}
@override
String get flowsInstallStatusFailed => 'Fehlgeschlagen';
@override
String flowsInstallStatusFailedDetail(String error) {
return '$error';
}
@override
String get flowsInstallDepsAllDone => 'Alle Abhängigkeiten installiert.';
@override
String flowsInstallDepsAnyFailed(int ok, int failed) {
return '$ok installiert, $failed fehlgeschlagen.';
}
@override
String get flowsInstallAuthWallButton => 'Registry-Token einfügen';
@override
String get flowsOpenInEditorTooltip => 'Im Studio-Flow-Editor öffnen';
@override
String flowsOpenInEditorFailed(String error) {
return 'Konnte Datei nicht öffnen: $error';
}
@override
String get registryCredentialsHeader => 'REGISTRY-ZUGANGSDATEN';
@override
String get registryCredentialsBlurb =>
'Token zum Herunterladen von .fai-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 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ähle 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 => 'Du bist eingerichtet.';
@override
String get welcomeChecklistAllSetBody =>
'Drei Stränge, an denen du als nächstes ziehen kannst:';
@override
String get welcomeChecklistNextAuditTitle => 'Audit-Log lesen';
@override
String get welcomeChecklistNextAuditBody =>
'Jede Installation, jeder Flow-Lauf, jede Freigabe landet im hash-verketteten Log. Im Protokoll-Tab siehst du, was dein Hub gemacht hat.';
@override
String get welcomeChecklistNextAuditButton => 'Protokoll öffnen';
@override
String get welcomeChecklistNextTodayTitle => 'Daily-Today-Story einrichten';
@override
String get welcomeChecklistNextTodayBody =>
'tools/today/propose.sh per Cron laufen lassen und die Editorial-Karte im Store füllt sich mit operator-kuratierten Stories.';
@override
String get welcomeChecklistNextTodayButton => 'Today-Doku öffnen';
@override
String get welcomeChecklistNextModuleTitle => 'Eigenes Modul bauen';
@override
String get welcomeChecklistNextModuleBody =>
'Mit `chain new module <name>` ein Rust+WASM-Scaffold erzeugen. Das module-sdk übernimmt die WIT-Plumbing; du schreibst nur ein typisiertes invoke.';
@override
String get welcomeChecklistNextModuleButton => 'Doku lesen';
@override
String get auditGroupToday => 'HEUTE';
@override
String get auditGroupYesterday => 'GESTERN';
@override
String get auditGroupThisWeek => 'DIESE WOCHE';
@override
String get auditGroupOlder => 'ÄLTER';
@override
String get auditEventViewFlowRun => 'Flow-Lauf ansehen';
@override
String auditFlowRunDialogTitle(String flow) {
return 'Flow-Lauf · $flow';
}
@override
String auditFlowRunDialogSubtitle(int n, String execution) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: 'Ereignisse',
one: 'Ereignis',
);
return '$n $_temp0 für Lauf $execution';
}
@override
String get approvalsSelectAll => 'Alle wählen';
@override
String get approvalsClearSelection => 'Auswahl aufheben';
@override
String approvalsBatchSelected(int n) {
return '$n ausgewählt';
}
@override
String get approvalsBatchApprove => 'Alle freigeben';
@override
String get approvalsBatchReject => 'Alle ablehnen';
@override
String approvalsBatchApproveDoneToast(int n) {
return '$n Freigaben erteilt.';
}
@override
String approvalsBatchRejectDoneToast(int n) {
return '$n Freigaben abgelehnt.';
}
@override
String approvalsBatchPartialFailure(int ok, int failed) {
return '$ok erledigt, $failed fehlgeschlagen.';
}
@override
String get flowsRunButton => 'Starten';
@override
String flowsRunningTitle(String name) {
return '$name läuft';
}
@override
String flowsResultTitle(String name) {
return '$name — Ergebnis';
}
@override
String flowsErrorTitle(String name) {
return '$name — fehlgeschlagen';
}
@override
String get flowsRunning => 'Flow läuft…';
@override
String get flowsNoOutputs => 'Flow abgeschlossen ohne deklarierte Outputs.';
@override
String get errGeneric => 'Da ist etwas schiefgegangen.';
@override
String get errInvalidArgument => 'Ungültige Eingabe.';
@override
String get errInvalidArgumentHint =>
'Werte im Formular prüfen und erneut versuchen.';
@override
String get errNotFound => 'Nicht gefunden.';
@override
String get errNotFoundHint =>
'Das Angefragte ist nicht hier — entweder entfernt oder nie existiert.';
@override
String get errAlreadyExists => 'Existiert bereits.';
@override
String get errPermissionDenied => 'Berechtigung verweigert.';
@override
String get errPermissionDeniedHint =>
'Die Operator-Policy des Hubs blockiert diese Aktion. `~/.chain/config.yaml` prüfen.';
@override
String get errFailedPrecondition => 'Setup-Problem hat das blockiert.';
@override
String get errFailedPreconditionHint =>
'Der Hub konnte nicht weiter, weil etwas Vorausgesetztes fehlt. Details unten erklären was.';
@override
String get errInternal => 'Unerwarteter interner Fehler.';
@override
String get errInternalHint =>
'Hub-Logs unter `~/.chain/logs/` prüfen. Wenn das öfter passiert, bitte melden.';
@override
String get errUnavailable => 'Hub nicht erreichbar.';
@override
String get errUnavailableHint =>
'Sicherstellen, dass `chain serve` (oder `chain daemon start`) läuft und der Daemon-Endpunkt zu Studios Einstellungen passt.';
@override
String get errUnauthenticated => 'Authentifizierung erforderlich.';
@override
String get errUnauthenticatedHint =>
'`CHAIN_REGISTRY_TOKEN` setzen oder in den Einstellungen anmelden, dann erneut versuchen.';
@override
String get errCopyDetail => 'Detail kopieren';
@override
String get errDetailCopied => 'Detail in die Zwischenablage kopiert.';
@override
String get flowsOutputUnknown => 'Unbekannter Output-Payload-Typ.';
@override
String get flowsOutputBytesUnknownMime => 'Binärdaten';
@override
String get flowsOutputSaveAs => 'Speichern unter…';
@override
String get flowsOutputSaveAsTitle => 'Flow-Output speichern';
@override
String flowsOutputSavedAt(String path) {
return 'Gespeichert: $path';
}
@override
String flowsOutputSaveFailed(String error) {
return 'Speichern fehlgeschlagen: $error';
}
@override
String get flowsOutputOpen => 'Öffnen';
@override
String flowsOutputOpenFailed(String error) {
return 'Öffnen fehlgeschlagen: $error';
}
@override
String get approvalsTitle => 'Freigaben';
@override
String get approvalsTabPending => 'Offen';
@override
String get approvalsTabHistory => 'Verlauf';
@override
String get approvalsInboxZero => 'Posteingang leer';
@override
String get approvalsInboxHint =>
'Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.';
@override
String get approvalsReloadTooltip => 'Aktualisieren';
@override
String get approvalsPillPending => 'offen';
@override
String get approvalsPillApproved => 'freigegeben';
@override
String get approvalsPillRejected => 'abgelehnt';
@override
String get approvalsPillExpired => 'abgelaufen';
@override
String get approvalsPayloadPreview => 'ZU PRÜFENDE DATEN';
@override
String get approvalsNoPayload =>
'Keine Daten zum Prüfen angehängt. Der system.approval-Schritt des Flows bestimmt über sein \"show:\"-Feld, was angezeigt wird — setze es, um die Daten hinter dieser Entscheidung sichtbar zu machen.';
@override
String get approvalsRequestFallback =>
'Freigabe für diesen Schritt erforderlich';
@override
String approvalsFlowStepMeta(String flow, String step) {
return 'Flow: $flow · Schritt: $step';
}
@override
String get approvalsApproveButton => 'Freigeben';
@override
String get approvalsRejectButton => 'Ablehnen';
@override
String get approvalsRejectDialogTitle => 'Freigabe ablehnen';
@override
String get approvalsRejectReasonLabel =>
'Begründung (im Audit-Log festgehalten)';
@override
String approvalsApprovedToast(String flow, String step) {
return 'freigegeben · $flow $step';
}
@override
String approvalsRejectedToast(String flow, String step) {
return 'abgelehnt · $flow $step';
}
@override
String approvalsApproveFailed(String error) {
return 'Freigabe fehlgeschlagen: $error';
}
@override
String approvalsRejectFailed(String error) {
return 'Ablehnung fehlgeschlagen: $error';
}
@override
String get approvalsHistoryEmpty => 'Noch kein Verlauf';
@override
String get approvalsHistoryEmptyHint =>
'Entschiedene Freigaben (freigegeben / abgelehnt / abgelaufen) erscheinen hier.\nDas Audit-Log enthält den vollständigen hash-verketteten Datensatz.';
@override
String get approvalsDialogDecided => 'entschieden';
@override
String get approvalsDialogCreated => 'erstellt';
@override
String get approvalsDialogReason => 'Begründung';
@override
String get approvalsDialogPrompt => 'PROMPT';
@override
String approvalsExpiresIn(int minutes) {
return '${minutes}m';
}
@override
String approvalsExpiresInHours(int hours) {
return '${hours}h';
}
@override
String get doctorTitle => 'Diagnose';
@override
String get doctorSummaryModules => 'Module';
@override
String get doctorSummaryApprovals => 'Freigaben';
@override
String get doctorSummaryAudit => 'Protokoll';
@override
String get doctorSummaryServices => 'Dienste';
@override
String doctorSummaryCapabilities(int n) {
return '$n Fähigkeiten';
}
@override
String get doctorSummaryPending => 'offen';
@override
String doctorSummaryChain(int verified, int total) {
return '$verified/$total Kette';
}
@override
String get doctorSummaryDeclared => 'deklariert';
@override
String doctorModulesPanelSummary(int n, int m) {
return '$n Module · $m Fähigkeiten';
}
@override
String get doctorApprovalsNone => 'Keine offenen Freigaben';
@override
String doctorApprovalsCount(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n Freigaben warten auf Prüfung',
one: '1 Freigabe wartet auf Prüfung',
);
return '$_temp0';
}
@override
String get doctorApprovalsAttentionPill => 'wichtig';
@override
String get doctorServicesEmpty => 'Keine Host-Dienste deklariert';
@override
String get doctorServicesEmptyHint =>
'in ~/.chain/config.yaml unter services: hinzufügen';
@override
String get doctorPillLoaded => 'geladen';
@override
String get doctorPillEmpty => 'leer';
@override
String get doctorRecheckTooltip => 'Erneut prüfen';
@override
String get doctorEventLogSection => 'Audit-Log';
@override
String get doctorModulesApprovalsSection => 'Module & Freigaben';
@override
String get doctorHostServicesSection => 'Host-Dienste';
@override
String get doctorDaemonFilesSection => 'Daemon-Dateien';
@override
String get doctorDaemonControlSection => 'Daemon-Steuerung';
@override
String get doctorChainIntact => 'Hash-Kette intakt';
@override
String doctorChainIntactDetail(int n) {
return '$n Ereignisse · prev_event_sha256 lückenlos verifiziert';
}
@override
String get doctorChainTampered => 'Manipulation erkannt';
@override
String doctorChainTamperedDetail(int verified, int total, String id) {
return '$verified von $total verifiziert vor Mismatch bei $id';
}
@override
String get doctorChainPillOk => 'WORM-1';
@override
String get doctorChainPillTamper => 'MANIPULIERT';
@override
String get doctorVerifyNow => 'Jetzt prüfen';
@override
String get doctorRestart => 'Neustart';
@override
String get doctorStart => 'Starten';
@override
String get doctorStop => 'Stoppen';
@override
String get doctorStatusAction => 'Status';
@override
String doctorRunningOn(String name, String endpoint) {
return 'Läuft auf $name: $endpoint';
}
@override
String doctorStoppedOn(String name) {
return '$name-Daemon gestoppt';
}
@override
String get doctorStatusUnknown => 'Daemon-Status: …';
@override
String get doctorPillRunning => 'läuft';
@override
String get doctorPillStopped => 'gestoppt';
@override
String get doctorDaemonControlHint =>
'Studio ruft das Platform-Binary auf — entspricht `chain daemon …`, sodass CLI und UI im Gleichschritt bleiben.';
@override
String get doctorDaemonControlWorking => 'Wird ausgeführt…';
@override
String get doctorPathLog => 'Log';
@override
String get doctorPathConfig => 'Konfig';
@override
String get doctorPathDb => 'Audit-DB';
@override
String get doctorPathModules => 'Module-Verzeichnis';
@override
String get doctorPathFlows => 'Flow-Verzeichnis';
@override
String get doctorPathPid => 'PID-Datei';
@override
String get doctorPathsEmpty =>
'Daemon hat keine Datei-Pfade gemeldet. Hub aktualisieren via `chain daemon restart`.';
@override
String doctorOpenError(String detail) {
return 'Konnte nicht öffnen: $detail';
}
@override
String doctorUpdateAvailable(String version) {
return 'Update verfügbar — $version';
}
@override
String doctorUpdateBody(String channel, String version) {
return 'Kanal $channel bietet jetzt $version. Per Button anwenden — Studio ruft `chain update apply --channel $channel` auf.';
}
@override
String get doctorUpdateUnreachable => 'Release-Host nicht erreichbar';
@override
String doctorUpdateUnreachableBody(String channel) {
return 'Release-Feed für $channel konnte nicht erreicht werden.';
}
@override
String doctorReleaseNotes(String url) {
return 'Notes: $url';
}
@override
String get doctorPillNew => 'neu';
@override
String get doctorPillOffline => 'offline';
@override
String get doctorApplyUpdate => 'Update anwenden';
@override
String get doctorApplying => 'Wird angewendet…';
@override
String get doctorApplyDone =>
'Update angewendet. Studio neu starten, um die neue Daemon-Version zu sehen.';
@override
String get mcpHeader => 'MCP-CLIENTS';
@override
String get mcpHint =>
'Externe MCP-Server bringen ihre Tools als `mcp.<server>.<tool>` Fähigkeiten ein. Einmal konfigurieren, im Store sichtbar.';
@override
String get mcpEmpty =>
'Keine MCP-Server konfiguriert. + klicken zum Hinzufügen.';
@override
String get n8nHeader => 'N8N-ENDPUNKTE';
@override
String get n8nHint =>
'Aktive n8n-Workflows erscheinen als `n8n.<endpoint>.<slug>` Fähigkeiten. Einmal konfigurieren, im Store sichtbar.';
@override
String get n8nEmpty =>
'Keine n8n-Endpunkte konfiguriert. + klicken zum Hinzufügen.';
@override
String get hubUnreachable => 'Hub nicht erreichbar';
@override
String get hubUnreachableHint => 'Hub starten mit `chain serve`.';
@override
String get languageEnglish => 'English';
@override
String get languageGerman => 'Deutsch';
@override
String get searchHint =>
'Springe überall hin — Module, Store, Flows, Seiten…';
@override
String get searchIndexing => 'Indiziere…';
@override
String get searchNoMatches => 'Keine Treffer.';
@override
String get searchHintNavigate => '↑↓ navigieren';
@override
String get searchHintOpen => 'Enter öffnen';
@override
String get searchHintClose => 'Esc schließen';
@override
String get searchGroupPages => 'Seiten';
@override
String get searchGroupModules => 'Module';
@override
String get searchGroupStore => 'Store';
@override
String get searchGroupFlows => 'Flows';
@override
String get searchSettingsLabel => 'Einstellungen';
@override
String searchPageHint(int n) {
return 'Seite · ⌘$n';
}
@override
String get searchSettingsHint => 'Hub-Endpunkt, Kanäle, System-AI · ⌘;';
@override
String searchInstalledModuleHint(String version) {
return 'installiertes Modul · v$version';
}
@override
String get searchStoreUncategorized => 'ohne Kategorie';
@override
String searchStoreHintWithTagline(String tagline) {
return 'Store · $tagline';
}
@override
String searchStoreHintWithCategory(String category) {
return 'Store · $category';
}
@override
String get searchSavedFlowHint => 'gespeicherter Flow';
@override
String get systemAiTitle => 'System-AI';
@override
String get systemAiIntro =>
'Die hub-interne LLM, die die Plattform selbst für Fehlererklärungen und Operator-Hilfe nutzt. Standardmäßig aus; hier konfigurieren. Siehe docs/architecture/system-ai.md, was über die Leitung geht.';
@override
String get systemAiProviderLabel => 'Provider';
@override
String get systemAiEndpointLabel => 'Endpunkt-URL (bis /v1)';
@override
String get systemAiApiKeyRequired =>
'API-Key-Umgebungsvariable (erforderlich)';
@override
String get systemAiApiKeyOptional => 'API-Key-Umgebungsvariable (optional)';
@override
String systemAiApiKeyDisclaimer(String name) {
return 'Studio liest oder speichert den Key-Wert nie — nur den Namen der Umgebungsvariable. Der Hub liest `\$$name` zur Anfragezeit.';
}
@override
String get systemAiTestConnection => 'Verbindung testen';
@override
String get systemAiTesting => 'Teste…';
@override
String get systemAiSave => 'Speichern';
@override
String get systemAiPrivacyHeader => 'PRIVACY-MODUS';
@override
String get systemAiPrivacyOffLabel => 'Aus';
@override
String get systemAiPrivacyOffDesc =>
'Feature deaktiviert. Keine Anfragen verlassen den Hub.';
@override
String get systemAiPrivacyRedactedLabel => 'Redigiert';
@override
String get systemAiPrivacyRedactedDesc =>
'Nur event_type / error / Modul-Namen. KRITIS-freundlicher Standard.';
@override
String get systemAiPrivacyFullLabel => 'Voll';
@override
String get systemAiPrivacyFullDesc =>
'Enthält das Audit-Detail-JSON (nur Hash — keine Roh-Payloads).';
@override
String get systemAiConnectionOk => 'Verbindung ok';
@override
String get systemAiConnectionFailed => 'Verbindung fehlgeschlagen';
@override
String systemAiReplyPrefix(String text) {
return 'Antwort: $text';
}
@override
String get systemAiModelLabel => 'Modell (erforderlich)';
@override
String get systemAiModelHintFallback =>
'Modell-Identifier, den der Provider erwartet';
@override
String get systemAiModelHelperBase =>
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen.';
@override
String get systemAiModelHelperOllama =>
'Erforderlich: aus der Liste auswählen (Aktualisieren) oder eintippen. Mit Pull von Ollama herunterladen.';
@override
String get systemAiRefresh => 'Aktualisieren';
@override
String get systemAiPull => 'Pull';
@override
String get systemAiPulling => 'Lade…';
@override
String systemAiCouldNotListModels(String error) {
return 'Modelle konnten nicht aufgelistet werden: $error';
}
@override
String get systemAiNoModelsOllama =>
'Noch keine Modelle auf dem Ollama-Server. Oben eintippen und Pull klicken.';
@override
String get systemAiNoModelsGeneric => 'Provider lieferte keine Modelle.';
@override
String get systemAiSuitabilityRecommended => 'empfohlen';
@override
String get systemAiSuitabilityBalanced => 'ausgewogen';
@override
String get systemAiSuitabilitySmall => 'klein — Qualität evtl. eingeschränkt';
@override
String get systemAiSuitabilityLarge => 'groß — langsamer';
@override
String get systemAiSuitabilityHuge =>
'sehr groß — auf einem Laptop wahrscheinlich zu langsam';
@override
String get systemAiSuitabilityUnknown => 'Größe unbekannt';
@override
String systemAiHwDetected(String summary) {
return 'Erkannt: $summary';
}
@override
String systemAiHwReviewed(String date) {
return ' · Kuratierung geprüft $date';
}
@override
String systemAiLegendRecommended(String tier) {
return 'empfohlen für diese Hardware$tier';
}
@override
String get systemAiLegendBalanced => 'ausgewogen (4-8B)';
@override
String get systemAiLegendSmallLarge =>
'klein <3B / groß 9-15B / über Hardware';
@override
String get systemAiLegendHuge => 'sehr groß >15B';
@override
String get systemAiLegendUnknown => 'Größe unbekannt';
@override
String systemAiCacheRow(int n) {
String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: 'gespeicherte Erklärungen',
one: 'gespeicherte Erklärung',
);
return 'Cache: $n $_temp0. Identische Prompts treffen den Cache; Modell- oder Privacy-Modus-Wechsel leeren ihn automatisch.';
}
@override
String get systemAiCacheClear => 'Leeren';
@override
String systemAiCacheClearedToast(int n) {
return '$n gespeicherte System-AI-Erklärungen gelöscht.';
}
@override
String systemAiCacheClearFailed(String error) {
return 'Cache-Löschen fehlgeschlagen: $error';
}
@override
String get systemAiPullEmptyError =>
'Erst eine Modell-ID eintippen (z.B. gemma3:4b).';
@override
String systemAiPullFailedError(String error) {
return 'Pull fehlgeschlagen: $error';
}
@override
String storeProvenanceTemporal(String provider) {
return 'temporal · $provider';
}
@override
String get storeSourceTemporal => 'Temporal';
@override
String get navFlowEditor => 'Editor';
@override
String get flowEditorBackTooltip => 'Zurück';
@override
String get flowEditorNew => 'Neuer Flow';
@override
String get flowEditorSave => 'Speichern';
@override
String get flowEditorRun => 'Ausführen';
@override
String get flowEditorRefresh => 'Datei-Liste neu laden';
@override
String get flowEditorRunOutput => 'LAUF-ERGEBNIS';
@override
String get flowEditorEmptyTitle => 'Kein Flow geöffnet';
@override
String get flowEditorEmptyBody =>
'Wähle links einen aus oder klicke Neuer Flow um einen neuen anzulegen.';
@override
String get flowEditorListEmptyTitle => 'Keine gespeicherten Flows';
@override
String get flowEditorListEmptyBody =>
'Klicke Neuer Flow um aus einer Vorlage zu starten.';
@override
String get flowEditorDiscardTitle => 'Ungespeicherte Änderungen verwerfen?';
@override
String get flowEditorDiscardBody =>
'Beim Wechsel der Datei gehen alle noch nicht gespeicherten Änderungen verloren.';
@override
String get flowEditorDiscardKeep => 'Weiterbearbeiten';
@override
String get flowEditorDiscardThrow => 'Verwerfen';
@override
String get flowEditorNewDialogTitle => 'Neuer Flow';
@override
String get flowEditorNewDialogLabel => 'Flow-Name';
@override
String get flowEditorNewDialogHelper =>
'Kleinbuchstaben, Ziffern, Bindestrich, Unterstrich';
@override
String get flowEditorNewDialogCancel => 'Abbrechen';
@override
String get flowEditorNewDialogCreate => 'Anlegen';
@override
String flowEditorNewTemplateComment(String name) {
return 'Von Studios Flow-Editor erstellt. Bearbeiten, speichern, ausführen.';
}
@override
String flowEditorAlreadyExists(String name) {
return 'Ein Flow namens \"$name\" existiert bereits.';
}
@override
String get buttonView => 'Ansehen';
@override
String logViewerTitle(String title, int count) {
return '$title — letzte $count Zeilen';
}
@override
String get logViewerEmpty => 'Log-Datei ist leer oder existiert noch nicht.';
@override
String get logViewerCopyAll => 'Alles kopieren';
@override
String get logViewerOpenExternal => 'Im Standardeditor öffnen';
@override
String logViewerLineCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Zeilen',
one: '1 Zeile',
);
return '$_temp0';
}
@override
String get doctorPathStudioErrors => 'Studio-Fehler';
@override
String get settingsCategoryGeneral => 'Allgemein';
@override
String get settingsCategoryAppearance => 'Darstellung';
@override
String get settingsCategoryAi => 'System-KI';
@override
String get settingsCategoryIntegrations => 'Integrationen';
@override
String get settingsCategorySecurity => 'Sicherheit';
@override
String get settingsCategoryMaintenance => 'Wartung';
@override
String get settingsAiPanelTitle => 'System-KI';
@override
String get settingsAiPanelBody =>
'Operator-verwalteter LLM-Endpunkt, den Studio für die KI-Helfer nutzt (System-KI-Edit, Install-Vorschläge, Doctor-Zusammenfassung). Kein Flow ruft das jemals auf; Module sprechen mit ihrem eigenen LLM.';
@override
String get settingsIntegrationsPanelTitle => 'Integrationen';
@override
String get settingsIntegrationsPanelBody =>
'Externe Tool-Server, deren Capabilities der Hub föderiert. MCP-Server bieten Tool-Endpunkte; n8n-Endpunkte stellen gehostete Workflows bereit.';
@override
String get settingsSecurityPanelTitle => 'Sicherheit & Zugangsdaten';
@override
String get settingsSecurityPanelBody =>
'Tokens, die der Hub für dich verwahrt. Liegen in ~/.chain/ mit Modus 0600; werden nie als Telemetrie versendet.';
@override
String get settingsMaintenancePanelTitle => 'Wartung';
@override
String get settingsMaintenancePanelBody =>
'Destruktive Aktionen, abgesichert durch explizite Bestätigungs-Dialoge. Nutzen z.B. beim Re-Pilot-Testen oder Debuggen.';
@override
String get tooltipMoveUp => 'Nach oben';
@override
String get tooltipMoveDown => 'Nach unten';
@override
String get tooltipRemove => 'Entfernen';
@override
String get daemonActionEnableAutostart => 'Autostart aktivieren';
@override
String get daemonActionDisableAutostart => 'Autostart deaktivieren';
@override
String get daemonActionRestart => 'Daemon neu starten';
@override
String get daemonActionStart => 'Daemon starten';
@override
String get daemonActionStop => 'Daemon stoppen';
@override
String get daemonActionStatus => 'Daemon-Status';
@override
String daemonActionResultOk(String label) {
return 'OK · $label';
}
@override
String daemonActionResultFailed(String label) {
return 'Fehlgeschlagen · $label';
}
@override
String get addSourceTitle => 'Modul-Quelle hinzufügen';
@override
String addSourceIntro(String capability) {
return '`$capability` ist nicht im öffentlichen Store. Zeig dem Hub eine `.fai`-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 .fai-Bundle';
@override
String get addSourceHint =>
'https://git.flemming.ai/deine-org/dein-modul/releases/download/v0.1.0/foo-0.1.0.fai';
@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 `.fai`-Bundle, das du beliebig hosten kannst (eigene Forgejo / GitHub / S3). Der Hub installiert per URL und prüft die Signatur gegen seinen Trust-Store.\n\nLokal entwickeln? Nimm das CLI — Studio installiert (noch) nicht aus einem unverpackten Verzeichnis:';
@override
String get addSourceCliExample => 'chain install --link /pfad/zum/modul';
@override
String get addSourceInstallButton => 'Installieren';
@override
String get addSourceCancel => 'Abbrechen';
@override
String installFailed(String error) {
return 'Installation fehlgeschlagen: $error';
}
@override
String get welcomeHubDownTitle => 'Der Hub läuft noch nicht';
@override
String get welcomeHubDownBody =>
'Studio spricht mit einem lokalen Hub — der Engine, die Module lädt und Flows ausführt. Sie ist gerade nicht erreichbar. Starte sie, 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 =>
'Installiere die Ch∆In-Plattform oder verweise 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. Setze sie in deiner Shell und starte den Daemon neu.';
@override
String get sysAiFixNetwork =>
'Der Hub erreicht den konfigurierten Endpunkt nicht. Läuft dein Anbieter?';
@override
String get sysAiFixHttp =>
'Der Anbieter hat einen Status außerhalb 2xx geliefert. Prüfe Endpunkt, Modellname 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 deinem Rechner. Kein API-Schlüssel nötig.';
@override
String get providerDescOpenai =>
'Gehostete OpenAI-API. Erfordert einen API-Schlüssel. Daten verlassen deinen Rechner.';
@override
String get providerDescLmstudio =>
'Lokaler LM-Studio-Server. Die Modelle bleiben auf deinem 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 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 =>
'Verbinde einen weiteren Hub als Satellit, um Capabilities dort auszuführen. Stelle dazu ein Enrollment-Token aus.';
@override
String get federationPillConnected => 'verbunden';
@override
String get federationRegionNone => 'keine Region';
@override
String federationCapabilities(int count) {
return '$count angebotene Capabilities';
}
@override
String get federationAddDialogTitle => 'Enrollment-Token ausstellen';
@override
String get federationNameLabel => 'Satelliten-Name';
@override
String get federationIssueButton => 'Ausstellen';
@override
String federationIssueFailed(String error) {
return 'Token konnte nicht ausgestellt werden: $error';
}
@override
String federationEnrollmentTitle(String name) {
return '$name einrichten';
}
@override
String get federationTokenLabel => 'Bootstrap-Token (einmalig)';
@override
String get federationConfigLabel =>
'Satelliten-Konfiguration (in den Satelliten einfügen)';
@override
String get federationCopied => 'In die Zwischenablage kopiert';
@override
String get federationEnrollmentHint =>
'Übergib das Token dem Satelliten-Betreiber über einen sicheren Kanal. Die mitgelieferte CA macht den ersten Connect des Satelliten manipulationssicher.';
}