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

<<<1...456789>>>

dervan
#91 2009-02-14 20:36
Эти да, правильно. Сейчас и для варианта, где неправильно, пофиксим - там одну строчку поправить.
Ratibor
#92 2009-02-14 20:40
# dervan : А при 11 12 13 14 уже будет неправильно.

Найдено 11 12 13 14 совпадений

Что тут неправильного ?

Разделяем число и получаем:
Найдено 11 миллионов 121 тысяча 314 совпадений

И где ошибка ?
Не задавай глупых вопросов, не услышишь вранья.
dervan
#93 2009-02-14 20:44
Да, я неправ. Всё в порядке.
Trustmaster
#94 2009-02-14 20:49
Хмм, а вот у меня
whosonline:
There's currently 6 visitor(s) and 12 registered member(s) online.
:-)
May the Source be with you!
Ratibor
#95 2009-02-14 20:55
Народ, прежде чем флудить, поставьте из транка последнюю версию,
потом впишите в function.php строку:
$digit = '';
перед строкой:
$i = preg_replace('#\D+#', '', $digit);

потом вписывайте в этот $digit = ''; нужные вам значения,
к примеру $digit = '11 12 13 14';
заходите в поиск и введите там любое значение и все увидите.

Если вам надо посмотреть как преобразовывается число,
то в function.php добавьте еще строку:
$digit = $i;
но уже после строки:
$i = preg_replace('#\D+#', '', $digit);

# Trustmaster : Хмм, а вот у меня
Я же сказал - это надо переписывать,
просто у меня совпало количество юзеров с окончаниями :-)

С надписью Сейчас на сайте 7 гостей и 12 зарегистрированных пользователей : в плагине whosonline будет посложней, там завязан еще tpl, сейчас буду пробовать :)

В общем напрямую в tpl вписать конструкцию вида:
<?php sed_declension({WHOSONlINE_VISITORS},{PHP.L.plu_visitors}) ?>
неполучается.
В общем можно заменить
{PHP.L.plu_visitors}
на к примеру:
{text_visitors}
а уже внутри whosonline.php
обработать это так:
sed_declension($total2,$L['plu_visitors'],$onlyword=true)

Или все таки можно зделать както обработку php внутри tpl ?
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-14 22:00, 15 years ago)
esclkm
#96 2009-02-14 22:13
php внутри tpl както не корректно. Лучше добавить еще строку в $t->assign
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты
Ratibor
#97 2009-02-14 22:23
В общем если надо, то могу переделать так:
в tpl строку:
{PHP.L.plu_therescurrently} {WHOSONlINE_VISITORS} {PHP.L.plu_visitors} {WHOSONlINE_MEMBERS} {PHP.L.plu_members}<br />&nbsp;<br />
меняем на :
{PHP.L.plu_therescurrently} {WHOSONlINE_VISITORS} {WHOSONlINE_TEXTVISITORS} {WHOSONlINE_MEMBERS} {WHOSONlINE_TEXTMEMBERS}<br />&nbsp;<br />
а в whosonline.php добавляем:
'WHOSONlINE_TEXTVISITORS' => sed_declension($total2,$L['plu_visitors'],$onlyword=true),
'WHOSONlINE_TEXTMEMBERS' => sed_declension($total1,$L['plu_members'],$onlyword=true),

после строк:
'WHOSONlINE_VISITORS' => $total2,
'WHOSONlINE_MEMBERS' => $total1,
ну и соответственно в ланг файле меняем на:
$L['plu_visitors'] = array(' гость и ',' гостя и ',' гостей и ');
$L['plu_members'] = array(' зарегистрированный пользователь :',' зарегистрированных пользователя :',' зарегистрированных пользователей :');

Тогда все работает прекрасно, проверил.
Ну что, делать такие изменения ?

В общем переделал я whosonline и в плагине и в common.php

Начал исправлять вот это:
Страница сгенерирована за 1.568 секунд(ы) SQL общее время: 1.41 секунд(ы) - SQL запросов: 35 - Среднее время SQL: 0.04028 секунд(ы)
И столкнулся с проблеммой, функция неправльно обрабатывант дробные числа,
вернее она правильно обрабатывает, вот только обрабатывать это не надо :-)
Если число дробное, то окончание всегда будет как для 2.

Страница сгенерирована за 2 секунды
Страница сгенерирована за 1.568 секунды
Страница сгенерирована за 13.568 секунды

Т.е разлаживаем: Страница сгенерирована за 13 целых 568 тысячных секунды.
или Страница сгенерирована за 2 целыe 2 десятые секунды.
В любом случае окончание получается как для 2.

Выходит в функции надо еще зделать проверку целое число или нет,
если целое, то обрабатывать дальше как обычно, если нет, то вернуть значение как для 2.

Либо не заморачиваться с этим и плюнуть на это :)

Либо как то зделать отдельную функцию и вызывать ее до sed_declension.
Ведь дробные числа могут получится очень редко. Других мест в движке я ненашел где могут получится дробные числа.
Какие у кого будут мысли по этому поводу ?
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-15 02:42, 15 years ago)
dervan
#98 2009-02-15 02:46
А что считать признаком дробного числа? Даже в простейшем случае записи с десятичной дробью это неоднозначно и зависит от языка - либо точка, либо запятая.
Ratibor
#99 2009-02-15 03:11
# dervan : А что считать признаком дробного числа?
А что php посчитает признаком, то и будет :)
можно зделать так:
$x = abs($x) - floor(abs($x));
и если $x не равно 0, то число дробное.

можно зделать так:
if fmod(y,1)>=0

Как лучше ?
Не задавай глупых вопросов, не услышишь вранья.
dervan
#100 2009-02-15 03:45
Ты про тот $i, который отсюда?
$i = preg_replace('#\D+#', '', $digit);
Так в нём же нет точек или запятых - всё кроме цифр поел preg_replace().

Вопрос про то, что есть признак дрообного числа - ключевой. Если считать, что число с точкой - дробное, тогда всё просто. Меняем
	$i = preg_replace('#\D+#', '', $digit);
на
	$i = preg_replace('#[^.\d]+#', '', $digit);

И добавляем так
function sed_get_plural($plural, $lang)
{
	$is_frac = strpos($plural, '.') !== false;

	switch ($lang)
		case 'ru':
		case 'ua':
			if ($is_frac)
			{
				return 2;
			}
			$plural %= 100;
И для остальных языковых групп тогда тоже надо добавлять по такому же принципу
		case '@$%':
			if ($is_frac)
			{
				return #;
			}
Ratibor
#101 2009-02-15 03:46
Короче я подумал :-)
Откуда могут взятся дробные числа ?
Правильно, только после какой либо специфичной функции.
И там число может быть только с точкой и в чистом виде, без всяких тэгов.

Дак вот надо проверку на дробность вносить не в функцию sed_declension,
а зделать отдельной функцией.

В тех местах где может получится дробное число, как в примере с генерацией страницы,
мы отправляем в эту новую функцию, там проверяем, если не дробное, то отправляем в sed_declension, если дробное, то присваиваем 2 и отправляем в sed_declension.
но это справедливо для русского языка, а как быть с другими ?

dervan
как ты предложил изменить функцию sed_declension с одной стороны правильно,
а с другой так делать нельзя.
Эта функция должна работать не только с чистыми числами, а с любыми,
в том числе и обрамленными тэгами.
И что будет если пользователь введет такое число 1.035.034 ?
Правильно, фигня :)
Вот потому то и нельзя трогать функцию sed_declension
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-15 03:51, 15 years ago)
dervan
#102 2009-02-15 03:52
Так я тебя сразу и спросил - а что считать дробью? И точки, и запятые могут ставиться в числе по разным причинам.

А в sed_declention() можно добавить параметр, считать ли число с точкой дробью, по умолчанию - не считать.

# Ratibor : В тех местах где может получится дробное число, как в примере с генерацией страницы, ...
function sed_declension($digit, $expr, $onlyword = false, $frac = false)

И в таких местах вызывать:
sed_declension($digit, $expr, false, true)

И не надо дополнительных функцищ.
This post was edited by dervan (2009-02-15 04:01, 15 years ago)
esclkm
#103 2009-02-15 04:01
есть языкоспецифические точки: то есть en это "." а ru это "," только вот по-моему движок не учитывает региональные стандарты когда выводит дробные числа
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты
dervan
#104 2009-02-15 04:06
В PHP есть поддержка locale - см. setlocale.
esclkm
#105 2009-02-15 04:08
я знаю - но уу нас она не используется - а было бы очень корректно в начальные установки вставлять дату в региональном стандарте и decemical (или как ее там)чтобы тоже точка или запята в зависимости от установок
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты

<<<1...456789>>>