【问题标题】:Failing to get quite simple i18n and dynamic routing to work with Next.js无法获得非常简单的 i18n 和动态路由来使用 Next.js
【发布时间】:2022-01-01 09:53:56
【问题描述】:

首先要做的事情 - 我已经阅读了 Next.js 文档,通过了教程,查看了许多示例,但归根结底,我仍然无法使用 Next.js 实现一个非常简单的事情.

我有一个具有以下语言环境的应用程序:ende

路线如下所示:

/en/things/[id]
/de/things/[id]

所以基本上,我需要用两种语言显示一些与事物 ID 无关的静态文本。这些只是对所有 ID 都相同的纯文本。然后我有一些 AJAX 实际上需要路径中的 ID。

现在麻烦开始了:

  1. 如果我在things/[id].js 中没有getStaticProps,则会收到此错误:
Error: MISSING_MESSAGE: No messages were configured on the provider.
  1. 然后我像这样添加getStaticProps
export async function getStaticProps({locale}) {
  return {
    props: {
      messages: await import(`../messages/${locale}.json`)
    }
  }
}

并得到这个错误:

Error: getStaticPaths is required for dynamic SSG pages and is missing for '/things/[id]'.
  1. 然后我像这样添加getStaticPaths
export const getStaticPaths = () => ({
  paths: [],
  fallback: 'blocking'
})

因为我有一百万个 ID,我无法预先生成所有页面。此外,新 ID 会在应用部署后出现,因此我无法在构建期间将所有可能的 ID 作为路径列出。

现在我收到此错误:

Error: Error serializing `.messages` returned from `getStaticProps` in "/things/[id]".
Reason: `object` ("[object Module]") cannot be serialized as JSON. Please only return JSON serializable data types.

我无法相信在一个声称使用 React 可以让生活更轻松的“框架”中实现如此简单的事情怎么会如此困难。我正在尝试将现有应用程序从 create-react-app 迁移到 Next.js,但是非常简单的事情很难实现。

请告诉我如何实现以下非常简单的事情:

  1. 拥有一个静态页面,其中包含两种语言的静态文本:EN 和 DE。
  2. 让用户像这样访问页面:/[locale]/things/[id]
  3. 有一些实际使用 URI 路径中的事物 ID 的 AJAX 代码。

【问题讨论】:

  • 我也面临同样的问题!我可以做一件事或另一件事,但不能两者兼而有之。我决定不使用 getStaticPaths,因为我也有数千个 ID,而且我可以在一开始只预渲染几个,但在请求时这样做更有意义。现在,如果有人试图访问像 /orders/:id 这样的 url,它会进入到自身的无限重定向循环(也使用文档中的一个非常虚拟的示例)
  • 但如果我从配置中删除 i18n 设置,它可以工作。
  • 啊,在您的情况下,问题似乎是因为您没有将语言环境返回到 getStaticPaths 中的路径。你需要这样做。

标签: javascript reactjs next.js nextjs-dynamic-routing


【解决方案1】:

您不应该为本地语言创建 2 个单独的路由,而是设置 next-i18next 它会根据所选的本地语言自动同步您的链接。

【讨论】:

  • 我没有 2 条路线。我有 1 个页面/组件,1 个路由 /things/[id]en | de 部分路径由配置处理。我正在使用"next-intl": "2.3.3"
  • 试试我提到的这个包,它非常简单,在 Next.js 社区中很受欢迎,我亲自使用过,配置起来也容易得多。
  • 谢谢。我设法使用next-i18nextgetServerSideProps 来完成这项工作。尽管如此,我仍然很困惑为什么我必须将我的静态页面转换为服务器端呈现的页面才能让翻译工作。翻译只是静态文本,不需要服务器端渲染。我应该能够在构建时拥有它们。
  • 是的 next-i18next 有组件基础翻译,你可以使用 t 函数来做到这一点。从“next-i18next”导入 { useTranslation };现在在组件内部使用 Hook const { t } = useTranslation("common");里面返回

    {t("news-letter")}

  • @ric980 next.js i18n 功能在导出到静态网站 (SSG) 时无法使用,解决方法可以是:dev.to/adrai/…
猜你喜欢
  • 2015-01-12
  • 2022-01-10
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2020-10-11
  • 2021-02-18
  • 2020-09-08
相关资源
最近更新 更多