Next.js + PolyLingo

Добавьте мультиязычность в ваше приложение Next.js.

Переводите ваши локальные файлы, Markdown-контент и HTML-страницы через один вызов API. Работает с App Router, next-intl и любой настройкой i18n маршрутизации.

App Router
Поддержка Next.js 13–15
next-intl
нативная интеграция
10 языков
один запуск скрипта
~3с
типичное время выполнения скрипта перевода

Next.js предоставляет маршрутизацию. Переводов он не даёт.

App Router в Next.js отлично поддерживает маршрутизацию на основе локалей. Библиотеки, такие как next-intl, упрощают управление файлами переводов и переключение локалей. Но они не решают сам перевод — кто-то должен создавать переведённый контент на каждом языке, и этим кем-то обычно являетесь вы. Для большинства команд рабочий процесс — скопировать английский JSON в DeepL, исправить сломанное форматирование, вставить результат обратно, повторить для каждого языка. Это медленно, подвержено ошибкам и не масштабируется.

Самый распространённый рабочий процесс — писать все UI-строки на английском в исходном коде, затем переводить файл messages.json для каждого целевого языка. Теоретически это просто. На практике поддерживать синхронизацию более 10 локальных файлов с изменениями исходника становится постоянной проблемой. Каждый раз при изменении английского текста нужно обновлять все локали. При использовании стандартных API перевода имена ключей портятся, переменные-плейсхолдеры переводятся, а структура JSON расходится между локалями — вызывая тонкие ошибки во время выполнения, которые трудно отследить.

PolyLingo вписывается в вашу существующую i18n-настройку Next.js.

Если вы используете next-intl или любую другую i18n-библиотеку, ваши сообщения уже в JSON. PolyLingo берёт этот JSON, отправляет его через модель перевода и возвращает переведённые копии для каждого целевого языка — с сохранёнными ключами, неизменной вложенностью и корректно переведёнными строковыми значениями. Вы можете вызвать это из скрипта сборки, вебхука или через UI PolyLingo. Результат сразу попадает в вашу директорию сообщений.

Рабочий процесс: пишите ваш английский messages.json. Запускайте один скрипт, который вызывает PolyLingo API с вашим исходным файлом и всеми кодами целевых языков. Получаете один переведённый JSON-файл на язык с идентичной структурой. Записываете каждый в директорию messages/. Коммитите. Готово.

Для сайтов с большим объёмом контента в Markdown в CMS (Sanity, Contentful) тот же подход применяется к контенту: экспортируйте в Markdown или HTML, переводите, записывайте обратно в CMS через её API. Весь процесс может запускаться как шаг сборки или по триггеру вебхука.

Скрипт перевода PolyLingo — в этом репозитории есть translate-messages.mjs
// This repository: frontend/scripts/translate-messages.mjs
// Chunks large namespaces (e.g. home) so the model stays within output limits.
//
//   export POLYLINGO_API_KEY=pl_xxx
//   npm run i18n:polylingo
//
// Writes messages/es.json, fr.json, … from messages/en.json via POST /v1/translate
// with format: "json". See MARKETING_I18N.md for options and CI notes.
//
// Minimal one-shot pattern (fine for small message files):
//
// const source = readFileSync('./messages/en.json', 'utf8')
// const { translations } = await fetch(apiUrl + '/translate', {
//   method: 'POST',
//   headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
//   body: JSON.stringify({
//     content: source, format: 'json', source: 'en',
//     targets: ['es', 'fr', 'de'], model: 'standard',
//   }),
// }).then((r) => r.json())
//
// for (const [lang, raw] of Object.entries(translations)) {
//   const obj = typeof raw === 'string' ? JSON.parse(raw) : raw
//   writeFileSync(`./messages/${lang}.json`, JSON.stringify(obj, null, 2))
// }
i18n.ts — конфигурация next-intl v4
// i18n.ts (next-intl v4)
import { getRequestConfig } from 'next-intl/server'

export const locales = [
  'en', 'ar', 'bn', 'cs', 'da', 'de', 'el', 'es', 'fa', 'fi',
  'fr', 'he', 'hi', 'id', 'it', 'ja', 'ko', 'ms', 'nl', 'no',
  'pl', 'pt', 'ru', 'sv', 'sw', 'th', 'tr', 'uk', 'vi', 'zh',
] as const
export type Locale = (typeof locales)[number]

export default getRequestConfig(async ({ requestLocale }) => {
  const locale = await requestLocale
  return {
    locale,
    messages: (await import(`./messages/${locale}.json`)).default,
  }
})
package.json — добавьте translate в ваш пайплайн сборки
// package.json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "i18n:polylingo": "node scripts/translate-messages.mjs",
    "translate:build": "npm run i18n:polylingo && next build"
  }
}

Почему PolyLingo подходит для i18n рабочего процесса Next.js

  • Переводите файлы messages/*.json напрямую — ключи всегда сохраняются
  • Переводите Markdown-контент для блогов и документации
  • Работает с next-intl, next-i18next и кастомными настройками
  • REST API интегрируется со скриптами сборки и вебхуками CMS
  • Все 36 языков в одном запросе
  • Бесплатный тариф — 100 000 токенов в месяц
  • Этот репозиторий использует этот рабочий процесс: npm run i18n:polylingo регенерирует маркетинговые локали из messages/en.json (см. MARKETING_I18N.md).
  • Работает с App Router и Pages Router
  • Выходные файлы готовы к коммиту — не требуют переформатирования

Настройте мультиязычность в вашем приложении Next.js

1

Настройте next-intl с вашим английским файлом сообщений

Установите next-intl и настройте i18n.ts и middleware. Пишите все UI-строки в messages/en.json. Структурируйте файл так, как нужно вашему приложению — плоско или вложенно. Это станет вашим единственным источником правды.

2

Запустите скрипт перевода

Используйте PolyLingo JSON API из небольшого Node-скрипта (см. код выше). В этом монорепозитории запустите npm run i18n:polylingo из frontend/ с установленным POLYLINGO_API_KEY — он разбивает большие пространства имён для надёжности. Типичный запуск занимает значительно меньше минуты для полного маркетингового пакета.

3

Закоммитьте файлы локалей и разверните

Сгенерированные файлы локалей — валидный JSON с идентичной структурой исходному. Закоммитьте их в репозиторий. Добавьте скрипт перевода в ваш CI-пайплайн, чтобы локали всегда были синхронизированы с изменениями контента.

Сценарии использования мультиязычности в Next.js

🚀

SaaS-приложения и панели управления

Переведите всю библиотеку UI-строк за один запуск скрипта. Поддерживаются все возможности форматирования next-intl — даты, числа, множественное число — потому что структура JSON сохраняется точно.

📰

Контентные сайты и блоги

Для контентных Next.js-сайтов с Sanity или Contentful используйте PolyLingo для перевода контента страниц и UI-строк — тот же API, те же гарантии сохранения формата.

🛒

E-commerce с региональными вариантами

Переводите названия продуктов, описания, страницы категорий и интерфейс оформления заказа. Используйте Advanced модель для маркетинговых текстов, где важен голос бренда, Standard — для функциональных UI-строк.

Часто задаваемые вопросы

Работает ли это с Next.js App Router?

Да. Интеграция PolyLingo — это просто скрипт, который читает и записывает JSON-файлы — он не зависит от внутренних механизмов Next.js. Работает с App Router, Pages Router или любым фреймворком. Пример конфигурации next-intl использует API v4 с requestLocale, совместимый с Next.js 13, 14 и 15.

Что если мой messages.json часто меняется?

Рекомендуемый подход — добавить скрипт перевода в ваш CI/CD пайплайн, который запускается при изменениях messages/en.json. Это автоматически поддерживает синхронизацию всех локалей. Для команд с частыми изменениями текста это полностью предотвращает рассинхронизацию локалей.

Работает ли PolyLingo с next-i18next так же, как с next-intl?

Да. next-i18next использует ту же структуру локальных JSON. Скрипт перевода работает одинаково — укажите директорию public/locales/en/ и запишите результаты в другие локальные директории. Совместимость формата JSON одинаковая.

Что насчёт динамического контента, который не в файле сообщений?

Динамический контент — блоги, описания продуктов, контент, созданный пользователями — должен переводиться на уровне данных, либо в вашей CMS, либо через скрипт сборки, который обрабатывает контент до попадания в Next.js. PolyLingo одинаково хорошо обрабатывает Markdown, HTML и простой текст для этой цели.

Можно ли переводить только строки, изменённые с последнего запуска?

Инкрементальный перевод (перевод только изменённых ключей) в планах. Сейчас скрипт переводит весь файл целиком. Для большинства файлов сообщений (до 20 КБ) это достаточно быстро для запуска при каждом коммите. Для очень больших файлов рекомендуется разбивать по пространствам имён.

Есть ли способ проверить переводы перед публикацией?

Рекомендуемый подход — коммитить переведённые локали в отдельную ветку или PR для проверки перед слиянием в main. Это стандартная практика для команд, которым нужен человеческий контроль качества перевода. PolyLingo даёт хороший первый вариант — для большинства UI-строк вывод модели Standard не требует редактирования.

Получите первый переведённый файл локали менее чем за 5 минут.

Бесплатный API-ключ. Без кредитной карты. Вставьте ваш JSON с сообщениями и сразу увидите результат.

Получить API-ключ

Настройка скрипта перевода занимает 5 минут. Бесплатный тариф — без необходимости кредитной карты.

Добавьте мультиязычность в ваше приложение Next.js — PolyLingo | PolyLingo