Склоняем единицы измерения с помощью функции cot_declension()
Популярные запросы: Open Graph, плагин Reading Time, тема Quebec, плагин Telegram, набор иконок Analogue
- 150 просмотров +1
- 23 декабря, 2025
- Обновлено: 16 января, 2026
- admin
- Время чтения: 4 минуты
- 1 (Подробно)
Практически любой сайт, особенно его backend, требует вывода числовых данных с единицами измерения. Например:
1 просмотр 12 страниц 5 посетителей 0 комментариев
Мы видим, что для русского языка выстраивается тройная парадигма:
- значение равно (заканчивается на) 1,
- значение больше 1 и меньше 5,
- значение больше или равно 5 (или равно 0).
Для английского все по-другому:
1 hit 12 pages 5 visitors 0 comments
Здесь парадигма другая:
- значение равно 1,
- значение больше 1.
Французы пошли своим путем:
1 aperçu 12 pages 5 visiteurs 0 commentaires
Парадигма тоже двойная, но иная по отношению к германской группе:
- значение равно 0 или 1,
- значение больше 1.
Со всей этой историей в Cotonti Siena разбираются функции cot_get_plural() и cot_declension(). Первая определяет парадигму и отдает вариант для множественного числа применительно к системному языку. Вторая оформляет вывод так, чтобы сделать его максимально гибким для разработчика или верстальщика сайта.
Функция cot_get_plural()
Данная функция вызывается из cot_declension() и, как уже говорилось, определяет вариант множественного числа для указанного языка. Чудес она не совершает и предлагает выбор для:
- германских языков (en, de, nl, se, us),
- романских языков (fr),
- славянских языков (ru, ua).
Все это группы языков индоевропейской семьи, да и то не все. Дальше их разработчики Cotonti не заходили, но это означает означает лишь то, что при востребованности, скажем, финского или венгерского в функцию будут внесены соответствующие изменения. А пока что у нас и так неплохой выбор из 8 языков.
Функция cot_declension()
В отличие от cot_get_plural(), с данной функцией уже можно работать напрямую. Она принимает 4 аргумента:
function cot_declension($digit, $expr, $onlyword = false, $canfrac = false)
{
...
Разберем каждый:
$digitсодержит числовое значение,$exprсодержит имя специальной языковой переменной из массива$Ls,$onlywordв зависимости от значенияtrueилиfalseограничит вывод только вербальным значением (“страниц” вместо “5 страниц”),$canfracв зависимости от значенияtrueилиfalseпередаст указание на число с дробной частью.
Теперь коротко по каждому аргументу с кейсами. Для простоты ограничимся использованием функции в шаблонизаторе, предположим, что организуем вывод для переменной $some_digit со значением 5, а системным языком является русский.
Прежде, чем делать красиво, создадим языковую строку для нашего значения или убедимся в ее наличии. Для этого заглянем в файл lang/ru/main.ru.lang.php и поищем в нем элементы массива $Ls. Это глобальный файл локализации, доступный в любой локации, но если в нем отсутствует строка с искомым словом, можно поискать в файле локализации модуля, например, modules/page/lang/page.ru.lang.php. Если и там нет ничего похожего, откроем файл локализации темы (например, themes/nemesis/nemesis.ru.lang.php) и создадим в нем кастомную строку:
$Ls['theme_apples'] = яблоко,яблока,яблок';
Имя можно выбрать любое, но для исключения возможных конфликтов используйте уникальный префикс.
Ок, теперь в шаблоне можем указать:
<div>
{PHP.some_digit|cot_declension($this, ‘theme_apples’)}
</div>
На выходе получим
5 яблок
Если все так просто, зачем нужна суета с $onlyword? Дело в том, что в шаблоне часто требуется отдельная разметка для числа и единицы измерения, например:
5 <span>просмотров</span>
В таком случае используем:
{PHP.some_digit} <span>{PHP.some_digit|cot_declension($this, ‘theme_hits’, true)}</span>
Проще всего дело обстоит с аргументом $canfrac. Исходя из названия, понятно, что если вы не уверены в целочисленном значении обрабатываемой переменной, этому аргументу лучше присвоить значение true:
{PHP.some_digit|cot_declension($this, ‘theme_hits’, false, true)}
Теперь если $some_digit примет значение 5.3, получим:
5.3 яблока
, но и при значении 5 вывод будет правильным:
5 яблок
Если вы уверены в целочисленном значении, $canfrac поможет избежать лишней проверки.
Заключение
Еще на одном примере мы продемонстрировали, что Cotonti Siena – это гибкое и компактное решение для создания сайтов, которое, ко всему прочему, еще и обеспечивает дружественный подход к локализации. Котонти не только и не просто обеспечивает подстановку переводных строк “как есть”, но и обеспечивает локализацию падежей, а также форматов дат, десятичных знаков и “тысячных” разделителей.
Нескучной вам верстки!
Новый комментарий
Ошибка
Выполнено