Skip to content
The foundation under itUI and contentinternationalization

English and Dutch

The workspace reads in your language from the first paint.

Growth-OS speaks English and Dutch as peers. Both catalogs are compiled into the app, so the first render is already in your language with nothing to fetch and nothing to flicker. If a phrase is added in one language and forgotten in the other, the build fails before anyone meets a raw key.

  • 2 complete languages, no partial one
  • 0 translation downloads at first load
  • 1 validated cookie that remembers the choice

How it works

The mechanism end to end, as implemented in the repository.

  1. 1

    The URL decides first

    A /nl prefix means Dutch. Without one, the app falls back to the account preference, then a strictly validated cookie, then the default.

  2. 2

    Pages render from compiled catalogs

    Copy reads from typed catalogs compiled into the app, so the server render and the first client render agree.

  3. 3

    Switching keeps your place

    The switcher rewrites the current URL, keeping path, query and hash, and updates the document language immediately.

  4. 4

    The choice sticks

    It is stored in a validated cookie and, for a signed-in teammate, on the account, so the next visit opens the same way.

Interactive example

See it working

This walkthrough demonstrates the implemented backend contract without using an account, credentials, or provider calls.

Interactive example

Explore the decisions this makes

Choose a sample state
Where our growth work lives

Deterministic sample data only. No account, provider, or network connection is used by the interaction.

The problem this solves

Without a shared foundation, every team rebuilds these edge cases, differently.

The raw key on a live page

A label is added in English and the Dutch line is forgotten. Nothing complains, and a Dutch reader meets an internal key on a settings page. Here that gap stops the build.

The link that changes language

Someone reading in Dutch shares a page, a colleague opens it in English because the choice only lived in a cookie, and the conversation restarts. Putting the language in the URL keeps it with the link.

The flash of the wrong language

Loading translations after the page means every first visit flickers from keys or English to the real text. Compiled catalogs leave nothing to wait for.

Highlights

Why it matters

The build catches a missing line

Both languages live side by side in one typed catalog. Add a phrase in one and forget the other, and compilation fails instead of shipping the gap.

The language travels with the link

Dutch pages live under /nl, so a link you paste into a channel opens in the language you were reading.

Nothing to wait for

Translations are compiled in, not fetched, so the server render and the first client render already speak the right language.

Engineering guarantees

What this does and does not promise

Safety boundary

This translates the application’s own words. It does not machine-translate anything, and what we type into a record, a decision, a meeting note or a campaign brief is stored and shown exactly as written.

Implementation evidence

The boundary above is code, not a claim. These files carry the contract:

  • src/modules/i18n/messages.ts
  • src/modules/i18n/locale-navigation.ts
  • src/modules/i18n/MODULE.md
Questions

Frequently asked questions

What english and dutch rests on

The docs describe the same contracts this page demonstrates.