Open Source / Tooling
Next-i18n Starter
A reusable Next.js starter extracted from client work so multilingual routing, dictionaries, and language switching are easier to understand and build on.

While building the bilingual Bonanza Counseling Services website, I spent hours getting locale middleware, dictionaries, and the rest of the multilingual setup to work together. That experience gave me a working implementation, but it was still tied to a specific client project.
When a friend asked how to build a site in both Vietnamese and English, I decided a clean example would be more useful than a long explanation. I removed the Bonanza-specific content, kept the internationalization foundation, and published the result as a starter other developers could inspect or extend for their own languages.
01 / Context
Turn a difficult setup into a clearer starting point.
The project began as a practical way to share what I had learned without asking someone else to untangle a finished client website.
The trigger
A friend needed a multilingual Vietnamese-and-English site and had questions about how the pieces fit together in Next.js.
The constraint
The example needed to keep the useful structure from Bonanza without carrying over client content or assuming one fixed pair of languages.
The audience
I made the repository public so it could help my friend first and remain available to other developers facing the same setup work.
02 / Foundation
Keep the internationalization decisions visible.
The starter provides a small project where the locale flow can be read directly instead of being buried inside a larger product.
Locale-aware routing
Middleware and locale handling establish the language path before page content is rendered.
Dictionary-based copy
Language dictionaries keep translated content separate from the components that present it.
Detection and switching
Automatic locale detection works alongside a manual language control so visitors still have a clear choice.
03 / Reflection
Explaining the system improved the system.
Stripping the project down made the boundaries between routing, content, and interface decisions easier for me to see as well.
Reuse follows understanding
A reusable template became possible only after I had worked through the setup in a real client project.
Teaching tests structure
Preparing the repository for someone else exposed which pieces needed clearer separation and naming.
Client learning can travel
The public starter turns one project-specific lesson into a foundation that can support different sites and languages.