我在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钩子实现了多语言支持。更改语言时,我将所选语言存储在本地存储器中。我希望应用程序即使在页面刷新后也能保持所选语言,无缝地将页面翻译为所选语言。在更改语言后刷新页面时,我遇到了水合错误。服务器端检测到英语(默认语言),而客户端具有我选择的自定义语言,导致不匹配。
1条答案
按热度按时间i7uq4tfw1#
如果希望初始页面加载为正确的语言,则需要以与服务器共享的方式存储语言首选项。比如在URL
example.com/es
或example.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
中)。