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

Ratibor
#7448 2009-02-10 01:26
# dervan : Ratibor, если хочешь - давай я перепишу всё это дело покомпактнее и без замеченных ошибок, а ты потом посмотришь.

Переписывай, лично для меня не важно кто это напишет, а важно чтобы это было универсально и работало :-)
Я пока вот на чем остановился.
С русским вроде все нормально теперь работает.
И избавился от case и array теперь может быть любой длинны.
А так же выкинул языки где нет склонений, они все равно не пройдут через if(is_array($expr)).

function declension($digit,$expr,$onlyword=false) {
    if(is_array($expr))
    {
	global $cfg, $lang;

	$i=preg_replace('/[^0-9]+/s','',$digit);
	if($onlyword) $digit='';

	$plural= getPlural ($i, $lang);
	$res=$digit.' '.$expr[$plural];
	}
    else
    {
    $res = $digit.' '.$expr;
    }
 
        return trim($res);

}

function getPlural($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 'uk':
		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;
	}
}
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-10 01:39, 15 years ago)