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

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

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

#: includes/common.inc:1244
msgid "1 byte"
msgid_plural "@count bytes"
msgstr[0] "@count байт"
msgstr[1] "@count байта"
msgstr[2] "@count байт"

В первой строковой группе используется единственная форма сообщения, во второй группе множественная, основанная на так называемой plural-формуле. Но как видите, и перед первой строковой группой и перед второй стоят строки с комментариями, которые начинаются на "#:". Данный комментарий говорит о том месте в PHP-файлах, откуда была взята данная строка для перевода.

Баг заключается в том, что если комментарии убрать, то строки первой группы, использующие единичную форму перевода загрузятся и будут работать, а вот строки второй группы - нет. Это связано с ошибкой в файле includes/locale.inc в функции _locale_import_read_po(), где обработку строк с комментариями перед ними и без них осуществляют два разных куска кода. Вот этот код работает в случае наличия комментария:

<?php
...
    if (!
strncmp("#"$line1)) { // A comment
      
if ($context == "COMMENT") { // Already in comment context: add
        
$current["#"][] = substr($line1);
      }
      elseif ((
$context == "MSGSTR") || ($context == "MSGSTR_ARR")) { // End current entry, start a new one
        
_locale_import_one_string($op$current$mode$lang$file$group);
...
?>

а вот этот когда комментария нет:

<?php
...    elseif (!strncmp("msgid"$line5)) {
      if (
$context == "MSGSTR") {   // End current entry, start a new one
        
_locale_import_one_string($op$current$mode$lang$file$group);
...
?>

Как легко заметить, во втором случае в if отсутствует проверка на важное условие:

<?php
($context == "MSGSTR_ARR")
?>

Если во второй фрагмент кода добавить эту проверку - файл загружается нормально как с комментариями, так и без них.

Желающим поспотрить предлагаю два аргумента:

  1. Спецификация PO файлов, которая говорит о том, что все комметарии, любого типа являются необязательными.
  2. Если таки кто-то будет продолжать настаивать, что комментарии в .po файле являются обязательными, то почему же тогда при импорте, Drupal не выдаёт ошибок о том, что отсутствуют обязательные комментарии?

Переводы с сервера переводов drupaler.ru, загруженные в компактной форме, демонстрируют эту проблему в полный рост.

В конце данной публикации приложен патч, который позволяет вам пропатчить ваш Drupal, чтобы устранить эту ошибку.

Мной запощен баг на drupal.org, по которому тишина - он вряд ли будет исправлен, но таким образом, мой долг сообществу отдан.

ВложениеРазмер
locale.diff509 байт