Столкнулся я как-то по работе с довольно популярным модулем для Drupal Webform. Делали мы мультиязычный сайт, и требовалось создать мультиязычную форму - на русском и английском языках.
Модуль Webform сам по себе мультиязычность не поддерживает (см. Make Webform multilingual (i18n) aware). Однако, есть-таки возможность создать полностью мультиязычную форму, правда, для этого вам понадобится бубен и навыки программирования под Drupal.
Здесь давайте немного остановимся и дадим определение "полной мультиязычности". Под полной мультиязычностью, в случае формы (webform`ы) нужно понимать, что при разных языках будут переведены:
В Drupal вся поддержка мультиязычности делиться на три основных слоя:
Что такое есть эти модули (слои), я надеюсь, читатель знает, и поэтому их описание останется за рамками статьи.
Если бы мы делали нашу форму программно, т.е. написали бы модуль и создали бы там форму через 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. Начинаем:
drupal_set_title(t(drupal_get_title())); //меняем заголовок ноды print t('My WebForm description.'); //текст пояснения пропускаем через t()
echo t('Your request has been sent. Thank you!');
Итак, на выходе у нас одна мультиязычная форма.
Желаю вам удачных проектов на Drupal!
Комментарии
Приветствую! Спасибо, что
Приветствую! Спасибо, что делитесь Вашими знаниями!
Перечитал несколько раз. Есть непонятные для меня моменты.
Или может я чего не уловил :)?
По пунктам: 1. Понятно, учту
По пунктам:
1. Понятно, учту в будущем, хотя уже сейчас стараюсь учитывать,
2. Описания к полям (Description) переводятся абсолютно также, как и названия полей (Title) - оригиналы описаний на английском языке нужно забить в базу данных.
себе сделал также форму
себе сделал также форму контактов, еще бы меню перевести без монстра i18n.
Так и не понял, как надо
Так и не понял, как надо перевести заголовок webform'ы.
Поставил модуль i18n, но ничего не изменилось. Нового функционала не заметил. Испытания на 6-м друпале.
Заголовок меняется
Заголовок меняется конструкцией
в поле Описание (Description) самой ноды-опросника (webform).
Отправить комментарий