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>
443 lines
10 KiB
Dart
443 lines
10 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for English (`en`).
|
|
class AppLocalizationsEn extends AppLocalizations {
|
|
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
|
|
|
@override
|
|
String get appTitle => 'F∆I Studio';
|
|
|
|
@override
|
|
String get navDoctor => 'Doctor';
|
|
|
|
@override
|
|
String get navModules => 'Modules';
|
|
|
|
@override
|
|
String get navStore => 'Store';
|
|
|
|
@override
|
|
String get navFlows => 'Flows';
|
|
|
|
@override
|
|
String get navAudit => 'Audit';
|
|
|
|
@override
|
|
String get navApprovals => 'Approvals';
|
|
|
|
@override
|
|
String get connectionConnected => 'connected';
|
|
|
|
@override
|
|
String get connectionUnreachable => 'unreachable';
|
|
|
|
@override
|
|
String get connectionConnecting => 'connecting…';
|
|
|
|
@override
|
|
String get connectionStartHub => 'Start hub';
|
|
|
|
@override
|
|
String get buttonCancel => 'Cancel';
|
|
|
|
@override
|
|
String get buttonSave => 'Save';
|
|
|
|
@override
|
|
String get buttonClose => 'Close';
|
|
|
|
@override
|
|
String get buttonRetry => 'Retry';
|
|
|
|
@override
|
|
String get buttonRefresh => 'Refresh';
|
|
|
|
@override
|
|
String get buttonInstall => 'Install';
|
|
|
|
@override
|
|
String get buttonUninstall => 'Uninstall';
|
|
|
|
@override
|
|
String get buttonDetails => 'Details';
|
|
|
|
@override
|
|
String get buttonAdd => 'Add';
|
|
|
|
@override
|
|
String get buttonRemove => 'Remove';
|
|
|
|
@override
|
|
String get buttonOpen => 'Open';
|
|
|
|
@override
|
|
String get buttonExplain => 'Explain';
|
|
|
|
@override
|
|
String get buttonReadDocs => 'Read docs';
|
|
|
|
@override
|
|
String get settingsTitle => 'Hub endpoint';
|
|
|
|
@override
|
|
String get settingsHost => 'Host';
|
|
|
|
@override
|
|
String get settingsPort => 'Port';
|
|
|
|
@override
|
|
String get settingsTls => 'TLS';
|
|
|
|
@override
|
|
String get settingsSaveAndConnect => 'Save & connect';
|
|
|
|
@override
|
|
String get settingsLanguage => 'Language';
|
|
|
|
@override
|
|
String get settingsLanguageHint =>
|
|
'App language. Affects every page; bilingual store entries also flip via this toggle.';
|
|
|
|
@override
|
|
String get channelsHeader => 'CHANNELS';
|
|
|
|
@override
|
|
String get channelsActive => 'active';
|
|
|
|
@override
|
|
String get channelsRunning => 'running';
|
|
|
|
@override
|
|
String get channelsStopped => 'stopped';
|
|
|
|
@override
|
|
String get channelsConnect => 'Connect Studio to this channel';
|
|
|
|
@override
|
|
String get channelsSwitch => 'Make this the active channel';
|
|
|
|
@override
|
|
String get channelsEnableAutostart => 'Enable autostart at login';
|
|
|
|
@override
|
|
String get channelsDisableAutostart => 'Disable autostart';
|
|
|
|
@override
|
|
String get storeSearchHint =>
|
|
'Search modules — name, tagline, tag, capability…';
|
|
|
|
@override
|
|
String get storeFeatured => 'FEATURED';
|
|
|
|
@override
|
|
String get storeFeaturedHint => 'curated picks · click for details';
|
|
|
|
@override
|
|
String get storeNoMatches => 'No matches';
|
|
|
|
@override
|
|
String get storeNoMatchesHint =>
|
|
'Adjust the filters or clear the search to see all entries.';
|
|
|
|
@override
|
|
String get storeClearFilters => 'Clear filters';
|
|
|
|
@override
|
|
String get storeStatusAll => 'All';
|
|
|
|
@override
|
|
String get storeStatusPublished => 'Published';
|
|
|
|
@override
|
|
String get storeStatusAlpha => 'Alpha';
|
|
|
|
@override
|
|
String get storeStatusPlanned => 'Planned';
|
|
|
|
@override
|
|
String get storeInstalledOnly => 'Installed';
|
|
|
|
@override
|
|
String storeNResults(int n) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
n,
|
|
locale: localeName,
|
|
other: 's',
|
|
one: '',
|
|
);
|
|
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';
|
|
|
|
@override
|
|
String get auditNoEvents => 'No events yet';
|
|
|
|
@override
|
|
String get auditNoEventsHint =>
|
|
'Run a flow to populate the audit stream.\nEvents appear here within seconds.';
|
|
|
|
@override
|
|
String get modulesTitle => 'Modules';
|
|
|
|
@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';
|
|
|
|
@override
|
|
String get approvalsTabPending => 'Pending';
|
|
|
|
@override
|
|
String get approvalsTabHistory => 'History';
|
|
|
|
@override
|
|
String get approvalsInboxZero => 'Inbox zero';
|
|
|
|
@override
|
|
String get approvalsInboxHint =>
|
|
'All caught up. New `system.approval@^0` steps land here automatically.';
|
|
|
|
@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';
|
|
|
|
@override
|
|
String get mcpHint =>
|
|
'External MCP servers federate their tools as `mcp.<server>.<tool>` capabilities. Configure once, see them in the Store.';
|
|
|
|
@override
|
|
String get mcpEmpty => 'No MCP servers configured. Click + to add one.';
|
|
|
|
@override
|
|
String get n8nHeader => 'N8N ENDPOINTS';
|
|
|
|
@override
|
|
String get n8nHint =>
|
|
'Active n8n workflows surface as `n8n.<endpoint>.<slug>` capabilities. Configure once, see them in the Store.';
|
|
|
|
@override
|
|
String get n8nEmpty => 'No n8n endpoints configured. Click + to add one.';
|
|
|
|
@override
|
|
String get hubUnreachable => 'Hub unreachable';
|
|
|
|
@override
|
|
String get hubUnreachableHint => 'Start the hub with `fai serve`.';
|
|
|
|
@override
|
|
String get languageEnglish => 'English';
|
|
|
|
@override
|
|
String get languageGerman => 'Deutsch';
|
|
}
|