2

我正在尝试使用gatsby-plugin-intl向这个 gatsbyjs 模板添加多语言。

字段级翻译:由可翻译标记的每个字段都将有一个翻译,并且所有翻译都有一个内容项。

多树翻译:每个翻译都有自己的内容项,翻译保存在不同的文件夹中。

文件夹中的页面pages使用字段级翻译并且完全按应有的方式工作。文件夹中的页面content使用降价文件使用多树翻译,但不能完全按预期/应该工作。他们的路由已关闭。

基本上我想让这些页面遵循这个路由:

  • /en/mypage/应该给英文版
  • /ko/mypage/应该给韩版

但是,我现在得到以下降价源页面:

  • /en/mypage/en//ko/mypage/en/给出英文版
  • /en/mypage/ko//ko/mypage/ko/给出韩文版

我尝试在其中一个钩子(onCreatePage、onCreateNode、createPages)中重命名 slug,但到目前为止没有成功。尝试时,似乎其中一个版本(en/ko)被覆盖了,因此您最终只能为两条路线使用一种语言。如何解决这个问题?

例如amsterdamfurniturelab.nl/en/bear-desk/en变成amsterdamfurniturelab.nl/nl/bear-desk/en但不显示 nl 翻译。

4

1 回答 1

2

gatsby-plugin-intl仅支持字段级翻译,通过 Context 传递 JSON 翻译键。

插件的 README 中

您不必创建单独的页面,例如pages/en/index.jspages/ko/index.js[...] 该插件将为每种语言创建静态页面

因此,如果您有 2 种语言,比如 NL 和 EN,插件将为每个 slug 生成 3 个页面。因此,如果您有一个/bear-desk/页面,您将获得:

"/en/bear-desk/" <-- EN locale
"/nl/bear-desk/" <-- NL locale
"/bear-desk/" <-- default: either redirects or renders the default locale based on plugin settings

在您提供的存储库中,您gatsby-plugin-intl使用两个单独的页面同时使用“手动”翻译。

由于/bear-desk/en//bear-desk/nl/被插件视为两个不同的页面,因此您实际上为每个 slug 生成了 6 个页面:

For your /bear-desk/en/ page (no JSON translations found, all will be in EN)
"/en/bear-desk/en/"
"/nl/bear-desk/en/"
"/bear-desk/en/"

For your /bear-desk/nl/ page (no JSON translations found, all will be in NL)
"/en/bear-desk/nl/"
"/nl/bear-desk/nl/"
"/bear-desk/nl/"

如果您想更改此行为,您将使用 Gatsby 的createPageAPI 手动创建页面,gatsby-node.js并确保您在正确的 URL 上创建正确的页面。

有多种方法可以做到这一点。如果您需要灵感,在 Hiddentao上使用 Gatsby 构建多语言静态站点中描述了一个似乎与您的案例相近的示例。

如果您在实施过程中出现其他问题,请随时提出新问题,我很乐意为您提供帮助!

 更新

我已经能够在onCreatePageAPI 中创建正确的 URL:

/*
here's what we want to do:
 - for /nl/<slug>/nl/ create both /<slug>/ and /nl/<slug>/
 - for /en/<slug>/en/ create /en/<slug>/
 - for the rest of pages including <slug>, delete
*/

// note: optimally you would grab slugs from the fs or via graphql
const slugs = ["bear-desk", "cnc-explained"]

exports.onCreatePage = async ({
  page,
  actions: { createPage, deletePage },
}) => {
  slugs.forEach(slug => {
    if (page.path === `/nl/${slug}/nl/`) {
      // create page in the default language (NL) at /slug
      const defaultPage = { ...page, path: `/${slug}/` }
      createPage(defaultPage)
      console.log(`Created default page in NL at ${defaultPage.path}`)

      // create a page for /nl/slug
      const nlPage = { ...page, path: `/nl/${slug}/` }
      createPage(nlPage)
      console.log(`Created NL page at ${nlPage.path}`)

      // delete the page with duplicate locale
      deletePage(page)
      console.log(`Deleted ${page.path}`)
    }

    else if (page.path === `/en/${slug}/en/`) {
      // create a page for /en/slug
      const enPage = { ...page, path: `/en/${slug}/` }
      createPage(enPage)
      console.log(`Created EN page at ${enPage.path}`)

      // delete the page with duplicate locale
      deletePage(page)
      console.log(`Deleted ${page.path}`)
    }

    else if (page.path.includes(slug)) {
      // delete all other pages with that slug
      deletePage(page)
      console.log(`Deleted ${page.path}`)
    }
  })
}

你会得到你想要的路线:

"/en/<slug>/" <-- EN locale
"/nl/<slug>/" <-- NL locale
"/<slug>/" <-- default (NL locale in your case)

尽管这会在正确的路线上创建正确的页面,但有一个主要限制:gatsby-plugin-intl没有意识到这一点。这意味着您需要手动实现语言切换和链接到正确的语言环境。

这显然不是最好的解决方案,但由于插件不支持这种类型的本地化,我不确定是否有更集成的方式来做到这一点(也许其他人会有更好的想法)。

我建议的另一件事是在 repo上提出功能请求。祝你好运!

于 2020-04-01T19:51:25.960 回答