Многоязычность в 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, проверить авторизован ли пользователь

Ноябрь 13, 2017 г.

Если в коде необходимо проверить авторизовался ли текущий пользователь, то можно использовать как минимум два подхода. Глобальная переменная user GLOBALS['user'] в Drupal хранит объект текущего пользователя, расширенного информацией о ролях пользователя. ...

Читать

Отправляем письмо из Drupal 7 в формате HTML

Июнь 24, 2011 г.

Разработчики решили в drupal 7 по умолчанию сделать отправку писем в формате plain text. Довольно неожиданный ход. Фактически, когда вы вызываете drupal_mail, на последнем этапе вызывается функция форматирования письма и там уже удаляются все html теги. ...

Читать

 

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

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



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