Многоязычность в 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, обрабатывая массив ссылок, возвращаемый данной функцией. Мы стараемся найти и подставить ссылки на переводы нод.

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

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

Программное создание публикации в Drupal 7

Апрель 15, 2017 г.

Еще одна шпаргалка по Drupal 7. Мы создадим публикацию из PHP, добавим пользовательские поля и даже загрузим файл (изображение) в поле соответствующего типа. Сначала мы создадим структуру публикации (объект node).  Нам понадобится указать данные, ...

Читать

Ошибка обновления metatag remove_robots_noydir_noodp

Май 24, 2023 г.

Если у вас собран Drupal + Commerce, то, возможно, при обновлении модуля метатегов возникает ошибка. Модуль не находит таблицы мета информации для сущности commerce_product и прерывается с выводом сообщения: [crayon-6991188f29c8e121653691/] ...

Читать

Пример задания значения контектного фильтра views программно

Декабрь 24, 2017 г.

Если вы практикуете вызов и рендеринг объектов views из кода, то возможно вам пригодится следующий пример задания значения контекстного фильтра напрямую из вашей программы. Программное задание значений фильтров я уже рассматривал ранее. Принцип ...

Читать

Фильтруем нежелательные теги из WORD в CKEditor

Июль 1, 2018 г.

Хоть CKEditor и позволяет редактировать тексты, но редакторов сложно приучить готовить их сразу на сайте. Потому первая ревизия текста обычно появляется ...

Читать
 

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

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



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