Множественное число имен существительных в Joomla 3
При создании своего модуля для 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 форм задавать ей нужно самому. Без словаря ни один язык программирования не справится. Спасибо за внимание.