chain-studio/lib/l10n/app_localizations_de.dart
flemming-it d25b4c87ae feat(studio): MCP suggestions + Approvals/Audit/Settings i18n (v0.26.0)
- Add curated catalogue of 9 official Anthropic MCP servers as
  click-to-prefill chips in the Add-MCP-server dialog. Operator
  still confirms via "Add + discover"; nothing is auto-spawned,
  preserving the regulated-environment trust model.
- Localize Approvals page: pending/history empty states, status
  pills, payload preview, approve/reject toasts, reject dialog,
  history detail dialog, expires-in pill.
- Localize Audit page: filter chips, clear-log dialog and toasts,
  no-events / hub-unreachable empty states, live-status bar with
  pluralized event count, hash-chain-verified badge, System AI
  panel (cached pill, latency, regenerate tooltip, asking
  state), event-detail dialog actions.
- Localize Settings dialog: hub-endpoint section, channel
  blurb + popup-menu items, System AI panel headers and
  off-blurb, MCP/N8N panel headers + pluralized counts +
  refresh/add/remove tooltips, Add-MCP and Add-n8n dialogs
  (intro, suggestions label, all field labels and hints, save
  buttons, toasts).

Field labels that map directly to JSON keys (event_id, flow,
step, module, provider, endpoint, model) stay English by design
— they're technical identifiers, not UI copy.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-05-08 02:38:11 +02:00

817 lines
19 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 => 'F∆I Studio';
@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 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 settingsTitle => 'Hub-Endpunkt';
@override
String get settingsHost => 'Host';
@override
String get settingsPort => 'Port';
@override
String get settingsTls => 'TLS';
@override
String get settingsSaveAndConnect => 'Speichern & 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 ~/.fai/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>`-Capabilities.';
@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>`-Capabilities.';
@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, Capability…';
@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 => 'Veröffentlicht';
@override
String get storeStatusAlpha => 'Alpha';
@override
String get storeStatusPlanned => 'Geplant';
@override
String get storeInstalledOnly => 'Installiert';
@override
String storeNResults(int n) {
return '$n Treffer';
}
@override
String get storeFederationNudgeTitle => 'Mehr Capabilities?';
@override
String get storeFederationNudgeBody =>
'MCP-Server oder n8n-Endpunkt unter Einstellungen → MCP-Clients / N8N-Endpunkte konfigurieren. Entdeckte Tools und Workflows tauchen hier als `mcp.<server>.<tool>`- und `n8n.<endpoint>.<workflow>`-Capabilities auf — jeder Anthropic-/Community-MCP-Server bringt mehrere auf einmal.';
@override
String get storeFederationNudgeButton => 'Einstellungen öffnen';
@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. Chain 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-Chain 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 =>
'`fai install <capability-name>` ausführen oder ~/.fai/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 => 'Capabilities';
@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 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 => 'PAYLOAD-VORSCHAU';
@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-chained 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 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-Chain 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 `fai 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 `fai 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 `fai 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>` Capabilities 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>` Capabilities. 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 `fai serve`.';
@override
String get languageEnglish => 'English';
@override
String get languageGerman => 'Deutsch';
}