Відмінювання слова «коментар» у Disqus



Як і майже у всіх платформах коментування, в Disqus є проблема з відмінюванням кількості коментарів. В англійській мові з одниною і множиною все просто, є comment, і є comments. Розробники переважно не вникають в особливості інших мов, і дозволяють тільки три опції для відображення кількості коментарів — опція для однини, опція для множини, і ше одна опція, коли коментарів зовсім нема. Англійською все добре:

None comments
One comment
%num% comments

Але в багатих слов’янських мовах з’являються проблеми, трьох опцій не досить, може бути і коментар, і коментарі, і коментарів. Це вже три опції + треба ше одну для нуля коментарів. Тому

%num% коментарів

перетворюється на:

2 коментарів

Шо невимовно бісить, доводиться викручуватись якось так:

%num% коментарі(в)

або

Коментарів: %num%

А це теж чіпляє чутливу душу граматичного нациста, хочеться нормальних людських відмінювань.

Тепер по суті. Виправити це в Disqus можна, якщо трошки підправити деякі скрипти.

На сторінці налаштувань Disqus є доступ до цих самих трьох опцій, але нам їх мало, тому треба знайти спосіб виводити кількість коментарів правильно.
Який взагалі у Disqus механізм відображення кількості коментарів до запису. Нехай запис знаходиться на сторінці http://example.com/post.html. Тоді в тому місці, де треба вивести к-сть коментарів, треба додати щось таке:


І в футері сторінки вставити такий скрипт:


Цей скрипт проходиться по сторінці, шукає всі посилання, href яких містить #disqus_thread, йде на сервер Disqus'у, десь там дивиться, скільки є коментарів до запису з такою адресою, а тоді заміняє вміст тих посилань на власне кількість коментарів.

Бачимо, що у цьому скрипті нічого схожого на виведення кількості комнтарів нема, але він звертається до іншого скрипта count.js, вочевидь, там все і відбувається. Йдемо за адресою, там такий скрипт без whitespace'ів.


Пропускаємо його через jsbeautifier.org, отримуємо таке:


В це теж не хочеться вникати, незрозумілі назви змінних і всяке таке. Якщо поверхнево, то є дві функції, getCount() i displayCount(). Логічно припустити, шо нам треба displayCount(). Бачимо там такий шматок коду:


Здається, тут якраз і відбувається те, шо нам треба. Є якесь b.comments, очевидно, шо це і є кількість коментарів до запису, бо далі в switch там перебираються випадки 0, 1 і решта. Після switch відбувається ше якась фігня, а потім в циклі ше шось. Можу тільки здогадуватись, шо там у змінних a, b, c i d, але це не суттєво, ніколи не треба без потреби розбиратись в чужому коді :). Достатньо бачити, що десь звідкись береться кількість коментарів, потім в циклі в якихось об’єктів заміняється innerHTML. Ясно, що ті об’єкти — це і є посилання з #disqus_thread, і їх вміст міняється на кількість коментарів. Отже в тому for нам треба міняти c[d].innerHTML на правильну кількість коментарів замість тої, яку видає Disqus. Переписуємо функцію displayCount() по-своєму:


Круто, тепер треба, щоб Disqus звертався до нашого скрипта, а не до свого. Повертаємось до того скрипта, що у футері сайту, міняємо там рядок з адресою потрібного скрипта. Хоч він знаходиться нижче коментаря «/* * * DON'T EDIT BELOW THIS LINE * * */». Правила деколи треба порушувати :)


І ура, все працює, можна насолоджуватись правильним відмінюванням. Отже, наш перероблений скрипт comments-count.js:


І перероблений скрипт у футері сайту, який буде звертатись до нашого скрипта:



Все. Хай живе граматика.
28 січня 2014 о 14:23