middleware.ts
(通过 createMiddleware(routing)
)会在每个匹配的请求上执行,负责根据 URL 前缀、NEXT_LOCALE
Cookie 和 Accept-Language
头来选出最终的 locale
,并将其写入内部头部 X-NEXT-INTL-LOCALE
(同时更新 Cookie)。getRequestConfig
(及其衍生的 getTranslations
)在该请求上下文内做 memoization
getTranslations()
或任何基于 getRequestConfig
的逻辑时,next-intl 会执行你在 i18n/request.ts
里配置的异步函数,然后利用 React 的缓存机制,将 { locale, messages }
缓存到本次 React Server 渲染上下文里。i18n/request.ts
里通过 getRequestConfig
暴露的函数,并把(通常由 middleware 决定的)requestLocale
传进去;结果在当前请求内被 memoize。每个请求都会跑 middleware
无论是页面首次渲染、RSC 数据请求,还是 Server Action 的 POST,都是各自独立的 HTTP 请求;每次请求都会经过 middleware.ts
。
middleware 依据优先级 URL 前缀 → NEXT_LOCALE
Cookie → Accept-Language
→ 默认语言 选出本次请求的 locale
,并可更新 NEXT_LOCALE
。
getRequestConfig
/ getTranslations
是“按请求 memoization”
在该请求里首次调用 getTranslations()
时,next-intl 会按上面的 locale
加载消息,并把 {locale, messages}
memoize 到该请求的服务端渲染上下文。
同一请求内后续再调用,直接命中这份 memoized 结果;请求结束即释放,不做跨请求的数据缓存。
Server Action 中的拿法
getTranslations()
——它会用当前这个 Server Action 请求的 locale(经 middleware 决定)和本请求内的 memoization。locale
字符串,可在 Server Action 用 cookies()
读取 NEXT_LOCALE
,或用 headers()
读 accept-language
(但不如前者稳定)。切换语言与一致性
切换语言会触发新请求 → middleware 重新判定 locale
。若没有用 [locale]
段路由,为避免客户端残留旧文案,可对承载消息的组件用 key={locale}
让其重建。
结论:不是全局 data cache。是“每次请求跑 middleware 选 locale” + “该请求内对翻译配置做 memoization”。Server Action 作为独立请求,会再跑一遍上述流程。
next-intl
的 middleware
在每次页面/Action 请求上协商 locale(前缀/Cookie/Accept-Language),并把结果写到请求头 x-next-intl-locale
(同时可做 / → /en
的重写)。这样,后续的 Server Components / Server Actions 就能在该请求里拿到一致的 locale
。Next IntlNext IntlgetTranslations / getLocale / getMessages
时,next-intl
运行时会自动执行你在 i18n/request.ts
里通过 getRequestConfig
导出的函数,并把一个 requestLocale
(需 await
)传进去。这个 requestLocale
的来源就是上面的请求头(或路由前缀),然后结果会做按请求的 memoization(同一请求内复用)。Next IntlNext Intlheaders().get('x-next-intl-locale')
;但注意:显式读取 headers()
会让该段落改为动态渲染。通常不需要你手动读,交给 getTranslations()
即可。createMiddleware
在匹配到的请求上,协商出最终的 locale,然后把它写进响应里的 x-next-intl-locale
(同时可能做 URL 重写或写入 NEXT_LOCALE
cookie)。getTranslations/getLocale/getMessages
)时,运行时调用你导出的 getRequestConfig
,把 requestLocale
(来源就是这个 header/前缀)传进去;结果在本请求内 memoize。next-intl 运行时 在你首次调用 getTranslations()
(或其它 i18n API)的时候,自动用 Next.js 的 headers()
去读这个 x-next-intl-locale
,把它当成 requestLocale
参数传给你在 i18n/request.ts
里通过 getRequestConfig
定义的回调。
NEXT_LOCALE
/ Accept-Language
),并把结果写到请求头 x-next-intl-locale
(同时可更新 Cookie / 做重写)。getTranslations/getLocale/getMessages
)时,next-intl 运行时会 import 你的 i18n/request.ts
,调用 getRequestConfig
,把 requestLocale
(来自上面的请求头/前缀)传给你;你 await requestLocale
后返回 {locale, messages}
。