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

<<<1...56789

Sergeich
#121 2009-02-15 07:50
Вы уже 4 страницу такой фигнёй занимаетесь :). И чем дальше в лес, тем...
Ratibor
#122 2009-02-15 17:09
В общем вот что получилось:
/**
 * Makes correct plural forms of words
 * 
 * @global string $lang Current language
 * @param int $digit Numeric value
 * @param string $expr Word or expression
 * @param bool $onlyword Return only words, without numbers
 * @param bool $canfrac - Numeric value can be Decimal Fraction
 * @return string 
 */
function sed_declension($digit, $expr, $onlyword = false, $canfrac = false)
{
    if (!is_array($expr))
    {
        return trim(($onlyword ? '' : "$digit ") . $expr);
    }

    global $lang;

	if ($canfrac)
	{
	$is_frac = floor($digit) != $digit;
	$i = $digit;
	}
	else
	{
	$i = preg_replace('#\D+#', '', $digit);
	}

    $plural = sed_get_plural($i, $lang, $is_frac);
    $cnt = count($expr);
    return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
}

/**
 * Used in sed_declension to get rules for concrete languages
 * 
 * @param int $plural Numeric value
 * @param string $lang Target language code
 * @return int 
 */
function sed_get_plural($plural, $lang, $is_frac = false)
{
    switch ($lang)
    {
        case 'en':
        case 'de':
        case 'nl':
        case 'se':
            return ($plural == 1) ? 1 : 0;
 
        case 'fr':
        case 'uk':
            return ($plural > 1) ? 0 : 1;
 
        case 'ru':
        case 'ua':
			if ($is_frac)
			{
				return 1;
			}
            $plural %= 100;
            return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));

        default:
            return 0;
    }
}
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-15 17:16, 15 years ago)
dervan
#123 2009-02-15 17:43
Мелкие улучшизмы.

Сюда
	else
	{
	$i = preg_replace('#\D+#', '', $digit);
	}
хорошо бы добавить
	else
	{
	$is_frac = false;
	$i = preg_replace('#\D+#', '', $digit);
	}

А сюда
        case 'en':
        case 'de':
        case 'nl':
        case 'se':
            return ($plural == 1) ? 1 : 0;
хорошо бы добавить
        case 'en':
        case 'de':
        case 'nl':
        case 'se':
        case 'us':
            return ($plural == 1) ? 1 : 0;

И добавить в шапку к sed_get_plural():
* @param int $plural Numeric value
* @param string $lang Target language code
* @param bool $is_frac true if numeric value is fraction, otherwise false
* @return int
Kort
#124 2009-04-15 23:57
Хорошо. Один только проблемный момент может быть из-за удаления языковых строк: эти строки могут использоваться не только в ядре и не только для множественного числа, но и сами по себе, так что лучше их оставить. Или даже для declensions использовать отдельные строки, вроде $L['Days_auto'].
Так и получилось :)
Сейчас в main.lang вместо
$L['Day'] = 'День';
$L['Days'] = 'Дни';
стоит
$L['Days'] = array('день','дня','дней');
а вот
$L['Member'] = 'Участник';
$L['Members'] = 'Участники';
по понятной причине так и осталось. Days вроде как нигде не используется (хотя никто никого и не спрашивал), а вот members -- сплошь и рядом. Получается как-то нелогично. При этом в скине уже невозможно реализовать ни
{PHP.L.Day}
, ни
{PHP.L.Days}
Глобально использовать склоняемые формы всех локализуемых имен существительных, мне кажется, пока не получится. Идея хорошая, но копать глубоко надоть...
SED.by - создание сайтов, разработка плагинов и тем для Котонти
Spuner
#125 2009-07-09 19:39
хм.. попытался сделать окончания для поиска. но в итоге он заданные окончания и не трогает.
выдает к примеру: Найдено 17 Array

вот то что в search.php:
			// Making the output array
			$t->assign(array(
				"PLUGIN_FORUM_FOUND" => $L['plu_found']." ".($items == $cfg['plugin']['search']['maxitems_ext'] ? $L['plu_moreres'].' ' : '').sed_declension($items,$L['plu_match'])
			));
в search.ru.lang.php:
$L['plu_match'] = array('совпадение','совпадения','совпадений');

поправьте меня пожалуйста.
Boss
#126 2009-07-11 23:16
Так чем дело то кончилось? Функцию так и не доработали и не встроили в котонти? А в чем сложности то?
Spuner
#127 2009-07-11 23:26
в обновлении ее прикрепили для whosonline, там она работает.
Boss
#128 2009-07-12 11:32
Точно. В транк не догадался заглянуть. :-) Там она действительно уже встроена. Да и причем не только в названный плагин, а вообще в системный файл. В форуме отрабатываются тоже численные. Молодцы!

<<<1...56789