Улучшаем сайт — выбор правильных окончаний
7 июня 2009
Безграмотность раздражает
Как часто вам приходилось видеть на сайтах безграмотные фразы "3 комментариев" или "Сайт посетили 122 человек"? Я сталкиваюсь с этим регулярно. Числительные употребляется очень часто, а вот позаботиться о правописании некоторые забывают. И это касается не только домашних страниче, а затрагивает сайты газет, муниципальные сайты и также сайты министерств образования.
Казалось бы мелочь, а отношение уже не то. Можно перестроить предложение, чтобы при любом числе было одно и то же окончание. Напрмер: "Мы рады 133 555-му посетителю". Но я считаю, что это не выход, ведь буквально на следующей странице придется отобразить еще что-нибудь и придется опять перестраивать все предложения.
Некоторые выбирают совсем ужасное решение — оформлять фразу на все случаи жизни: "Сайт посетили 123 человек (а)". Данное решение также является показателем ленивости создателей.
Универсальное решение — как же все просто
Наиболее оптимальным решением является исользование универсальной функции выбора окончаний, которая навсегда забыть об этой проблеме. В ней нет сложной семантики, которая анализирует, как должны строиться различные окончания. Вся функция умещается в два десятка строчек.
Принцип работы
Принцип основан на том, что лучше всего подберет окончание человек. На него и перекладывается вся работа. Нужно указать слово в трех вариантах: как оно употребляется с единицей, с двойкой и пятеркой. Например, возьмем слово "рубль". Вызываем функцию SelectCase($Count,"рубль","рубля","рублей"). Все. К любому переданному числу она возвратит правильное окончание.
Функция выбора окончаний
function SelectCase ($Numeral,$ForOne,$ForTwo,$ForOther) {
$Numeral = (string) $Numeral;
$Lenght = strlen($Numeral);
$LastCharPosition = $Lenght - 1; // номер последнего символа в числе
// форматируем вывод
if($Numeral[$LastCharPosition]==2||$Numeral[$LastCharPosition]==3||
$Numeral [$LastCharPosition]==4) {
// если заканчивается на 2, 3 или 4
if ($Lenght>1 AND $Numeral[$LastCharPosition-1]==1)
//если это 12, 113 или в таком духе, т.е. перед числом стоит 1 тогда
$CorrectCase = $ForOther;
else
$CorrectCase = $ForTwo;
}
elseif ($Numeral[$LastCharPosition]==1) {
// для цифр оканчивающихся на 1
if ($Lenght>1 AND $Numeral[$LastCharPosition-1]==1)
//если это 11, 111 или в таком духе, т.е. перед числом стоит 1 тогда
$CorrectCase = $ForOther;
else
$CorrectCase = $ForOne;
}
else {
// для 5, 6, 7, 8, 9 10 - все просто
$CorrectCase = $ForOther;
}
return $CorrectCase;
}
Остается только вынести функцию в общий для всех страниц файл и вызывать по мере необходимости.
Мищенко Михаил, 7 июня 2009
