Локализация (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.ts | Per-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('...'), если нужен их перевод.
Как добавить перевод
- Добавьте ключ в оба файла
messages/ru.jsonиmessages/en.json(структура ключей должна совпадать — это проверяется тестомsrc/i18n/messages.test.ts). - В серверном компоненте:
const t = await getTranslations('namespace'). В клиентском:const t = useTranslations('namespace'). - Для внутренних ссылок берите
Linkиз@/i18n/navigation, чтобы префикс локали сохранялся.
Как добавить язык
- Добавьте код локали в
routing.locales(src/i18n/routing.ts). - Создайте
messages/<locale>.jsonс той же структурой ключей. - При необходимости расширьте
openGraph.localeвsrc/app/[locale]/layout.tsx.
Дальше
- SEO и метаданные — как локали отражаются в
sitemap.xmlи Open Graph.