dervan |
|
---|---|
Эти да, правильно. Сейчас и для варианта, где неправильно, пофиксим - там одну строчку поправить.
|
Ratibor |
|
---|---|
# dervan : А при 11 12 13 14 уже будет неправильно. Найдено 11 12 13 14 совпадений Что тут неправильного ? Разделяем число и получаем: Найдено 11 миллионов 121 тысяча 314 совпадений И где ошибка ? Не задавай глупых вопросов, не услышишь вранья.
|
dervan |
|
---|---|
Да, я неправ. Всё в порядке.
|
Trustmaster |
|
---|---|
Хмм, а вот у меня
whosonline: May the Source be with you!
|
Ratibor |
|
---|---|
Народ, прежде чем флудить, поставьте из транка последнюю версию,
потом впишите в 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 |
|
---|---|
php внутри tpl както не корректно. Лучше добавить еще строку в $t->assign
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты |
Ratibor |
|
---|---|
В общем если надо, то могу переделать так:
в tpl строку: {PHP.L.plu_therescurrently} {WHOSONlINE_VISITORS} {PHP.L.plu_visitors} {WHOSONlINE_MEMBERS} {PHP.L.plu_members}<br /> <br />меняем на : {PHP.L.plu_therescurrently} {WHOSONlINE_VISITORS} {WHOSONlINE_TEXTVISITORS} {WHOSONlINE_MEMBERS} {WHOSONlINE_TEXTMEMBERS}<br /> <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 |
|
---|---|
А что считать признаком дробного числа? Даже в простейшем случае записи с десятичной дробью это неоднозначно и зависит от языка - либо точка, либо запятая.
|
Ratibor |
|
---|---|
# dervan : А что считать признаком дробного числа?А что php посчитает признаком, то и будет :) можно зделать так: $x = abs($x) - floor(abs($x)); и если $x не равно 0, то число дробное. можно зделать так: if fmod(y,1)>=0 Как лучше ? Не задавай глупых вопросов, не услышишь вранья.
|
dervan |
|
---|---|
Ты про тот $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 |
|
---|---|
Короче я подумал
Откуда могут взятся дробные числа ? Правильно, только после какой либо специфичной функции. И там число может быть только с точкой и в чистом виде, без всяких тэгов. Дак вот надо проверку на дробность вносить не в функцию 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 |
|
---|---|
Так я тебя сразу и спросил - а что считать дробью? И точки, и запятые могут ставиться в числе по разным причинам.
А в 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 |
|
---|---|
есть языкоспецифические точки: то есть en это "." а ru это "," только вот по-моему движок не учитывает региональные стандарты когда выводит дробные числа
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты |
dervan |
|
---|---|
В PHP есть поддержка locale - см. setlocale.
|
esclkm |
|
---|---|
я знаю - но уу нас она не используется - а было бы очень корректно в начальные установки вставлять дату в региональном стандарте и decemical (или как ее там)чтобы тоже точка или запята в зависимости от установок
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты |