feat(studio): Doctor + Modules localized + sparse-store federation nudge (v0.25.0)
Two threads.
Translation expansion: every visible string on the Doctor
page (section headers, status text, button labels, daemon-
control card, daemon-files panel, update banner) and the
Modules page (recent-activity strip, capabilities label,
uninstall dialog + toast) flips between DE and EN with the
sidebar toggle. Adds ~50 ARB keys split between
`app_en.arb` / `app_de.arb`. Pluralised + parametrised
strings (`{n} events verified`, `Running on {name}: {endpoint}`)
use the standard ICU placeholder syntax so future locales
slot in without code changes.
Sparse-store federation nudge: the Store page renders an
inline banner above the grid when the operator has zero
federated entries — single biggest store-fullness lever is
configuring an MCP server / n8n endpoint, so the banner
says exactly that and the button opens Settings straight
to the editor. Banner dismisses automatically the next
render after a federated entry appears.
Coverage stand for translation: Doctor + Modules + sidebar
+ page titles + nav + Cmd+K labels are bilingual. Settings
dialog, Approvals cards, Audit drilldown, MCP/n8n editors,
Store search hint + filter chips remain English-literal.
The infrastructure (ARB plumbing, generator hookup,
locale-notifier) means each follow-up surface is a
one-line ARB edit + one call-site swap.
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
parent
ee83eb851a
commit
349619d68e
11 changed files with 1091 additions and 80 deletions
|
|
@ -172,6 +172,16 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
return '$n result$_temp0';
|
||||
}
|
||||
|
||||
@override
|
||||
String get storeFederationNudgeTitle => 'Want more capabilities?';
|
||||
|
||||
@override
|
||||
String get storeFederationNudgeBody =>
|
||||
'Configure an MCP server or n8n endpoint in Settings → MCP Clients / N8N Endpoints. Discovered tools and workflows surface here as `mcp.<server>.<tool>` and `n8n.<endpoint>.<workflow>` capabilities — every Anthropic / community MCP server adds a handful at once.';
|
||||
|
||||
@override
|
||||
String get storeFederationNudgeButton => 'Open Settings';
|
||||
|
||||
@override
|
||||
String get auditTitle => 'Audit';
|
||||
|
||||
|
|
@ -188,9 +198,51 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
@override
|
||||
String get modulesNoneTitle => 'No modules yet';
|
||||
|
||||
@override
|
||||
String get modulesNoneHint =>
|
||||
'Run `fai install <capability-name>` or check ~/.fai/modules/.';
|
||||
|
||||
@override
|
||||
String get modulesReloadTooltip => 'Reload';
|
||||
|
||||
@override
|
||||
String get modulesRecentActivity => 'RECENT ACTIVITY';
|
||||
|
||||
@override
|
||||
String modulesRecentActivityHint(int n) {
|
||||
return 'last $n install/uninstall events from the audit log';
|
||||
}
|
||||
|
||||
@override
|
||||
String get modulesActivityInstalled => 'installed';
|
||||
|
||||
@override
|
||||
String get modulesActivityUninstalled => 'uninstalled';
|
||||
|
||||
@override
|
||||
String get modulesCapabilitiesLabel => 'Capabilities';
|
||||
|
||||
@override
|
||||
String get modulesUninstallTitle => 'Uninstall module?';
|
||||
|
||||
@override
|
||||
String modulesUninstallBody(String name, String version) {
|
||||
return 'Removes $name v$version from this hub. Flows that reference it will fail at the next run. A `module.uninstalled` audit event is recorded.';
|
||||
}
|
||||
|
||||
@override
|
||||
String modulesUninstalledToast(String name, String version) {
|
||||
return 'Uninstalled $name v$version.';
|
||||
}
|
||||
|
||||
@override
|
||||
String modulesUninstallFailed(String error) {
|
||||
return 'Uninstall failed: $error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get modulesUninstalling => 'Uninstalling…';
|
||||
|
||||
@override
|
||||
String get approvalsTitle => 'Approvals';
|
||||
|
||||
|
|
@ -210,6 +262,153 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||
@override
|
||||
String get doctorTitle => 'Doctor';
|
||||
|
||||
@override
|
||||
String get doctorRecheckTooltip => 'Re-check';
|
||||
|
||||
@override
|
||||
String get doctorEventLogSection => 'Event log';
|
||||
|
||||
@override
|
||||
String get doctorModulesApprovalsSection => 'Modules & approvals';
|
||||
|
||||
@override
|
||||
String get doctorHostServicesSection => 'Host services';
|
||||
|
||||
@override
|
||||
String get doctorDaemonFilesSection => 'Daemon files';
|
||||
|
||||
@override
|
||||
String get doctorDaemonControlSection => 'Daemon control';
|
||||
|
||||
@override
|
||||
String get doctorChainIntact => 'Hash chain intact';
|
||||
|
||||
@override
|
||||
String doctorChainIntactDetail(int n) {
|
||||
return '$n events · prev_event_sha256 verified end-to-end';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doctorChainTampered => 'Tampering detected';
|
||||
|
||||
@override
|
||||
String doctorChainTamperedDetail(int verified, int total, String id) {
|
||||
return '$verified of $total verified before mismatch at $id';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doctorChainPillOk => 'WORM-1';
|
||||
|
||||
@override
|
||||
String get doctorChainPillTamper => 'TAMPER';
|
||||
|
||||
@override
|
||||
String get doctorVerifyNow => 'Verify now';
|
||||
|
||||
@override
|
||||
String get doctorRestart => 'Restart';
|
||||
|
||||
@override
|
||||
String get doctorStart => 'Start';
|
||||
|
||||
@override
|
||||
String get doctorStop => 'Stop';
|
||||
|
||||
@override
|
||||
String get doctorStatusAction => 'Status';
|
||||
|
||||
@override
|
||||
String doctorRunningOn(String name, String endpoint) {
|
||||
return 'Running on $name: $endpoint';
|
||||
}
|
||||
|
||||
@override
|
||||
String doctorStoppedOn(String name) {
|
||||
return '$name daemon stopped';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doctorStatusUnknown => 'Daemon status: …';
|
||||
|
||||
@override
|
||||
String get doctorPillRunning => 'running';
|
||||
|
||||
@override
|
||||
String get doctorPillStopped => 'stopped';
|
||||
|
||||
@override
|
||||
String get doctorDaemonControlHint =>
|
||||
'Studio shells out to the platform binary — mirrors `fai daemon …` exactly so the CLI and UI stay in lockstep.';
|
||||
|
||||
@override
|
||||
String get doctorDaemonControlWorking => 'Working…';
|
||||
|
||||
@override
|
||||
String get doctorPathLog => 'Log';
|
||||
|
||||
@override
|
||||
String get doctorPathConfig => 'Config';
|
||||
|
||||
@override
|
||||
String get doctorPathDb => 'Audit DB';
|
||||
|
||||
@override
|
||||
String get doctorPathModules => 'Modules dir';
|
||||
|
||||
@override
|
||||
String get doctorPathFlows => 'Flows dir';
|
||||
|
||||
@override
|
||||
String get doctorPathPid => 'PID file';
|
||||
|
||||
@override
|
||||
String get doctorPathsEmpty =>
|
||||
'Daemon did not report file paths. Update the running hub via `fai daemon restart`.';
|
||||
|
||||
@override
|
||||
String doctorOpenError(String detail) {
|
||||
return 'Could not open: $detail';
|
||||
}
|
||||
|
||||
@override
|
||||
String doctorUpdateAvailable(String version) {
|
||||
return 'Update available — $version';
|
||||
}
|
||||
|
||||
@override
|
||||
String doctorUpdateBody(String channel, String version) {
|
||||
return 'Channel $channel now offers $version. Apply via the button — Studio shells out to `fai update apply --channel $channel`.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doctorUpdateUnreachable => 'Release host unreachable';
|
||||
|
||||
@override
|
||||
String doctorUpdateUnreachableBody(String channel) {
|
||||
return 'Could not contact the release feed for $channel.';
|
||||
}
|
||||
|
||||
@override
|
||||
String doctorReleaseNotes(String url) {
|
||||
return 'notes: $url';
|
||||
}
|
||||
|
||||
@override
|
||||
String get doctorPillNew => 'new';
|
||||
|
||||
@override
|
||||
String get doctorPillOffline => 'offline';
|
||||
|
||||
@override
|
||||
String get doctorApplyUpdate => 'Apply update';
|
||||
|
||||
@override
|
||||
String get doctorApplying => 'Applying…';
|
||||
|
||||
@override
|
||||
String get doctorApplyDone =>
|
||||
'Update applied. Restart Studio to see the new daemon version.';
|
||||
|
||||
@override
|
||||
String get mcpHeader => 'MCP CLIENTS';
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue