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

<<<123456789>>>

Trustmaster
#76 2009-02-10 05:25
/**
 * 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
 * @return string 
 */
function sed_declension($digit, $expr, $onlyword = false)
{
    if (!is_array($expr))
    {
        return trim(($onlyword ? '' : "$digit ") . $expr);
    }
 
    global $lang;
 
    $i = preg_replace('#\D+#', '', $digit);
    $plural = sed_get_plural($i, $lang);
    $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)
{
    switch ($lang)
    {
        case 'en':
        case 'de':
        case 'nl':
        case 'se':
            return ($plural == 1) ? 1 : 0;
 
        case 'fr':
        case 'uk':
            return (($plural == 0) || ($plural == 1)) ? 1 : 0;
 
        case 'ru':
        case 'ua':
            $plural %= 100;
            return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));

        default:
            return 0;
    }
}
May the Source be with you!
Ratibor
#77 2009-02-10 05:27
Trustmaster
Спасибо.

Можно в транк включить ?
Не задавай глупых вопросов, не услышишь вранья.
Trustmaster
#78 2009-02-13 06:25
Извини, не заметил последнее сообщение. Но ты уже залил изменения в транк, и правильно сделал, так что поздравляю! Теперь бы статеечку написать, как все это великолепие использовать для облагораживания своих сайтов :) В смысле, в документации, а не на форуме.
May the Source be with you!
This post was edited by Trustmaster (2009-02-13 06:38, 15 years ago)
esclkm
#79 2009-02-13 06:54
Да и поколдуй с текущими окончаниями чтобы были явные примеры работы функции
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты
This post was edited by esclkm (2009-02-13 07:32, 15 years ago)
Ratibor
#80 2009-02-13 16:00
# esclkm : Да и поколдуй с текущими окончаниями чтобы были явные примеры работы функции
Плагин поиска уже переделан для примера и залит в транк.
Постараюсь еще что нибудь переделать.

Кстати вот хороший пример как нельзя писать,
смотрите function sed_build_timegap

Особенно строка:
$result = ($gap<2) ? '1 '.$L['Minute'] : $gap.' '.$L['Minutes'];

Как минимум эгоизмом попахивает.

В общем вся функция подлежит переделки.

Вот переделал, посмотрите вроде все правильно:
function sed_build_timegap($t1,$t2)
{
	global $L;

	$gap = $t2 - $t1;

	if($gap<=0 || !$t2 || $gap>94608000)
	{
		$result = '';
	}
	elseif($gap<60)
	{
		$result  = sed_declension($gap,$L['Seconds']);
	}
	elseif($gap<3600)
	{
		$gap = floor($gap/60);
		$result = sed_declension($gap,$L['Minutes']);
	}
	elseif($gap<86400)
	{
		$gap1 = floor($gap/3600);
		$gap2 = floor(($gap-$gap1*3600)/60);
		$result = sed_declension($gap1,$L['Hours']).' ';
		if ($gap2>0)
		{
			$result .= sed_declension($gap2,$L['Minutes']);
		}
	}
	else
	{
		$gap = floor($gap/86400);
		$result = sed_declension($gap,$L['Days']);
	}

	return $result;
}

Остается переписать ланг файлы.
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Trustmaster (2009-02-14 17:15, 15 years ago)
Trustmaster
#81 2009-02-14 17:16
Да, займись такими исправлениями, пожалуйста. Изменения добавляй в trunk. Если надо перевести какие-то строчки для лангфайлов, выкладывай их здесь - переведем, добавишь. И используй, пожалуйста, подсветку для кода.
May the Source be with you!
Ratibor
#82 2009-02-14 17:22
Trustmaster
Проверил функцию, работает вездеотлично,
и на форуме и в кто онлайн и т.п.
Сейчас в транк добавлю для русских и английских файлов

Все добавил,
также удалил из русского и английского ланг файлов ненужные строки:
$L['Day']
$L['Hour']
$L['Minute']
$L['Second']

Остались только исправленные:
$L['Days']
$L['Hours']
$L['Minutes']
$L['Seconds']

Ктото тут сомневался про отрицательные значения чисел :)
Функции sed_declension побарабану какие числа,
также по барабану в какие тэги число обрамлено,
к примеру входящее число может быть обрамлено к примеру тэгом Bold.
Если у кого есть сомнения могут посмотрть переделанную функцию sed_build_timezone,
Там прекрасно обрабатываются отрицательные значения времменных зон.
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-14 18:07, 15 years ago)
Trustmaster
#83 2009-02-14 18:23
Хорошо. Один только проблемный момент может быть из-за удаления языковых строк: эти строки могут использоваться не только в ядре и не только для множественного числа, но и сами по себе, так что лучше их оставить. Или даже для declensions использовать отдельные строки, вроде $L['Days_auto'].
May the Source be with you!
Ratibor
#84 2009-02-14 18:35
Trustmaster
Я проверил, эти слова больше нигде не используются в стандартной поставке.
Ни в движке, ни в плагинах.
А если ктото решит использовать эти строки в своих плагинах,
то будет хороший повод сразу написать правильно :-)

P.S. Написал статью, утверди :-)
Не задавай глупых вопросов, не услышишь вранья.
Trustmaster
#85 2009-02-14 18:58
Ладно, посмотрим, будут ли жалобы.
May the Source be with you!
Ratibor
#86 2009-02-14 19:42
тут возникал еще один вопрос:
esclkm:
а что будет при цифре 11 12 13 14 15

Т.е. что будет если в функцию sed_declension подать отформатированное число,
в общем число разделенное пробелами на группы.
Будет то же самое что и с числами обрамленными тэгами,
т.е. все обработается правильно.

Специально провел эксперимент, тупо подал на вход этой функции это число,
вернулось: Найдено 11 12 13 14 15 совпадений

Смотрите в функции строку:
$i = preg_replace('#\D+#', '', $digit);
после этого число преобразуется в 1112131415 и уже после этого обрабатывается.

Вот и до header.php добрался и тоже переделал, чтоб надпись о количестве новых личных сообщений правильная была :-)
Что бы еще переделать ?
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-14 20:12, 15 years ago)
Trustmaster
#87 2009-02-14 20:21
Вот только сейчас видел "зоопарк" в whosonline: в common.php и в плагине.
May the Source be with you!
Ratibor
#88 2009-02-14 20:28
# Trustmaster : Вот только сейчас видел "зоопарк" в whosonline:
Если ты имеешь ввиду графу "Последний раз был замечен",
то там должно быть уже все правильно.
А если об этом:
Сейчас на сайте 9 гостей и 7 зарегистрированных пользователей :
то надо переделать :)
Не задавай глупых вопросов, не услышишь вранья.
dervan
#89 2009-02-14 20:30
А при 11 12 13 14 уже будет неправильно. Как и при 11 12 13.
esclkm
#90 2009-02-14 20:34
а просто числа 11, 12, 13 обрабатываются правильно?
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты

<<<123456789>>>