среда, 8 сентября 2010 г.

[Blogger.com] Отображение количества комментариев с учётом русской морфологии. Добавляем человечности blogspot-у.

Сегодня я расскажу, как сделать отображение счетчика комментариев к постам более человечным. Вы, наверное, замечали, что строчка под текстом поста, в которой пишется число комментариев, выглядит, мягко говоря, не очень.

В англоязычных блогах такой проблемы не возникает: в зависимости от числа комментариев, шаблон выбирает нужную форму слова: comment или comments. Поскольку у них нет зубодробительной системы падежей и согласования существительного с числительным, простая проверка на равенство единице решает все проблемы. В русскоязычных же блогах мы можем наблюдать «0 коммент.», «1 коммент.», «2 коммент.» вместо «0 комментариев», «1 комментарий», «2 комментария» и т.п. Сегодня мы попытаемся этот недостаток исправить.


В зависимости от числа, слово комментарий принимает следующие формы:
  • 0 — комментариев
  • 1 — комментарий
  • от 2 до 4 включительно — комментария
  • от 5 до 9 включительно — комментариев
  • от 10 до 19 включительно — комментариев
  • от 20 до 99 включительно — так же, как для соответствующих чисел от 0 до 9
  • от 100 и до бесконечности — так же, как для соответствующих чисел от 0 до99
В виджете Blog добавим две подключаемых секции:
<b:includable id='commentcounthelper' var='i'>
    <b:if cond='data:i % 10 == 0'>
        комментариев
    <b:else/>
        <b:if cond='data:i % 10 == 1'>
            комментарий
        <b:else/>
            <b:if cond='data:i % 10 &lt; 5'>
                комментария
            <b:else/>
                комментариев
            </b:if>
        </b:if>
    </b:if>
</b:includable>
<b:includable id='commentcount' var='i'>
    <data:i/>
    <b:if cond='data:i % 100 &gt; 19'>
        <b:include name='commentcounthelper' data='post.numComments'/>
    <b:else/>
        <b:if cond='data:i % 100 &lt; 10'>
            <b:include name='commentcounthelper' data='post.numComments'/>
        <b:else/>
            комментариев
        </b:if>
    </b:if>
</b:includable>

Сегмент commentcount в переменной i получает количество комментариев, выводит его, а затем выводит слово комментариев, если число попадает в диапазон от 11 до 19. Для чисел вне диапазона вызывается сегмент commentcounthelper, который выводит слово в нужной форме для остальных чисел.
Для того, чтобы обрабатывались любые числа, анализируется не непосредственно число комментариев, а остаток от деления на 100 или на 10.

Далее в коде виджета изменим код, выводящей число комментариев, чтобы из него вызывался сегмент commentcount. Первый фрагмент кода выводит число комментариев при просмотре поста на главной, в архиве, поиске и т.п.
Находим нужный фрагмент:
<span class='post-comment-link'>
<b:if cond='data:blog.pageType != &quot;item&quot;'>

<b:if cond='data:post.allowComments'>
<a class='comment-link' expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><b:if cond='data:post.numComments == 1'>1 <data:top.commentLabel/><b:else/><data:post.numComments/> <data:top.commentLabelPlural/></b:if></a>
</b:if>
</b:if>
</span>
И заменяем в нём всё, что заключено внутри тела ссылки на вызов сегмента commentcount:
<span class='post-comment-link'>
<b:if cond='data:blog.pageType != &quot;item&quot;'>
<b:if cond='data:post.allowComments'>
<a class='comment-link' expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><b:include name='commentcount' data='post.numComments'/></a>
</b:if>
</b:if>
</span>

Второй фрагмент кода выводит число комментариев непосредствено на странице поста перед списком комментариев:
<h4>
<b:if cond='data:post.numComments == 1'>
1 <data:commentLabel/>:
<b:else/>
<data:post.numComments/> <data:commentLabelPlural/>:
</b:if>
</h4>
Модифицируем:
<h4><b:include name='commentcount' data='post.numComments'/></h4>

Вот и всё. Готово.

3 комментария

Reebok Princess

Спасибо большое за интересную статью и блог!
Узнал много нового, исправил отображение количества комментарием у себя в блоге. Удачи!

Андрей Савчин

Отличный ресурс. Множество полезной информации!

Антон Ромашко

Добрый день! Подскажите, что нужно сделать в селекторе "post-comment-link", чтобы отражалась только цифра кол-ва комментариев, и при отсутствии таковых стояла цифра 0 вместо "нет комментариев".
http://perevirkablogu.blogspot.com

Отправить комментарий