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

am46iovg  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(237)

我在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钩子实现了多语言支持。更改语言时,我将所选语言存储在本地存储器中。我希望应用程序即使在页面刷新后也能保持所选语言,无缝地将页面翻译为所选语言。在更改语言后刷新页面时,我遇到了水合错误。服务器端检测到英语(默认语言),而客户端具有我选择的自定义语言,导致不匹配。

i7uq4tfw

i7uq4tfw1#

如果希望初始页面加载为正确的语言,则需要以与服务器共享的方式存储语言首选项。比如在URLexample.com/esexample.com?lang=es中,或者在cookie中。然后,您应该基于该值初始化语言,即使在服务器上也是如此。
如果你在cookie中设置了它,你还必须用Vary头来响应,表明页面内容可能会因cookie而异,如果你有其他内容,从一个用户到下一个用户变化很大,这可能有点糟糕...
在服务器上,您还可以读取Accept-Language头,以便在第一次以正确的语言提供页面(如果您这样做,请使用Vary头进行响应,表明内容可能会根据Accept-Language进行更改)。
如果您决定使用URL,通常的选择(为了美观)是example.com/es/page-name。所以你需要一些重定向:

  • 一个内部重写,将/es/page-name转换为/page-name?lang=fr,以便在内部找到正确的Next page代码,只需使用语言参数。这种重写应该是不可见的用户,我知道这可以做到与下一个中间件
  • 客户端重定向(如果需要),可以将正在访问example.com但已设置了另一种语言的首选项的用户重定向到example.com/es

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

相关问题