Мультиязычный сайт на Drupal и модуль WebForm

аватар: andyceo

Столкнулся я как-то по работе с довольно популярным модулем для Drupal Webform. Делали мы мультиязычный сайт, и требовалось создать мультиязычную форму - на русском и английском языках.

Модуль Webform сам по себе мультиязычность не поддерживает (см. Make Webform multilingual (i18n) aware). Однако, есть-таки возможность создать полностью мультиязычную форму, правда, для этого вам понадобится бубен и навыки программирования под Drupal.

Здесь давайте немного остановимся и дадим определение "полной мультиязычности". Под полной мультиязычностью, в случае формы (webform`ы) нужно понимать, что при разных языках будут переведены:

  1. Заголовок страницы с формой
  2. Описание формы
  3. Заголовки полей
  4. Описания полей
  5. Сообщение об успешной отправке
  6. Сообщения о неправильно заполненных полях (неуспешая отправка формы)

В Drupal вся поддержка мультиязычности делиться на три основных слоя:

  • Перевод интерфейса (модуль ядра Locale)
  • Перевод контента (модуль ядра Content Translation)
  • Модуль i18n для полного перевода сайта

Что такое есть эти модули (слои), я надеюсь, читатель знает, и поэтому их описание останется за рамками статьи.

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

WebForm тоже так делает - он пропускает заголовки и описания полей формы через t(). Т.е. казалось бы, мы решили проблему перевода формы! Но... почти решили. Вот первый подводный камень.

WebForm сохраняет параметры полей в том виде, в каком вы их вводите. Т.е., если вы вводите поле

Тип: "textfield"
Заголовок: "Ваше имя"
Описание: "Пожалуйста, введите Ваше имя."

То в базе данных будут сохранены именно эти значения, а это означает, что когда придет время форме отобразиться, через ф-ию t() пойдут русские строки, что не есть правильно.

Второе. WebForm`а является нодой, т.е. единицей контента. А для перевода контента у нас предназначен совсем другой слой переводов - "Перевод контента".

Строго говоря, как нужно было бы сделать правильно, с точки зрения философии Drupal? Нужно было бы создать свою форму для каждого конкретного языка, при создании забивать все поля на том языке, для которого делается эта форма, и затем... нужно было бы создать некую интересную ссылку (например в меню сайта), при которой у нас на русском языке, например, она вела бы на node/25, а на английском - на node/26. Как известно, в админке через стандартный интерфейс работы с меню этого сделать нельзя. (Забегая немного вперед, скажу, что при помощи модуля i18n (а точнее его подмодуля Menu translation, или, если меню - это primary links, путем еще больших хитростей - читайте мануал к i18n) эту задачу можно решить, путем создания разных меню - каждое на ту или иную языковую версию сайта. Но хотелось бы чего попроще.)

Более того, хотелось бы, чтобы при переключении языка, показывалась соответствующая версия нашей ноды-webform`ы. Т.е. находимся мы, например, на этой самой форме, в английском варианте - node/26. Потом - хоп! - переключились на русский, нажав соответствующий флажок. Как поведет себя друпал? Он сразу же переведет интерфейс (все служебные сообщения, пункты меню и прочая), и отобразит эту же ноду - node/26, отобразив внизу малоприметную ссылочку на перевод. А как надо? Чтобы он перенаправил нас на русскую версию этой ноды - node/25, чего не произойдет. А еще лучше - что в блоке переключения языков, на слове "Русский" (или там на флажке), при просмотре английской версии, был адрес не текущей, английской, ноды, а уже ссылка на форму-перевод.

И как это сделать (стандартными средствами или сторонними модулями), совершенно непонятно. Если кто знает - отпишитесь в комментах как.

И это я уже и не вспоминаю "удобство" администрирования, при таком подходе: в случае двух языков, будет две вебформы, и за результатами их заполнения нужно следить уже в двух местах. А если языков не два, а три или четыре (а так бывает)? А форм на сайте не одна, а 3-4-5-более? Тогда это все превратиться в АДминистрирование. :)

Итак, не буду долго томить и предлагаю решение. Чтобы создать мультиязычную вебформу, нужно создать ее всего лишь одну, но при этом потребуются навыки программирования и небольшое знание API Drupal. Начинаем:

  1. Переведем текст описания самой формы (еще его могут называть пояснение к форме) и ее заголовок. В поле Описание ставим фильтр ввода php и вводим примерно следующее:

      drupal_set_title(t(drupal_get_title())); //меняем заголовок ноды
      print t('My WebForm description.'); //текст пояснения пропускаем через t()

  2. Задаем сообщение об успешной отправке формы, примерно так:

      echo t('Your request has been sent. Thank you!');

  3. Поскольку заголовки и описания полей у нас пройдут через функцию t(), т.к. WebForm строит формы, используя FormAPI Drupal, то нам следует забивать их на английском языке. Да, я тоже так подумал сначала. Но WebForm еще умнее. ;) Когда вы нажмете кнопку "Сохранить", WebForm зачем-то прогонит ваши строки через t() и в своей базе данных сохранит именно переводы, а не исходные английские тексты. То ли это фича, то ли это баг, но делать нечего - придется пойти в базу (в таблицу webform_component), найти там ваши только что введенные поля и перебить их параметры английскими значениями. Сделать это нужно непосредственно в базе данных, т.к. при сохранении формы WebForm вновь переведет измененные строки. Именно поэтому этот шаг - последняя правка самой ноды-формы. Имейте ввиду, что при любом обновлении ноды через стандартный интерфейс, названия полей будут перезаписаны, и придется повторять трюк с базой снова. Зато теперь, при построении формы, WebForm пропустит эти строки через t() и если найдет в системе перевод, переведет их.
  4. В админке в разделе Администрирование - Конструкция - Перевод интерфейса, нужно сделать поиск по англоязычным текстам ваших полей, и перевести их там, на нужные языки. Вуаля, на этом шаге мы перевели заголовки полей и их описания.
  5. Для перевода всяческих сообщений об ошибках, о неверно заполненных полях и прочее, просто залейте файл перевода модуля WebForm.

Итак, на выходе у нас одна мультиязычная форма.

Желаю вам удачных проектов на Drupal!

Комментарии

аватар: Petu

Приветствую! Спасибо, что

Приветствую! Спасибо, что делитесь Вашими знаниями!

Перечитал несколько раз. Есть непонятные для меня моменты.

  1. Было бы здорово, если бы в самой статье соответствующие термины были продублированы на языке оригинала - английском. Например: "текст описания самой формы" == "Description", "сообщение об успешной отправке формы" == "Confirmation message or redirect URL". Иначе возникает путаница.
  2. Немного не понятно, как переводить описания для самих полей (Form components). Имя поля (Label) переводится правильно. А вот описание поля (Description) как переводить? Конструкцию вида "drupal_set_title(t(drupal_get_title())); print t('Please enter your company’s name'); " здесь вставить можно, но она не будет работать.

Или может я чего не уловил :)?

аватар: andyceo

По пунктам: 1. Понятно, учту

По пунктам:

1. Понятно, учту в будущем, хотя уже сейчас стараюсь учитывать,

2. Описания к полям (Description) переводятся абсолютно также, как и названия полей (Title) - оригиналы описаний на английском языке нужно забить в базу данных.

аватар: Nikit

себе сделал также форму

себе сделал также форму контактов, еще бы меню перевести без монстра i18n.

аватар: Petu

Так и не понял, как надо

Так и не понял, как надо перевести заголовок webform'ы.
Поставил модуль i18n, но ничего не изменилось. Нового функционала не заметил. Испытания на 6-м друпале.

аватар: andyceo

Заголовок меняется

Заголовок меняется конструкцией

drupal_set_title(t(drupal_get_title())); //меняем заголовок ноды

в поле Описание (Description) самой ноды-опросника (webform).

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can use the <go> tags just like the <a> for nicer urls.
  • Доступны HTML теги: <a> <img> <noindex> <br> <em> <i> <strong> <b> <strike> <s> <u> <sup> <sub> <h1> <h2> <h3> <h4> <h5> <h6> <cite> <blockquote> <abbr> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <div> <span> <hr>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <blockcode>. The supported tag styles are: <foo>, [foo]. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Подробнее о форматировании

CAPTCHA
Введите, пожалуйста, код, который Вы видите на картинке. Показ изображений в браузере должен быть включен.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.
Добавьте страницу в закладки. Перейти к верху страницы
RSS-материал