polish: rebrand to Fleet Ops, add trilingual i18n, adaptive demo guide, and UX overhaul
Rebrands the product from MobilityOps to Fleet Ops across the UI, backend defaults and knowledge base, and makes nl-BE/en-GB/fr-BE full first-class languages: i18next with eager-bundled per-namespace resources, a persisted accessible language switcher (topbar and mobile drawer), locale-aware date/number formatting, and a coverage test that fails the build on any missing or empty translation key. Backend dynamic content (demo scenarios, blocked-reason text, integration status) moves from fixed English/Dutch prose to stable message codes + params so the frontend can localize it; the demo knowledge base gains a fully translated NL/EN/FR procedure corpus (11 documents each) with per-language retrieval and localized evidence-state messages. The Demo Guide becomes breakpoint-adaptive: a docked rail on extra-wide desktop, a floating panel that auto-collapses to a persistent, closable progress chip on standard desktop/tablet, and a collapsed/half/full bottom sheet on mobile -- with scroll+focus+ highlight on "go to this step", Escape handling, and reduced-motion support. The Data Quality Workbench gets accessible choice-card decisions with a clear primary/ secondary/tertiary action hierarchy; the Automation ledger groups repeated successes and uses meaningful short refs; the Audit trail groups events by correlation id with human action labels and readable before/after diffs. Attention Queue, Today's movements, Vehicles, Bookings and Data Quality rows are fully clickable (stretched-link pattern) with independent secondary links, keyboard support and mobile touch targets. Fixes a topbar overflow on mobile caused by the new language switcher (moved into the mobile drawer at <=960px) and two dangling aria-labelledby references introduced this session. Updates all affected Playwright specs for the new nl-BE default and the new Audit/DemoGuide DOM structure, and adds new i18n-coverage, demo-guide-adaptive and clickable-rows specs. 131 backend tests, Ruff and mypy, and 71 Playwright tests pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
257a4cf6c0
commit
337f8716bb
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"openRow": "Openen: {{label}}",
|
||||
"reducedMotion": "Beperkte beweging actief",
|
||||
"closeDialog": "Dialoogvenster sluiten",
|
||||
"expandSection": "Sectie uitklappen",
|
||||
"collapseSection": "Sectie inklappen"
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"eyebrow": "Bewaken / Onveranderlijke geschiedenis",
|
||||
"title": "Audit trail",
|
||||
"description": "Volg belangrijke statuswijzigingen, actoren en gekoppelde gebeurtenissen op.",
|
||||
"actionFilterLabel": "Actie",
|
||||
"actionFilterPlaceholder": "bv. demo-login",
|
||||
"managerOnly": "De audit trail is enkel zichtbaar voor Operations Managers.",
|
||||
"managerOnlyDetail": "Auditgeschiedenis is enkel zichtbaar voor Operations Managers.",
|
||||
"loading": "Audit trail laden…",
|
||||
"unavailable": "Audit trail is momenteel niet beschikbaar.",
|
||||
"empty": "Geen auditgebeurtenissen gevonden",
|
||||
"emptyDetail": "Pas het actiefilter aan.",
|
||||
"relatedFilterActive": "Enkel gebeurtenissen gekoppeld aan deze actie ({{count}} gerelateerde gebeurtenissen).",
|
||||
"clearFilter": "Filter wissen",
|
||||
"count": "{{count}} gebeurtenissen",
|
||||
"storedRendered": "UTC opgeslagen · Brussel weergegeven",
|
||||
"columns": {
|
||||
"when": "Wanneer",
|
||||
"actor": "Actor",
|
||||
"action": "Actie",
|
||||
"entity": "Entiteit",
|
||||
"change": "Wijziging",
|
||||
"followUp": "Vervolg",
|
||||
"details": "Details"
|
||||
},
|
||||
"viewRelatedEvents": "Gerelateerde gebeurtenissen bekijken",
|
||||
"noChangeDetail": "Geen wijzigingsdetail geregistreerd.",
|
||||
"noFieldChange": "Geen wijziging op veldniveau gedetecteerd.",
|
||||
"reference": "Referentie",
|
||||
"relatedEventsCount": "{{count}} gekoppelde gebeurtenis",
|
||||
"relatedEventsCount_other": "{{count}} gekoppelde gebeurtenissen",
|
||||
"showTechnicalEvents": "{{count}} technische gebeurtenis tonen",
|
||||
"showTechnicalEvents_other": "{{count}} technische gebeurtenissen tonen",
|
||||
"hideTechnicalEvents": "Technische gebeurtenissen verbergen",
|
||||
"technicalDetails": "Technische details",
|
||||
"fullReference": "Volledige referentie",
|
||||
"correlationId": "Gekoppelde gebeurtenis-ID",
|
||||
"diff": {
|
||||
"setTo": "{{field}}: ingesteld op {{value}}",
|
||||
"was": "{{field}}: was {{value}}",
|
||||
"changed": "{{field}}: {{before}} → {{after}}"
|
||||
},
|
||||
"actions": {
|
||||
"demo_login": "Ingelogd",
|
||||
"demo_logout": "Uitgelogd",
|
||||
"demo_reset": "Demogegevens hersteld",
|
||||
"demo_data_seeded": "Demogegevens ingeladen",
|
||||
"return_registered": "Voertuigretour geregistreerd",
|
||||
"vehicle_status_changed": "Voertuigstatus gewijzigd",
|
||||
"data_quality_issue_resolved": "Datakwaliteitsprobleem opgelost",
|
||||
"data_quality_issue_deferred": "Datakwaliteitsprobleem uitgesteld",
|
||||
"data_quality_issue_rejected": "Datakwaliteitsprobleem verworpen",
|
||||
"data_quality_fields_provided": "Ontbrekende velden aangevuld",
|
||||
"data_quality_odometer_corrected": "Kilometerstand gecorrigeerd",
|
||||
"data_quality_odometer_retained": "Laatst bevestigde kilometerstand behouden",
|
||||
"data_quality_status_applied": "Aanbevolen status toegepast",
|
||||
"data_quality_booking_blocked": "Boeking geblokkeerd",
|
||||
"data_quality_scan_run": "Kwaliteitscontrole uitgevoerd",
|
||||
"customer_merged": "Klanten samengevoegd",
|
||||
"workflow_retry": "Automatisering opnieuw geprobeerd",
|
||||
"knowledge_question_asked": "Kennisvraag gesteld",
|
||||
"mcp_tool_request": "MCP-tool aangeroepen"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"brandTagline": "Bedieningscentrum",
|
||||
"orgLine": "Demo-organisatie: {{orgName}} (fictief)",
|
||||
"headline1": "Elke overdracht.",
|
||||
"headline2": "Eén helder overzicht.",
|
||||
"defaultDescription": "Fleet Ops brengt voertuig-, boekings- en operationele gegevens samen, ondersteunt verhuurprocessen, detecteert datakwaliteitsproblemen en automatiseert gecontroleerde vervolgstappen.",
|
||||
"footnote": "Synthetische demo · geen echte klant- of voertuiggegevens · op elk moment herstelbaar",
|
||||
"accessEyebrow": "Demo-toegang",
|
||||
"accessHeading": "Kies hoe je wil starten",
|
||||
"accessIntro": "Geen wachtwoord nodig. Elke rol opent een afgebakende, synthetische omgeving — alle workflows en controles zijn echt geïmplementeerd.",
|
||||
"startGuidedDemo": "Start begeleide demo",
|
||||
"exploreAsOperationsManager": "Verken als Operations Manager",
|
||||
"exploreAsOperationsManagerDetail": "Volledig overzicht, kwaliteitsoplossing en herpogingen",
|
||||
"exploreAsRentalEmployee": "Verken als Rental Employee",
|
||||
"exploreAsRentalEmployeeDetail": "Boekingen, retours, wagenpark en procedures",
|
||||
"safeByDesignTitle": "Veilig ontworpen",
|
||||
"safeByDesignDetail": "Elke actie wordt gelogd en is in deze demo herstelbaar.",
|
||||
"loginFailed": "De demo-sessie kon niet gestart worden. De API is mogelijk niet bereikbaar.",
|
||||
"roleOperationsManager": "Operations manager",
|
||||
"roleRentalEmployee": "Rental employee",
|
||||
"switchRole": "Wissel van rol",
|
||||
"logout": "Uitloggen"
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"list": {
|
||||
"eyebrow": "Uitvoeren / Planning",
|
||||
"title": "Boekingen",
|
||||
"description": "Bekijk actieve verhuurperiodes en aankomende voertuigverbintenissen.",
|
||||
"searchLabel": "Zoeken",
|
||||
"searchPlaceholder": "Boeking, klant of voertuig",
|
||||
"statusLabel": "Status",
|
||||
"statusAll": "Alle statussen",
|
||||
"loading": "Boekingsoverzicht laden…",
|
||||
"empty": "Geen boekingen gevonden",
|
||||
"emptyDetail": "Pas het statusfilter voor boekingen aan.",
|
||||
"noMatch": "Geen overeenkomende boekingen",
|
||||
"noMatchDetail": "Probeer een bredere zoekterm.",
|
||||
"unavailable": "Boekingsoverzicht is momenteel niet beschikbaar.",
|
||||
"count": "{{count}} boekingen",
|
||||
"pageOf": "Pagina {{page}} van {{total}}",
|
||||
"columns": {
|
||||
"reference": "Referentie",
|
||||
"customer": "Klant",
|
||||
"vehicle": "Voertuig",
|
||||
"window": "Periode",
|
||||
"status": "Status"
|
||||
},
|
||||
"paginationLabel": "Boekingspagina's",
|
||||
"previous": "Vorige",
|
||||
"next": "Volgende",
|
||||
"rangeOf": "{{from}}–{{to}} van {{total}}"
|
||||
},
|
||||
"statuses": {
|
||||
"reserved": "gereserveerd",
|
||||
"active": "actief",
|
||||
"returned": "geretourneerd",
|
||||
"cancelled": "geannuleerd",
|
||||
"blocked": "geblokkeerd"
|
||||
},
|
||||
"detail": {
|
||||
"backLink": "Boekingsoverzicht",
|
||||
"eyebrow": "Boekingen / Huurrecord",
|
||||
"notFound": "Deze boeking kon niet gevonden worden.",
|
||||
"loading": "Boekingsrecord laden…",
|
||||
"customer": "Klant",
|
||||
"vehicle": "Voertuig",
|
||||
"starts": "Start",
|
||||
"ends": "Einde",
|
||||
"startOdometer": "Startkilometerstand",
|
||||
"endOdometer": "Eindkilometerstand",
|
||||
"requirementsComplete": "Vereisten volledig",
|
||||
"yes": "Ja",
|
||||
"no": "Nee"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"appName": "Fleet Ops",
|
||||
"orgName": "Northstar Mobility",
|
||||
"brandTagline": "Bedieningscentrum",
|
||||
"actions": {
|
||||
"save": "Opslaan",
|
||||
"cancel": "Annuleren",
|
||||
"confirm": "Bevestigen",
|
||||
"close": "Sluiten",
|
||||
"back": "Terug",
|
||||
"next": "Volgende",
|
||||
"retry": "Opnieuw proberen",
|
||||
"reset": "Herstellen",
|
||||
"yes": "Ja",
|
||||
"no": "Nee",
|
||||
"viewDetails": "Details bekijken",
|
||||
"technicalDetails": "Technische details"
|
||||
},
|
||||
"status": {
|
||||
"loading": "Laden…",
|
||||
"saving": "Opslaan…",
|
||||
"error": "Er ging iets mis",
|
||||
"success": "Gelukt",
|
||||
"noResults": "Geen resultaten"
|
||||
},
|
||||
"states": {
|
||||
"loadingDefault": "Werkruimte wordt geladen…",
|
||||
"errorTitle": "We konden deze werkruimte niet laden."
|
||||
},
|
||||
"timezone": "Europa/Brussel",
|
||||
"language": {
|
||||
"label": "Taal",
|
||||
"nl-BE": "Nederlands",
|
||||
"en-GB": "English",
|
||||
"fr-BE": "Français"
|
||||
},
|
||||
"footer": {
|
||||
"productLine": "Fleet Ops Demo",
|
||||
"locale": "Europa/Brussel · Synthetische demogegevens"
|
||||
},
|
||||
"demo": {
|
||||
"syntheticBadge": "Synthetische demo"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"eyebrow": "Uitvoeren / Live overzicht",
|
||||
"title": "Goedemorgen. Hier is je wagenpark.",
|
||||
"description": "Beschikbaarheid, uitzonderingen en overdrachten doorheen de huidige werking.",
|
||||
"viewFleet": "Wagenpark bekijken",
|
||||
"demoStart": {
|
||||
"title": "Probeer een demonstratiescenario",
|
||||
"readyCount": "{{ready}} van {{total}} scenario's klaar voor demo.",
|
||||
"readyCountFallback": "Vijf afgebakende scenario's.",
|
||||
"startGuide": "Start demo-gids",
|
||||
"resumeGuide": "Verder met demo-gids ({{current}}/{{total}})",
|
||||
"viewScenarios": "Bekijk scenario's"
|
||||
},
|
||||
"readiness": {
|
||||
"title": "Wagenparkstatus",
|
||||
"description": "Live vanuit persistente voertuigstatus",
|
||||
"openFleet": "Wagenpark openen",
|
||||
"available": "Beschikbaar",
|
||||
"rented": "Verhuurd",
|
||||
"cleaning": "Reiniging",
|
||||
"maintenance": "Onderhoud",
|
||||
"blocked": "Geblokkeerd"
|
||||
},
|
||||
"attention": {
|
||||
"title": "Aandachtspunten",
|
||||
"description": "{{openIssues}} open datakwaliteitsproblemen · {{workflowExceptions}} automatiseringsuitzonderingen",
|
||||
"reviewQueue": "Wachtrij bekijken",
|
||||
"filterPlaceholder": "Filter aandachtspunten…",
|
||||
"filterAriaLabel": "Zoek in aandachtspunten",
|
||||
"severityAll": "Alle ernst",
|
||||
"severityHigh": "Kritiek",
|
||||
"severityMedium": "Waarschuwing",
|
||||
"severityLow": "Info",
|
||||
"severityAriaLabel": "Ernst",
|
||||
"empty": "Geen aandachtspunten voor dit filter.",
|
||||
"openRecord": "Open {{title}}"
|
||||
},
|
||||
"movements": {
|
||||
"title": "Bewegingen vandaag",
|
||||
"description": "Vertrekken en retours in Europa/Brussel",
|
||||
"allBookings": "Alle boekingen",
|
||||
"empty": "Geen bewegingen gepland vandaag.",
|
||||
"departure": "vertrek",
|
||||
"return": "retour",
|
||||
"openBooking": "Open boeking {{ref}}"
|
||||
},
|
||||
"integrationPulse": {
|
||||
"title": "Integratiestatus",
|
||||
"description": "Actuele evidentie van gekoppelde diensten",
|
||||
"systemDetail": "Systeemdetail",
|
||||
"n8nTitle": "n8n-aflevering",
|
||||
"n8nSummary": "{{succeeded}} geslaagd · {{failed}} mislukt",
|
||||
"n8nLatest": "Meest recente gebeurtenis {{ref}}",
|
||||
"n8nNoEvidence": "Geen automatiseringsevidentie geregistreerd",
|
||||
"knowledgeTitle": "Kennisassistent",
|
||||
"knowledgeSummary": "{{count}} procedures geïndexeerd",
|
||||
"knowledgeUnavailable": "Statuscontrole niet beschikbaar",
|
||||
"mcpTitle": "MCP Hub",
|
||||
"mcpEnabled": "Registratie ingeschakeld",
|
||||
"mcpNotConnected": "Nog niet gekoppeld"
|
||||
},
|
||||
"recent": {
|
||||
"title": "Recente activiteit",
|
||||
"description": "Laatst geauditeerde workflowwijzigingen",
|
||||
"empty": "Geen automatiseringsactiviteit geregistreerd."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
{
|
||||
"badge": {
|
||||
"trigger": "Synthetische demo",
|
||||
"dialogLabel": "Over deze demo-omgeving",
|
||||
"close": "Sluiten",
|
||||
"orgIntro": "<strong>{{orgName}}</strong> is een fictieve organisatie. Alle namen, voertuigen en boekingen zijn synthetisch.",
|
||||
"orgIntroFallback": "Alle namen, voertuigen en boekingen in deze omgeving zijn synthetisch.",
|
||||
"realWorkflows": "De workflows, controles en automatisering zijn echt geïmplementeerd — enkel de gegevens zijn verzonnen.",
|
||||
"lastReset": "Laatste reset: <strong>{{when}}</strong> · deze omgeving is op elk moment herstelbaar.",
|
||||
"aboutLink": "Over deze demo",
|
||||
"unknown": "onbekend"
|
||||
},
|
||||
"guide": {
|
||||
"dialogLabel": "Gegidste demo",
|
||||
"trigger": "Demo-gids",
|
||||
"kicker": "Gegidste demo · stap {{current}} van {{total}}",
|
||||
"whatYouWillSee": "Wat je zal zien",
|
||||
"whyItMatters": "Waarom dit relevant is",
|
||||
"startAction": "Aan de slag",
|
||||
"expectedOutcome": "Verwacht resultaat",
|
||||
"goToStep": "Ga naar deze stap",
|
||||
"next": "Volgende",
|
||||
"close": "Sluiten",
|
||||
"restart": "Demo opnieuw voorbereiden",
|
||||
"restarting": "Bezig met herstellen…",
|
||||
"restartFailed": "De demo kon niet hersteld worden.",
|
||||
"allStepsLabel": "Alle stappen",
|
||||
"progressChip": "Demo-gids · stap {{current}} van {{total}}",
|
||||
"expand": "Demo-gids uitklappen",
|
||||
"collapse": "Demo-gids inklappen",
|
||||
"steps": {
|
||||
"understand-state": {
|
||||
"title": "1. Begrijp de operationele status",
|
||||
"whatYouWillSee": "Het dashboard toont de wagenparkstatus, openstaande aandachtspunten en de bewegingen van vandaag.",
|
||||
"whyItMatters": "Een Operations Manager start elke dag met dit overzicht om te bepalen waar ingrijpen nodig is.",
|
||||
"startAction": "Open het dashboard en bekijk de aandachtslijst en de tijdlijn van vandaag.",
|
||||
"expectedOutcome": "Je ziet welke boekingen, voertuigen of datakwaliteitsproblemen aandacht vragen."
|
||||
},
|
||||
"open-booking": {
|
||||
"title": "2. Open een boeking die aandacht nodig heeft",
|
||||
"whatYouWillSee": "De boeking BK-DEMO-RETURN, actief en klaar voor retour vandaag.",
|
||||
"whyItMatters": "Retours zijn het moment waarop foute kilometerstanden of schade voor het eerst zichtbaar worden.",
|
||||
"startAction": "Open de boeking vanuit het dashboard of de boekingenlijst.",
|
||||
"expectedOutcome": "Je ziet de boekingsdetails en de knop om de retour te verwerken."
|
||||
},
|
||||
"process-return": {
|
||||
"title": "3. Verwerk een retour met een afwijkende kilometerstand",
|
||||
"whatYouWillSee": "Een retourformulier met een vooringevulde, verdachte kilometerstand lager dan de laatst gekende stand.",
|
||||
"whyItMatters": "Een dalende kilometerstand wijst op een foutieve invoer of een verwisseld voertuig — dit moet vóór vrijgave worden opgemerkt.",
|
||||
"startAction": "Vul de retour in met de voorgestelde waarde en bekijk de serverpreview vóór je bevestigt.",
|
||||
"expectedOutcome": "De retour wordt verwerkt, het voertuig krijgt een passende status en er wordt automatisch een datakwaliteitsprobleem aangemaakt."
|
||||
},
|
||||
"handle-quality-issue": {
|
||||
"title": "4. Bekijk en behandel het gecreëerde datakwaliteitsprobleem",
|
||||
"whatYouWillSee": "Een nieuw issue van het type 'kilometerstand-afwijking' bovenaan de werklijst.",
|
||||
"whyItMatters": "Elk gedetecteerd probleem heeft één afgebakende oplossingsstap — niets wordt automatisch stilzwijgend gecorrigeerd.",
|
||||
"startAction": "Open het datakwaliteitsoverzicht en kies het nieuwste issue.",
|
||||
"expectedOutcome": "Je ziet de aanbevolen actie, kiest een oplossing en het issue wordt opgelost met een audit-spoor."
|
||||
},
|
||||
"merge-duplicate": {
|
||||
"title": "5. Beoordeel en behandel een mogelijke dubbele klant",
|
||||
"whatYouWillSee": "Twee klantprofielen met hetzelfde e-mailadres en telefoonnummer, naast elkaar vergeleken.",
|
||||
"whyItMatters": "Dubbele klanten leiden tot verspreide boekingsgeschiedenis en verwarrende communicatie.",
|
||||
"startAction": "Vergelijk beide profielen en kies welk profiel behouden blijft.",
|
||||
"expectedOutcome": "De profielen worden samengevoegd, boekingen worden herverbonden en het verliezende profiel wordt een tombstone."
|
||||
},
|
||||
"ask-knowledge": {
|
||||
"title": "6. Stel een vraag aan de procedureassistent",
|
||||
"whatYouWillSee": "Een antwoord met bronvermelding uit de afgebakende demokennisbank.",
|
||||
"whyItMatters": "Medewerkers moeten snel een onderbouwd antwoord krijgen over procedures, zonder te gokken.",
|
||||
"startAction": "Klik op één van de voorbeeldvragen, in de huidige interfacetaal.",
|
||||
"expectedOutcome": "Je ziet het antwoord, de gebruikte procedure en de brontekst — of een eerlijk 'onvoldoende informatie' als dat niet aanwezig is."
|
||||
},
|
||||
"check-automation-audit": {
|
||||
"title": "7. Controleer automatisering en audit trail",
|
||||
"whatYouWillSee": "De status van de n8n-aflevering voor je retour, en de bijhorende audit-gebeurtenissen.",
|
||||
"whyItMatters": "Elke belangrijke actie moet naspeurbaar zijn: wie deed wat, wanneer, en wat was het gevolg.",
|
||||
"startAction": "Open Integraties om de afleverstatus te zien, en Audit trail voor het volledige spoor.",
|
||||
"expectedOutcome": "Je ziet een geslaagde (of herstelbare) aflevering en een leesbaar audit-overzicht van je acties."
|
||||
},
|
||||
"review-real-vs-simulated": {
|
||||
"title": "8. Bekijk wat echt is, gesimuleerd is, of nog niet gekoppeld",
|
||||
"whatYouWillSee": "Een overzicht van wat in deze demo functioneel geïmplementeerd is, wat synthetisch is, en welke koppelingen nog niet live zijn.",
|
||||
"whyItMatters": "Een demo is pas overtuigend als bezoekers zelf kunnen nagaan wat echt werkt en wat nog toekomstmuziek is.",
|
||||
"startAction": "Lees de pagina 'Over deze demo'.",
|
||||
"expectedOutcome": "Je kan zelf uitleggen wat Fleet Ops wel en niet is, zonder mondelinge toelichting."
|
||||
}
|
||||
}
|
||||
},
|
||||
"scenarios": {
|
||||
"eyebrow": "Demonstratiescenario's",
|
||||
"title": "Probeer een demonstratiescenario",
|
||||
"description": "Vijf afgebakende scenario's die telkens dezelfde vaste boekingen, klanten en voertuigen gebruiken — na een reset zijn ze altijd opnieuw te vinden.",
|
||||
"loading": "Scenario's laden…",
|
||||
"ready": "Klaar voor demo",
|
||||
"notReady": "Niet beschikbaar",
|
||||
"duration": "Duur",
|
||||
"durationValue": "± {{minutes}} min",
|
||||
"role": "Rol",
|
||||
"demonstrates": "Toont aan:",
|
||||
"requiresRole": "Vereist rol: {{roles}}.",
|
||||
"startScenario": "Start scenario",
|
||||
"roleOr": "{{a}} of {{b}}",
|
||||
"roles": {
|
||||
"operations_manager": "Operations Manager",
|
||||
"rental_employee": "Rental Employee"
|
||||
},
|
||||
"items": {
|
||||
"return-anomaly": {
|
||||
"title": "Retour met afwijkende kilometerstand",
|
||||
"problem": "Een voertuig komt terug met een kilometerstand die lager ligt dan de laatst geregistreerde stand — een teken van een foutieve invoer of een verwisseld voertuig.",
|
||||
"demonstrates": "Retourverwerking, automatische detectie van datakwaliteitsproblemen en de audit trail die daaruit ontstaat."
|
||||
},
|
||||
"duplicate-customer": {
|
||||
"title": "Mogelijke dubbele klant samenvoegen",
|
||||
"problem": "Twee klantprofielen delen hetzelfde e-mailadres en telefoonnummer — waarschijnlijk dezelfde persoon, twee keer geregistreerd.",
|
||||
"demonstrates": "Samenvoegen van klanten met behoud van boekingsgeschiedenis en audit trail."
|
||||
},
|
||||
"booking-overlap": {
|
||||
"title": "Overlappende boekingen herstellen",
|
||||
"problem": "Eén voertuig staat dubbel gereserveerd voor overlappende periodes — een planningsfout die vóór vertrek moet worden opgelost.",
|
||||
"demonstrates": "Detectie en gecontroleerde oplossing van planningsconflicten."
|
||||
},
|
||||
"automation-retry": {
|
||||
"title": "Mislukte automatisering opnieuw proberen",
|
||||
"problem": "Eén eerdere gebeurtenis kon niet worden afgeleverd aan de automatisering door een gesimuleerde verbindingsfout.",
|
||||
"demonstrates": "Betrouwbare aflevering met begrensde herpogingen en zichtbare foutstatus."
|
||||
},
|
||||
"knowledge-question": {
|
||||
"title": "Een procedurevraag stellen",
|
||||
"problem": "Een medewerker weet niet zeker welke procedure van toepassing is bij een specifieke operationele situatie.",
|
||||
"demonstrates": "Antwoorden met brongebaseerde onderbouwing uit een afgebakende demokennisbank."
|
||||
}
|
||||
},
|
||||
"blockedReasons": {
|
||||
"bookingNotFound": "Demoboeking BK-DEMO-RETURN niet gevonden. {{resetHint}}",
|
||||
"bookingAlreadyProcessed": "Deze boeking is al verwerkt sinds de laatste reset. {{resetHint}}",
|
||||
"duplicateIssueNotFound": "Demo-issue DQ-DEMO-DUPLICATE niet gevonden. {{resetHint}}",
|
||||
"issueAlreadyResolved": "Dit issue is al opgelost sinds de laatste reset. {{resetHint}}",
|
||||
"overlapIssueNotFound": "Demo-issue DQ-DEMO-OVERLAP niet gevonden. {{resetHint}}",
|
||||
"failedEventNotFound": "Gesimuleerde mislukte gebeurtenis niet gevonden. {{resetHint}}",
|
||||
"eventAlreadyRecovered": "Deze gebeurtenis is al hersteld sinds de laatste reset. {{resetHint}}",
|
||||
"knowledgeUnavailable": "De demokennisbank is momenteel niet beschikbaar.",
|
||||
"resetHint": "Reset de demogegevens om dit scenario opnieuw beschikbaar te maken."
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
"eyebrow": "Over deze demo",
|
||||
"title": "Wat Fleet Ops wel en niet is",
|
||||
"description": "{{orgName}} is een fictieve verhuurorganisatie die dient om deze demo tastbaar te maken — geen bestaand bedrijf.",
|
||||
"loading": "Demo-informatie laden…",
|
||||
"ctaTitle": "Liever meteen aan de slag?",
|
||||
"ctaBody": "De gegidste demo doorloopt alle acht stappen hierboven in de praktijk.",
|
||||
"ctaButton": "Start begeleide demo",
|
||||
"problemTitle": "Het fictieve probleem",
|
||||
"problemBody": "{{orgName}} verhuurt zo'n 50 campers en bestelwagens vanuit één hoofdlocatie. Boekingen, retours, klantgegevens en onderhoud kwamen tot nu toe uit losse spreadsheets en mondelinge afspraken, waardoor fouten (dubbele klanten, foutieve kilometerstanden, dubbel geboekte voertuigen) laat aan het licht kwamen. Fleet Ops toont hoe één samenhangend systeem die problemen vroeg signaleert en gecontroleerd laat oplossen.",
|
||||
"scopeTitle": "Voor wie en met welke scope",
|
||||
"scopeBody": "Deze demo is bedoeld voor wie wil zien hoe Fleet Ops operationele problemen bij een kleine verhuurder aanpakt: Operations Managers en Rental Employees, en iedereen die de aanpak evalueert. De scope is bewust afgebakend tot één samenhangende proof of concept — geen boekhouding, geen betalingen, geen publieke reservaties, geen volledig CRM of ERP.",
|
||||
"realTitle": "Wat écht werkt",
|
||||
"realBody": "Alles hieronder is functionele code, niet alleen een mockup: rol-gebaseerde toegang en sessies, voertuig- en boekingsbeheer, retourverwerking met serverzijdige validatie, vijf datakwaliteitsregels met elk een eigen oplossingsstap, een volledige audit trail, geautomatiseerde aflevering naar n8n met begrensde herpogingen, Docker-gebaseerde deployment en een geautomatiseerde testsuite (backend en Playwright end-to-end).",
|
||||
"syntheticTitle": "Wat synthetisch is",
|
||||
"syntheticBody": "De organisatie, alle klanten, voertuigen, boekingen, onderhoudsgeschiedenis, procedures in de kennisbank en de vooraf ingerichte scenario's zijn volledig verzonnen. Geen enkel gegeven verwijst naar een bestaand persoon, voertuig of bedrijf; e-mailadressen gebruiken uitsluitend het testdomein {{testDomain}}.",
|
||||
"architectureTitle": "Architectuur in het kort",
|
||||
"architectureBody": "Een React/TypeScript-frontend praat met een FastAPI-backend (PostgreSQL via SQLAlchemy/Alembic-migraties); belangrijke bedrijfsregels leven in de backend, niet in n8n of in prompts. Retours en andere gebeurtenissen worden eerst lokaal gecommit en pas daarna asynchroon via een automatiseringsopdracht aan n8n afgeleverd, zodat een tijdelijke storing in de automatisering nooit een operationele actie blokkeert.",
|
||||
"securityTitle": "Beveiliging en toegang",
|
||||
"securityBody": "Toegang verloopt via ondertekende, HTTP-only sessiecookies per rol; elke rol gebonden aan een set toegestane routes, zowel serverzijdig afgedwongen als in de navigatie weerspiegeld. Belangrijke statuswijzigingen worden altijd gecontroleerd en gelogd — nooit stilzwijgend automatisch gecorrigeerd.",
|
||||
"testingTitle": "Hoe dit getest is",
|
||||
"testingBody": "Een geautomatiseerde backend-testsuite dekt bedrijfsregels en API-contracten; een volledige Playwright-eindtot-eind-suite dekt de gebruikersstromen, inclusief deze demo-ervaring zelf in drie talen. Elke wijziging wordt bovendien tegen een schone checkout (lege database, opnieuw opgebouwd vanaf de seed-data) gevalideerd voor deployment.",
|
||||
"integrationsTitle": "Koppelingen — eerlijk gelabeld",
|
||||
"integrationsDescription": "Wat operationeel is, wat demomodus is, en wat nog niet gekoppeld is.",
|
||||
"resetTitle": "Demo-omgeving herstellen",
|
||||
"resetBodyManager": "De omgeving is op elk moment terug te zetten naar de startsituatie. Laatste reset: <strong>{{when}}</strong>. Gebruik <strong>Demogegevens herstellen</strong> in de zijbalk om opnieuw te beginnen.",
|
||||
"resetBodyEmployee": "De omgeving is op elk moment terug te zetten naar de startsituatie. Laatste reset: <strong>{{when}}</strong>. Een Operations Manager kan de demo-omgeving herstellen via de zijbalk.",
|
||||
"limitationsTitle": "Beperkingen",
|
||||
"limitationsBody": "Dit is een gerichte proof of concept, geen volledig ERP. RAGcore en de ITWorx MCP Hub zijn nog niet live gekoppeld; de kennisassistent gebruikt een lokale, afgebakende demokennisbank in plaats van een live RAGcore-omgeving.",
|
||||
"unknown": "onbekend"
|
||||
},
|
||||
"integrationSummary": {
|
||||
"titles": {
|
||||
"n8n": "Automatisering (n8n)",
|
||||
"ragcore": "Kennisassistent (RAGcore)",
|
||||
"mcp_hub": "ITWorx MCP Hub"
|
||||
},
|
||||
"n8nDetail": "{{succeeded}} geslaagd · {{failed}} mislukt · {{pending}} in wachtrij.",
|
||||
"ragcoreDetail": "{{count}} procedures geïndexeerd in {{collection}}.",
|
||||
"mcpDetailEnabled": "Voorbereid voor toekomstige, gecontroleerde tool-aanroepen vanuit de Hub.",
|
||||
"mcpDetailNotConnected": "Nog niet gekoppeld — voorbereid voor toekomstige, gecontroleerde tool-aanroepen vanuit de Hub."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"generic": "Er is een fout opgetreden. Probeer opnieuw.",
|
||||
"workspaceLoadFailed": "We konden deze werkruimte niet laden.",
|
||||
"unauthorized": "Je sessie is verlopen. Log opnieuw in.",
|
||||
"forbidden": "Je hebt geen toegang tot dit onderdeel.",
|
||||
"notFound": "Dit record kon niet gevonden worden.",
|
||||
"networkUnavailable": "De verbinding met de server is momenteel niet beschikbaar."
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
{
|
||||
"list": {
|
||||
"eyebrow": "Wagenpark / Register",
|
||||
"title": "Wagenpark",
|
||||
"description": "Live operationele status, locatie en onderhoudsgereedheid.",
|
||||
"searchLabel": "Zoeken",
|
||||
"searchPlaceholder": "Referentie, merk of locatie",
|
||||
"statusLabel": "Status",
|
||||
"statusAll": "Alle statussen",
|
||||
"attentionOnly": "Enkel aandachtspunten",
|
||||
"loading": "Wagenparkregister laden…",
|
||||
"empty": "Geen voertuigen gevonden",
|
||||
"emptyDetail": "Pas de huidige wagenparkfilters aan.",
|
||||
"noMatch": "Geen overeenkomende voertuigen",
|
||||
"noMatchDetail": "Probeer een bredere zoekterm.",
|
||||
"unavailable": "Wagenparklijst is momenteel niet beschikbaar.",
|
||||
"count": "{{count}} voertuigen",
|
||||
"persisted": "Persistente wagenparkgegevens",
|
||||
"columns": {
|
||||
"reference": "Referentie",
|
||||
"makeModel": "Merk / model",
|
||||
"location": "Locatie",
|
||||
"status": "Status",
|
||||
"odometer": "Kilometerstand (km)",
|
||||
"attention": "Aandacht"
|
||||
},
|
||||
"needsAttention": "Vraagt aandacht"
|
||||
},
|
||||
"statuses": {
|
||||
"available": "beschikbaar",
|
||||
"rented": "verhuurd",
|
||||
"cleaning": "reiniging",
|
||||
"maintenance": "onderhoud",
|
||||
"blocked": "geblokkeerd"
|
||||
},
|
||||
"detail": {
|
||||
"backLink": "Wagenparkregister",
|
||||
"eyebrow": "Wagenpark / Voertuigrecord",
|
||||
"notFound": "Dit voertuig kon niet gevonden worden.",
|
||||
"loading": "Voertuigrecord laden…",
|
||||
"needsAttention": "Vraagt aandacht",
|
||||
"tabs": {
|
||||
"overview": "Overzicht",
|
||||
"bookings": "Boekingen",
|
||||
"inspections": "Inspecties",
|
||||
"maintenance": "Onderhoud",
|
||||
"quality": "Kwaliteit"
|
||||
},
|
||||
"tabsAriaLabel": "Voertuigonderdelen",
|
||||
"overview": {
|
||||
"registration": "Kenteken",
|
||||
"modelYear": "Bouwjaar",
|
||||
"location": "Locatie",
|
||||
"odometer": "Kilometerstand",
|
||||
"nextService": "Volgende onderhoudsbeurt",
|
||||
"active": "Actief"
|
||||
},
|
||||
"yes": "Ja",
|
||||
"no": "Nee",
|
||||
"noBookings": "Geen boekingen geregistreerd.",
|
||||
"noInspections": "Geen inspecties geregistreerd.",
|
||||
"noMaintenance": "Geen onderhoudsgegevens.",
|
||||
"noQualityIssues": "Geen kwaliteitsproblemen geregistreerd.",
|
||||
"fuel": "Brandstof {{percent}}%",
|
||||
"damage": "Schade",
|
||||
"technicalWarning": "Technische melding"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"eyebrow": "Bewaken / Integraties",
|
||||
"title": "Integratiebeheer",
|
||||
"description": "Bewaak afleverkwaliteit, beperkte beschikbaarheid en herprobeerbare workflowgebeurtenissen.",
|
||||
"cards": {
|
||||
"orchestrationKicker": "Orkestratie",
|
||||
"n8nTitle": "n8n-aflevering",
|
||||
"n8nSummary": "{{succeeded}} geslaagd · {{failed}} mislukt · {{pending}} in wachtrij · {{delivering}} bezig",
|
||||
"n8nFallback": "Retourgebeurtenissen worden eerst lokaal verwerkt en pas daarna via de automatiseringsopdracht afgeleverd.",
|
||||
"knowledgeKicker": "Kennis",
|
||||
"knowledgeTitle": "Kennisassistent",
|
||||
"knowledgeSummaryDemo": "Demokennisbank · {{count}} procedures geïndexeerd in {{collection}}.",
|
||||
"knowledgeSummaryRagcore": "RAGcore · {{count}} procedures geïndexeerd in {{collection}}.",
|
||||
"knowledgeUnavailable": "Statusevidentie momenteel niet beschikbaar.",
|
||||
"gatewayKicker": "Tool-gateway",
|
||||
"mcpTitle": "MCP Hub",
|
||||
"mcpEnabled": "Registratie is ingeschakeld voor deze omgeving.",
|
||||
"mcpNotConnected": "Nog niet gekoppeld — voorbereid voor toekomstige, gecontroleerde tool-aanroepen vanuit de Hub."
|
||||
},
|
||||
"statusLabels": {
|
||||
"notConnected": "Niet gekoppeld",
|
||||
"deliveryFailed": "Verwerking mislukt",
|
||||
"retryAvailable": "Opnieuw proberen mogelijk",
|
||||
"operational": "Operationeel",
|
||||
"prepared": "Voorbereid",
|
||||
"demoMode": "Demomodus",
|
||||
"unavailable": "Niet beschikbaar"
|
||||
},
|
||||
"ledger": {
|
||||
"title": "Automatiseringsopdrachten",
|
||||
"description": "Vastgelegde automatiseringspogingen met de recentste foutevidentie.",
|
||||
"filterLabel": "Weergave",
|
||||
"filterNeedsAttention": "Vraagt aandacht",
|
||||
"filterRecent": "Recent",
|
||||
"filterSucceeded": "Geslaagd",
|
||||
"filterAll": "Alle",
|
||||
"statusFilterLabel": "Status",
|
||||
"statusAll": "Alle statussen",
|
||||
"statusPending": "In wachtrij",
|
||||
"statusDelivering": "Bezig",
|
||||
"statusSucceeded": "Geslaagd",
|
||||
"statusFailed": "Mislukt",
|
||||
"unavailable": "Automatiseringsopdrachten zijn momenteel niet beschikbaar.",
|
||||
"managerOnly": "Automatisering is enkel zichtbaar voor Operations Managers.",
|
||||
"loading": "Automatiseringsopdrachten laden…",
|
||||
"empty": "Geen automatiseringsopdrachten voor dit filter.",
|
||||
"count": "{{count}} workflowgebeurtenissen",
|
||||
"boundedRetries": "Begrensde herpogingen",
|
||||
"groupedSucceeded": "{{count}} geslaagde voertuigretourverwerkingen",
|
||||
"showIndividually": "Individuele opdrachten tonen",
|
||||
"hideIndividually": "Individuele opdrachten verbergen",
|
||||
"columns": {
|
||||
"event": "Opdracht",
|
||||
"type": "Type",
|
||||
"booking": "Boeking",
|
||||
"status": "Status",
|
||||
"attempts": "Pogingen",
|
||||
"lastError": "Laatste fout",
|
||||
"when": "Wanneer",
|
||||
"action": "Actie"
|
||||
},
|
||||
"retry": "Opnieuw proberen",
|
||||
"retrying": "Bezig met opnieuw proberen…",
|
||||
"retryFailed": "Kon deze aflevering niet opnieuw proberen.",
|
||||
"noAction": "—",
|
||||
"eventTypes": {
|
||||
"vehicle.returned.v1": "Voertuigretour verwerkt"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"eyebrow": "Bewaken / Onderbouwde kennis",
|
||||
"title": "Procedurekennis",
|
||||
"description": "Stel operationele vragen. Antwoorden verschijnen enkel wanneer {{provider}} voldoende onderbouwde evidentie teruggeeft.",
|
||||
"providerDemo": "de demokennisbank",
|
||||
"providerRagcore": "RAGcore",
|
||||
"statusAvailable": "Beschikbaar",
|
||||
"statusUnavailable": "Niet beschikbaar",
|
||||
"proceduresIndexed": "{{count}} procedures geïndexeerd",
|
||||
"providerNote": "Deze demo beantwoordt vanuit een kleine, vaste set geïndexeerde procedures — geen live RAGcore-koppeling. Een live RAGcore-backend zal later dezelfde interface overnemen, zonder dat deze pagina verandert.",
|
||||
"askHeading": "Stel een procedurevraag",
|
||||
"askSubheading": "Ophalen → evidentiecontrole → onderbouwd antwoord",
|
||||
"questionLabel": "Vraag",
|
||||
"questionPlaceholder": "bv. Wat moet ik doen wanneer een voertuig beschadigd terugkomt?",
|
||||
"ask": "Vraag stellen",
|
||||
"asking": "Bezig met vragen…",
|
||||
"askFailed": "Kon de kennisdienst niet bereiken.",
|
||||
"suggestedLabel": "Probeer:",
|
||||
"suggestedQuestions": [
|
||||
"Wat moet ik doen wanneer een voertuig terugkomt met schade?",
|
||||
"Hoe registreer ik een voertuigretour?",
|
||||
"Wanneer mag een voertuig opnieuw beschikbaar gezet worden?",
|
||||
"Wie beoordeelt een ongewone kilometerstand?",
|
||||
"Welke controles zijn verplicht vóór vertrek?"
|
||||
],
|
||||
"emptyTitle": "Evidentie voor antwoorden",
|
||||
"emptyDescription": "Vraag naar retours, schade, inspecties of een andere geïndexeerde procedure. Fleet Ops verzint geen antwoord wanneer evidentie ontbreekt.",
|
||||
"retrievalFlow": {
|
||||
"question": "Vraag",
|
||||
"sources": "Bronnen",
|
||||
"answer": "Antwoord"
|
||||
},
|
||||
"questionLabelExchange": "Vraag",
|
||||
"evidenceStates": {
|
||||
"grounded": "Onderbouwd met geciteerde procedures",
|
||||
"insufficient": "Onvoldoende evidentie",
|
||||
"unavailable": "Kennisdienst niet beschikbaar"
|
||||
},
|
||||
"unavailableBody": "De kennisdienst is momenteel niet bereikbaar. Operationele functies zijn hier niet door beïnvloed — probeer later opnieuw.",
|
||||
"sourceVersion": "v{{version}}"
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"skipToContent": "Ga naar hoofdinhoud",
|
||||
"groups": {
|
||||
"operate": "Uitvoeren",
|
||||
"assure": "Bewaken"
|
||||
},
|
||||
"items": {
|
||||
"overview": "Overzicht",
|
||||
"fleet": "Wagenpark",
|
||||
"bookings": "Boekingen",
|
||||
"quality": "Datakwaliteit",
|
||||
"knowledge": "Kennis",
|
||||
"integrations": "Integraties",
|
||||
"audit": "Audit trail"
|
||||
},
|
||||
"primaryNavLabel": "Hoofdnavigatie",
|
||||
"mobileNavLabel": "Mobiele navigatie",
|
||||
"more": "Meer",
|
||||
"openNavigation": "Navigatie openen",
|
||||
"closeNavigation": "Navigatie sluiten",
|
||||
"sidebarEnvironment": "Demo-omgeving",
|
||||
"sidebarEnvironmentDetail": "Enkel synthetische gegevens",
|
||||
"resetDemoData": "Demogegevens herstellen",
|
||||
"resetConfirmTitle": "Demoreset bevestigen",
|
||||
"resetConfirmBody": "Alle synthetische wijzigingen worden ongedaan gemaakt en de deterministische demogegevens worden hersteld. Je wordt uitgelogd.",
|
||||
"resetting": "Bezig met herstellen…",
|
||||
"resetConfirmYes": "Ja, herstellen",
|
||||
"resetCancel": "Annuleren",
|
||||
"resetFailed": "Demogegevens konden niet hersteld worden.",
|
||||
"searchLabel": "Zoek in Fleet Ops",
|
||||
"searchPlaceholder": "Zoek wagenpark, boeking of onderdeel…",
|
||||
"searchShortcutHint": "Ctrl K",
|
||||
"searchSearching": "Zoeken…",
|
||||
"searchUnavailable": "Zoeken is momenteel niet beschikbaar.",
|
||||
"searchNoResults": "Geen resultaten voor \"{{query}}\".",
|
||||
"switchRole": "Wissel van rol",
|
||||
"switchRoleTitle": "Wissel van demo-rol",
|
||||
"languageSwitcherLabel": "Taal wijzigen"
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"list": {
|
||||
"eyebrow": "Bewaken / Werkbank",
|
||||
"title": "Datakwaliteit",
|
||||
"description": "Los evidentie-onderbouwde uitzonderingen op voor ze de werking verstoren.",
|
||||
"runScan": "Kwaliteitscontrole uitvoeren",
|
||||
"confirmScanTitle": "Kwaliteitscontrole bevestigen",
|
||||
"confirmScanBody": "Nu de deterministische controle over alle vijf regeltypes uitvoeren?",
|
||||
"scanning": "Bezig met controleren…",
|
||||
"confirmScanYes": "Ja, uitvoeren",
|
||||
"cancel": "Annuleren",
|
||||
"scanComplete": "Controle voltooid: {{summary}}",
|
||||
"scanNoNew": "geen nieuwe problemen gevonden (bestaande open problemen worden niet opnieuw aangemaakt).",
|
||||
"scanFailed": "Kwaliteitscontrole kon niet uitgevoerd worden.",
|
||||
"statusLabel": "Status",
|
||||
"statusAll": "Alle statussen",
|
||||
"statusOpen": "Open",
|
||||
"statusDeferred": "Uitgesteld",
|
||||
"statusResolved": "Opgelost",
|
||||
"statusRejected": "Verworpen",
|
||||
"ruleTypeLabel": "Regeltype",
|
||||
"ruleTypeAll": "Alle regeltypes",
|
||||
"demoScenariosOnly": "Enkel demoscenario's",
|
||||
"loading": "Kwaliteitswerkbank laden…",
|
||||
"queueClear": "Wachtrij is leeg",
|
||||
"noIssuesMatch": "Geen problemen komen overeen met de huidige filters.",
|
||||
"noDemoIssuesMatch": "Geen demoscenario-problemen komen overeen",
|
||||
"noDemoIssuesMatchDetail": "Vink 'Enkel demoscenario's' uit om de volledige wachtrij te zien.",
|
||||
"unavailable": "Datakwaliteitsproblemen zijn momenteel niet beschikbaar.",
|
||||
"count": "{{count}} problemen",
|
||||
"evidenceBacked": "Evidentie-onderbouwde detectie",
|
||||
"columns": {
|
||||
"reference": "Referentie",
|
||||
"rule": "Regel",
|
||||
"entity": "Entiteit",
|
||||
"severity": "Ernst",
|
||||
"status": "Status"
|
||||
}
|
||||
},
|
||||
"ruleTypes": {
|
||||
"possible_duplicate_customer": "Mogelijke dubbele klant",
|
||||
"missing_required_field": "Ontbrekend verplicht veld",
|
||||
"odometer_regression": "Afwijkende kilometerstand",
|
||||
"booking_overlap": "Overlappende boeking",
|
||||
"vehicle_status_conflict": "Statusconflict voertuig"
|
||||
},
|
||||
"severities": {
|
||||
"high": "Kritiek",
|
||||
"medium": "Waarschuwing",
|
||||
"low": "Info"
|
||||
},
|
||||
"detail": {
|
||||
"backLink": "Kwaliteitswerkbank",
|
||||
"eyebrow": "Kwaliteit / {{rule}}",
|
||||
"title": "Bekijk vastgelegde evidentie en registreer een geauditeerde oplossing.",
|
||||
"notFound": "Dit probleem kon niet gevonden worden.",
|
||||
"loading": "Probleemevidentie laden…",
|
||||
"managerOnly": "De kwaliteitswerkbank is enkel zichtbaar voor Operations Managers.",
|
||||
"managerOnlyDetail": "Datakwaliteitsevidentie en -oplossingen zijn enkel zichtbaar voor Operations Managers.",
|
||||
"summary": {
|
||||
"rule": "Regel",
|
||||
"entity": "Entiteit",
|
||||
"evidenceSummary": "Evidentiesamenvatting"
|
||||
},
|
||||
"resolved": {
|
||||
"title": "Probleem {{ref}} opgelost",
|
||||
"body": "De wijziging is doorgevoerd en vastgelegd in de audit trail.",
|
||||
"viewAudit": "Audit trail bekijken",
|
||||
"viewVehicle": "Voertuig bekijken",
|
||||
"continueDemo": "Ga verder met de demo"
|
||||
},
|
||||
"deferOrReject": {
|
||||
"heading": "Uitstellen of verwerpen",
|
||||
"description": "Stel uit om later opnieuw te bekijken, of verwerp als dit geen echt probleem is.",
|
||||
"defer": "Uitstellen",
|
||||
"reject": "Verwerpen",
|
||||
"deferFailed": "Kon dit probleem niet uitstellen.",
|
||||
"rejectFailed": "Kon dit probleem niet verwerpen."
|
||||
},
|
||||
"explainer": {
|
||||
"whatIsWrong": "Wat is er mis",
|
||||
"whyItMatters": "Waarom dit belangrijk is",
|
||||
"possible_duplicate_customer": {
|
||||
"whatIsWrong": "Twee klantprofielen delen identificerende gegevens (e-mail, telefoon of een erg gelijkende naam) sterk genoeg om waarschijnlijk dezelfde persoon te zijn, twee keer geregistreerd.",
|
||||
"whyItMatters": "Dubbele klanten verdelen de boekingsgeschiedenis over twee records, riskeren dubbele facturatie en verwarren klantcontacten."
|
||||
},
|
||||
"missing_required_field": {
|
||||
"whatIsWrong": "Dit record mist gegevens die vereist zijn voor normale werking (bijvoorbeeld een klant zonder e-mail of telefoonnummer).",
|
||||
"whyItMatters": "Zonder deze gegevens kan het bedrijf de klant niet bereiken, of het voertuig niet betrouwbaar identificeren voor compliance- en overdrachtscontroles."
|
||||
},
|
||||
"odometer_regression": {
|
||||
"whatIsWrong": "Een ingevoerde kilometerstand ligt lager dan de laatst bevestigde (canonieke) stand van het voertuig.",
|
||||
"whyItMatters": "Een dalende kilometerstand wijst meestal op een invoerfout of een verwisseld voertuig. Dit stilzwijgend doorlaten zou de onderhoudsplanning en de kilometerhistoriek bij wederverkoop verstoren."
|
||||
},
|
||||
"booking_overlap": {
|
||||
"whatIsWrong": "Hetzelfde voertuig is toegewezen aan twee boekingen met overlappende periodes.",
|
||||
"whyItMatters": "Slechts één van deze boekingen kan effectief worden nagekomen. Onopgelost zou een klant aankomen en merken dat zijn voertuig al bij iemand anders is."
|
||||
},
|
||||
"vehicle_status_conflict": {
|
||||
"whatIsWrong": "De opgeslagen operationele status van dit voertuig komt niet overeen met wat de eigen boekings- en inspectiegeschiedenis impliceert.",
|
||||
"whyItMatters": "Een foutieve status kan een niet-beschikbaar voertuig boekbaar laten lijken, of een beschikbaar voertuig verbergen voor het wagenpark."
|
||||
}
|
||||
},
|
||||
"duplicateCustomer": {
|
||||
"heading": "Vergelijken en samenvoegen",
|
||||
"description": "Kies de klant die behouden blijft en bekijk elk afwijkend veld.",
|
||||
"keepAsSurvivor": "Behouden als hoofdprofiel",
|
||||
"differs": "Verschilt",
|
||||
"match": "Gelijk",
|
||||
"mergePreview": "{{loser}} wordt een tombstone gekoppeld aan {{survivor}}; de boekingen worden herverbonden.",
|
||||
"mergeInto": "Samenvoegen met {{ref}}",
|
||||
"confirmMergeTitle": "Samenvoegen bevestigen",
|
||||
"confirmMergeBody": "{{loser}} samenvoegen met {{survivor}}? Dit kan niet ongedaan gemaakt worden.",
|
||||
"merging": "Bezig met samenvoegen…",
|
||||
"confirmMergeYes": "Ja, samenvoegen",
|
||||
"mergeFailed": "Kon deze klanten niet samenvoegen.",
|
||||
"bothMissing": "Beide klanten in deze vergelijking konden niet geladen worden.",
|
||||
"fieldColumn": "Veld",
|
||||
"fields": {
|
||||
"first_name": "Voornaam",
|
||||
"last_name": "Achternaam",
|
||||
"email": "E-mail",
|
||||
"phone": "Telefoon",
|
||||
"postal_code": "Postcode",
|
||||
"city": "Stad"
|
||||
}
|
||||
},
|
||||
"missingField": {
|
||||
"heading": "Ontbrekende velden invullen",
|
||||
"description": "Vervolledig het record voor {{ref}}. Het probleem wordt automatisch opgelost zodra niets verplichts meer ontbreekt.",
|
||||
"atLeastOne": "Minstens één van e-mail of telefoon is vereist.",
|
||||
"saveAndRecheck": "Opslaan en herchecken",
|
||||
"saving": "Opslaan…",
|
||||
"saveFailed": "Kon deze velden niet opslaan.",
|
||||
"fields": {
|
||||
"first_name": "Voornaam",
|
||||
"last_name": "Achternaam",
|
||||
"email": "E-mail",
|
||||
"phone": "Telefoon",
|
||||
"registration_number": "Kenteken",
|
||||
"make": "Merk",
|
||||
"model": "Model",
|
||||
"location": "Locatie"
|
||||
}
|
||||
},
|
||||
"odometerRegression": {
|
||||
"heading": "Kilometerafwijking oplossen",
|
||||
"description": "De laatst bevestigde kilometerstand wordt nooit automatisch verlaagd — kies hoe dit te verwerken.",
|
||||
"canonicalOdometer": "Laatst bevestigde kilometerstand",
|
||||
"decisionLegend": "Beslissing",
|
||||
"retainCanonical": "Laatst bevestigde stand behouden",
|
||||
"retainCanonicalDetail": "Behandel de ingevoerde stand als foutief; er verandert niets aan het voertuigrecord.",
|
||||
"correctReading": "Stand corrigeren",
|
||||
"correctReadingDetail": "Werk zowel de boeking als de laatst bevestigde kilometerstand bij met de juiste waarde.",
|
||||
"noBookingAttached": "Geen gekoppelde boeking bij dit probleem, dus enkel 'laatst bevestigde stand behouden' is beschikbaar.",
|
||||
"booking": "Boeking",
|
||||
"correctedOdometer": "Gecorrigeerde kilometerstand (km)",
|
||||
"note": "Notitie",
|
||||
"resolving": "Bezig met oplossen…",
|
||||
"resolveIssue": "Probleem oplossen",
|
||||
"resolveFailed": "Kon dit probleem niet oplossen."
|
||||
},
|
||||
"bookingOverlap": {
|
||||
"heading": "Boekingsoverlap oplossen",
|
||||
"description": "Blokkeer één van de twee overlappende verbintenissen. De andere behoudt zijn huidige status.",
|
||||
"columns": {
|
||||
"booking": "Boeking",
|
||||
"window": "Periode",
|
||||
"status": "Status",
|
||||
"blockThis": "Deze blokkeren"
|
||||
},
|
||||
"blockLabel": "{{ref}} blokkeren",
|
||||
"note": "Notitie",
|
||||
"resolving": "Bezig met oplossen…",
|
||||
"blockButton": "{{ref}} blokkeren",
|
||||
"blockButtonFallback": "Boeking blokkeren",
|
||||
"resolveFailed": "Kon deze overlap niet oplossen."
|
||||
},
|
||||
"vehicleStatusConflict": {
|
||||
"heading": "Statusconflict oplossen",
|
||||
"description": "Eén gezaghebbende regel beveelt een gecorrigeerde operationele status voor dit voertuig aan.",
|
||||
"currentStatus": "Huidige status",
|
||||
"calculateAndApply": "Aanbevolen status berekenen en toepassen",
|
||||
"confirmTitle": "Statuswijziging bevestigen",
|
||||
"confirmBody": "De gezaghebbende aanbevolen status voor dit voertuig toepassen?",
|
||||
"applying": "Bezig met toepassen…",
|
||||
"confirmYes": "Ja, toepassen",
|
||||
"applied": "Toegepast {{status}} — {{reason}}",
|
||||
"applyFailed": "Kon geen aanbevolen status toepassen."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"progress": {
|
||||
"capture": "Vastleggen",
|
||||
"review": "Nakijken",
|
||||
"result": "Resultaat",
|
||||
"ariaLabel": "Voortgang retourregistratie"
|
||||
},
|
||||
"capture": {
|
||||
"heading": "Voertuigretour registreren",
|
||||
"description": "Leg de staat bij inlevering vast. De volgende stap evalueert de exacte operationele gevolgen voor er iets wordt bevestigd.",
|
||||
"endOdometer": "Eindkilometerstand (km)",
|
||||
"fuelLevel": "Brandstofniveau (%)",
|
||||
"conditionLegend": "Voertuigstaat",
|
||||
"cleanlinessOk": "Netheid aanvaardbaar",
|
||||
"damageReported": "Schade gemeld",
|
||||
"technicalWarning": "Technische melding",
|
||||
"notes": "Notities",
|
||||
"evaluating": "Evalueren…",
|
||||
"reviewReturn": "Retour nakijken"
|
||||
},
|
||||
"review": {
|
||||
"heading": "Retourimpact nakijken",
|
||||
"description": "Dit is de gezaghebbende serverevaluatie van wat bevestigen zal doen — controleer dit voor het de wagenparkstatus bijwerkt en automatisering start.",
|
||||
"odometer": "Kilometerstand",
|
||||
"fuel": "Brandstof",
|
||||
"cleanliness": "Netheid",
|
||||
"cleanlinessAccepted": "Aanvaard",
|
||||
"cleanlinessFollowUp": "Opvolging nodig",
|
||||
"damage": "Schade",
|
||||
"damageReported": "Gemeld",
|
||||
"damageNone": "Niet gemeld",
|
||||
"technicalWarning": "Technische melding",
|
||||
"technicalWarningReported": "Gemeld",
|
||||
"technicalWarningNone": "Niet gemeld",
|
||||
"expectedState": "Verwachte wagenparkstatus:",
|
||||
"odometerRegressionWarning": "De ingevoerde kilometerstand ({{submitted}} km) ligt onder de laatst bevestigde stand ({{canonical}} km). De laatst bevestigde kilometerstand wijzigt niet en er wordt een datakwaliteitsprobleem geopend.",
|
||||
"nextBookingRisk": "Volgende boeking {{ref}} start {{when}} — mogelijk beïnvloed door deze retour.",
|
||||
"nextBookingLowRisk": "Volgende boeking {{ref}} start {{when}} — laag risico.",
|
||||
"commitList": {
|
||||
"inspection": "Retourinspectie aanmaken",
|
||||
"updateAtomic": "Boeking en voertuig atomair bijwerken",
|
||||
"queueAutomation": "Automatisering inplannen na de lokale verwerking"
|
||||
},
|
||||
"editDetails": "Gegevens bewerken",
|
||||
"registering": "Registreren…",
|
||||
"confirmReturn": "Retour bevestigen"
|
||||
},
|
||||
"result": {
|
||||
"committedLocally": "Lokaal verwerkt",
|
||||
"heading": "Retour geregistreerd",
|
||||
"inspection": "Inspectie",
|
||||
"resultingStatus": "Resulterende wagenparkstatus",
|
||||
"qualityIssue": "Datakwaliteitsprobleem",
|
||||
"noneCreated": "Geen aangemaakt",
|
||||
"automationEvent": "Automatiseringsopdracht",
|
||||
"queuedForDelivery": "Klaargezet voor verwerking ({{ref}}) — lokale verwerking gelukt; aflevering via automatisering gebeurt asynchroon en is nog niet bevestigd.",
|
||||
"nextBookingRisk": "Risico volgende boeking",
|
||||
"nextBookingRiskValue": "{{ref}} {{status}}",
|
||||
"atRisk": "— mogelijk beïnvloed",
|
||||
"lowRisk": "— laag risico",
|
||||
"noUpcomingBooking": "Geen aankomende boeking voor dit voertuig",
|
||||
"odometerRegressionNotice": "De ingevoerde kilometerstand lag onder de laatst bevestigde stand van het voertuig. Ze werd zo geregistreerd; de laatst bevestigde kilometerstand is niet gewijzigd en er is een datakwaliteitsprobleem geopend ter controle.",
|
||||
"viewVehicle": "Voertuig {{ref}} bekijken",
|
||||
"viewAutomation": "Automatiseringsstatus bekijken",
|
||||
"viewAudit": "Audit trail bekijken",
|
||||
"continueDemo": "Ga verder met de demo"
|
||||
},
|
||||
"scenario": {
|
||||
"title": "Demonstratiescenario: afwijkende kilometerstand",
|
||||
"body": "Dit voertuig staat momenteel op {{odometer}} km. Het onderstaande formulier is vooraf ingevuld met een retourstand die daaronder ligt — een teken van een foutieve invoer of een verwisseld voertuig. Bevestig de retour om te zien hoe Fleet Ops dit detecteert en afhandelt.",
|
||||
"preparing": "Scenario voorbereiden…"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user