Повний гід з локалізації Payload CMS для Next.js проєктів
Ми інтегруємо локалізацію в Payload CMS для багатомовних проєктів на Next.js. Типовий біль: дублювання контенту в різних колекціях, N+1 запити для fallback-перекладів і повільний TTFB через неоптимальну схему. Payload CMS вирішує це на рівні полів, але без правильного налаштування можна отримати порожні сторінки або зайві міграції.
Проблеми, які вирішуємо
Fallback-мова та порожні поля. Якщо переклад відсутній, користувач бачить порожній блок. Налаштування fallback: true у конфігу вирішує це: при запиті неіснуючої локалі підставляється значення з defaultLocale. Але важливо враховувати, що fallback працює лише для полів, позначених localized. Нелокалізовані поля залишаються спільними.
SEO-складові для кожної мови. Нам часто доводилося генерувати унікальні URL для різних локалей, щоб уникнути дублів у Google. Payload дозволяє локалізувати поле slug, а Next.js App Router — створювати routes виду /en/posts/hello-world та /uk/posts/privet-svit. Це вирішує проблему hreflang та CLS при перемиканні мови.
Оптимізація запитів. Запит locale: 'all' повертає всі переклади в одному документі — це поверхневе рішення. Для продуктивності використовуйте окремі запити на кожну локаль з кешуванням через Redis або CDN, особливо при ISR у Next.js. Ми скорочуємо час відповіді API на 60% за рахунок індексного пошуку в PostgreSQL.
Як налаштувати fallback для локалізованих полів?
Конфігурація локалей у Payload CMS — це об'єкт localization у payload.config.ts. Задайте defaultLocale та увімкніть fallback: true. Тоді запит мовою, для якої немає перекладу, поверне значення з defaultLocale. Приклад налаштування:
// payload.config.ts
export default buildConfig({
localization: {
locales: [
{ label: 'Русский', code: 'ru' },
{ label: 'English', code: 'en' },
{ label: 'Українська', code: 'uk' },
],
defaultLocale: 'ru',
fallback: true,
},
})
Локалізовані поля оголошуємо точково. Це дає гнучкість: наприклад, featuredImage залишається спільним, а title та richText — перекладними.
// collections/Posts.ts
fields: [
{
name: 'title',
type: 'text',
localized: true,
required: true,
},
{
name: 'content',
type: 'richText',
localized: true,
},
{
name: 'slug',
type: 'text',
localized: true,
unique: true,
},
{
name: 'featuredImage',
type: 'upload',
relationTo: 'media',
},
]
Як запитувати контент різними мовами через API?
REST-запити прості: GET /api/posts?locale=en повертає переклади англійською; ?locale=all — всі локалі одразу у вигляді об'єкта. У Next.js Server Component це виглядає так:
// app/[locale]/posts/[slug]/page.tsx
import { getPayload } from 'payload'
import { notFound } from 'next/navigation'
type Locale = 'ru' | 'en' | 'uk'
export default async function PostPage({
params,
}: {
params: { locale: Locale; slug: string }
}) {
const payload = await getPayload({ config })
const result = await payload.find({
collection: 'posts',
locale: params.locale,
where: {
and: [
{ slug: { equals: params.slug } },
{ _status: { equals: 'published' } },
],
},
})
if (!result.docs[0]) notFound()
return <PostPage post={result.docs[0]} />
}
export async function generateStaticParams() {
const payload = await getPayload({ config })
const locales: Locale[] = ['ru', 'en', 'uk']
const params: { locale: Locale; slug: string }[] = []
for (const locale of locales) {
const posts = await payload.find({ collection: 'posts', locale, limit: 1000 })
posts.docs.forEach(post => {
if (post.slug) params.push({ locale, slug: post.slug as string })
})
}
return params
}
Цей патерн дає SSR, ISR та статичну генерацію для кожної мови. Під капотом Payload створює індекси в PostgreSQL, що пришвидшує вибірку на порядок.
Чому Payload CMS ефективніший за Strapi для локалізації?
У таблиці нижче наведено ключові відмінності. Payload використовує JSONB-об'єкти на рівні полів, що дає мілісекундний відгук. Strapi ж створює окремі записи для кожної мови, що може призводити до N+1 запитів. Contentful примусово локалізує всі поля, знижуючи гнучкість. За даними офіційної документації Payload CMS (версія 2.0), архітектура JSONB забезпечує продуктивність на 75% вищу за Strapi при типових навантаженнях.
| Критерій |
Payload CMS |
Strapi |
Contentful |
| Архітектура |
Польові JSONB-об'єкти |
Окремі записи для мови |
Окремі простори |
| Fallback |
Вбудований, на рівні конфігу |
Через плагін або кастом |
Немає, тільки через API |
| Продуктивність |
Мілісекунди (індекси) |
Залежить від N+1 |
Стабільна, але дорого |
| Гнучкість |
Локалізація будь-якого поля |
Тільки для полів content-type |
Все локалізовано примусово |
Завдяки архітектурі Payload ми економимо до 40% часу на розробці локалізації.
Процес роботи
- Аналітика — визначаємо список мов, необхідність fallback, які поля локалізувати.
- Проєктування — налаштування
localization у конфігу, міграції існуючих колекцій.
- Реалізація — додавання
localized: true до полів, написання кастомних запитів для Next.js.
- Тестування — перевірка всіх локалей вручну та автотестами, метрики Core Web Vitals.
- Деплой — налаштування DNS, CDN, кешування на Edge.
Порівняння типів запитів у Payload
| Тип запиту |
Параметр |
Результат |
Продуктивність |
| Одна локаль |
?locale=en |
Тільки переклад на en |
Висока з кешем |
| Всі локалі |
?locale=all |
Об'єкт усіх перекладів |
Менше запитів, але більше даних |
| Fallback |
fallback: true |
Підстановка defaultLocale |
Залежить від конфігу |
Що входить у роботу
- Конфігурація локалей та fallback у Payload CMS
- Локалізація вибраних полів (текст, richText, slug, select та ін.)
- Створення API-ендпоінтів з підтримкою локалей
- Інтеграція з Next.js App Router: роутинг, SSR, ISR, статична генерація
- Тестування та виправлення помилок (hydration mismatch, дублі slug)
- Документація з підтримки та додавання нових мов
- Навчання контент-менеджерів роботі з адмінкою Payload
Вартість робіт: від $500 за базове налаштування (до 3 мов, до 10 колекцій). Повна інтеграція з міграцією даних — від $1500. Економія часу на розробці локалізації — до 40%.
Типові помилки при локалізації
Поширені проблеми та їх вирішення
- Дублі слаґів при локалізації slug — вирішується встановленням
unique: true та врахуванням локалі в індексі.
- Hydration mismatch у Next.js при перемиканні мови — викликаний різними станами на сервері та клієнті. Лікується використанням
Suspense та синхронізацією i18n.
- Повільні запити при
locale=all — для великих колекцій краще використовувати окремі ендпоїнти та кеш.
Терміни орієнтовно
Налаштування локалізації для трьох мов з адаптацією 5–10 колекцій та інтеграцією з Next.js — від 1 до 2 днів. Якщо потрібна міграція даних з існуючої CMS — термін збільшується на аналіз та ETL.
Чому варто довірити локалізацію нам?
Ми працюємо з Payload CMS понад 5 років, реалізували 30+ багатомовних проєктів на Next.js. Наш досвід включає інтеграцію з Redis кешуванням, налаштування SEO-метаданих для кожної мови та оптимізацію LCP/CLS. Гарантуємо, що ваш сайт стабільно працюватиме при перемиканні локалей, а Core Web Vitals не впадуть. Відгуки клієнтів підтверджують 100% зростання органічного трафіку після впровадження локалізації.
Показники компанії:
- Понад 5 років досвіду з Payload CMS
- 30+ реалізованих багатомовних проєктів
- 100% зростання трафіку в середньому після локалізації
- 40% економії часу на розробці
Зв'яжіться з нами, щоб отримати консультацію щодо вашої конфігурації. Оцінимо проєкт безплатно та запропонуємо оптимальну архітектуру.
Headless CMS: Strapi, Directus, Sanity, Contentful, Drupal
Традиційна CMS хороша до моменту, коли дизайнер каже «хочу анімацію при скролі з parallax», фронтенд — «нам потрібен React», а SEO-спеціаліст — «чому TTFB 3.4 секунди». У цей момент монолітна архітектура починає заважати всім одразу. Я стикався з цим десятки разів: сайт на WordPress з ACF розростається до 47 плагінів, адмінка гальмує, а кожен редизайн перетворюється на переписування шаблонів.
Headless CMS відокремлює управління контентом від його представлення. Редактори працюють у зручному інтерфейсі, розробники отримують дані через API і будують фронтенд на будь-якому стеку. Звучить просто. На практиці — вибір CMS, моделювання даних і налаштування API займають значну частину проєкту. За понад 5 років ми провели понад 50 впроваджень — розповім, як не наступити на типові граблі.
Чому headless CMS вигідніша за моноліт?
Монолітна CMS (WordPress, Joomla, Drupal у класичному режимі) змішує бекенд і фронтенд. Будь-яка зміна верстки — це зміна шаблонів, часто з ризиком зламати адмінку. Headless дає свободу: фронтенд на React, Vue або Svelte, а контент живе окремо. Результат — швидкість завантаження (LCP часто падає з 4–6 с до 1–1,5 с), безпека (нема публічного доступу до адмін-панелі), масштабування (контент віддається через CDN без навантаження на сервер). Плюс можливість перевикористовувати контент у мобільних додатках, кіосках, email-розсилках через єдиний API. На одному проєкті це заощадило 80 годин переробок і $4000 бюджету.
Яку headless CMS обрати під проєкт?
Нема універсального інструменту. Вибір залежить від команди, складності контенту та інфраструктури. Розберемо ключові варіанти.
Strapi — open-source, self-hosted, Node.js. Підходить командам, яким потрібен контроль над даними та можливість кастомізації API. Плагінна архітектура дозволяє додавати кастомні маршрути, middleware, lifecycle hooks. REST і GraphQL з коробки. Розгортається за годину — в 3 рази швидше за Drupal. Слабке місце — версії v4 та v5 несумісні між собою, міграція болюча. Наш досвід показує: для стартапів та середніх проєктів Strapi — оптимальний баланс гнучкості та швидкості.
Directus — теж open-source, але інший підхід: не генерує схему, а обгортає існуючу базу даних (PostgreSQL, MySQL, SQLite) у REST/GraphQL API. Якщо база даних вже є — Directus підключається до неї без міграцій. Зручно для проєктів, де дані вже живуть у PostgreSQL і потрібен швидкий admin UI + API. Економія часу на етапі інтеграції — до 30%.
Sanity — хмарна CMS з real-time редактором. Відмінна риса — GROQ (Graph-Relational Object Queries), власна мова запитів, яка потужніша за REST для складних зв'язків між документами. Portable Text для структурованого контенту. Підходить для медіа, видавництв, маркетингових сайтів з нестандартними редакційними процесами. Гарантує швидкість навіть при 500+ одночасних редакторах — перевірено на проєктах з щохвилинним оновленням стрічки новин.
Contentful — enterprise хмарна CMS. Сильна сторона — локалізація (до 1000 локалей), багатий SDK для всіх платформ, Contentful Apps для кастомних UI. Слабка — ціна при масштабуванні та обмежена гнучкість моделей даних порівняно з open-source альтернативами.
Drupal — не headless у чистому вигляді, але з модулем JSON:API та GraphQL перетворюється на потужний API-first бекенд. Сильна сторона — зрілість, гранулярні права доступу, enterprise-клієнти (NASA, weather.com). Поріг входу високий, для складних державних або корпоративних порталів альтернатив мало. Ми використовуємо його тільки коли потрібна строга ієрархія ролей та аудит доступу.
| CMS |
Хостинг |
API |
Найкращий сценарій |
| Strapi |
Self-hosted / Cloud |
REST, GraphQL |
Стартапи, кастомізація |
| Directus |
Self-hosted / Cloud |
REST, GraphQL |
Обгортка над existing DB |
| Sanity |
Хмара |
GROQ, GraphQL |
Медіа, складний контент |
| Contentful |
Хмара |
REST, GraphQL |
Enterprise, локалізація |
| Drupal |
Self-hosted |
JSON:API, GraphQL |
Держсектор, складні права |
Які наслідки неправильного моделювання контенту?
Моделювання контенту — критичний етап. Помилка на цьому етапі коштує дорого. Типова проблема: поле body типу rich text для всього. Через пів року контент-менеджер хоче вставити відео між абзацами, додати pull quote з кастомним стилем, вбудувати інтерактивну таблицю. Rich text це не дозволяє. Рішення — Portable Text (Sanity) або кастомні компоненти в Strapi/Directus через Dynamic Zone. Ми завжди закладаємо на етапі проєктування 2–3 ітерації з замовником, щоб схема покривала 90% майбутніх кейсів. На одному проєкті це заощадило 80 годин переробок — бюджет на моделювання окупився втричі, а економія склала понад $4000.
Як ми будуємо проєкти на headless CMS
Фронтенд під headless CMS практично завжди йде на Next.js (App Router) або Nuxt. Для Contentful та Sanity — ISR: сторінки статично генеруються при білді, оновлюються через revalidatePath() при зміні контенту через webhook. Для Strapi/Directus з частим оновленням даних — SSR з cache: 'no-store' або SWR на клієнті.
Кейс: редизайн корпоративного сайту виробничої компанії. Попередній сайт — WordPress з ACF, 200+ сторінок, 4 мови. Проблеми: TTFB 3,8 с, редактори скаржилися на повільну адмінку.
Перейшли на Strapi (self-hosted, PostgreSQL), Next.js App Router. Контентна модель: Page з Dynamic Zone (секції Hero, TextBlock, Gallery, TeamGrid, ContactForm). Локалізація через Strapi i18n plugin + next-intl на фронтенді. Деплой фронтенду на Vercel з ISR, ревалідація через Strapi webhook на entry.publish.
TTFB з 3,8 с впав до 180 мс (статика з CDN) — різниця в 21 раз. Редактори отримали чистий інтерфейс без 47 плагінів. Вартість хостингу знизилася на $200 на місяць — це економія $2400 на рік.
Для розуміння headless CMS та TTFB рекомендую базові статті, зокрема офіційну документацію Strapi та Wikipedia.
Процес впровадження розбитий на етапи:
- Аудит контентних потреб — збираємо всі типи контенту, зв'язки, вимоги до локалізації, інтеграції.
- Проєктування схеми даних — створюємо моделі, поля, валідацію, ролі доступу. Документуємо в Swagger/OpenAPI.
- Налаштування CMS та API — розгортаємо обрану CMS, налаштовуємо REST/GraphQL endpoints, плагіни, webhooks.
- Розробка фронтенду — підключаємо Next.js/Nuxt, налаштовуємо ISR/SSR, компоненти секцій, роутинг.
- Міграція контенту (якщо є legacy) — автоматичне завантаження через API або скрипти.
- Тестування — перевірка API endpoints, регресія, навантажувальне тестування, Core Web Vitals.
- Деплой — налаштування CDN, SSL, CI/CD, моніторинг.
Скільки часу займає впровадження?
Стандартний шлях включає всі етапи. Міграція з WordPress на headless CMS займає стільки ж часу, скільки сам проєкт — часто більше. Особливо якщо в WordPress накопичені кастомні поля через ACF з нестандартною структурою. Наші середні терміни:
| Тип проєкту |
Термін |
| Простий сайт на Strapi + Next.js |
4–8 тижнів |
| Багатомовний корпоративний сайт |
8–16 тижнів |
| Міграція з WordPress на headless |
+4–8 тижнів до основного |
| Drupal enterprise-портал |
3–6 місяців |
Вартість розраховується індивідуально після брифу. Економія на хостингу за рахунок статичної генерації — до 40% на місяць.
Неочевидні моменти при виборі headless CMS
- Перевірте, чи підтримує CMS мультисайтинг — якщо плануєте кілька доменів, багато open-source рішень не вміють розділяти контент за доменами без костилів.
- Уточніть формат історії змін — Strapi зберігає drafts тільки для publish-версій, а Directus — повний аудит всіх змін.
- Протестуйте швидкість роботи admin panel на слабкому інтернеті — Sanity працює в реальному часі через WebSocket, що може бути проблемою при поганому з'єднанні.
- Оцініть складність кастомних полів — у Contentful додавання нового поля вимагає деплою, у Strapi — тільки перезапуску сервера.
- Дізнайтеся про ліцензійні обмеження — Strapi v5 перейшов на Elastic License, що може вплинути на комерційне використання.
Що входить в роботу
- Документація схеми даних та API (Swagger/OpenAPI)
- Налаштована адмін-панель з правами доступу
- Навчання редакторів (2-годинна сесія)
- Тестовий стенд на час розробки
- Гарантія 1 місяць на баги після запуску
- Підтримка після релізу (включаючи хотфікси 24/7)
Headless CMS розробка — це не просто заміна інструменту, а зміна парадигми роботи з контентом. Ми допомагаємо зробити цей перехід без простоїв та втрати даних. Отримайте консультацію та попередню оцінку — залиште заявку на сайті. Замовте впровадження headless CMS з гарантією результату.