Skip to content

Established an English/Danish internationalization system with linter‑enforced vocabulary and a 400‑line namespace budget.

Full Stack Engineer

Situation. NextMariner runs in English and Danish, and translation systems have a way of sprawling into a mess. The files grow without limit, keys leak — present in one locale, missing in the other — and the language‑specific conventions get applied unevenly, so one locale ends up reading like it was translated by a committee that didn’t talk to each other. For a professional product that’s not a small blemish; it reads as carelessness.

Task. The internationalization setup had to scale — keeping both languages consistent and correct, and the files something a person could still maintain a year in.

Action. It’s built on next‑intl with rules the tooling actually enforces. The Danish side has a locked vocabulary and style — literal æøå, the informal “du”, the right imperative accents, and semantic mappings for compound nouns so they’re translated by meaning rather than word‑for‑word — and a linter holds it to that. There’s a hard 400‑line budget per namespace, with a split‑and‑merge approach so a big area divides into nested files that merge back cleanly instead of one file growing forever. A linter check compares keys across locales so nothing leaks or goes missing. And stored overrides are merged catalogue‑driven rather than with fragile top‑level fallbacks — the same deep‑merge idea used for preferences.

Result. Both locales stay correct and consistent, and the files stay maintainable as the string count climbs. Language quality became something the tooling guarantees on every commit rather than something that quietly degrades each time someone adds a string in a hurry.