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>
This commit is contained in:
parent
349619d68e
commit
d25b4c87ae
9 changed files with 2022 additions and 209 deletions
|
|
@ -36,6 +36,62 @@
|
|||
"settingsSaveAndConnect": "Speichern & verbinden",
|
||||
"settingsLanguage": "Sprache",
|
||||
"settingsLanguageHint": "Sprache der App. Wirkt auf alle Seiten; mehrsprachige Store-Einträge folgen ebenfalls.",
|
||||
"settingsHubEndpointHint": "Wohin soll Studio sich verbinden? Standard ist der lokale Hub auf 127.0.0.1:50051.",
|
||||
"settingsTlsSubtitle": "https/grpc-secure",
|
||||
"settingsPortError": "Port muss 1–65535 sein",
|
||||
"channelsBlurb": "Hub-Kanal wechseln (schreibt ~/.fai/current-channel und startet den Daemon neu). Verbinden ändert nur die Wire von Studio.",
|
||||
"channelsActionsTooltip": "Kanal-Aktionen",
|
||||
"systemAiHeader": "SYSTEM-AI",
|
||||
"systemAiEnabled": "aktiv",
|
||||
"systemAiOff": "aus",
|
||||
"systemAiEdit": "Bearbeiten…",
|
||||
"systemAiConfigure": "Konfigurieren…",
|
||||
"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.",
|
||||
"mcpServersCount": "{n} {n, plural, =1{Server} other{Server}}",
|
||||
"@mcpServersCount": { "placeholders": { "n": { "type": "int" } } },
|
||||
"mcpRediscoverTooltip": "Discovery neu ausführen",
|
||||
"mcpAddTooltip": "MCP-Server hinzufügen",
|
||||
"mcpRemoveTooltip": "Server entfernen",
|
||||
"mcpToolsCount": "{n} Tools",
|
||||
"@mcpToolsCount": { "placeholders": { "n": { "type": "int" } } },
|
||||
"n8nEndpointsCount": "{n} {n, plural, =1{Endpunkt} other{Endpunkte}}",
|
||||
"@n8nEndpointsCount": { "placeholders": { "n": { "type": "int" } } },
|
||||
"n8nWorkflowsCount": "{n} Workflows",
|
||||
"@n8nWorkflowsCount": { "placeholders": { "n": { "type": "int" } } },
|
||||
"n8nRediscoverTooltip": "Discovery neu ausführen",
|
||||
"n8nAddTooltip": "n8n-Endpunkt hinzufügen",
|
||||
"n8nRemoveTooltip": "Endpunkt entfernen",
|
||||
"addMcpTitle": "MCP-Server hinzufügen",
|
||||
"addMcpIntro": "Tools, die der Server via `tools/list` anbietet, erscheinen im Store als `mcp.<name>.<tool>`-Capabilities.",
|
||||
"addMcpSuggestionsLabel": "Vorschläge — zum Vorausfüllen klicken",
|
||||
"addMcpNameLabel": "Name (keine Punkte)",
|
||||
"addMcpNameHint": "filesystem",
|
||||
"addMcpEndpointLabel": "Endpunkt",
|
||||
"addMcpEndpointHint": "http://127.0.0.1:3001/mcp",
|
||||
"addMcpApiKeyLabel": "API-Key-Umgebungsvariable (optional)",
|
||||
"addMcpApiKeyHint": "MCP_FILESYSTEM_TOKEN",
|
||||
"addMcpNotesLabel": "Notizen (optional)",
|
||||
"addMcpAddButton": "Hinzufügen + Discovery",
|
||||
"addN8nTitle": "n8n-Endpunkt hinzufügen",
|
||||
"addN8nIntro": "Aktive Workflows erscheinen im Store als `n8n.<name>.<workflow_slug>`-Capabilities.",
|
||||
"addN8nNameLabel": "Name (keine Punkte)",
|
||||
"addN8nNameHint": "ops",
|
||||
"addN8nBaseUrlLabel": "Basis-URL (ohne /api/v1)",
|
||||
"addN8nBaseUrlHint": "https://n8n.example.com",
|
||||
"addN8nApiKeyLabel": "API-Key-Umgebungsvariable (optional)",
|
||||
"addN8nApiKeyHint": "N8N_OPS_KEY",
|
||||
"addN8nNotesLabel": "Notizen (optional)",
|
||||
"addN8nAddButton": "Hinzufügen + Discovery",
|
||||
"addedMcpToast": "MCP-Server „{name}\" hinzugefügt.",
|
||||
"@addedMcpToast": { "placeholders": { "name": { "type": "String" } } },
|
||||
"addedN8nToast": "n8n-Endpunkt „{name}\" hinzugefügt.",
|
||||
"@addedN8nToast": { "placeholders": { "name": { "type": "String" } } },
|
||||
"addFailedToast": "Hinzufügen fehlgeschlagen: {error}",
|
||||
"@addFailedToast": { "placeholders": { "error": { "type": "String" } } },
|
||||
"removeFailedToast": "Entfernen fehlgeschlagen: {error}",
|
||||
"@removeFailedToast": { "placeholders": { "error": { "type": "String" } } },
|
||||
"refreshFailedToast": "Aktualisieren fehlgeschlagen: {error}",
|
||||
"@refreshFailedToast": { "placeholders": { "error": { "type": "String" } } },
|
||||
|
||||
"channelsHeader": "KANÄLE",
|
||||
"channelsActive": "aktiv",
|
||||
|
|
@ -68,6 +124,56 @@
|
|||
"auditTitle": "Protokoll",
|
||||
"auditNoEvents": "Noch keine Ereignisse",
|
||||
"auditNoEventsHint": "Starte einen Flow, um den Audit-Stream zu füllen.\nEreignisse erscheinen innerhalb von Sekunden.",
|
||||
"auditFilterAll": "alle",
|
||||
"auditFilterFlow": "Flow",
|
||||
"auditFilterStep": "Step",
|
||||
"auditFilterModule": "Modul",
|
||||
"auditClearLogTooltip": "Protokoll löschen (nur local/dev Kanal)",
|
||||
"auditClearedToast": "{n} Ereignisse auf Kanal „{channel}\" gelöscht. Chain mit Marker neu geseedet.",
|
||||
"@auditClearedToast": {
|
||||
"placeholders": {
|
||||
"n": { "type": "int" },
|
||||
"channel": { "type": "String" }
|
||||
}
|
||||
},
|
||||
"auditClearFailed": "Löschen fehlgeschlagen: {detail}",
|
||||
"@auditClearFailed": { "placeholders": { "detail": { "type": "String" } } },
|
||||
"auditExplain": "Erklären",
|
||||
"auditReask": "Neu fragen",
|
||||
"auditAsking": "Frage läuft…",
|
||||
"auditSystemAi": "SYSTEM-AI",
|
||||
"auditCachedPill": "gecacht",
|
||||
"auditOriginalLatency": "ursprünglich {ms} ms",
|
||||
"@auditOriginalLatency": { "placeholders": { "ms": { "type": "int" } } },
|
||||
"auditLatency": "{ms} ms",
|
||||
"@auditLatency": { "placeholders": { "ms": { "type": "int" } } },
|
||||
"auditRegenerateTooltip": "Neu generieren — Cache überspringen, Modell erneut fragen",
|
||||
"auditLiveStatus": "live · Abfrage alle 2s · {n} {n, plural, =1{Ereignis} other{Ereignisse}}",
|
||||
"@auditLiveStatus": { "placeholders": { "n": { "type": "int" } } },
|
||||
"auditDisconnected": "getrennt · {error}",
|
||||
"@auditDisconnected": { "placeholders": { "error": { "type": "String" } } },
|
||||
"auditHashChainVerified": "Hash-Chain verifiziert",
|
||||
"auditDetailHeader": "DETAIL",
|
||||
"auditAskingFull": "Frage an die konfigurierte System-AI läuft…",
|
||||
"auditFixLabel": "FIX",
|
||||
"auditCachedTooltipKnown": "Aus dem lokalen Cache geliefert. Ursprünglich erzeugt am {at}{hits}.",
|
||||
"@auditCachedTooltipKnown": {
|
||||
"placeholders": {
|
||||
"at": { "type": "String" },
|
||||
"hits": { "type": "String" }
|
||||
}
|
||||
},
|
||||
"auditCachedTooltipUnknown": "Aus dem lokalen Cache geliefert. Ursprünglicher Zeitpunkt unbekannt{hits}.",
|
||||
"@auditCachedTooltipUnknown": { "placeholders": { "hits": { "type": "String" } } },
|
||||
"auditCachedTooltipHits": " · {n} Treffer",
|
||||
"@auditCachedTooltipHits": { "placeholders": { "n": { "type": "int" } } },
|
||||
"auditConfigureSystemAi": "System-AI unter Einstellungen konfigurieren (Cmd+,)",
|
||||
"auditClearDialogTitle": "Audit-Log löschen?",
|
||||
"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.",
|
||||
"auditClearReviewerLabel": "Prüfer",
|
||||
"auditClearReasonLabel": "Begründung (im chain.reset-Marker festgehalten)",
|
||||
"auditClearReasonHelper": "Erforderlich — Auditoren werden das lesen.",
|
||||
"auditClearLogButton": "Log löschen",
|
||||
|
||||
"modulesTitle": "Module",
|
||||
"modulesNoneTitle": "Noch keine Module",
|
||||
|
|
@ -103,6 +209,44 @@
|
|||
"approvalsTabHistory": "Verlauf",
|
||||
"approvalsInboxZero": "Posteingang leer",
|
||||
"approvalsInboxHint": "Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.",
|
||||
"approvalsReloadTooltip": "Aktualisieren",
|
||||
"approvalsPillPending": "offen",
|
||||
"approvalsPillApproved": "freigegeben",
|
||||
"approvalsPillRejected": "abgelehnt",
|
||||
"approvalsPillExpired": "abgelaufen",
|
||||
"approvalsPayloadPreview": "PAYLOAD-VORSCHAU",
|
||||
"approvalsApproveButton": "Freigeben",
|
||||
"approvalsRejectButton": "Ablehnen",
|
||||
"approvalsRejectDialogTitle": "Freigabe ablehnen",
|
||||
"approvalsRejectReasonLabel": "Begründung (im Audit-Log festgehalten)",
|
||||
"approvalsApprovedToast": "freigegeben · {flow} › {step}",
|
||||
"@approvalsApprovedToast": {
|
||||
"placeholders": {
|
||||
"flow": { "type": "String" },
|
||||
"step": { "type": "String" }
|
||||
}
|
||||
},
|
||||
"approvalsRejectedToast": "abgelehnt · {flow} › {step}",
|
||||
"@approvalsRejectedToast": {
|
||||
"placeholders": {
|
||||
"flow": { "type": "String" },
|
||||
"step": { "type": "String" }
|
||||
}
|
||||
},
|
||||
"approvalsApproveFailed": "Freigabe fehlgeschlagen: {error}",
|
||||
"@approvalsApproveFailed": { "placeholders": { "error": { "type": "String" } } },
|
||||
"approvalsRejectFailed": "Ablehnung fehlgeschlagen: {error}",
|
||||
"@approvalsRejectFailed": { "placeholders": { "error": { "type": "String" } } },
|
||||
"approvalsHistoryEmpty": "Noch kein Verlauf",
|
||||
"approvalsHistoryEmptyHint": "Entschiedene Freigaben (freigegeben / abgelehnt / abgelaufen) erscheinen hier.\nDas Audit-Log enthält den vollständigen hash-chained Datensatz.",
|
||||
"approvalsDialogDecided": "entschieden",
|
||||
"approvalsDialogCreated": "erstellt",
|
||||
"approvalsDialogReason": "Begründung",
|
||||
"approvalsDialogPrompt": "PROMPT",
|
||||
"approvalsExpiresIn": "{minutes}m",
|
||||
"@approvalsExpiresIn": { "placeholders": { "minutes": { "type": "int" } } },
|
||||
"approvalsExpiresInHours": "{hours}h",
|
||||
"@approvalsExpiresInHours": { "placeholders": { "hours": { "type": "int" } } },
|
||||
|
||||
"doctorTitle": "Diagnose",
|
||||
"doctorRecheckTooltip": "Erneut prüfen",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue