Куда идем?

Extra Vote. Склонения (голос, голоса, голосов)

Больше
12 года 8 мес. назад #3565 от VARion
Добрый день.
Понадобилось использовать Extra Vote для более удобного голосования, как на данном сайте.
Но есть только единичное число (1 голос) и множественное исчисление (5 голосов), но получается, что вместо 3 голоса выводится 3 голосов.
Насколько я знаю, Joomla теперь позволяет задавать константы для всех трёх случаев. Вопрос как можно плагин научить работать по-русски на 100%?

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
12 года 8 мес. назад #3575 от Wedal
VARion, тут дело не в Joomla, а в плагине. Для всех трех не получится потому, что в нем это попросту не предусмотрено. Слишком уж наш русский "Великий и Могучий" ;-) . Я бы советовал сделать что-то вроде "голосов:5". Тогда не придется мучаться со склонениями.
Спасибо сказали: VARion

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
12 года 8 мес. назад #3580 от VARion
Виталий, спасибо.
Сделал по твоему совету. И дополнительно написал разработчикам письмо по проблеме.
Если узнаю как решить вопрос, отпишусь здесь.

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
11 года 11 мес. назад #4975 от rixter
Есть решение, рабочее. Нюанс в том, что нужно править и extravote.php, и extravote.js. Ну и в языковой файл добавить переменную "голоса". Если нужно могу выложить решение.

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
11 года 11 мес. назад #4979 от VARion
rixter, буду признателен, если поделитесь своим решением. И скажите, что правили.

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
11 года 11 мес. назад - 11 года 11 мес. назад #4980 от rixter
Скажу сразу я не программист, поэтому если у вас что-то не заработает я не гарантирую помощь.
Перед правкой файлов обязательно сохраните их копии.

Будем править следующие файлы:
- plg_extravote\language\ru-RU\ru-RU.plg_content_extravote.ini
- plg_extravote\extravote.php
- plg_extravote\extravote.js
На сайте они лежат, соответсвенно
- сайт/administrator/language/ru-RU/ru-RU.plg_content_extravote.ini
- сайт/plugins/content/extravote/extravote.php
- сайт/plugins/content/extravote/extravote.js

ru-RU.plg_content_extravote.ini
После строки PLG_CONTENT_EXTRAVOTE_LABEL_VOTE="(%s Голос)"
Добавлем PLG_CONTENT_EXTRAVOTE_LABEL_VOTE_TWO="(%s Голоса)"

extravote.php
1. Находим код (примерно 81 строка) JTEXT::_('PLG_CONTENT_EXTRAVOTE_LABEL_RATING').
меняем на
Code:
JTEXT::_('PLG_CONTENT_EXTRAVOTE_LABEL_RATING')."','". JTEXT::_('PLG_CONTENT_EXTRAVOTE_LABEL_VOTE_TWO').
Новая строка должна быть последней в массиве extravote_text (8-й, счет идет с 0) это очень важно, дальше объясню почему.

2. Находим код (примерно 132-138 строки)
Code:
if ( $show_counter > 0 ) { if($rating_count!=1) { $html .= JTEXT::sprintf('PLG_CONTENT_EXTRAVOTE_LABEL_VOTES', '<SPAN itemprop="reviewCount">'.$rating_count.'</SPAN>'); } else { $html .= JTEXT::sprintf('PLG_CONTENT_EXTRAVOTE_LABEL_VOTE', '<SPAN itemprop="reviewCount">'.$rating_count.'</SPAN>'); } }
меняем на
Code:
if ( $show_counter > 0 ) { $plural = $rating_count%10==1&&$rating_count%100!=11?'PLG_CONTENT_EXTRAVOTE_LABEL_VOTE':($rating_count%10>=2&&$rating_count%10<=4&&($rating_count%100<10||$rating_count%100>=20)?'PLG_CONTENT_EXTRAVOTE_LABEL_VOTE_TWO':'PLG_CONTENT_EXTRAVOTE_LABEL_VOTES'); $html .= JTEXT::sprintf($plural, '<SPAN itemprop="reviewCount">'.$rating_count.'</SPAN>'); }

Можно было бы на этом и успокоиться, но если проголосовать сейчас, то изменений не увидим (2 Голосов, 21 голосов и т.д) пока не обновим страничку. Дело в extravote.js именно он обновляет рейтинг и количество голосов, а также выводит другие сообщения без перезагрузки страницы.

extravote.js
Находим код
Code:
0!=k&&(d=1!=b?d+extravote_text[5].replace("%s",b):d+extravote_text[6].replace("%s",b));
и меняем его
Code:
if (0!=k) { var b = b + '';/*в строку*/ var b_term = b.substr(-2); if (b_term > 10 && b_term < 15) { d=d+extravote_text[5].replace("%s",b);/*Голосов*/ } else { var b_term = b.substr(-1); if (b_term == 0 || b_term > 4) { d=d+extravote_text[5].replace("%s",b);/*Голосов*/ } if (b_term == 1) { d=d+extravote_text[6].replace("%s",b);/*Голос*/ } if (b_term > 1 && b_term < 5) { d=d+extravote_text[8].replace("%s",b);/*Голоса*/ } } var b = +b;/*обратно в число*/ };
Обратите внимание на цифры в квадратных скобках это номер элемента в массиве, вот почему было важно, чтобы новая строка была 8.
Теперь все будет работать как надо и радовать окончаниями.

Выражаю огромную благодарность:
1. Андрею Антонову за статью Множественное число на PHP

2. Форуму javascript.ru в лице рони, Deff за помощь в реализации на javascript

Кстати, код javascript можно еще упростить, читайте вышеприведенную тему. Кто справится - поделитесь, я еще не добрался :).
Последнее редактирование: 11 года 11 мес. назад пользователем rixter. Причина: Подредактировал код
Спасибо сказали: VARion

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
11 года 11 мес. назад #4981 от VARion
rixter, спасибо за развёрнутый ответ!
Обязательно воспользуюсь этой инструкцией.

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
11 года 11 мес. назад #4982 от rixter
VARion отпишитесь, пожалуйста, о результатах.

Как я решил вопрос с тестированием. Дело в том, что плагин Extra Vote имеет защиту от накрутки. Защита реализована следующим образом - к каждой статье в базе хранится IP последнего проголосовавшего. Я воспользовался сервисом www.anonymizer.ru/ вбиваете вверху адрес странички, переходите, голосуете. В другом окне открываете обычным образом голосуете. Ну и по кругу :)

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.

Больше
10 года 3 мес. назад #6902 от Deniska
Всем привет.
А как строчку с голосами переместить вправо. Рядом с сердечком ?

Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.