Статья размещена автором Бетке Сергей Сергеевич

Русификация и множественные числа в php

Русификация и множественные числа в phpСогласитесь, фразы типа “1 дней назад”, “3 недель назад” слегка портят впечатление от русификации. В этой статье как раз и обсудим локализацию с учётом множественного числа.

О русификации wordpress уже также писал, и уже был пример русификации плагина recent comments with gravatar. На базе этого примера и продолжим.

Рассмотрим внимательно функцию gettext и всё её формы. Обращаю внимание на функцию ngettext:

ngettext("%d day ago", "%d days ago", $days_ago)

Данная функция исполняет не только задачи printf. Она также проанализирует целочисленную переменную (третий аргумент) и определит по её значению одну из возможных форм множественного числа. Этой функцией и воспользуемся.

Русификация и множественные числа в phpВ первую очередь, нам необходимо задать в наших файлах локализации правила выбора той или иной формы множественного числа. Для этого воспользуемся готовым решением.

Открываем снова с помощью 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 файл! Если в этом поле будет ошибка, у Вас просто не будет работать перевод с множественными числами без какой-бы то ни было ругани!

Русификация и множественные числа в php Также добавляем ещё одно “ключевое слово”: __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);
   }

Русификация и множественные числа в php После всех указанных действий нам потребуется “обновить каталог” в 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)

  1. samwicer:

    Здравствуйте, спасибо за интересную статью. Я пробовал сам сделать что то подобное, но у меня не получилось… Вот такая ошибка постояно появлялась: Poedit не нашел никаких файлов в просканированных папках.21:35:20: Элементы каталога, возможно, неверны.21:35:20: Обновление каталога завершилось неудачей. Нажмите ‘Подробности>>’ для получения дополнительной информации.Вы, бы не могли оправить файлы «русификация и множественное числа» мне на почту или выложить их для загрузки ?! Спасибо.

  2. В настройках на вкладке «пути» Вам необходимо указать пути к php файлам, которые Вы планируете русифицировать, и ошибки больше не будет. Если будут проблемы — пишите.

  3. samwicer:

    мне нужны файлы — русификация и множественные числа к плагину «Recent_comments_with_Gavatar»

  4. Антон:

    Спасибо, а можно также учитывать от локализации формат отображения даты?

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

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка