bounty 7天后到期。对这个问题的回答有资格获得+100的声誉奖励。James正在寻找来自可靠来源的答案。
我有一个多语言的网站,需要设置的每个页面的语言的HTMLLang属性。
我尝试在上下文中传递该值,但不会在页面更改时更新。
以下是当前代码:
import Document, { Html, Head, Main, NextScript } from 'next/document'
import GlobalContext , {eLanguage }from '../components/GlobalContext' //my global context
export default class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx)
return { ...initialProps }
}
static contextType = GlobalContext;
render() {
console.debug('Started')
console.debug('language:'+ this.context.language)
return (
<Html lang={eLanguage[this.context.language]}> //if the first page loaded as lang 'en' it sets 'en' and apply to all other pages.
<Head>
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
更新:每个页面的语言都可以从页面路径中推断出来
9条答案
按热度按时间gg58donl1#
我认为这里最好的解决方案是使用一个定制的
./pages/_document.js
文件并覆盖文档本身。更多解释可以在这里找到:https://nextjs.org/docs/advanced-features/custom-document
z8dt9xmd2#
Next 10支持Internationalized Routing,将动态添加
lang
,为您留下:xpcnnkqh3#
如果使用next/head,则可以将语言设置为html标记。您传递给Head组件的任何内容都将放置在
<head>
或<html>
中。Next Head的工作原理类似于React Helm ,因此对于您的情况,可以执行以下操作:
<html lang={lan} />
添加到组件。然后,您可以将所需的语言传递给该组件,然后在所需的页面上导入该组件。
该html位将被注入到
<html>
标记中。请注意,即使我们这样注入它,控制台也会记录以下错误:
TypeError: n is null
。neekobn84#
我通过将以下代码添加到next.config.js文件实现了这一点:
我不需要创建自定义_Document.js
7kqas0il5#
在
pages``文件夹中创建
_document.js`,并使用以下命令:对于本地化,请使用
next.config.js
cigdeys36#
Nextjs 10以后的版本提供了默认的本地化支持,您不必进行太多配置。
它会自动将lang属性添加到html中,但仍然直到现在v12才支持dir属性来包含我们可以在**_文档文件**中使用的这个小技巧。
最终结果为
nqwrtyyt7#
使用Document对象可以如下设置lang属性:
在页面加水之前,不会在初始html上设置此lang属性,但仍将通过Chrome“hrefang”审计检查。
mlnl4t2r8#
您可以使用Reaction useEffect挂钩来设置文档的语言,而不必更改Next.js本身生成HTML标记的方式。
在页面组件或其他适当的组件中,包括useEffect挂钩:
然后添加挂钩:
这将通过LighTower的“hrefang”检查,如果您的站点有多种语言,您可以使用它来设置每个页面的页面语言。
cl25kdpy9#
要覆盖默认的nextjs设置,请创建./Pages/_Document.js文件并扩展Document类,如下所示:
允许将自定义属性用作道具,如lang:
您可以在此处阅读有关自定义文档的更多信息:https://nextjs.org/docs/advanced-features/custom-document