gatsby-plugin-intl
仅支持字段级翻译,通过 Context 传递 JSON 翻译键。
从插件的 README 中:
您不必创建单独的页面,例如pages/en/index.js
或pages/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 的createPage
API 手动创建页面,gatsby-node.js
并确保您在正确的 URL 上创建正确的页面。
有多种方法可以做到这一点。如果您需要灵感,在 Hiddentao上使用 Gatsby 构建多语言静态站点中描述了一个似乎与您的案例相近的示例。
如果您在实施过程中出现其他问题,请随时提出新问题,我很乐意为您提供帮助!
更新
我已经能够在onCreatePage
API 中创建正确的 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上提出功能请求。祝你好运!