При создании своего модуля для Joomla 3 я решил сразу учить его нормально говорить по-русски. Тем более, что мультиязыковая поддержка в Joomla не представляет из себя ничего сложного. Задаешь языковые переменные, создаешь файлы для поддерживаемых языков и всего делов. Но под вопросом было как организовать в расширении Joomla 3 склонение имен существительных во множественном числе. Ведь у англоязычных народов все просто, одна форма слова в единственном числе и одна во множественном, например guest и guests. А у нас это, к примеру, 1 гость, 2 гостя, 5 гостей, 21 гость. Но оказалось, интересные решения есть. Так есть один вариант реализовать это при помощи функции на PHP, а другой  -  стандартным методом класса JText. О них и поговорим в этом материале.

Собственно стояла задача, как в зависимости от числительного выводить корректную форму слова. В моем модуле кто сейчас онлайн, чтобы красиво собрать общую сводку нужно было выводить слова "гость", "робот" и "пользователь" в нужной форме в зависимости от числа тех или иных на сайте. К примеру, 31 гость, 12 роботов и 1 пользователь. Можно было не парится и написать как все делают, что-нибудь в языковой строке типа в "пользователь/ей", как бы универсально, но это хрень, друзья мои. 

1. Склонение имен существительных в зависимости от числительного на PHP

Для начала определим собственно слова и их формы. Для каждого слова создадим свой массив. У меня три слова, три массива с формами.

$usersarray = array("пользователь", "пользователя", "пользователей");
$guestsarray = array("гость", "гостя", "гостей");
$robotsarray = array("робот", "робота", "роботов");

Далее собственно сама функция, которая определяет какой из 3 вариантов слова подходит к числительному с которым ему стоять в одном предложении. Описание ее тела легко найдете в сети, если хотите понять как она работает.

  function getWord($number, $suffix) {
    $keys = array(2, 0, 1, 1, 1, 2);
    $mod = $number % 100;
    $suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
    return $suffix[$suffix_key];
  }

При обращении к этой функции ей нужно передать 2 параметра. Первый это собственно цифра-числитель, второй - массив с формами слов. То есть результатом выполнения кода:

<?php
  function getWord($number, $suffix) {
    $keys = array(2, 0, 1, 1, 1, 2);
    $mod = $number % 100;
    $suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys[min($mod % 10, 5)];
    return $suffix[$suffix_key];
  }
$usersarray = array("пользователь", "пользователя", "пользователей");
$guestsarray = array("гость", "гостя", "гостей");
$robotsarray = array("робот", "робота", "роботов");
$users_num = 41;
$guests_num = 23;
$robots_num = 38;
echo $users_num; echo getword($users_num,$usersarray); echo "<br>";
echo $guests_num; echo getword($guests_num,$guestsarray); echo "<br>";
echo $robots_num; echo getword($robots_num,$robotsarray); echo "<br>";
?>

будет

41 пользователь
23 гостя
38 роботов

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

$usersarray = (
				"MOD_MYMODULE_USERS1",
				"MOD_MYMODULE_USERS2",
				"MOD_MYMODULE_USERS3"
				)

Определить данные переменные в языковом файле /language/ru-RU/ru-RU.mod_mymodule.ini:

MOD_MYMODULE_USERS1="пользователь"
MOD_MYMODULE_USERS2="пользователя"
MOD_MYMODULE_USERS1="пользователей"

а потом получать нужную форму на вашем языке через JText::_

$n = 22;
$word = JText::_(getWord($n, $usersarray));
echo "$n $word";

Результатом будут тоже аккуратные "22 пользователя". 

2. Склонение имен существительных в зависимости от числительного методом JText_plural в Joomla 3.

Метод JText_plural является стандартным методом класса JText. Исходник функции-метода кому интересно можно глянуть в файле класса JText по адресу /libraries/joomla/language/text.php

Тут для начала нужно задать языковые переменные. В нашем языковом файле пишем следующее:

MOD_MYMODULE_ROBOTS=" роботов"
MOD_MYMODULE_ROBOTS_1=" робот"
MOD_MYMODULE_ROBOTS_0=" роботов нет"
MOD_MYMODULE_ROBOTS_2=" робота"

Затем собственно вызовем наш метод вот так:

$b = 981;
$word = JText::plural('MOD_MYMODULE_ROBOTS',$b);
echo $b; echo $word;

И получим в результате:

 

981 робот

 

Вот так в принципе Joomla может склонять имена существительные в зависимости от числительного стоящего с ним рядом. Но, как видите, словарь из 3 форм задавать ей нужно самому. Без словаря ни один язык программирования не справится. Спасибо за внимание.