Het hele portaal nu in vier talen
Nederlands, Engels, Duits en Frans — inclusief demo-omgevingen per taal. Je klanten werken in hun eigen taal, jij in de jouwe.
Twee taal-paden, één schone splitsing
Voorheen — Vertalen is niet moeilijk — vertalen consistent uitrollen over een portaal met 2.000 UI-strings, een marketingsite, en klanten die in een andere taal zitten dan hun bureau, dat is het probleem. De halve implementatie zou zijn: alleen ingelogde gebruikers laten wisselen. Dan bezoekt een Duitse prospect senly.io/features in Engels en gaat weg.
Nu — De taal-detectie loopt via twee paden. Uitgelogd: één cookie portal_locale op .senly.io die alles op de marketingsite en de demo-omgeving beslist. Ingelogd: User.preferredLanguage die alles in de app beslist. Bij inloggen synct de cookie naar het account (via LanguageAccountSync). Bij uitloggen blijft de cookie. Geen dubbele bron, geen verrassing.
Waarom de klant zijn eigen taal krijgt, niet die van het bureau
Voorheen — De eerste versie liet het bureau kiezen welke taal zijn klanten kregen. Dat werkte tot een Nederlands bureau met een Franse restaurant-klant zijn factuur in het Nederlands stuurde. De klant belde in stress: "je verstaat me niet, ik ben Frans."
Nu — Elke klantrecord heeft een eigen locale. Facturen, offertes, boekingsbevestigingen, welkomstmails — alles wat de klant ziet gebruikt de klant-locale. Wat het bureau ziet (dashboard, portaal-UI) gebruikt de bureau-locale. Twee kolommen, twee lezers, geen kruisverontreiniging.
Demo-omgevingen per taal — met echte inhoud, geen placeholder
Voorheen — Een demo in de taal van de bezoeker is niet Google Translate op live-data — het is een aparte demo-tenant per taal met naam-varianten, bedrijfsnamen, factuur-teksten die voor die markt kloppen. Anders herkennen bezoekers meteen "dit is Nederlands met een vlaggetje eroverheen".
Nu — Vier demo-tenants (demo-bureau-nl, demo-bureau-en, demo-bureau-de, demo-bureau-fr) met eigen klantnamen, eigen content, eigen cinematic-scroll-frames. Elke start via /api/demo/start?lang=<x> zet de cookie en logt in de juiste demo-tenant in. De bezoeker ziet in vijf seconden hoe zijn markt eruit zou zien in Senly.
Vertaal-invariante changelog
Voorheen — De changelog verandert dagelijks; live vertalen bij het laden zou een LLM-call per pagina-weergave zijn. Dat is duur, langzaam, en niet-cacheable.
Nu — Elke changelog-entry heeft een permanent vertaalde JSON in lib/changelog-i18n-static.json. Bij een nieuwe entry vertaalt een cron 'm één keer (naar de vier talen) en committen we de output naar de repo. De pagina leest daarna alleen statische strings. Read-pad matcht niet op sourceHash want dat zou strikt na elke tekstwijziging refetchen — wél op een compensatie die kleine polish-edits doorlaat.
Wat je er merkbaar door doet
Nu — De AI-agents (support-chat, content-suggesties, klantprofielen) reageren nu in de taal van de vrager, niet in de taal van de tenant. Google-indexering laat SEO-varianten van senly.io in vier talen zien. Marketingteams van bureaus die zowel Nederlandse als Duitse klanten hebben schakelen tussen talen met één taalkiezer in de portaal-header. En de mockup op de homepage — inclusief 140 cinematic frames per taal — draait ook in de nieuwe talen.