One accessor, everywhere
Transformed code reaches the active i18n instance through exactly one function: getI18n(). There is no provider to mount, no second hook for server components, and no separate RSC entry point. The same component code runs unchanged in a server component, a client island, or an Express route handler.
Request-local scope on the server
On the server the active locale lives in request-local async context, so concurrent requests in different languages never see each other's state. This is the mechanism Context cannot provide and the reason no bypass is needed — the lookup was never tied to the render tree in the first place.
One locale for the client document
In the browser the same accessor is a plain getter initialized before translated UI hydrates. Locale changes navigate the document, which keeps framework state, module caches, and the server-rendered language aligned.
Not a Next.js feature
The same model runs across 6 server frameworks, including the RSC-capable ones beyond Next.js — Waku and TanStack Start among them. Server-component support here is a property of the architecture, not an integration written for one framework.