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

Next.js使用next-translate切换非英语语言刷新时遇Hydration错误

解决Next.js + next-translate刷新页面Hydration错误问题

问题根源

服务端渲染时无法读取localStorage,会默认使用i18n.js中配置的en语言;而客户端Hydrate时会读取localStorage中存储的自定义语言,两者渲染内容不匹配,触发Hydration错误。

解决方案:用Cookie同步服务端与客户端语言

服务端可以读取Cookie,因此将选中的语言存储到Cookie中,让服务端渲染时能获取到用户选中的语言,保证两端内容一致。

1. 切换语言时写入Cookie

安装js-cookie简化Cookie操作(也可使用原生document.cookie):

npm install js-cookie

编写切换语言的函数:

import Cookies from 'js-cookie';

export const switchLanguage = (locale) => {
  // 将语言写入Cookie,设置有效期1年,作用域为根目录
  Cookies.set('NEXT_LOCALE', locale, { expires: 365, path: '/' });
  // 同步更新localStorage(可选,兼容原有逻辑)
  localStorage.setItem('selectedLanguage', locale);
  // 刷新页面或通过路由跳转生效(根据你的路由模式选择)
  window.location.href = `/${locale}${window.location.pathname}${window.location.search}`;
};

2. 配置next-translate从Cookie读取语言

修改根目录i18n.js,关闭自动语言检测,添加自定义语言解析逻辑:

const Cookies = require('js-cookie');

module.exports = {
  locales: ["ar", "en","es"],
  defaultLocale: "en",
  pages: {
    "*": ["common"],
  },
  localeDetection: false, // 禁用默认语言检测
  localeResolver: (locale, req, res) => {
    // 服务端从请求Cookie中读取语言
    if (req) {
      const cookieLocale = req.cookies?.NEXT_LOCALE;
      if (cookieLocale && ["ar", "en", "es"].includes(cookieLocale)) {
        return cookieLocale;
      }
    } else {
      // 客户端优先从Cookie读取,其次是localStorage
      const cookieLocale = Cookies.get('NEXT_LOCALE');
      const storageLocale = localStorage.getItem('selectedLanguage');
      return cookieLocale || storageLocale || "en";
    }
    return "en";
  },
};

3. 验证效果

切换非英语语言后刷新页面,服务端会从Cookie中读取选中的语言进行渲染,客户端Hydrate时内容与服务端完全一致,不会再触发Hydration错误,同时能维持用户选中的语言状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:55:21