Возможно, это неправильное решение для вас, но .. Вы пробовали gatsby-plugin-i18next ?Мои первые проекты с gatsbyjs - это была кошмарная сделка с языками, пока я ее не нашел.На мой взгляд, это работает действительно хорошо.Вы должны установить с помощью npm / yarn и немного настроить.Вы можете удалить обертку IntlProvider и выполнять переводы в любом месте (страницы / шаблоны или компоненты).
Здесь и пример извлечен из вашего кода (английский и испанский языки).Плагин заботится о URL, помещая / es & / en на каждой странице / шаблоне:
src / pages / index.jsx
import React from 'react';
import { I18n } from 'react-i18next';
import { withI18next } from 'gatsby-plugin-i18next';
import Layout from '../components/index'
const IndexPage = props => (<I18n>{t => (
<Layout{...props}>
<p>{t('hello')}</p>
<p>{t('hello')}</p>
</Layout>
)}</I18n>);
export const query = graphql`
query($lng: String!){
locales: allLocale(filter: { lng: { eq:$lng }, ns: { eq: "messages" } }) {
...TranslationFragment
}
}
`;
export default withI18next()(IndexPage);
src / components / index.jsx
Обратите внимание, что вы также должны изменить шлем.Я перевожу метаданные, чтобы показать, как можно переводить в компонентах (не на страницах и не в шаблонах).
import React from 'react';
import PropTypes from 'prop-types';
import { translate } from 'react-i18next';
import { Head } from 'gatsby-plugin-i18next';
import { StaticQuery, graphql } from 'gatsby'
import Header from './header'
import './layout.css'
const Layout = ({children, t }) => (
<StaticQuery
query={graphql`
query SiteTitleQuery {
site {
siteMetadata {
title
}
}
}
`}
render={data => (
<>
<Head hreflang>
<title>{data.site.siteMetadata.title}</title>
<meta name="description" content="{t('metaDescription')}" />
<meta name="keywords" content="{t('metaKeywords')}" />
</Head>
<Header lang="/^\/eng/" />
<div
style={{
margin: '0 auto',
maxWidth: 960,
padding: '0px 1.0875rem 1.45rem',
paddingTop: 0,
}}
>
{children}
</div>
</>
)}
/>
)
Layout.propTypes = {
children: PropTypes.node.isRequired,
}
export default translate()(Layout)
gatsby-config.js Вы можете отлаживать плагин только во время разработки;)
const defaultLanguage = "en";
const languages: ["en", "es"];
const siteUrl: "https://domain-where-the-gatsby-are-published.com/",
module.exports = {
...,
plugins: [
...,
{
resolve: `gatsby-plugin-i18next`,
options: {
availableLngs: languages,
fallbackLng: defaultLanguage,
debug: process.env.NODE_ENV === 'development',
siteUrl
},
}
],
}
locale / en / messages.json
{
"hello": "Hi!",
"metaDescription": "Sample page with i18n translations",
"metaKeywords": "i18n, gatsbyjs, english"
}
locale / es / messages.json
{
"hello": "Hola!",
"metaDescription": "Página de ejemplo con traducciones i18n",
"metaKeywords": "i18n, gatsbyjs, spanish"
}
В качестве дополнительных комментариев:
- Не забудьте изменить все ссылки, импортированные из gatsby на gatsby-plugin-i18next
- Вы должны вводить запрос graphql на каждой странице / шаблоне
- Вы можете увидеть код starter , чтобы увидеть, как вы можете создать переключатель между языками