День, дня, дней или Yii2 это круто.

Во время рефакторинга на одном из наших проектов, написанном на Yii2, мне на глаза попался такой кусок кода:

if (substr($days, -1) <= 0) {
  $days .= ' дней';
}
else if (substr($days, -1) > 0 && substr($days, -1) <= 1) {
  $days .= ' день';
}
else if (substr($days, -1) > 1 && substr($days, -1) <= 4) {
  $days .= ' дня';
}
else if (substr($days, -1) > 4) {
  $days .= ' дней';
}

Код решал проблему правильной вставки окончаний в существительные после числительных. После числа "1" будет правильно вставить "день", после "2" правильно "дня", после "7" правильно "дней".

Данный код меня явно не устраивал, поэтому начал копать в этом направлении. Чтобы не затягивать статью, перейду сразу к решению. Оказалось что разработчики замечательного фреймворка Yii2 уже придумали все за нас. Вот решение:

$days = Yii::t('app', 'day {n}', ['n' => $days]);

Также нужно добавить строчку в языковые файлы:

'day {n}' => '{n, plural, =0{ # дней} one{ # день} few{ # дня} many{ # дней} other{ # дней}}' 

Давайте разберемся, что именно происходит. В переменную $days передается число дней, например 3. Затем данная строка подвергается переводу, и в зависимости от переданного числа, выбирается форма слова "день".