Forums / National / Russian / Зоопарк с окончаниями

dervan
#7469 2009-02-10 02:39
# Ratibor : Если зделать проверку, во первых код будет длиньше, а во вторых глюк не сразу заметят :)
Заметят - вместо слова будет пустая строка. :)
Вариант с проверкой добавил и закомментировал, а там дело хозяйское.

Подправил, получилось практически то же, что и у тебя, только я отформатировал текст в соответствии с Cotinti coding conventions.
function declension($digit, $expr, $onlyword = false)
{
	if (!is_array($expr))
	{
		return trim(($onlyword ? '' : "$digit ") . $expr);
	}

	global $lang;

	$i = preg_replace('#[^0-9]+#', '', $digit);
	$plural = get_plural($i, $lang);
	return trim(($onlyword ? '' : "$digit ") . $expr[$plural]);
//	$cnt = count($expr);
//	return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
}

Со второй функцищей непонятки - здесь было так
            case 'am':
            case 'bh':
            case 'fil':
            case 'fr':
            case 'gun':
            case 'hi':
            case 'ln':
            case 'mg':
            case 'nso':
            case 'xbr':
            case 'ti':
            case 'wa':
а в твоём последнем варианте case 'xbr': превратился в case 'uk': - оставил как в первоначальном варианте, плюс добавил default:
function get_plural($plural, $locale)
{
	switch ($locale)
	{
		case 'af':
		case 'az':
		case 'bn':
		case 'bg':
		case 'ca':
		case 'da':
		case 'de':
		case 'el':
		case 'en':
		case 'eo':
		case 'es':
		case 'et':
		case 'eu':
		case 'fa':
		case 'fi':
		case 'fo':
		case 'fur':
		case 'fy':
		case 'gl':
		case 'gu':
		case 'ha':
		case 'he':
		case 'hu':
		case 'is':
		case 'it':
		case 'ku':
		case 'lb':
		case 'ml':
		case 'mn':
		case 'mr':
		case 'nah':
		case 'nb':
		case 'ne':
		case 'nl':
		case 'nn':
		case 'no':
		case 'om':
		case 'or':
		case 'pa':
		case 'pap':
		case 'ps':
		case 'pt':
		case 'so':
		case 'sq':
		case 'sv':
		case 'sw':
		case 'ta':
		case 'te':
		case 'tk':
		case 'ur':
		case 'zh':
		case 'zu':
			return ($plural == 1) ? 1 : 0;

		case 'am':
		case 'bh':
		case 'fil':
		case 'fr':
		case 'gun':
		case 'hi':
		case 'ln':
		case 'mg':
		case 'nso':
		case 'xbr':
		case 'ti':
		case 'wa':
			return (($plural == 0) || ($plural == 1)) ? 1 : 0;

		case 'be':
		case 'bs':
		case 'hr':
		case 'ru':
		case 'sr':
		case 'ua':
			$plural %= 100;
			return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));

		case 'cs':
		case 'sk':
			return ($plural == 1) ? 1 : (($plural >= 2) && ($plural <= 4)) ? 2 : 0;

		case 'ga':
			return ($plural == 1) ? 1 : ($plural == 2) ? 2 : 0;

		case 'lt':
			return (($plural % 10 == 1) && ($plural % 100 != 11)) ? 1 : (($plural % 10 >= 2) && (($plural % 100 < 10) || ($plural % 100 >= 20))) ? 2 : 0;

		case 'sl':
			return ($plural % 100 == 1) ? 1 : ($plural % 100 == 2) ? 2 : (($plural % 100 == 3) || ($plural % 100 == 4)) ? 3 : 0;

		case 'mk':
			return ($plural % 10 == 1) ? 1 : 0;

		case 'mt':
			return ($plural == 1) ? 1 : (($plural == 0) || (($plural % 100 > 1) && ($plural % 100 < 11))) ? 2 : (($plural % 100 > 10) && ($plural % 100 < 20)) ? 3 : 0;

		case 'lv':
			return ($plural == 0) ? 1 : (($plural % 10 == 1) && ($plural % 100 != 11)) ? 2 : 0;

		case 'pl':
			return ($plural == 1) ? 1 : (($plural % 10 >= 2) && ($plural % 10 <= 4) && (($plural % 100 < 10) || ($plural % 100 > 29))) ? 2 : 0;

		case 'cy':
			return ($plural == 1) ? 1 : ($plural == 2) ? 2 : (($plural == 8) || ($plural == 11)) ? 3 : 0;

		case 'ro':
			return ($plural == 1) ? 1 : (($plural == 0) || (($plural % 100 > 0) && ($plural % 100 < 20))) ? 2 : 0;

		case 'ar':
			return ($plural == 0) ? 1 : ($plural == 1) ? 2 : ($plural == 2) ? 3 : (($plural >= 3) && ($plural <= 10)) ? 4 : (($plural >= 11) && ($plural <= 99)) ? 5 : 0;

		default:
			return 0;
	}
}