当我使用 next-translate/useTranslation 更改语言(英语除外)后刷新时,Next.js 中的水化错误

Hydration error in Next.js when I refresh after changing language(except english) using next-translate/useTranslation

提问人:Sushanth 提问时间:6/10/2023 最后编辑:juliomalvesSushanth 更新时间:6/10/2023 访问量:624

问:

我在使用 Next.js 应用程序中 next-translate 包中的 useTranslation 钩子时遇到了问题。虽然我的所有语言都被识别出来,但每当我更改语言和刷新页面时,我都会遇到冻结错误。

这是我在位于根目录的 i18n.js 文件中的设置:

module.exports = {
  locales: ["ar", "en","es"],
  defaultLocale: "en",
  pages: {
    "*": ["common"],
  },
};

我在我的组件中使用useTranslation,如下所示:

import useTranslation from "next-translate/useTranslation";

const ComponentName = () => {
  const { t } = useTranslation("common");
  // rest of the component
}

我已将所有翻译放在公共文件夹中。当我更改语言时,我会将新语言存储在本地存储中。

当我更改语言然后刷新页面时,会出现此问题。我收到冻结错误,因为服务器端语言被检测为英语,而客户端具有我选择并存储在本地存储中的自定义语言。

有没有办法解决这个问题,以便服务器端在刷新时识别所选语言?我已经尝试了所有方法。非常感谢任何帮助或指导。https://drive.google.com/file/d/1WSBKdXKTpOlQv6g2v1c2KpnZaZjecHhf/view?usp=sharing - 这是我的文件夹结构

我在Next.js应用程序中使用next-translate/useTranslation钩子实现了多语言支持。更改语言时,我将所选语言存储在本地存储中。我希望应用程序即使在页面刷新后也能保持所选语言,从而将页面无缝翻译成所选语言。更改语言后刷新页面时,我遇到了冻结错误。服务器端检测到英语(默认语言),而客户端具有我选择的自定义语言,导致不匹配。

JavaScript reactjs next.js 服务器端渲染 next-translate

评论

0赞 Tushar Shahi 6/10/2023
你能显示你从本地存储读取的代码吗?什么时候叫
0赞 Sushanth 6/11/2023
从 “i18next” 导入 i18n;从 “react-i18next” 导入 { initReactI18next };import { en } from “./en”;import { es } from “./es”;let defaultLanguage = “en” if(typeof window !== undefined) defaultLanguage = window.localStorage.getItem(“defaultLang”) ||“en” i18n.use(initReactI18next).init({ resources: { en: { translation: en, }, es: { translation: es, }, ar: { translation: ar, }, }, lng: defaultLanguage, fallbackLng: defaultLanguage, interpolation: { escapeValue: false, }, });导出默认 i18n;

答:

0赞 Sheraff 6/10/2023 #1

如果希望初始页面加载是正确的语言,则需要以与服务器共享的方式存储语言首选项。就像在 URLCookie 中一样。然后,您应该根据该值初始化语言,即使在服务器上也是如此。example.com/esexample.com?lang=es


如果您在 cookie 中设置了它,您还必须使用标题进行响应,该标题表明页面内容可能因 cookie 而异,如果您还有其他内容在 cookie 中从一个用户到下一个用户发生很大变化,这可能会有点糟糕......Vary

在服务器上,您还可以读取标题,以便更好地在第一次以正确的语言提供页面(如果这样做,则使用标题进行响应,指示内容可能会根据 )。Accept-LanguageVaryAccept-Language


如果您决定改用 URL,通常的选择(出于美观考虑)是 .因此,您需要一些重定向:example.com/es/page-name

  • 内部重写,转换为内部,以便内部命中正确的下一页代码,只需使用语言参数即可。这种重写应该对用户不可见,我知道这可以通过下一个中间件来完成/es/page-name/page-name?lang=fr
  • 如果需要,客户端重定向可能会使正在访问但已经为另一种语言设置了首选项的人example.comexample.com/es

这些是实际在服务器上生成不同语言的方法,但是如果您只想避免冻结错误,只需使用服务器设置的语言在客户端上初始化语言,然后立即更改它(在第一次渲染后执行)。useEffect