Русификация и множественные числа в php
Согласитесь, фразы типа “1 дней назад”, “3 недель назад” слегка портят впечатление от русификации. В этой статье как раз и обсудим локализацию с учётом множественного числа.
О русификации wordpress уже также писал, и уже был пример русификации плагина recent comments with gravatar. На базе этого примера и продолжим.
Рассмотрим внимательно функцию gettext и всё её формы. Обращаю внимание на функцию ngettext:
ngettext("%d day ago", "%d days ago", $days_ago)
Данная функция исполняет не только задачи printf. Она также проанализирует целочисленную переменную (третий аргумент) и определит по её значению одну из возможных форм множественного числа. Этой функцией и воспользуемся.
В первую очередь, нам необходимо задать в наших файлах локализации правила выбора той или иной формы множественного числа. Для этого воспользуемся готовым решением.
Открываем снова с помощью PoEdit подготовленный нами ранее файл recent-comments-with-gravatar-ru_RU.po. В меню Каталог \ Настройки….
Корректируем свойства каталога (заполняем Формы множественного числа).
nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?0:(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?1:2));
Обращаю Ваше внимание на необходимость соблюдать аккуратность при заполнении этого поля! Если Вы его изменили – необходимо сохранить через PoEdit и использовать обновлённый .mo файл! Если в этом поле будет ошибка, у Вас просто не будет работать перевод с множественными числами без какой-бы то ни было ругани!
Также добавляем ещё одно “ключевое слово”: __ngettext:1,2.
Естественно, этого недостаточно. Именно теперь мы полезем в исходных код плагина. И везде, где локализуемые строки просто “слепляют” с числами, применим ngettext. Для этих целей придётся поправить одну функцию. Такой она была:
function get_time_diff($time) { $difference = time() - strtotime($time); $weeks = round($difference / 604800); $difference = $difference % 604800; $days = round($difference / 86400); $difference = $difference % 86400; $hours = round($difference / 3600); $difference = $difference % 3600; $minutes = round($difference / 60); $difference = $difference % 60; $seconds = $difference; if ($weeks > 0) return $weeks . ' ' . __('weeks', $this->_folder); else if ($days > 0) return $days . ' ' . __('days', $this->_folder); else if ($hours > 0) return $hours . ' ' . __('hours', $this->_folder); else if ($minutes > 0) return $minutes . ' ' . __('minutes', $this->_folder); else if ($seconds > 0) return $seconds . ' ' . __('seconds', $this->_folder); }
а такой должна быть:
function get_time_diff($time) { $difference = time() - strtotime($time); $weeks = round($difference / 604800); $difference = $difference % 604800; $days = round($difference / 86400); $difference = $difference % 86400; $hours = round($difference / 3600); $difference = $difference % 3600; $minutes = round($difference / 60); $difference = $difference % 60; $seconds = $difference; if ($weeks > 0) return sprintf(__ngettext('%d week', '%d weeks', $weeks, $this->_folder), $weeks); else if ($days > 0) return sprintf(__ngettext('%d day', '%d days', $days, $this->_folder), $days); else if ($hours > 0) return sprintf(__ngettext('%d hour', '%d hours', $hours, $this->_folder), $hours); else if ($minutes > 0) return sprintf(__ngettext('%d minute', '%d minutes', $minutes, $this->_folder), $minutes); else if ($seconds > 0) return sprintf(__ngettext('%d second', '%d seconds', $seconds, $this->_folder), $seconds); }
После всех указанных действий нам потребуется “обновить каталог” в PoEdit. Открываем файл recent-comments-with-gravatar-ru_RU.po. Меню “Каталог \ Обновить из исходного кода”. (не забываем предварительно подсунуть ему новый php файл). При локализации изменённых нами строк во множественном числе интерфейс будет иным.
Перевели все формы, сохранили. Полученные файлы (recent-comments-with-gravatar-ru_RU.po, recent-comments-with-gravatar-ru_RU.mo) выкладываем повторно в папку \wp-content\plugins\recent-comments-with-gravatar\. Проверяем, как работает.
Всё работает. Теперь и форма множественного числа правильная, что и требовалось.
Если кому потребуются файлы перевода и скорректированные файлы плагина – сообщите, выложу.
Отзывы » (9)
RSS комментарии
Обратная ссылка
Здравствуйте, спасибо за интересную статью. Я пробовал сам сделать что то подобное, но у меня не получилось… Вот такая ошибка постояно появлялась: Poedit не нашел никаких файлов в просканированных папках.21:35:20: Элементы каталога, возможно, неверны.21:35:20: Обновление каталога завершилось неудачей. Нажмите ‘Подробности>>’ для получения дополнительной информации.Вы, бы не могли оправить файлы «русификация и множественное числа» мне на почту или выложить их для загрузки ?! Спасибо.
В настройках на вкладке «пути» Вам необходимо указать пути к php файлам, которые Вы планируете русифицировать, и ошибки больше не будет. Если будут проблемы — пишите.
Я все делал как написано в статье. Вы отправите мне файлы ??
К какому плагину \ теме Вам требуется локализация? Вышлю.
мне нужны файлы — русификация и множественные числа к плагину «Recent_comments_with_Gavatar»
Даю ссылку на архив плагина с локализацией.
В статье не описана настройка путей к исходникам для PoEdit. Вам в любом случае потребуется разобраться с этим вопросом для локализации других плагинов / тем. Судя по ошибке, проблема была только с путями. Но на картинке слева видны вкладки, одна из которых — Пути. Именно на этой вкладке необходимо указать пути к php файлам плагина, который Вы собираетесь «переводить». Попробуйте ещё раз.
спасибо за плагин …
Да не за что Плагин то не мой, моя — только локализация.
Спасибо, а можно также учитывать от локализации формат отображения даты?