Налаштування локалізації контенту Payload CMS

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування локалізації контенту Payload CMS
Проста
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Локалізація контенту в Payload CMS

Payload підтримує багатомовний контент на рівні полів: кожне помічене як localized поле зберігає окремі значення для кожної локалі. У PostgreSQL це колонка з JSONB-об'єктом {ru: "...", en: "...", uk: "..."}.

Конфігурація локалей

// payload.config.ts
export default buildConfig({
  localization: {
    locales: [
      { label: 'Русский', code: 'ru' },
      { label: 'English', code: 'en' },
      { label: 'Українська', code: 'uk' },
    ],
    defaultLocale: 'ru',
    fallback: true,  // якщо перекладу нема — використовувати дефолтну локаль
  },
})

Локалізовані поля

// collections/Posts.ts
fields: [
  {
    name: 'title',
    type: 'text',
    localized: true,  // окремене значення для кожної локалі
    required: true,
  },
  {
    name: 'content',
    type: 'richText',
    localized: true,
  },
  {
    name: 'slug',
    type: 'text',
    localized: true,  // slug тоже можна локалізувати
    unique: true,
  },
  {
    name: 'featuredImage',
    type: 'upload',
    relationTo: 'media',
    // НЕ localized — одне зображення для всіх локалей
  },
]

Запити з локаллю

// Отримати пости на руському
const posts = await payload.find({
  collection: 'posts',
  locale: 'ru',
})

// Отримати пост на всіх мовах відразу
const allLocales = await payload.findByID({
  collection: 'posts',
  id: postId,
  locale: 'all',
})
// allLocales.title = { ru: '...', en: '...', uk: '...' }

// REST API:
// GET /api/posts?locale=en
// GET /api/posts/123?locale=all

Інтеграція з Next.js i18n

// 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
}

Часові рамки

Налаштування локалізації для 3 мов з адаптацією існуючих колекцій та Next.js роутингу — 1–2 дні.