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();
       }