You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@nuxtjs/i18n刷新后所选语言重置为默认语言问题排查

问题根因

现有配置缺失语言持久化和全链路语言检测逻辑。本地开发环境存在HMR状态残留,切换语言后热更新不会清空内存里的语言配置,所以表现正常;部署后页面全量刷新时,服务端渲染阶段拿不到用户此前选择的语言标识,就会直接回退到配置的defaultLocale。

修复方案

1. 补全i18n模块核心配置

在@nuxtjs/i18n的配置项中新增路由策略和浏览器语言检测配置,开启cookie持久化存储用户语言偏好:

[
 '@nuxtjs/i18n',
       {
           locales,
           defaultLocale,
           lazy: true,
           langDir: 'locales/',
           // 新增配置开始
           strategy: 'prefix_except_default', // 默认语言URL不带前缀,其余语言URL带/{langCode}前缀,刷新时可直接从URL识别语言
           detectBrowserLanguage: {
               useCookie: true,
               cookieKey: 'i18n_redirected',
               redirectOn: 'root',
               alwaysRedirect: false,
               cookieSecure: process.env.NODE_ENV === 'production'
           },
           // 新增配置结束
           vueI18n: {
               fallbackLocale: defaultLocale,
           },
       },
   ],
   ['~/.build/merge-and-compare-locales.js', { defaultLocale }],
]

如果不想让URL带语言前缀,把strategy改成no_prefix即可,但这种模式下必须依赖cookie存储语言标识,否则刷新时服务端无法识别用户语言选择。

2. 替换语言切换实现

不要直接调用$i18n.setLocale,该方法默认不会同步写入cookie、也不会触发路由更新,改用官方提供的路由跳转方式切换语言,自动完成状态同步、cookie写入、URL更新:

async changeLocale(code: string) {
  await this.$router.push(this.switchLocalePath(code))
}

如果确实不想触发路由跳转,在调用setLocale后手动写入对应cookie即可,cookie的key、过期时间、路径要和配置里的detectBrowserLanguage参数保持一致。

3. 部署环境排查

如果配置更新后部署仍然失效,检查反向代理(Nginx、CDN等)是否过滤了i18n_redirected这个cookie,确保请求能正常携带该cookie到服务端、响应头的Set-Cookie字段没有被拦截。


内容的提问来源于stack exchange,提问作者Dooxe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:36:07