next-i18next VS next-intl VS Intlayer | Internationalization (i18n) на Next.js
Ниже представлено краткое сравнение трех популярных библиотек для интернационализации (i18n) приложения на Next.js: next-intl, next-i18next и Intlayer.
Этот документ подчеркивает ключевые критерии:
- Архитектура (сохранение переводов рядом с компонентами)
- Поддержка TypeScript
- Управление отсутствующими переводами
- Поддержка серверных компонентов
- Улучшенный роутинг и промежуточное ПО для Next.js
- Простота настройки
Руководство также предлагает углубленный обзор Intlayer, показывая, почему это может быть сильным выбором—особенно для Next.js 13+, включая App Router и Server Components.
Обзор каждой библиотеки
1. next-intl
Основное внимание: Быстрая и простая настройка с легким подходом к локализации.
- Архитектура: Предлагает расположение переводов в одной папке (например, locales/), но также допускает несколько стратегий. Не строго требует архитектуры «перевод на компонент».
- Поддержка TypeScript: Базовая интеграция TypeScript. Некоторые определения типов существуют, но они не сильно ориентированы на авто-генерацию определений TypeScript из файлов перевода.
- Отсутствующие переводы: Базовый механизм резервного копирования. По умолчанию возвращает ключ или строку локали по умолчанию. Нет надежных инструментов «из коробки» для проверки отсутствующих переводов.
- Поддержка серверных компонентов: Работает с Next.js 13+ в общем плане, но шаблон менее специализирован для глубокого серверного использования (например, серверные компоненты с комплексным динамическим роутингом).
- Роутинг и промежуточное ПО: Поддержка промежуточного ПО возможна, но ограничена. Обычно полагается на Middleware Next.js для определения локали или ручную настройку для переписывания локальных путей.
- Простота настройки: Очень просто. Минимальный шаблон необходим.
Используйте, когда: Вам нужен более простой подход или вы комфортно управляете переводами более традиционными способами (например, одна папка с файлами локалей JSON).
2. next-i18next
Основное внимание: Проверенное временем решение, использующее i18next под капотом, широко принято для проектов на Next.js.
- Архитектура: Обычно организует переводы в папке public/locales. Не специально разработано для сохранения переводов «рядом» с каждым компонентом, хотя вы можете вручную принять другую структуру.
- Поддержка TypeScript: Разумное покрытие TypeScript, но требует пользовательской настройки для типизированных переводов и типизированных хуков.
- Отсутствующие переводы: i18next предлагает интерполяцию/резервные копии. Однако определение отсутствующих переводов обычно требует дополнительной настройки или сторонних плагинов.
- Поддержка серверных компонентов: Документировано базовое использование с Next.js 13, но расширенное использование (например, глубокая интеграция с серверными компонентами, генерация динамических маршрутов) может быть затруднительным.
- Роутинг и промежуточное ПО: В значительной степени полагается на Middleware Next.js и переписывания для подмаршрутов локали. Для более сложных настроек, возможно, вам нужно будет углубиться в продвинутую конфигурацию i18next.
- Простота настройки: Знакомый подход для тех, кто привык к i18next. Однако он может стать более громоздким, когда требуются продвинутые функции i18n (пространства имен, несколько локалей по умолчанию и т. д.).
Используйте, когда: Вы уже привержены экосистеме i18next или имеете существующие переводы на основе i18next.
3. Intlayer
Основное внимание: Современная, открытая библиотека i18n, специально адаптированная для Next.js App Router (12, 13, 14 и 15) с встроенной поддержкой Server Components и Turbopack.
Ключевые преимущества
Архитектура
- Поощряет размещение переводов прямо рядом с их компонентами. Каждая страница или компонент может иметь свой собственный файл .content.ts (или JSON)—никакого более копания в гигантской папке с переводами.
- Это делает ваш код более модульным и поддерживаемым, особенно в больших кодовых базах.
Поддержка TypeScript
- Авто-генерируемые определения типов: В момент, когда вы определяете свой контент, Intlayer генерирует типы, которые обеспечивают автозаполнение и ловят ошибки перевода.
- Минимизирует ошибки выполнения, такие как отсутствующие ключи, и предлагает расширенное автозаполнение прямо в вашей IDE.
Управление отсутствующими переводами
- Во время сборки Intlayer может обнаружить отсутствующие ключи перевода и выдать предупреждения или ошибки.
- Это обеспечивает, чтобы вы никогда случайно не отправляли язык с отсутствующим текстом.
Оптимизирован для серверных компонентов
- Полностью совместим с App Router Next.js и новым парадигмой Server Components.
- Предоставляет специализированные провайдеры (IntlayerServerProvider, IntlayerClientProvider), чтобы изолировать серверный контекст (что важно при работе с Next.js 13+).
Улучшенный роутинг и промежуточное ПО
- Включает специальное intlayerMiddleware для автоматического определения локали (через cookies или заголовки браузера) и расширенной генерации маршрутов.
- Динамически обрабатывает локализованные пути (например, /en-US/about против /fr/about) с минимальной конфигурацией.
- Предлагает вспомогательные методы, такие как getMultilingualUrls для генерации альтернативных языковых ссылок (отлично для SEO).
Упрощенная настройка
- Один конфигурационный файл (intlayer.config.ts), чтобы определить ваши локали, локаль по умолчанию и предпочтения интеграции.
- Плагин-обертка withIntlayer(nextConfig), который внедряет все переменные окружения и наблюдатели за вашим контентом.
- Нет больших конфигураций по умолчанию—система построена так, чтобы «просто работать» с минимальным трением.
В конце концов: Intlayer является современным решением, которое стремится продвигать лучшие практики: от сохранения переводов рядом с каждым компонентом React до предложений надежной поддержки TS и легкого серверного использования, в то время как значительно уменьшает количество шаблонного кода.
Сравнение функций бок о бок
Функция | next-intl | next-i18next | Intlayer |
---|---|---|---|
Сохранение переводов рядом с компонентами | Частично – обычно одна папка локалей | Не по умолчанию – часто в public/locales | Да – рекомендуется и просто |
Авто-генерация TypeScript | Базовые определения TS | Базовая поддержка TS | Да – продвинутая «из коробки» |
Обнаружение отсутствующих переводов | В основном строки резервных копий | В основном строки резервных копий | Да – проверки на этапе сборки |
Поддержка серверных компонентов | Работает, но не специализирован | Поддерживается, но может быть многословно | Полная поддержка с специализированными провайдерами |
Роутинг и промежуточное ПО | Интегрируется вручную с промежуточным ПО Next | Предоставляется с помощью конфигурации переписывания | Специальное i18n промежуточное ПО + продвинутые хуки |
Сложность настройки | Простой, минимальная конфигурация | Традиционный, может быть многословным для продвинутого использования | Один файл конфигурации и плагин |
Почему Intlayer?
Для команд, переходящих на или строящих на основе Next.js App Router (версии 13, 14 или 15) с Server Components, Intlayer предоставляет:
Упрощенная архитектура
- Каждый маршрут или компонент содержит свои переводы. Это способствует ясности и поддерживаемости.
Мощная интеграция TypeScript
- Вы получаете безопасность на уровне компилятора, избегая «ошибок-описок» или отсутствующих ключей перевода.
Реальные предупреждения о отсутствующих переводах
- Если вы забудете ключ или перевод языка, вы будете предупреждены на этапе сборки (а не отправляя неполный UI).
Встроенный продвинутый роутинг
- Автоматическое определение локали, генерация динамических маршрутов и легкое управление локализованными URL включены.
- Стандартное intlayerMiddleware не требует глубоких пользовательских переписываний.
Упрощенная настройка
- Минимальное количество шаблона: просто определите ваш intlayer.config.ts, оберните next.config с withIntlayer и добавьте официальное промежуточное ПО.
- Четкое и простое использование как для серверных, так и для клиентских компонентов через IntlayerServerProvider и IntlayerClientProvider.
Дружественный к SEO
- Встроенные вспомогательные функции (getMultilingualUrls, атрибуты hrefLang и т. д.) облегчают создание страниц и карт сайтов, соответствующих требованиям SEO.
Пример: Intlayer в действии
Ниже приведен очень сокращенный фрагмент, иллюстрирующий, как использовать Intlayer в проекте на Next.js 15. Для получения всех деталей и примеров кода, посмотрите полное руководство Intlayer.
Пошаговый пример
Установка и настройка
bashnpm install intlayer next-intlayer
ts// intlayer.config.tsimport { Locales, type IntlayerConfig } from "intlayer";const config: IntlayerConfig = { internationalization: { locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], defaultLocale: Locales.ENGLISH, },};export default config;
Используйте плагин
ts// next.config.mjsimport { withIntlayer } from "next-intlayer/server";/** @type {import('next').NextConfig} */const nextConfig = {};export default withIntlayer(nextConfig);
Добавьте промежуточное ПО
ts// src/middleware.tsexport { intlayerMiddleware as middleware } from "next-intlayer/middleware";export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",};
Создайте локализованный макет
tsx// src/app/[locale]/layout.tsximport { getHTMLTextDir } from "intlayer";import { NextLayoutIntlayer } from "next-intlayer";const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { const { locale } = params; return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body>{children}</body> </html> );};export { generateStaticParams } from "next-intlayer";export default LocaleLayout;
Объявите и используйте контент
tsx// src/app/[locale]/page.content.tsimport { t } from "intlayer";export default { key: "page", content: { getStarted: { main: t({ en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, },};
tsx// src/app/[locale]/page.tsximport { IntlayerServerProvider } from "next-intlayer/server";import { IntlayerClientProvider, useIntlayer } from "next-intlayer";const PageContent = () => { const { content } = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> );};export default function Page({ params }) { return ( <IntlayerServerProvider locale={params.locale}> <IntlayerClientProvider locale={params.locale}> <PageContent /> </IntlayerClientProvider> </IntlayerServerProvider> );}
Заключение
Каждое решение—next-intl, next-i18next и Intlayer—оказалось эффективным для многоязычных проектов на Next.js. Однако Intlayer идет дальше, предлагая:
- Сильное поощрение архитектуры перевода на уровне компонентов
- Бесшовную интеграцию с Next.js 13+ и Server Components
- Предложения мощного авто-генерации TypeScript для безопасного кода
- Обработку отсутствующих переводов на этапе сборки
- Предоставление упрощенного, единого подхода к конфигурации с расширенным роутингом и промежуточным ПО
Если вы хотите современные функции i18n, адаптированные к Next.js App Router, и ищете полностью типизированный опыт без ручного настройки логики резервного копирования, переписывания маршрутов или сложных шагов сборки, Intlayer является убедительным выбором. Он не только сокращает время настройки, но и обеспечивает более поддерживаемый, масштабируемый подход к переводам для вашей команды.
Если у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на блог GitHub