Next.js 10 +子路由,如何在服务器端的自定义应用中访问区域设置

阿里·阿夫萨(Ali Afsah)

我正在将一个项目从next.js 7迁移到10。它使用react-intl进行翻译,并且是用TypeScript编写的。

在以前的版本我有一个自定义的server.js和处理子路由多语言的目的(/日,/ FR等),在它在自定义应用程序组件中,通过getInitialProps,我req获取语言环境并将其作为道具传递给我的组件。所以整个图片是这样的:自定义应用程序:

static async getInitialProps({ Component, ctx }) {
    let pageProps = {}

    const { req } = ctx;
    const { locale, messages } = req || (window as any).__NEXT_DATA__.props;
    const initialNow = Date.now();

    if (Component.getInitialProps) {
        pageProps = await Component.getInitialProps(ctx)
    }
    return { pageProps, locale, messages, initialNow }
}

和组件

render() {
        const { Component, pageProps, locale, messages, initialNow } = (this.props as any);
        return (
            <Container>
                <IntlProvider locale={locale} messages={messages} initialNow={initialNow}>
                    <Component {...pageProps} />
                </IntlProvider>
            </Container>
        )
    }

现在,由于我使用next.js 10,出于多种原因,我删除了自定义server.js并通过i18n进行了子路由,因此我在next.config.js中添加了它:

module.exports = {
   i18n: {
        locales: ["en", "de", "fr"],
        defaultLocale: "en",
    },
}

唯一的事情是,我需要在服务器端以及所有页面中将语言环境传递给react-intl的IntlProvider。所以我想我应该在自定义应用程序中执行此操作,并且getInitialProps返回的语言环境值错误(始终为默认值)而且我们不能在自定义_app中使用getServerSideProps或getStaticProps。

所以最后!问题是:如何在所有页面的一个地方访问服务器端的语言环境?还是有更好的方法来解决此问题?

(我目前无法删除intl并与i18n完全兼容,这个特定项目需要太多时间,而我们没有atm!)

提前致谢

朱利奥马尔维斯

您可以通过道具locale在自定义应用中访问getInitialPropsrouter

static async getInitialProps({ Component, ctx, router }) {
    let pageProps = {}

    const { req } = ctx;
    const { locale } = router; // Will return `fr` for `/fr/*` pages
    const { messages } = req || (window as any).__NEXT_DATA__.props;
    const initialNow = Date.now();

    if (Component.getInitialProps) {
        pageProps = await Component.getInitialProps(ctx)
    }
    return { pageProps, locale, messages, initialNow }
}

您可以查看i18n路由文档以了解更多详细信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在next.js应用程序中从服务器端获取客户端的IP地址?

如何在不使用自定义服务器的情况下在Next.js中设置自定义HTTP响应标头?

动态路由在Next JS中呈现在服务器端还是客户端?

内容丰富的服务器端在Next.js中呈现动态路由?

Next.JS:如何在服务器端发出所有请求

具有自定义快递服务器的Next.js重新呈现所有自定义路由

如何使用自定义服务器 (Nest.js) 构建生产 Next.js

为 Next.js 的服务器文件设置自定义目录

Next Js中的子路由

如何在 next.js 中使用来自客户端的数据执行服务器端代码

Next.js 客户端自定义钩子并防止“与服务器/客户端不匹配”错误

Next.js:在getInitialProps()中获取数据:服务器端与客户端

Next Js中如何去除URL中的重复斜杠,如何拦截和修改服务器端getServerSideProps的请求?

如何访问 Next.JS 自定义 404 页面上的当前路由?

如何在 Next JS 中导入自定义字体?

在Emotion 11 / Next js 10应用程序中启用CSS道具的正确方法是什么

服务器端在React中使用Next.js加载全局组件

使用next.js与传统SSR进行服务器端渲染

服务器端渲染不适用于生产构建 Next.js

(材料UI / Next.js)从服务器端渲染停止useStyles

使用Next.js在服务器端呈现反应查询

无法在 Next.js 中获取动态组件以跳过服务器端渲染并仅在客户端上显示

是否可以在 Next.js 中通过国际化重定向服务器端?

Next.js路由器区域设置问题

如何在 next.js 中设置初始路由?

我在客户端使用 next.js 工作,在服务器端使用 node.js 表达

Next.js-在文件中导入服务器端程序包同时包含服务器端和客户端功能吗?

使用Express服务器将多个参数传递给Next.js自定义URL

如何在 js/googlescript 中访问从客户端到服务器端的对象数组中传递的变量