防止特定语言环境的 getStaticPaths 运行

Prevent getStaticPaths running for specific locale

是否可以阻止 Next.js getStaticPaths 为特定语言环境生成静态页面?

在我的下一个配置中:

  i18n: {
    locales: ['default', 'en', 'hu', 'de', 'cz', 'eu', 'sl'],
    defaultLocale: 'default',
    localeDetection: true,
  },

那是因为我们一直需要语言环境,默认情况下 Next.js 不支持它,所以我们必须使用官方 Next.js 文档后面的中间件技巧: https://github.com/vercel/next.js/discussions/18419

但是现在当我想生成站点时,我不想生成像

这样的页面

如何防止 Next.js 这样做?因为这不起作用: 对于我的常见问题解答页面,其中 /help/[maincategory]/[subcategory]/[help].

使用slice(我将跳过默认语言环境):

 locales.slice(1).map((locale) => {
        pages.map((item) => {
          item.data.mainTabList?.[locale]?.map((main, mainidx) => {
            main.subTabList?.map((sub, subidx) => {
              questions.map((help) => {
                help.data.helplist?.[locale]?.map((title) => {
                  const urllink = {
                    maincategory: urlConverter(main.tab),
                    subcategory: urlConverter(sub.tab),
                    help: title.url
                  }
    
                  routes.push(urllink)
                })
              })
            })
          })
        })
      })

  const paths = routes.map((doc) => ({
    params: {
      maincategory: `${doc.maincategory}`,
      subcategory: `${doc.subcategory}`,
      help: doc.help?.toLowerCase(),
    },
  }))

谁能帮我解决这个问题,/default 页面不会生成,因为这只是我的语言环境前缀的一种 hacky 方式,我们不会在任何地方使用它。

可以通过在 paths 数组中返回所需的语言环境来控制 getStaticPaths 将为哪些语言环境生成路径。

来自 i18n Dynamic Routing 文档:

For pages using getStaticProps with Dynamic Routes, all locale variants of the page desired to be prerendered need to be returned from getStaticPaths. Along with the params object returned for paths, you can also return a locale field specifying which locale you want to render.


在您的情况下,您的 getStaticPaths 函数应大致如下所示。

export const getStaticPaths = ({ locales }) => {
    // Your own logic
    
    // Filter out the `default` locale, and map through the remaining locales
    locales.filter((locale) => locale !== 'default').map((locale) => {
        pages.map((item) => {
            item.data.mainTabList?.[locale]?.map((main, mainidx) => {
                main.subTabList?.map((sub, subidx) => {
                    questions.map((help) => {
                        help.data.helplist?.[locale]?.map((title) => {
                            const urlLink = {
                                maincategory: urlConverter(main.tab),
                                subcategory: urlConverter(sub.tab),
                                help: title.url,
                                locale // Also push current `locale` value to be used in `paths` array
                            }
                            routes.push(urlLink)
                        })
                    })
                })
            })
        })
    })

    const paths = routes.map((doc) => ({
        params: {
            maincategory: `${doc.maincategory}`,
            subcategory: `${doc.subcategory}`,
            help: doc.help?.toLowerCase(),
        },
        locale: doc.locale // Pass `locale` value here
    }))

    return {
        paths,
        fallback: false
    }
}