Многоязычные сайты

Сделать сайт на двух языках — это не просто добавить переключатель в шапку. На Drupal можно запустить 10 языков за вечер, но если наступить на те же грабли, что и 80% новичков, вы потратите недели на разгребание дублей и битых ссылок. Здесь — конкретные шаги, цифры и грабли. Без воды.
- Реальные цифры: типовой проект-каталог на 200 страниц при добавлении 3 языков требует около 40 часов только на перевод интерфейса (если делать вручную, в админке).
- Основная проблема: 70% ошибок — неправильный выбор модуля перевода: начинают с
Entity Translation, хотяContent Translationбыл бы быстрее в 2 раза. - Почему это важно: если выберете не тот модуль на старте, придётся перезаливать весь контент заново — Drupal не умеет мигрировать между подходами.
Прежде чем ставить модули, определитесь с архитектурой. Есть три принципиально разных пути: каждый язык — отдельный домен (en.site.ru, de.site.ru), поддиректория (site.ru/en) или субдомен. Для SEO лучше поддиректории — один домен, вся весна перетекает между языками. Для больших корпоративных сайтов (от 5000 страниц) — отдельные домены, чтобы не перегружать базу.
- Домены: дороже (SSL на каждый), сложнее учёт аудитории, но проще для серверной.
- Поддиректории: самый частый выбор для каталогов и блогов (80% проектов).
- Параметры URL:
?lang=en— не делайте, Google это не любит, индексация падает на 30%.
1. Главное решение: какой модуль перевода ставить?
В Drupal 9/10/11 есть два основных подхода: Content Translation (базовый, ядро) и Entity Translation (отдельный модуль). Разница — как они хранят перевод. Content Translation создаёт для каждого перевода отдельную ноду (запись), Entity Translation — хранит все переводы внутри одного ID. Выбор зависит от объёма и системы.
Пример: у вас интернет-магазин на 1000 товаров. Если используете Content Translation — каждое описание товара создаётся как отдельная нода. При редактировании оригинала вам придётся править все переводы вручную или через интерфейс. Entity Translation — переводите поля: описание, цена, характеристики. Одна карточка товара, 3 языка. В 2 раза меньше админских кликов.
Когда какой брать? Content Translation — если структура простая (блог, статья, новости). Entity Translation — для каталогов, таксономий, сложных полей (цены, скидки). Ещё нюанс: Entity Translation не поддерживает Drupal 8 ниже 8.4 — проверьте версию.
- Content Translation: для сайтов до 300 страниц с однотипным контентом.
- Entity Translation: для каталогов, интернет-магазинов, сайтов с динамическими полями.
- Смешанный подход: некоторые ноды переводятся через Content, другие — через Entity. Это возможно, но требует чёткой настройки прав доступа.
- Лучшая практика: сначала спроектируйте структуру на бумаге — 70% ошибок из-за того, что сначала ставят модуль, а потом думают.
2. Пошаговая настройка (чтобы не сломать сайт)
Шаг 1. Включите модули: Locale, Content Translation (или Entity), Language. Идите на страницу /admin/config/regional/language и добавьте языки: русский, английский, немецкий — что нужно. Не забудьте про Language Switcher — это не модуль, а блок, его нужно разместить в нужной области.
Шаг 2. Настройте перевод интерфейса. Это отдельный процесс: через /admin/config/regional/translate можно импортировать готовые .po файлы (найдите на drupal.org/project/l10n_server). Если у вас кастомные типы материалов — переводите их вручную, через интерфейс. Бюджет: 200 строк интерфейса — около 2-3 часов работы переводчика.
Шаг 3. Для каждой сущности (тип материала, таксономия) укажите, какие поля переводить. Зайдите в настройки типа: /admin/structure/types/manage/article → вкладка «Настройки языка». Отметьте галки: «Включить перевод» для полей заголовка, тела, изображения. Если не отметите — поле будет общим для всех языков (иногда это нужно, например, для даты или автора).
- Проверка: после настройки создайте ноду на русском, переключите язык в админке — должна появиться вкладка «Добавить перевод».
- Ошибка №1: забыли настроить права — пользователь с ролью «редактор» не видит кнопку перевода. Дайте права: «переводить контент», «редактировать любой контент».
- Ошибка №2: переключатель языка не отображается на странице — проверьте, что блок «Language switcher» размещён в нужной области (например, в Header) через Structure → Block layout.
- Ошибка №3: после переключения языка URL не меняется — включите опцию «Set language from URL» в настройках Language detection.
3. SEO для многоязычного сайта: что сделать обязательно
Drupal не проставит hreflang теги автоматически, если вы не скачаете модуль Hreflang (contrib). Без него Google может посчитать языковые версии дублями — и ранжирование упадёт. Установите модуль, настройте его на /admin/config/search/hreflang — укажите связку «язык → URL-префикс». Проверьте через Google Search Console: в разделе «Улучшения» должны появиться зелёные отметки.
Ещё одна ловушка — неправильная настройка XML Sitemap. Для каждого языка нужно сгенерировать отдельную карту сайта. Модуль Simple XML Sitemap (contrib) умеет делать это через настройки: включите галку «Разделять по языкам». Пример: sitemap_ru.xml, sitemap_en.xml. Каждая карта — только страницы своего языка. Без этого Google будет индексировать все языки подряд, создавая путаницу.
- Модули для обязательной установки: Hreflang, Language Switcher (блок), Simple XML Sitemap (с опцией разделения).
- Чек-лист SEO: проверьте hreflang в исходном коде страницы — должно быть
<link rel="alternate" hreflang="ru" href="..." />для каждого языка. - Meta-теги: для каждого языка заполняйте title и description отдельно — модуль Metatag (contrib) поддерживает перевод полей.
- Ошибка: если у вас многостраничные формы (фильтры каталога) — проверьте, что URL-параметры не влияют на язык. Пример:
/ru/catalog?page=2— это нормально, а/ru/catalog?lang=ru— нет.
4. Как автоматизировать перевод (не сидеть и не кликать)
Переводить 1000 страниц вручную — это 200+ часов. Используйте модуль TMGMT (Translation Management Tool). Он подключает профессиональных переводчиков или Google Translate (через плагин). Настройка: установите TMGMT, добавьте провайдера (например, Google Translation API), настройте очереди перевода. Для карточек товаров можно вообще настроить автоперевод через cron — каждую ночь новые ноды будут переводиться автоматически.
Бюджет: Google Translation API стоит около $20 за 1 миллион символов. Для сайта на 1000 страниц (по 500 символов каждая) — около $10. Если нужен качественный перевод — наймите подрядчика на TMGMT (там есть встроенный интерфейс для заказа).
- Бесплатный вариант: модуль DeepL API (есть contrib-версия) — 500 000 символов бесплатно в месяц.
- Платный вариант: TMGMT + Microsoft Translator — стабильно работает, среднее качество.
- Ручной вариант: если сайт маленький (до 50 страниц) — сделайте дамп базы, переведите через Excel, импортируйте через Feeds (contrib) — быстрее, чем кликать админку.
- Совет: не автоматизируйте перевод мета-тегов и alt-текстов — они часто требуют локальной адаптации (идиомы, региональные слова).
5. Типичные ошибки и как их не допустить
Ошибка 1: переводите только контент, но не интерфейс. Посетитель видит русский текст, но кнопки «Добавить в корзину» — на английском. Выход: используйте .po файлы для интерфейса (скачайте готовые с l10n.drupal.org). Для кастомных модулей — переводите строки через t() в коде и импортируйте .po через Translate interface.
Ошибка 2: не настроили переключатель языка для таксономии. Если у вас категории товаров (рубрики) не переводятся — при переключении языка пользователь видит пустую страницу. Выход: в настройках таксономии включите перевод для каждого словаря. Проверьте, что URL-алиасы (синонимы) тоже переведены: /ru/category/odezhda и /en/category/clothes.
Ошибка 3: забыли про перевод views. Если вы выводите список новостей через Views — убедитесь, что сам View (настройки, заголовки) переведён. В админке Views есть вкладка «Translation» — там можно указать заголовки для каждого языка.
Ошибка 4: пытаетесь перевести уже запущенный сайт без тестовой копии. 90% багов проявляются после включения языковых модулей на живой базе — дубли нод, потеря связей. Всегда делайте копию базы (дамп через Drush: drush sql-dump --result-file=backup.sql) и тестируйте на локальной или стейджинг-среде.
- Ещё одна ловушка: URL-алиасы на разных языках не должны совпадать. Если
/aboutведёт на русскую страницу, а/en/about— на английскую, Drupal сам проставит префикс, но проверьте, что нет дублёров. - Проверка: после настройки пройдите по всем страницам каждого языка — ссылки не должны вести на 404. Используйте модуль Link checker (contrib) — он найдёт битые ссылки автоматически.
- Итог: многоязычность на Drupal — это не страшно, если последовательно пройти все шаги. Главное — не начинать с установки модулей, а сначала написать план на бумаге.
Добавлено: 23.04.2026
