{ "@@locale": "en", "appTitle": "F∆I Studio", "@appTitle": { "description": "App-bar title in the OS task switcher." }, "navDoctor": "Doctor", "navModules": "Modules", "navStore": "Store", "navFlows": "Flows", "navAudit": "Audit", "navApprovals": "Approvals", "connectionConnected": "connected", "connectionUnreachable": "unreachable", "connectionConnecting": "connecting…", "connectionStartHub": "Start hub", "buttonCancel": "Cancel", "buttonSave": "Save", "buttonClose": "Close", "buttonRetry": "Retry", "buttonRefresh": "Refresh", "buttonInstall": "Install", "buttonUninstall": "Uninstall", "buttonDetails": "Details", "buttonAdd": "Add", "buttonRemove": "Remove", "buttonOpen": "Open", "buttonExplain": "Explain", "buttonReadDocs": "Read docs", "settingsTitle": "Hub endpoint", "settingsHost": "Host", "settingsPort": "Port", "settingsTls": "TLS", "settingsSaveAndConnect": "Save & connect", "settingsLanguage": "Language", "settingsLanguageHint": "App language. Affects every page; bilingual store entries also flip via this toggle.", "settingsHubEndpointHint": "Where should Studio connect? Default is the local hub at 127.0.0.1:50051.", "settingsTlsSubtitle": "https/grpc-secure", "settingsPortError": "port must be 1–65535", "channelsBlurb": "Switch hub channel (writes ~/.fai/current-channel and restarts the daemon). Connect just changes Studio's wire.", "channelsActionsTooltip": "Channel actions", "systemAiHeader": "SYSTEM AI", "systemAiEnabled": "enabled", "systemAiOff": "off", "systemAiEdit": "Edit…", "systemAiConfigure": "Configure…", "systemAiOffBlurb": "Off — failure explanations on the audit page are disabled. Click Configure… to pick a provider (Ollama / OpenAI / LM Studio / vLLM / Custom). Operator config is rewritten in place; no daemon restart needed.", "mcpServersCount": "{n} {n, plural, =1{server} other{servers}}", "@mcpServersCount": { "placeholders": { "n": { "type": "int" } } }, "mcpRediscoverTooltip": "Re-run discovery", "mcpAddTooltip": "Add MCP server", "mcpRemoveTooltip": "Remove server", "mcpToolsCount": "{n} {n, plural, =1{tool} other{tools}}", "@mcpToolsCount": { "placeholders": { "n": { "type": "int" } } }, "n8nEndpointsCount": "{n} {n, plural, =1{endpoint} other{endpoints}}", "@n8nEndpointsCount": { "placeholders": { "n": { "type": "int" } } }, "n8nWorkflowsCount": "{n} {n, plural, =1{workflow} other{workflows}}", "@n8nWorkflowsCount": { "placeholders": { "n": { "type": "int" } } }, "n8nRediscoverTooltip": "Re-run discovery", "n8nAddTooltip": "Add n8n endpoint", "n8nRemoveTooltip": "Remove endpoint", "addMcpTitle": "Add MCP server", "addMcpIntro": "Tools the server advertises via `tools/list` appear in the Store as `mcp..` capabilities.", "addMcpSuggestionsLabel": "Suggested servers — click to pre-fill", "addMcpNameLabel": "Name (no dots)", "addMcpNameHint": "filesystem", "addMcpEndpointLabel": "Endpoint", "addMcpEndpointHint": "http://127.0.0.1:3001/mcp", "addMcpApiKeyLabel": "API key env var (optional)", "addMcpApiKeyHint": "MCP_FILESYSTEM_TOKEN", "addMcpNotesLabel": "Notes (optional)", "addMcpAddButton": "Add + discover", "addN8nTitle": "Add n8n endpoint", "addN8nIntro": "Active workflows surface in the Store as `n8n..` capabilities.", "addN8nNameLabel": "Name (no dots)", "addN8nNameHint": "ops", "addN8nBaseUrlLabel": "Base URL (without /api/v1)", "addN8nBaseUrlHint": "https://n8n.example.com", "addN8nApiKeyLabel": "API key env var (optional)", "addN8nApiKeyHint": "N8N_OPS_KEY", "addN8nNotesLabel": "Notes (optional)", "addN8nAddButton": "Add + discover", "addedMcpToast": "Added MCP server \"{name}\".", "@addedMcpToast": { "placeholders": { "name": { "type": "String" } } }, "addedN8nToast": "Added n8n endpoint \"{name}\".", "@addedN8nToast": { "placeholders": { "name": { "type": "String" } } }, "addFailedToast": "Add failed: {error}", "@addFailedToast": { "placeholders": { "error": { "type": "String" } } }, "removeFailedToast": "Remove failed: {error}", "@removeFailedToast": { "placeholders": { "error": { "type": "String" } } }, "refreshFailedToast": "Refresh failed: {error}", "@refreshFailedToast": { "placeholders": { "error": { "type": "String" } } }, "channelsHeader": "CHANNELS", "channelsActive": "active", "channelsRunning": "running", "channelsStopped": "stopped", "channelsConnect": "Connect Studio to this channel", "channelsSwitch": "Make this the active channel", "channelsEnableAutostart": "Enable autostart at login", "channelsDisableAutostart": "Disable autostart", "storeSearchHint": "Search modules — name, tagline, tag, capability…", "storeFeatured": "FEATURED", "storeFeaturedHint": "curated picks · click for details", "storeNoMatches": "No matches", "storeNoMatchesHint": "Adjust the filters or clear the search to see all entries.", "storeClearFilters": "Clear filters", "storeStatusAll": "All", "storeStatusPublished": "Published", "storeStatusAlpha": "Alpha", "storeStatusPlanned": "Planned", "storeInstalledOnly": "Installed", "storeNResults": "{n} result{n, plural, =1{} other{s}}", "@storeNResults": { "placeholders": { "n": { "type": "int" } } }, "storeFederationNudgeTitle": "Want more capabilities?", "storeFederationNudgeBody": "Configure an MCP server or n8n endpoint in Settings → MCP Clients / N8N Endpoints. Discovered tools and workflows surface here as `mcp..` and `n8n..` capabilities — every Anthropic / community MCP server adds a handful at once.", "storeFederationNudgeButton": "Open Settings", "auditTitle": "Audit", "auditNoEvents": "No events yet", "auditNoEventsHint": "Run a flow to populate the audit stream.\nEvents appear here within seconds.", "auditFilterAll": "all", "auditFilterFlow": "flow", "auditFilterStep": "step", "auditFilterModule": "module", "auditClearLogTooltip": "Clear log (local/dev channels only)", "auditClearedToast": "Cleared {n} events on channel \"{channel}\". Chain reseeded with marker.", "@auditClearedToast": { "placeholders": { "n": { "type": "int" }, "channel": { "type": "String" } } }, "auditClearFailed": "Clear failed: {detail}", "@auditClearFailed": { "placeholders": { "detail": { "type": "String" } } }, "auditExplain": "Explain", "auditReask": "Re-ask", "auditAsking": "Asking…", "auditSystemAi": "SYSTEM AI", "auditCachedPill": "cached", "auditOriginalLatency": "orig {ms} ms", "@auditOriginalLatency": { "placeholders": { "ms": { "type": "int" } } }, "auditLatency": "{ms} ms", "@auditLatency": { "placeholders": { "ms": { "type": "int" } } }, "auditRegenerateTooltip": "Regenerate — skip cache, ask the model again", "auditLiveStatus": "live · polling 2s · {n} {n, plural, =1{event} other{events}}", "@auditLiveStatus": { "placeholders": { "n": { "type": "int" } } }, "auditDisconnected": "disconnected · {error}", "@auditDisconnected": { "placeholders": { "error": { "type": "String" } } }, "auditHashChainVerified": "hash chain verified", "auditDetailHeader": "DETAIL", "auditAskingFull": "Asking the configured System AI…", "auditFixLabel": "FIX", "auditCachedTooltipKnown": "Served from the local cache. Originally generated on {at}{hits}.", "@auditCachedTooltipKnown": { "placeholders": { "at": { "type": "String" }, "hits": { "type": "String" } } }, "auditCachedTooltipUnknown": "Served from the local cache. Originally generated at unknown time{hits}.", "@auditCachedTooltipUnknown": { "placeholders": { "hits": { "type": "String" } } }, "auditCachedTooltipHits": " · {n} hits", "@auditCachedTooltipHits": { "placeholders": { "n": { "type": "int" } } }, "auditConfigureSystemAi": "Configure System AI in Settings (Cmd+,)", "auditClearDialogTitle": "Clear audit log?", "auditClearDialogBody": "Wipes every audit event on the active channel and seeds a fresh chain.reset marker carrying reviewer + reason. Refused on beta / production. Irreversible.", "auditClearReviewerLabel": "Reviewer", "auditClearReasonLabel": "Reason (recorded in chain.reset marker)", "auditClearReasonHelper": "Required — auditors will read this.", "auditClearLogButton": "Clear log", "modulesTitle": "Modules", "modulesNoneTitle": "No modules yet", "modulesNoneHint": "Run `fai install ` or check ~/.fai/modules/.", "modulesReloadTooltip": "Reload", "modulesRecentActivity": "RECENT ACTIVITY", "modulesRecentActivityHint": "last {n} install/uninstall events from the audit log", "@modulesRecentActivityHint": { "placeholders": { "n": { "type": "int" } } }, "modulesActivityInstalled": "installed", "modulesActivityUninstalled": "uninstalled", "modulesCapabilitiesLabel": "Capabilities", "modulesUninstallTitle": "Uninstall module?", "modulesUninstallBody": "Removes {name} v{version} from this hub. Flows that reference it will fail at the next run. A `module.uninstalled` audit event is recorded.", "@modulesUninstallBody": { "placeholders": { "name": { "type": "String" }, "version": { "type": "String" } } }, "modulesUninstalledToast": "Uninstalled {name} v{version}.", "@modulesUninstalledToast": { "placeholders": { "name": { "type": "String" }, "version": { "type": "String" } } }, "modulesUninstallFailed": "Uninstall failed: {error}", "@modulesUninstallFailed": { "placeholders": { "error": { "type": "String" } } }, "modulesUninstalling": "Uninstalling…", "approvalsTitle": "Approvals", "approvalsTabPending": "Pending", "approvalsTabHistory": "History", "approvalsInboxZero": "Inbox zero", "approvalsInboxHint": "All caught up. New `system.approval@^0` steps land here automatically.", "approvalsReloadTooltip": "Reload", "approvalsPillPending": "pending", "approvalsPillApproved": "approved", "approvalsPillRejected": "rejected", "approvalsPillExpired": "expired", "approvalsPayloadPreview": "PAYLOAD PREVIEW", "approvalsApproveButton": "Approve", "approvalsRejectButton": "Reject", "approvalsRejectDialogTitle": "Reject approval", "approvalsRejectReasonLabel": "Reason (recorded in audit log)", "approvalsApprovedToast": "approved · {flow} › {step}", "@approvalsApprovedToast": { "placeholders": { "flow": { "type": "String" }, "step": { "type": "String" } } }, "approvalsRejectedToast": "rejected · {flow} › {step}", "@approvalsRejectedToast": { "placeholders": { "flow": { "type": "String" }, "step": { "type": "String" } } }, "approvalsApproveFailed": "approve failed: {error}", "@approvalsApproveFailed": { "placeholders": { "error": { "type": "String" } } }, "approvalsRejectFailed": "reject failed: {error}", "@approvalsRejectFailed": { "placeholders": { "error": { "type": "String" } } }, "approvalsHistoryEmpty": "No history yet", "approvalsHistoryEmptyHint": "Decided approvals (approved / rejected / expired) appear here.\nThe audit log keeps the full hash-chained record.", "approvalsDialogDecided": "decided", "approvalsDialogCreated": "created", "approvalsDialogReason": "reason", "approvalsDialogPrompt": "PROMPT", "approvalsExpiresIn": "{minutes}m", "@approvalsExpiresIn": { "placeholders": { "minutes": { "type": "int" } } }, "approvalsExpiresInHours": "{hours}h", "@approvalsExpiresInHours": { "placeholders": { "hours": { "type": "int" } } }, "doctorTitle": "Doctor", "doctorRecheckTooltip": "Re-check", "doctorEventLogSection": "Event log", "doctorModulesApprovalsSection": "Modules & approvals", "doctorHostServicesSection": "Host services", "doctorDaemonFilesSection": "Daemon files", "doctorDaemonControlSection": "Daemon control", "doctorChainIntact": "Hash chain intact", "doctorChainIntactDetail": "{n} events · prev_event_sha256 verified end-to-end", "@doctorChainIntactDetail": { "placeholders": { "n": { "type": "int" } } }, "doctorChainTampered": "Tampering detected", "doctorChainTamperedDetail": "{verified} of {total} verified before mismatch at {id}", "@doctorChainTamperedDetail": { "placeholders": { "verified": { "type": "int" }, "total": { "type": "int" }, "id": { "type": "String" } } }, "doctorChainPillOk": "WORM-1", "doctorChainPillTamper": "TAMPER", "doctorVerifyNow": "Verify now", "doctorRestart": "Restart", "doctorStart": "Start", "doctorStop": "Stop", "doctorStatusAction": "Status", "doctorRunningOn": "Running on {name}: {endpoint}", "@doctorRunningOn": { "placeholders": { "name": { "type": "String" }, "endpoint": { "type": "String" } } }, "doctorStoppedOn": "{name} daemon stopped", "@doctorStoppedOn": { "placeholders": { "name": { "type": "String" } } }, "doctorStatusUnknown": "Daemon status: …", "doctorPillRunning": "running", "doctorPillStopped": "stopped", "doctorDaemonControlHint": "Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.", "doctorDaemonControlWorking": "Working…", "doctorPathLog": "Log", "doctorPathConfig": "Config", "doctorPathDb": "Audit DB", "doctorPathModules": "Modules dir", "doctorPathFlows": "Flows dir", "doctorPathPid": "PID file", "doctorPathsEmpty": "Daemon did not report file paths. Update the running hub via `fai daemon restart`.", "doctorOpenError": "Could not open: {detail}", "@doctorOpenError": { "placeholders": { "detail": { "type": "String" } } }, "doctorUpdateAvailable": "Update available — {version}", "@doctorUpdateAvailable": { "placeholders": { "version": { "type": "String" } } }, "doctorUpdateBody": "Channel {channel} now offers {version}. Apply via the button — Studio shells out to `fai update apply --channel {channel}`.", "@doctorUpdateBody": { "placeholders": { "channel": { "type": "String" }, "version": { "type": "String" } } }, "doctorUpdateUnreachable": "Release host unreachable", "doctorUpdateUnreachableBody": "Could not contact the release feed for {channel}.", "@doctorUpdateUnreachableBody": { "placeholders": { "channel": { "type": "String" } } }, "doctorReleaseNotes": "notes: {url}", "@doctorReleaseNotes": { "placeholders": { "url": { "type": "String" } } }, "doctorPillNew": "new", "doctorPillOffline": "offline", "doctorApplyUpdate": "Apply update", "doctorApplying": "Applying…", "doctorApplyDone": "Update applied. Restart Studio to see the new daemon version.", "mcpHeader": "MCP CLIENTS", "mcpHint": "External MCP servers federate their tools as `mcp..` capabilities. Configure once, see them in the Store.", "mcpEmpty": "No MCP servers configured. Click + to add one.", "n8nHeader": "N8N ENDPOINTS", "n8nHint": "Active n8n workflows surface as `n8n..` capabilities. Configure once, see them in the Store.", "n8nEmpty": "No n8n endpoints configured. Click + to add one.", "hubUnreachable": "Hub unreachable", "hubUnreachableHint": "Start the hub with `fai serve`.", "languageEnglish": "English", "languageGerman": "Deutsch" }