Sharing a project that pushed App Router i18n further than I expected to take it: a Big Five personality test with a 300 item questionnaire, 32 locales, and facet level scoring.
The two decisions that mattered most:
-
Finished results are encoded into a ~46 character share key instead of a database row, so the result page is fully rebuildable from its own URL and the landing pages stay static.
-
Questionnaire items are fetched from a static per-locale endpoint at run start and never enter indexable HTML, while scoring always maps back to the canonical English item order, so translations cannot move scores.
One gotcha worth sharing: root level files with a dot (/favicon.ico, /foo.txt) can fall through the middleware matcher into a [locale] dynamic segment and crash metadata generation with a 500 instead of a 404. A validity guard on the locale param fixed it.
Live: https://ipipneo.com/en The long questionnaire flow: https://ipipneo.com/en/ipip-neo-300