Многоязычность в Drupal 7

Конструирование многоязычного сайта добавляет множество деталей, которые нужно учитывать в процессе работы. Это и верстка шаблона, картинки которого могут содержать текстовые надписи. Перевод контента, таксономии. Вопросы навигации по многоязычному сайту. А также многоязычное меню.

Первый шаг — это подключение модуля Locale, который входит в состав Drupal. Его подключают и для моноязычных проектов, чтобы работать с локализованным интерфейсом сайта. В моноязычном случае можно игнорировать правило — оборачивать все текстовые константы функцией t() в коде, сразу писать тексты на требуемом языке.  Функция t()  ожидает, что текст будет на английском, а она уже будет подбирать вам локализацию в зависимости от текущего языка просматриваемой страницы.

Для многоязычных сайтов нужно выполнить несколько шагов.

Добавляем языки

/admin/config/regional/language — на этой странице вы можете добавить нужные вам языки. У каждого языка есть префикс, который можно будет использовать в url, давая понять системе на каком языке вы хотите увидеть страницу. Для смены языка можно вбить соответствующий префикс в адресе страницы. Для системных страниц это работает всегда. Для пользовательского контента — нет.

Грузим локализации интерфейса

Локализацией интерфейса модулей и ядра на русский язык занимается огромная куча народу на проекте Drupaler.ru. По мимо русского языка, там есть ещё несколько языков с меньшей степенью локализации, но это лучше чем ничего.

Модуль интернационализации

Устанавливаем пачку модулей i18n. Он содержит целую пачку решений для перевода разных типов контента. Про каждый компонент можно написать не одну статью. К примеру, для нод используется компонент модуля — Multilingual content. Он добавляет настройки в типы публикаций.

multilingual-options

Перевод нод сводится к созданию дополнительных публикаций на других языках. Публикации одной и той же статьи связаны в базе друг с другом общим кодом (node.tnid), что позволяет легко программно отыскать нужные переводы.

В контекстном меню ноды появляется закладка — «переводы».

node-translate

Словари таксономии можно переводить по аналогии с нодами, создавая дополнительные термины. А можно ограничиться локализацией названий. Помогает в этом компонент Taxonomy translation. Его подключение позволяет выбрать для каждого словаря свои опции многоязычности.

taxonomy-translation

Каждая из опций может быть полезной в той или иной ситуации. При «локализации» мы получим возможность перевода названий и описаний, но сохраним id термина. В случае «Translate» — переводы хранятся в связанных терминах (на подобии перевода нод), т.е. переводы имеют собственные term_id. «Fixed Language» — тут каждый термин будет привязан к определенному языку, и термины будут показываться на страницах только с соответствующим языком. Связей между языками в последнем случае у терминов не будет.

Компонент Menu translation пытается решить задачу с переводом меню. В некоторых случаях это решение даже можно использовать. Вот такие настройки появляются в конструкциях меню.

menu-translation

В первом случае модуль пытает играть префиксами, подставляя к пути страницы текущий префикс языка. Если алиасы разноязычных страниц не совпадают, это не даёт ожидаемого результата. Пункты меню можно перевести, используя локализацию.

Случай «Translate and Localize» мне не удалось понять как работает. При добавлении пункта меню в редакторе ноды язык брался из ноды. Но если я добавлял пункт меню вручную, то язык пункта меню оказывался undefined. При этом ссылка в редакторе списка элементов меню «Translate» вела на страницу — доступ запрещен.

Последний вариант — «Fixed Language», был наиболее продуктивным. В меню нужно было сложить ссылки на всех языках, но при выводе меню будут отображаться ссылки ассоциированные с языком текущей страницы. Для 2-3 языков это вполне себе решение, если меню не очень ветвистое.

Так как все три варианта оказались не «ахти», пришлось сварганить хелпер для вывода меню в шаблон. Хелпер замещает menu_navigation_links, обрабатывая массив ссылок, возвращаемый данной функцией. Мы стараемся найти и подставить ссылки на переводы нод.

В рабочую версию хелпера стоит добавить кеширование.

Мало букафф? Читайте есчо !

Проверить заданный permission у пользователя в Drupal

Сентябрь 6, 2017 г.

В Drupal (7) новые флажки - права пользователей добавляются через hook модуля MODULENAME_permission. В зацепке вы формируете массив описаний прав, который возвращаете при выходе из функции. Пример: [crayon-68e5339e6ed99716583677/] После того, ...

Читать

Как в шаблоне параграфа получить заголовок родительской ноды

Сентябрь 15, 2025 г.

Иногда возникает задача: в Twig-шаблоне параграфа (paragraph.html.twig) нужно отобразить заголовок материала (ноды), к которому этот параграф прикреплён. Нам не нужно передавать что то дополнительно в шаблон, эти данные могут быть получены из самой ...

Читать

Работа со схемой данных в Drupal

Январь 17, 2019 г.

В определенный момент стандартные схемы данных Drupal вас могут перестать удовлетворять, и вы решите добавить свои таблицы в базу данных сайта. Как это ...

Читать

Транслитерация имени файла при создании медиа entity программно в Drupal

Май 21, 2023 г.

При импорте изображений возникает задача транслитерации. Картинки, например, могут содержать буквы национальной кодировки (кириллицы) и/или иметь несовместимые с файловой системой сервера символы. Drupal (начиная с 8.2) объявляет специальный интерфейс, ...

Читать
 

Комментарии к «Многоязычность в Drupal 7»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: