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("#", $line, 1)) { // A comment
if ($context == "COMMENT") { // Already in comment context: add
$current["#"][] = substr($line, 1);
}
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", $line, 5)) {
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")
?>Если во второй фрагмент кода добавить эту проверку - файл загружается нормально как с комментариями, так и без них.
Желающим поспотрить предлагаю два аргумента:
- Спецификация PO файлов, которая говорит о том, что все комметарии, любого типа являются необязательными.
- Если таки кто-то будет продолжать настаивать, что комментарии в .po файле являются обязательными, то почему же тогда при импорте, Drupal не выдаёт ошибок о том, что отсутствуют обязательные комментарии?
Переводы с сервера переводов drupaler.ru, загруженные в компактной форме, демонстрируют эту проблему в полный рост.
В конце данной публикации приложен патч, который позволяет вам пропатчить ваш Drupal, чтобы устранить эту ошибку.
Мной запощен баг на drupal.org, по которому тишина - он вряд ли будет исправлен, но таким образом, мой долг сообществу отдан.
| Вложение | Размер |
|---|---|
| locale.diff | 509 байт |
- Тэги:
- Войдите или зарегистрируйтесь, чтобы добавлять комментарии
