2. Баг при импорте перевода из .po файлов, касающийся использования HTML-тэгов

Как известно, Drupal позволят импортировать перевод с помощью загрузки специальных .po файлов. В данных файлах типичными являются строковые группы вида:

#: includes/common.inc:2722
msgid "Cron run exceeded the time limit and was aborted."
msgstr "Выполнение cron было прервано, потому что был исчерпан лимит времени на запуск."

Разумеется, что сообщения, которые нуждаются в переводе, в отличие от вышеприведённого примера, могут быть очень разными. Проблема возникает с сообщениями, которые содержат HTML-тэги, которые признаны разработчиками Drupal как небезопасные. Это хорошо можно увидеть на примере перевода помощи к модулю BBCode. Помощь содержит примеры, демонстрирующие возможности форматирования текста с помощью BB-кодов. Для того, чтобы показать пользователю как будет выглядеть отформатированный текст, используются HTML-тэги. В английском варианте вы всё видите без проблем, но загрузка русского перевода к этому модулю завершится с сообщением: "One translation string was skipped because it contains disallowed HTML." (Одна строка с переводом была пропущена, потому что она содержит неразрешённый HTML)

Раскопки исходников Drupal показывают, что при загрузке перевода, используется проверка загружаемых строк на допустимость с помощью функции:

<?php
function locale_string_is_safe($string) {
  return 
decode_entities($string) == decode_entities(filter_xss($string, array('a''abbr''acronym''address',
 
'b''bdo''big''blockquote''br''caption''cite''code''col''colgroup''dd''del''dfn''dl',
 
'dt''em''h1''h2''h3''h4''h5''h6''hr''i''ins''kbd''li''ol''p''pre''q''samp',
 
'small''span''strong''sub''sup''table''tbody''td''tfoot''th''thead''tr''tt''ul',
 
'var')));
?>

что автоматически приводит к невозможности использования в переводах HTML-тэгов, которые в ней не перечислены. Более того, хотя тэг span присутствует в этом списке, он проходит только если используется без параметров, т.е.

<span>текст</span>

что автоматически делает его бесполезным.

В общем-то, в какой-то степени, причина такой фильтрации понятна - разработчики постарались закрыть потенциальную брешь в безопасности, когда может быть использован вредносный HTML, содержащий JavaScript или такие настройки стилей, которые исказят оформление сайта. Однако, тут есть два больших НО:

  1. Почему же в оригинальном английском тексте допускаются все HTML-тэги, а в переводе нет? Почему такой двойной стандарт?
  2. Даже с учётом потенциальных проблем с небезопасным HTML, перевод загружает администратор сайта, а не рядовой пользователь! Администратор сайта должен осознавать потенциальные угрозы и сам производить проверку.

Но как же быть если перевод с использованием запрещённых HTML-тэгов всё-таки нужен? Ведь в итоге, разработчики Drupal не оставили никакого выбора - тупой запрет и всё! Выходов несколько:

  1. Прямая прогрузка перевода в базу данных с помощью SQL-запроса. Да, такой путь позволяет избежать изменения файлов самого Drupal, однако уж очень он неудобен.
  2. Использовать специальный, написанный мной патч к Drupal, приложенный к данной публикации. Использование этого патча добавляет на страницу импорта перевода admin/build/translate/import, дополнительную галочку, позволяющую отключить проверку валидности HTML-тэгов:
    После этого вы можете загружать перевод, содержащий любые HTML-тэги.

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

ВложениеРазмер
trhack.jpg27.19 kb
locale.inc_.patch1.57 kb