A multilingual website on Sanity and Next.js is mostly a modelling decision made in week one, then a routing and SEO job. Get the content model wrong and every language you add multiplies the pain. This is the order I work in: content model, routing, hreflang and sitemaps, then the editor workflow.
If you want the next-intl wiring in more detail, I covered it in Sanity multilingual content in Next.js with next-intl . This post is the wider decision flow around it.
Document-level vs field-level i18n in Sanity
There are two models, and they suit different content.
Document-level Field-level
Shape One document per language, linked by a translation key One document, each field is an object keyed by locale
Slugs per language Natural Awkward
Publish per language Yes No, one publish for all
Partial translation Easy, missing doc just does not exist Messy, empty fields everywhere
Studio clutter More documents Wide, long forms
Best for Pages, posts, products Labels, short UI strings
My default is…