Drupal качественно отличается от прочих известных систем управления тем, что "из коробки" поддерживает не просто единственную и множественную форму числительных, но и условия в зависимости от значения.
Очевидно, дает о себе знать не-US-происхождение drupal, так как в US-like странах из форм только 1-many (item-items). Русский язык же, в отличие от, содержит дополнительные условия, выполняющиеся в зависимости от значения порядка единиц и десятков.
- 1 страница
- 2-3-4 страницы
- 5-10 страниц
- (исключение) 11-20 страниц
- далее по порядку с п.1 до п.3.
Вводная
При импорте широко распространенного на просторах сети Интернет перевода возникает ситуация, когда множественные формы в файле описаны, но импортироваться не хотят. Почему?
Код файла перевода содержит следующую инфоомацию:
#: includes/common.inc:1512 msgid "1 page" msgid_plural "@count pages" msgstr[0] "@count страница" msgstr[1] "@count страницы" msgstr[2] "@count страниц"
Первая строка - комментарий, указывающий, где в PHP-коде встречается строка. Вторая и третья строки - оригиналы строк для перевода. Далее следуют строки перевода в порядке, используемом в plural-формуле drupal.
Фишка
Файл 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);?>
?>Ясно видно, что во втором куске кода нет проверки на массив строк MSGSTR_ARR. Чем массивы не угодили разработчикам именно при условии отсутствия комментариев - не ясно.
Решение
Ничего кроме жесткого хака на момент Drupal 6.16 нет. Хак необходимо производить до того, как добавляется русская локаль и импортируется файл перевода.
Требуется открыть includes/locale.inc в районе строки №1148. Строку
if ($context == "MSGSTR") { // End current entry, start a new oneтребуется заменить на
if ($context == "MSGSTR" || $context == "MSGSTR_ARR") {Для любителей патчить - diff:
--- locale.inc 2010-04-09 10:17:43.000000000 +0400
+++ locale.inc 2010-04-09 10:28:02.000000000 +0400
@@ -1145,7 +1145,7 @@
$context = "MSGID_PLURAL";
}
elseif (!strncmp("msgid", $line, 5)) {
- if ($context == "MSGSTR") { // End current entry, start a new one
+ if ($context == "MSGSTR" || $context == "MSGSTR_ARR") { // End current entry, start a new one
_locale_import_one_string($op, $current, $mode, $lang, $file, $group);
$current = array();
}


