Для реализации интернационализации (i18n) в проектах на основе MDX необходимо правильно структурировать файлы с переводами. Основной принцип — разделение контента по языкам и компонентам, чтобы обеспечить лёгкую поддержку и масштабируемость.
Обычно структура проекта включает следующие уровни:
/locales
/en
common.json
home.json
about.json
/ru
common.json
home.json
about.json
locales — корневая директория для всех
переводов.en, ru) —
содержат файлы перевода для каждого языка.common.json,
home.json) — разделяют контент по страницам или логическим
блокам. common.json обычно содержит общие фразы интерфейса:
кнопки, заголовки, подсказки.Каждый JSON-файл должен содержать ключи и значения для локализации:
{
"title": "Главная страница",
"welcomeMessage": "Добро пожаловать на наш сайт"
}
MDX позволяет использовать JSX внутри Markdown, что делает возможным
динамическое получение текста из файлов переводов. Для этого обычно
применяют библиотеку react-i18next.
Пример подключения:
import { useTranslation } from 'react-i18next';
import { MDXProvider } from '@mdx-js/react';
function Page() {
const { t } = useTranslation('home'); // namespace home.json
return (
{t('title')}
{t('welcomeMessage')}
);
}
Ключевые моменты:
t динамически подставляет текст на выбранном
языке.useTranslation.MDX-файлы можно организовать параллельно с JSON-файлами:
/content
/en
home.mdx
about.mdx
/ru
home.mdx
about.mdx
Каждый MDX-файл импортирует необходимые компоненты и использует переводы:
import { useTranslation } from 'react-i18next';
export const Frontmatter = {
title: 'home'
};
export default function HomeContent() {
const { t } = useTranslation('home');
return (
<>
{t('title')}
{t('welcomeMessage')}
>
);
}
Такой подход позволяет:
t.locales и content.Для сложного контента допустимо использовать вложенные объекты в JSON:
{
"header": {
"title": "Главная",
"subtitle": "Лучший контент"
},
"footer": {
"contact": "Связаться с нами"
}
}
В MDX доступ к таким ключам осуществляется через точечную нотацию:
{t('header.subtitle')}
Это упрощает структуру и позволяет группировать фразы по смысловым блокам.
react-i18next поддерживает вставку динамических
значений:
{
"welcomeUser": "Добро пожаловать, {{name}}!"
}
{t('welcomeUser', { name: 'Алексей' })}
Такой подход особенно полезен для персонализированного контента в MDX.