Files
MobilityOps/frontend/src/i18n/locales/en-GB/dashboard.json
T
NuklearRabbit e427313bce feat: add time-dependent Europe/Brussels dashboard greeting
The dashboard greeting was a fully static "Goedemorgen..." regardless of
actual time of day. New frontend/src/i18n/greeting.ts::getGreetingPeriod
is a pure, clock-injectable function resolving one of 4 periods (05:00-
11:59 morning, 12:00-17:59 afternoon, 18:00-22:59 evening, 23:00-04:59
night) against Europe/Brussels wall-clock time via
Intl.DateTimeFormat({ timeZone, hourCycle: "h23" }), which is DST-safe
by construction.

useGreetingPeriod.ts wires this into React with a 30s poll so the
greeting rolls over live while the app stays open, no reload required.
Each period now has its own greeting word and accompanying sentence in
all 3 languages (dashboard.json), replacing both the fixed "Goedemorgen"
and the fixed "Here's the fleet" follow-up sentence. Night never says
"Goedenacht" (used as a farewell, not a welcome, in Dutch).
2026-08-04 03:08:45 +02:00

79 lines
2.7 KiB
JSON

{
"eyebrow": "Operations / Live overview",
"greeting": {
"morning": "Good morning",
"afternoon": "Good afternoon",
"evening": "Good evening",
"night": "Welcome back"
},
"greetingBody": {
"morning": "Here's today's fleet status.",
"afternoon": "Here's the current overview of your fleet.",
"evening": "Here's this evening's fleet overview.",
"night": "Here's the latest overview of your fleet."
},
"description": "Readiness, exceptions and hand-offs across today's operation.",
"viewFleet": "View fleet",
"demoStart": {
"title": "Try a demonstration scenario",
"readyCount": "{{ready}} of {{total}} scenarios ready for demo.",
"readyCountFallback": "Five focused scenarios.",
"startGuide": "Start demo guide",
"resumeGuide": "Continue demo guide ({{current}}/{{total}})",
"viewScenarios": "View scenarios"
},
"readiness": {
"title": "Fleet readiness",
"description": "Live from persisted vehicle state",
"openFleet": "Open fleet",
"available": "Available",
"rented": "Rented",
"cleaning": "Cleaning",
"maintenance": "Maintenance",
"blocked": "Blocked"
},
"attention": {
"title": "Attention queue",
"description": "{{openIssues}} open quality issues · {{workflowExceptions}} workflow exceptions",
"reviewQueue": "Review queue",
"filterPlaceholder": "Filter issues…",
"filterAriaLabel": "Search attention queue",
"severityAll": "All severity",
"severityHigh": "Critical",
"severityMedium": "Warning",
"severityLow": "Info",
"severityAriaLabel": "Severity",
"empty": "No issues match this filter.",
"openRecord": "Open {{title}}"
},
"movements": {
"title": "Today's movements",
"description": "Departures and returns in Europe/Brussels",
"allBookings": "All bookings",
"empty": "No movements scheduled today.",
"departure": "departure",
"return": "return",
"openBooking": "Open booking {{ref}}"
},
"integrationPulse": {
"title": "Integration pulse",
"description": "Current evidence from connected services",
"systemDetail": "System detail",
"n8nTitle": "n8n delivery",
"n8nSummary": "{{succeeded}} succeeded · {{failed}} failed",
"n8nLatest": "Latest event {{ref}}",
"n8nNoEvidence": "No workflow evidence recorded",
"knowledgeTitle": "Knowledge assistant",
"knowledgeSummary": "{{count}} procedures indexed",
"knowledgeUnavailable": "Health check unavailable",
"mcpTitle": "MCP Hub",
"mcpEnabled": "Registration enabled",
"mcpNotConnected": "Not yet connected"
},
"recent": {
"title": "Recent activity",
"description": "Latest audited workflow changes",
"empty": "No automation activity recorded."
}
}