Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійськоюЯкщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.
Посилання на документацію на GitHubСкопіювати документацію у форматі Markdown в буфер обміну
Як інтернаціоналізувати сайт на Next.js 15 з next-i18next та Intlayer | Internationalization (i18n)
Для кого це керівництво
- Junior: Дотримуйтесь точних кроків та копіюйте блоки коду. Ви отримаєте робочий багатомовний додаток.
- Mid-level: Використовуйте чеклісти та позначки найкращих практик, щоб уникнути типових помилок.
- Senior: Перегляньте високорівневу структуру, розділи про SEO та автоматизацію; тут ви знайдете розумні налаштування за замовчуванням і точки розширення.
Що ви створите
- Проєкт App Router з локалізованими маршрутами (наприклад,
/,/fr/...) - i18n-конфігурація з локалями, локаллю за замовчуванням та підтримкою RTL
- Ініціалізація i18n на сервері та клієнтський провайдер
- Переклади з неймспейсами, що завантажуються за потреби
- SEO з
hreflang, локалізованимsitemapіrobots - Middleware для маршрутизації локалей
- Інтеграція Intlayer для автоматизації робочих процесів перекладу (тести, автозаповнення за допомогою AI, синхронізація JSON)
Примітка: next-i18next побудований поверх i18next. Цей посібник використовує примітиви i18next, сумісні з next-i18next в App Router, одночасно зберігаючи архітектуру простою та готовою до продакшену. Для ширшого порівняння див. next-i18next vs next-intl vs Intlayer.
1) Структура проєкту
Встановіть залежності next-i18next:
Почніть з чіткої структури. Тримайте повідомлення розділеними за locale та namespace.
Контрольний список (mid/senior):
- Майте по одному JSON-файлу на namespace для кожної locale
- Не централізуйте повідомлення надто; використовуйте невеликі простори імен (namespaces), орієнтовані на сторінку чи feature
- Уникайте імпорту всіх локалей одночасно; завантажуйте лише те, що потрібно
2) Встановлення залежностей
Якщо ви плануєте використовувати API next-i18next або сумісність конфігурації, також додайте:
3) Основна конфігурація i18n
Визначте локалі, локаль за замовчуванням, RTL та допоміжні функції для локалізованих шляхів/URL.
Примітка: Якщо ви використовуєте next-i18next.config.js, тримайте його узгодженим з i18n.config.ts, щоб уникнути розходжень.
4) Ініціалізація i18n на сервері
Ініціалізуйте i18next на сервері з динамічним бекендом, який імпортує лише потрібні JSON для локалі та namespace.
Проміжна примітка: Тримайте список неймспейсів коротким для кожної сторінки, щоб обмежити обсяг передаваних даних. Уникайте глобальних «catch-all» бандлів.
5) Клієнтський провайдер для React-компонентів
Оберніть клієнтські компоненти провайдером, який відповідає конфігурації сервера й завантажує лише запитані namespaces.
Порада для початківців: Не потрібно передавати всі повідомлення на клієнт. Почніть лише з namespaces сторінки.
6) Локалізований layout та routes
Встановіть мову й напрям тексту, та попередньо згенеруйте маршрути для кожної локалі, щоб віддати перевагу статичному рендерингу.
7) Приклад сторінки з використанням сервера та клієнта
Переклади (один файл JSON на неймспейс під src/locales/...):
Клієнтський компонент (завантажує лише потрібний неймспейс):
Переконайтеся, що сторінка/провайдер включає лише ті простори імен, які вам потрібні (наприклад,
about). Якщо ви використовуєте React < 19, мемоізуйте важкі форматери, такі якIntl.NumberFormat.
Синхронний серверний компонент, вбудований у клієнтську межу:
8) SEO: Метадані, Hreflang, Sitemap, Robots
Переклад контенту, це спосіб розширити охоплення. Ретельно налаштуйте багатомовне SEO.
Найкращі практики:
- Встановіть
langтаdirу корені - Додайте
alternates.languagesдля кожної локалі (+x-default) - Перелічіть перекладені URL у
sitemap.xmlі використовуйтеhreflang - Виключайте локалізовані приватні розділи (наприклад,
/fr/admin) уrobots.txt
9) Middleware для маршрутизації локалі
Виявляє локаль і перенаправляє на локалізований маршрут, якщо він відсутній.
10) Кращі практики продуктивності та DX
- Встановіть атрибути html
langіdir: Зроблено вsrc/app/[locale]/layout.tsx. - Розділяйте повідомлення за namespace: Тримайте бандли маленькими (
common.json,about.json, тощо). - Мінімізуйте payload клієнта: На сторінках передавайте провайдеру лише потрібні namespace.
- Надавайте перевагу статичним сторінкам: Використовуйте
export const dynamic = 'force-static'таgenerateStaticParamsдля кожної локалі. - Синхронізуйте server components: Передавайте попередньо обчислені рядки/форматування замість асинхронних викликів під час рендерингу.
- Застосовуйте memoization для важких операцій: Особливо в клієнтському коді для старіших версій React.
- Кеш і заголовки: Віддавайте перевагу статичному рендерингу або
revalidateзамість динамічного, коли це можливо.
11) Тестування та CI
- Додайте юніт-тести для компонентів, що використовують
t, щоб переконатися, що ключі існують. - Перевіряйте, що в кожному namespace однакові ключі в усіх локалях.
- Забезпечуйте виявлення відсутніх ключів у CI перед деплоєм.
Intlayer автоматизує більшість цього (див. наступний розділ).
12) Додайте Intlayer зверху (автоматизація)
Intlayer допомагає синхронізувати JSON-переклади, перевіряти відсутні ключі та за потреби заповнювати їх за допомогою AI.
Встановіть залежності intlayer:
Додайте скрипти у package.json:
Типові сценарії:
pnpm i18n:testу CI, щоб CI завершувався з помилкою при відсутніх ключахpnpm i18n:fillлокально, пропонує AI-переклади для щойно доданих ключів
Ви можете передавати аргументи CLI; див. документацію Intlayer CLI.
13) Усунення неполадок
- Ключі не знайдені: Переконайтесь, що сторінка/провайдер перераховують правильні простори імен (namespaces) і файл JSON існує за шляхом
src/locales/<locale>/<namespace>.json. - Неправильна мова / мерехтіння англійською: Перевірте визначення локалі в
middleware.tsта значенняlngу провайдері. - Проблеми з RTL-розкладкою: Переконайтесь, що
dirвстановлюється черезisRtl(locale)і що ваш CSS поважає[dir="rtl"]. - Відсутні SEO alternates: Підтвердіть, що
alternates.languagesвключає всі локалі таx-default. - Занадто великі бандли: Розбивайте namespaces ще дрібніше та уникайте імпорту цілих дерев
localesна клієнті.
14) Що далі
- Додайте більше локалей та namespaces у міру розвитку функціоналу (features)
- Локалізуйте сторінки помилок, електронні листи та контент, що подається через API
- Розширте робочі процеси Intlayer, щоб автоматично відкривати PR для оновлень перекладів
Якщо ви віддаєте перевагу стартовому шаблону, спробуйте: https://github.com/aymericzip/intlayer-next-i18next-template.