Локализация (next-intl)

Стартер использует next-intl v4 с маршрутизацией по локали. Поддерживаются два языка:

  • ru — язык по умолчанию, отдаётся без префикса (/, /login, /dashboard, /blog).
  • en — второй язык, отдаётся под префиксом /en (/en, /en/login, /en/blog).

Решение по префиксу локали: as-needed

Выбрана стратегия next-intl localePrefix: 'as-needed' (src/i18n/routing.ts). Это рекомендованный подход, когда один язык — канонический: русскоязычная аудитория (основная для РУ) получает чистые URL без префикса, а английская версия полностью доступна на /en/.... Так у дефолтного языка нет ни редиректов, ни дублей URL, а SEO-канон совпадает с существующими ссылками.

Из чего состоит

ФайлНазначение
src/i18n/routing.tsЛокали, дефолт, localePrefix: 'as-needed'.
src/i18n/request.tsPer-request конфиг: активная локаль + загрузка messages/<locale>.json.
src/i18n/navigation.tsЛокале-зависимые Link, useRouter, usePathname — используйте их вместо next/link.
src/middleware.tsКомпозиция middleware next-intl + защита /dashboard из Auth.js (локале-независимо).
src/app/[locale]/layout.tsxКорневой layout: <html lang>, NextIntlClientProvider, метаданные по локали.
messages/ru.json, messages/en.jsonКаталоги переводов (одинаковая структура ключей).
src/components/locale-switcher.tsxПереключатель языка.

Что локализовано

Полностью переведены лендинг, страница входа и оболочка дашборда (шапка + «Обзор»), а также страницы /ai и /blog. Страницы регистрации / verify-request / оплаты остаются на русском (Russian-first) — добавьте ключи в messages/*.json и замените литералы на t('...'), если нужен их перевод.

Как добавить перевод

  1. Добавьте ключ в оба файла messages/ru.json и messages/en.json (структура ключей должна совпадать — это проверяется тестом src/i18n/messages.test.ts).
  2. В серверном компоненте: const t = await getTranslations('namespace'). В клиентском: const t = useTranslations('namespace').
  3. Для внутренних ссылок берите Link из @/i18n/navigation, чтобы префикс локали сохранялся.

Как добавить язык

  1. Добавьте код локали в routing.locales (src/i18n/routing.ts).
  2. Создайте messages/<locale>.json с той же структурой ключей.
  3. При необходимости расширьте openGraph.locale в src/app/[locale]/layout.tsx.

Дальше