Патчим iNove: правильная форма вывода количества комментариев
Те, кто используют WordPress на русском, наверняка сталкивались с тем, что количество комментариев или просмотров статей выводится с неправильным окончанием для множественного числа, например 3 комментариев или 21 просмотров. Я не стану рассказывать как все становится красиво если поставить магический плагин 2-4 comments fix, а расскажу как справиться с проблемой на многоязычном блоге под управлением плагина qTranslate.
Подробнее про плагин 2-4 comment fix – по сути сам плагин это полностью скопированная и немного измененная стандартная функция comments_popup_link(), в которой вызывается модифицированная стандартная функция comments_number(), которая, в зависимости от количества комментариев возвращает слово комментарий/комментария/комментариев. Подобный подход может и работает нормально на чисто русскоязычных блогах, но если используется многоязычность, то возникают проблемы с правильным переводом, да и копирование и изменение стандартных функций мне лично не по душе – неизвестно как этот плагин будет работать на последующих версиях движка Wordpress.
Поэтому я решил поступить просто – раз уж блог многоязычный, то нужно сделать так, чтобы выводился правильный перевод в нужной форме для слова comments, благо функционал в Wordpress есть. Итак, по шагам:
- Открываем index.php (single.php, page.php, archive,php, etc.), в общем, тот файл, в котором, в используемой вами теме показывается количество комментариев.
- Находим примерно вот такую строку (может использоваться comments_popup_link() или comments_number(), я приведу код из использующейся у меня темы iNove):
comments_popup_link(__('No comments', 'domain'), __('1 comment', 'domain'), __('Comments: %', 'domain'), '', __('Comments off', 'domain')); - Нам нужно сделать так чтобы в русском варианте вместо «Comments» выводилась правильная форма множественного числа слова «комментарий», и, поэтому, функция __() нам не подходит, т.к. не может выводить множественное число. Нужно использовать функцию __ngettext() или _n(), в чем между ними разница я так и не понял, но это уже на совести разработчиков Wordpress. Т.к. функции __ngettext() для определения правильной формы множественного числа слова необходимо само число для сравнения, то получаем примерно следующее:
comments_popup_link(__('No comments', 'domain'), __('1 comment', 'domain'), __ngettext('% comment', '% comments', get_comments_number(), 'domain'), '', __('Comments off', 'domain')); - Теперь нужно сделать правильный перевод для нужных нам форм слова. Я предполагаю, что вы уже используете тему с поддержкой многоязычности и знаете как редактировать .po файлы, поэтому подробно на этом останавливаться не буду. Единственное, что следует упомянуть – это как добиться чтобы в Poedit вместо стандартных двух форм для множественного числа было три нужных нам формы. Для этого в вашем .po файле должна быть следующая строка:
"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n"
А вот эта строка, я ее приводил раньше и она используется в официальной русификации WordPress, не является полностью правильной, т.к., например, для 11 комментариев выводит 11 комментарий:
Plural-Forms: nplurals=3; plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n+9)%10>3 ? 2 : 1;\n
Отредактировав файл вручную либо открыв в Poedit нужный нам файл и введя в поле Catalog -> Settings -> Plural Forms соответствующую часть вышеприведенной строки мы добьемся того, что сможем отредактировать три формы перевода слова comment. Если же вы предпочитаете редактировать .po файлы вручную, то получится следующее:
msgid "% comment" msgid_plural "% comments" msgstr[0] "% комментарий" msgstr[1] "% комментария" msgstr[2] "% комментариев"
- Компилируем .mo файл, заливаем на сервер, перезагружаем страницу в браузере и наслаждаемся правильным русским языком.
Комментарии