Routing pattern is an SEO decision—not just folders
Next.js locales can hang many ways; migrating paths later is expensive. Choose with Chinese-primary market, SEO, and CMS preview in mind. We default Chinese at root, English at /en, middleware only when needed—no forced redirects that break shared links. Below: patterns and implementation notes. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
Subpath vs domain
Subpaths simplify implementation and certs; domains fit strong brand splits. Most ZH/EN sites are fine on subpaths. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
Default locale and prefixes
When Chinese is unprefixed, English must stably live under /en. Link helpers must not hardcode strings. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
Middleware detection strategy
Accept-Language can suggest, but respect user choice and shared URLs. Avoid SEO-hostile forced redirects. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
Static generation and dictionaries
Generate static pages per locale; split dictionaries to cut unused packs. Watch empty paths on dynamic segments. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
CMS preview and draft locales
Preview links carry locale; unfinished translations cannot publish. Align editorial workflow with route params. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
SEO integration points
Metadata, sitemap, hreflang, canonical all export from one route table. Single source reduces drift. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
Migration checklist
301 old locale paths to new pattern; GSC change-of-address if applicable; spot-check inbound links. Fold this into KSX discover→design→build→launch checks on staging so verbal alignment does not drop the requirement. Fold this into KSX Studio discover→design→build→launch: named owner, Definition of Done, staging proof, and rollback so verbal alignment does not drift.
Checklist
- 1Document routing pattern + default locale
- 2Unified link helper for locale URLs
- 3Middleware does not break shared links
- 4Sitemap/hreflang generated from same source
- 5Old path 301s + spot checks done
Key takeaways
- Routing is expensive to migrate—lock in discovery.
- One route table drives SEO artifacts.
- User choice and shareability beat automatic guessing.
FAQ
- Built-in App Router i18n?
- You own conventions, middleware, dictionaries—product decisions remain.
- Adding more languages?
- Subpaths scale cheaper; ensure CMS and translation state machines keep up.
- Where to put language switch?
- Globally discoverable; switch to equivalent path or fall back to locale home.