Добавление переключателя языка в markdown документацию
Добавим в next.config.js конфигурацию
// next.config.js
module.exports = withNextra({
// ...
i18n: {
locales: ['en', 'ru'],
defaultLocale: 'ru',
localeDetection: false,
},
// ...
})
Параметр localeDetection
в конфигурации Next.js определяет, должен ли Next.js автоматически определять язык пользователя на основе заголовков HTTP Accept-Language или других механизмов.
Если localeDetection
установлен в true
, Next.js будет использовать заголовки HTTP Accept-Language для определения языка пользователя. Если заголовки не указывают на конкретный язык, Next.js будет использовать язык, указанный в параметре defaultLocale
Если localeDetection
установлен в false
, Next.js не будет автоматически определять язык пользователя и будет использовать только язык, указанный в параметре defaultLocale
.
Важно: Если у вас есть параметр output: "export" необходимо удалить его
Добавим файл конфигурации для theme.config.tsx
// theme.config.tsx
const config: DocsThemeConfig = {
// ...
i18n: [
{ locale: 'en', text: 'English' },
{ locale: 'ru', text: 'Русский' },
],
// ...
}
Создаем файл middleware.js
// middleware.js
export { locales as middleware } from 'nextra/locales'
если у вас уже есть middleware.js то:
// middleware.js
import { withLocales } from 'nextra/locales'
export const middleware = withLocales(request => {
// Ваш middleware код...
})
Необходимо в директории /pages создать и наполнить, вместо обычных файлов md / mdx / json - файлы вида:
/pages
_meta.en.json
_meta.ru.json
index.en.md
index.ru.md
...
В этих файлах мы создаем контент на необходимом языке
Если вам необходимо сделать так, чтобы тема nextra тоже переключалась на другой язык:
Пример с footer. Нам необходим компонент footer:
// ./components/MyFooter.tsx
import { useRouter } from 'next/router';
const MyFooter = () => {
const router = useRouter();
const currentLocale = router.locale;
console.log(currentLocale);
return (
<footer className="nx-bg-gray-100 nx-pb-[env(safe-area-inset-bottom)] dark:nx-bg-neutral-900 print:nx-bg-transparent">
<hr className="dark:nx-border-neutral-800" />
<div className="nx-mx-auto nx-flex nx-max-w-[90rem] nx-justify-center nx-py-12 nx-text-gray-600 dark:nx-text-gray-400 md:nx-justify-start nx-pl-[max(env(safe-area-inset-left),1.5rem)] nx-pr-[max(env(safe-area-inset-right),1.5rem)]">
{currentLocale === 'en' ? 'documentation' : 'документация'}
</div>
</footer>
)
};
export default MyFooter
Дальше необходимо его встроить в тему:
// ./theme.config.tsx
//...
import MyFooter from "./components/MyFooter";
const config: DocsThemeConfig = {
// ...
footer: {
component: MyFooter,
},
// ...
}
export default config;