1. 每个请求都会跑 middleware

    无论是页面首次渲染、RSC 数据请求,还是 Server Action 的 POST,都是各自独立的 HTTP 请求;每次请求都会经过 middleware.ts

    middleware 依据优先级 URL 前缀 → NEXT_LOCALE Cookie → Accept-Language → 默认语言 选出本次请求的 locale,并可更新 NEXT_LOCALE

  2. getRequestConfig / getTranslations 是“按请求 memoization”

    该请求里首次调用 getTranslations() 时,next-intl 会按上面的 locale 加载消息,并把 {locale, messages} memoize 到该请求的服务端渲染上下文

    同一请求内后续再调用,直接命中这份 memoized 结果;请求结束即释放,不做跨请求的数据缓存。

  3. Server Action 中的拿法

  4. 切换语言与一致性

    切换语言会触发新请求 → middleware 重新判定 locale。若没有用 [locale] 段路由,为避免客户端残留旧文案,可对承载消息的组件用 key={locale} 让其重建。

结论:不是全局 data cache。是“每次请求跑 middleware 选 locale” + “该请求内对翻译配置做 memoization”。Server Action 作为独立请求,会再跑一遍上述流程。



next-intl 运行时 在你首次调用 getTranslations()(或其它 i18n API)的时候,自动用 Next.js 的 headers() 去读这个 x-next-intl-locale,把它当成 requestLocale 参数传给你在 i18n/request.ts 里通过 getRequestConfig 定义的回调。