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).
79 lines
3.0 KiB
JSON
79 lines
3.0 KiB
JSON
{
|
|
"eyebrow": "Exploitation / Aperçu en direct",
|
|
"greeting": {
|
|
"morning": "Bonjour",
|
|
"afternoon": "Bonjour",
|
|
"evening": "Bonsoir",
|
|
"night": "Bon retour"
|
|
},
|
|
"greetingBody": {
|
|
"morning": "Voici l'état de votre flotte pour aujourd'hui.",
|
|
"afternoon": "Voici l'aperçu actuel de votre flotte.",
|
|
"evening": "Voici l'aperçu de votre flotte pour ce soir.",
|
|
"night": "Voici le dernier aperçu de votre flotte."
|
|
},
|
|
"description": "Disponibilité, exceptions et transferts de l'activité en cours.",
|
|
"viewFleet": "Voir la flotte",
|
|
"demoStart": {
|
|
"title": "Essayer un scénario de démonstration",
|
|
"readyCount": "{{ready}} scénarios sur {{total}} prêts pour la démo.",
|
|
"readyCountFallback": "Cinq scénarios ciblés.",
|
|
"startGuide": "Démarrer le guide de démo",
|
|
"resumeGuide": "Poursuivre le guide de démo ({{current}}/{{total}})",
|
|
"viewScenarios": "Voir les scénarios"
|
|
},
|
|
"readiness": {
|
|
"title": "Disponibilité de la flotte",
|
|
"description": "En direct depuis l'état persistant des véhicules",
|
|
"openFleet": "Ouvrir la flotte",
|
|
"available": "Disponible",
|
|
"rented": "Loué",
|
|
"cleaning": "Nettoyage",
|
|
"maintenance": "Entretien",
|
|
"blocked": "Bloqué"
|
|
},
|
|
"attention": {
|
|
"title": "File d'attention",
|
|
"description": "{{openIssues}} problèmes de qualité ouverts · {{workflowExceptions}} exceptions de workflow",
|
|
"reviewQueue": "Examiner la file",
|
|
"filterPlaceholder": "Filtrer les problèmes…",
|
|
"filterAriaLabel": "Rechercher dans la file d'attention",
|
|
"severityAll": "Toute gravité",
|
|
"severityHigh": "Critique",
|
|
"severityMedium": "Avertissement",
|
|
"severityLow": "Info",
|
|
"severityAriaLabel": "Gravité",
|
|
"empty": "Aucun problème ne correspond à ce filtre.",
|
|
"openRecord": "Ouvrir {{title}}"
|
|
},
|
|
"movements": {
|
|
"title": "Mouvements du jour",
|
|
"description": "Départs et retours en Europe/Bruxelles",
|
|
"allBookings": "Toutes les réservations",
|
|
"empty": "Aucun mouvement prévu aujourd'hui.",
|
|
"departure": "départ",
|
|
"return": "retour",
|
|
"openBooking": "Ouvrir la réservation {{ref}}"
|
|
},
|
|
"integrationPulse": {
|
|
"title": "État des intégrations",
|
|
"description": "Preuves actuelles des services connectés",
|
|
"systemDetail": "Détail du système",
|
|
"n8nTitle": "Livraison n8n",
|
|
"n8nSummary": "{{succeeded}} réussies · {{failed}} échouées",
|
|
"n8nLatest": "Dernier événement {{ref}}",
|
|
"n8nNoEvidence": "Aucune preuve d'automatisation enregistrée",
|
|
"knowledgeTitle": "Assistant de connaissances",
|
|
"knowledgeSummary": "{{count}} procédures indexées",
|
|
"knowledgeUnavailable": "Vérification de santé indisponible",
|
|
"mcpTitle": "MCP Hub",
|
|
"mcpEnabled": "Enregistrement activé",
|
|
"mcpNotConnected": "Pas encore connecté"
|
|
},
|
|
"recent": {
|
|
"title": "Activité récente",
|
|
"description": "Derniers changements de workflow audités",
|
|
"empty": "Aucune activité d'automatisation enregistrée."
|
|
}
|
|
}
|