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

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

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

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

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

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

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

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

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

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

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

4 года 10 мес. назад - 4 года 10 мес. назад #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').
меняем на
JTEXT::_('PLG_CONTENT_EXTRAVOTE_LABEL_RATING')."','".
JTEXT::_('PLG_CONTENT_EXTRAVOTE_LABEL_VOTE_TWO').
Новая строка должна быть последней в массиве extravote_text (8-й, счет идет с 0) это очень важно, дальше объясню почему.

2. Находим код (примерно 132-138 строки)
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>');
			}
		}
меняем на
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
Находим код
0!=k&&(d=1!=b?d+extravote_text[5].replace("%s",b):d+extravote_text[6].replace("%s",b));
и меняем его
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 можно еще упростить, читайте вышеприведенную тему. Кто справится - поделитесь, я еще не добрался :).
Спасибо сказали: VARion

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

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

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

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

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

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

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

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


Вверх