Перейти к содержанию

Локали и связанные переводы

Оглавление серии

Локализация хранит разные языковые представления одного документа. Русская и английская статья могут иметь разные заголовки, summary и адресные slug, сохраняя общую идентичность материала. Это не автоматический перевод: i18n даёт структуру для версий, а автор по-прежнему отвечает за содержание каждой из них. В «Редакционном доме» добавим английское представление только первой статьи.

После урока запросы будут явно выбирать locale=ru или locale=en. Автор Анна Лесная и категория «Вёрстка» останутся общими справочниками. Полный финальный src/api/article/content-types/article/schema.json включает i18n-настройки; прежние snapshots показывают состояние до локализации. Изменение схемы рассматривается как подготовленный учебный шаг, а не проверенная миграция существующей редакции.

Сначала локаль, затем перевод

В Settings → Internationalization добавьте русский язык и задайте ru как default locale лаборатории. Затем убедитесь, что en также доступна. Код локали — часть API-контракта. Русский текст в поле title не заставляет Strapi автоматически выбрать ru: язык содержимого и значение locale должны совпасть благодаря вашим действиям.

Официальная документация нового проекта использует en по умолчанию. Если ранее созданная статья после включения i18n оказалась в en, не считайте её русским вариантом лишь потому, что title написан кириллицей. Для учебной последовательности сначала создайте нужное ru-представление средствами Content Manager и перенесите туда исходные значения. Перед таким изменением сохраняйте локальную копию. Не обещаем автоматического переназначения уже существующей записи без проверки версии и состояния.

Настройте Article как localized type. Для title, slug, summary, body, seo, resources, coverAlt и coverCaption включим localized. Level, Author, Category и media cover в учебной модели оставим общими. Такое решение показывает, что не все сведения обязательно переводятся: сложность статьи и личность автора не меняются вместе с языком интерфейса.

Схема повторяет весь attributes и сохранена в архиве; здесь не приводим длинный JSON второй раз. Сопоставьте pluginOptions.i18n.localized у content type и отдельных полей с предыдущим snapshot. Правила включения и создания языковых представлений описаны в Internationalization.

Связанный английский документ

Откройте русскую «Сетку карточек CSS Grid» и создайте English localization средствами выбора локали этой записи. Не создавайте независимую Article с похожим названием. У связанной локализации должен быть тот же documentId, а у новой самостоятельной статьи — другой. Это отличие позволяет строить переключатель языка без угадывания по названию.

Заполните title CSS Grid card layout, slug css-grid-cards, summary Place three cards in a responsive grid. В body можно записать два учебных абзаца: CSS Grid defines rows and columns. и Start with three cards and a single container. SEO и альтернативный текст также заполните на английском, если они будут использоваться этим представлением. Сначала сохраните draft, затем отдельно опубликуйте после проверки.

Ожидаемая таблица состояния первой статьи выглядит так. Она не является выгрузкой запущенной CMS.

Представление documentId locale title
Русское Один реальный ID вашей статьи ru Сетка карточек CSS Grid
Английское Тот же ID en CSS Grid card layout

Одинаковый slug допустим для нашего замысла, поскольку сайт включает язык в маршрут. Если редакция выбирает переводные slug, например setka-kartochek и grid-card-layout, переключатель языка всё равно должен находить связь по документу, а не механически заменять /ru/ на /en/. Обычная строковая подстановка может дать страницу, которой нет.

Запрос определяет язык и состояние

REST принимает locale как отдельный query-параметр. Для опубликованного русского каталога передайте locale=ru&status=published, для английского — en. При отсутствии locale используется default проекта, но наш потребитель не полагается на эту настройку. Явный параметр делает запрос читаемым и защищает поведение сайта от случайной смены default в панели. Формат описан в REST Locale.

Если английская «Форма обратной связи» ещё не создана, en-каталог не обязан показать русскую статью. Такое отсутствие — нормальный результат нашего контракта. Автоматический fallback на ru потребовал бы отдельного решения интерфейса: показать язык, объяснить подмену и не выдавать непереведённый текст за английский. Минимальный сайт не добавляет подобный fallback скрытно.

Публикация языка также самостоятельна. Русская версия может быть published, английская — draft. Запрос en/published должен учитывать состояние английского представления. Не проверяйте доступность перевода по одному факту, что русская статья видна в каталоге. В выпускной ведомости нужно назвать обе локали и их готовность.

Связанные поля требуют внимания при наполнении. Поскольку Author и Category общие, имя и название категории в en-ответе пока остаются русскими. Это честная граница учебной модели, а не ошибка i18n. Если нужен полностью английский сайт, локализуйте справочники и определите связь языковых вариантов. Нельзя обещать полного перевода интерфейса только потому, что title Article поменял язык.

Полнота перевода как редакционная задача

Переведённый заголовок при русском body создаёт непоследовательную страницу. Схема проверяет наличие текста, но не его язык и соответствие. Редактору полезно сравнить summary, основной пример, ссылки ресурсов и подпись обложки. Иногда ссылка на документацию должна остаться английской в обеих локалях; это осмысленное решение, которое следует объяснить читателю.

Изменение русской статьи не обновляет английскую автоматически. Например, добавление четвёртой карточки в пример делает прежний английский текст устаревшим, даже если обе версии опубликованы. Для небольшого проекта отметьте в редакционной задаче, какие переводы требуют пересмотра. Будущая автоматизация может помогать находить изменения, но решение о соответствии всё равно должно иметь владельца.

У локали есть и presentation-сведения. HTML lang помогает вспомогательным средствам читать текст подходящим образом, но не переводит navigation или даты. Наш layout получает locale и задаёт lang, тогда как видимая подпись «Редакционный дом» пока общая. Если нужен полный многоязычный интерфейс, переведите клиентские строки отдельно от Article. Это различие между контентом и оболочкой особенно заметно в пустом каталоге: сообщение сайта существует даже когда API не вернул ни одного документа.

Для самостоятельной проверки сначала опубликуйте только ru и сравните два каталога, затем выпустите en и повторите сравнение. Вы должны увидеть различие состава и содержания без изменения идентичности первой статьи. В подготовке курса эти действия не выполнялись. Следующий урок свяжет языковой выбор с реальными маршрутами отдельного сайта: /ru/ и /en/ будут запрашивать конкретные опубликованные представления.