
From MUI to shadcn/ui: rebuilding our design system
Lessons from migrating off a heavy runtime CSS-in-JS library to a code-you-own component library.
How next-intl and a localized Firestore schema let us ship every page in both languages.
By Kamga Simo Junior
Most multilingual sites I've seen are English-first with a French translation layered on later — and the seams show. We wanted EN and FR to be peers from day one.
Every URL begins with the locale: /en/about, /fr/about. No domain switching, no subdomains. next-intl middleware handles the redirect on first visit, persists the choice in NEXT_LOCALE, and emits the right hreflang tags.
Every content document carries both translations as sibling fields: title.en and title.fr. Renders read the active locale and fall back to en with a small dev-mode badge if the FR field is missing. No separate French collection, no translation drift.
French is, on average, 25% wider than English for the same text. Every component is designed with that headroom — buttons, nav items, hero copy — so the FR version doesn't break the layout.

Lessons from migrating off a heavy runtime CSS-in-JS library to a code-you-own component library.

App Router, React Server Components, and a Firebase backend — the decision behind the J7Soft website stack.