Перевод в CakePHP

Испокон веков повелось, что в языке Толстого и Достоевского существует единственное и множественное число СЛОВА, которые более того имеют предрасположенность склоняться в 3 падежа. Разрабатывая один крупный проект, наша команда столкнулась с проблемой интернализации как раз-таки такого рода. Путешествуя по пространствам мануалов и толстенных томов книг по web-разработке, нами было найдено решение проблемы, которое я хотел бы рассмотреть на вполне конкретном примере, с дальнейшей безусловной возможностью обобщения.

Для решения проблемы следует использовать стандартную функцию CakePHP: __n(). Ее описание можно найти, пройдя по ссылке ниже. Для корректной работы функции, в заголовке файла default.po следует прописать следующее:

default.po

"обеспечивает работу склонений числительных. проверка существования этой строки"
"производится в I18n::__bindTextDomain"
msgid ""
msgstr ""

"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"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"
"Language-Code: ru\n"
"Language-Name: Russian\n"
"Preferred-Encodings: utf-8\n"

msgid "comment"
msgid_plural "comments"
msgstr[0] "комментарий"
msgstr[1] "комментария"
msgstr[2] "комментариев"

Строка "Plural-Forms: … " задает правила верного перевода по склонениям. В нашем примере рассмотрен русский язык, для остальных языков правила можно найти, пользуясь ссылкой, указанной ниже. Для русского языка три формы, их просто запомнить:

  • 1 комментарий 
  • 2 комментария 
  • 5 комментариев

Т.е. нужно написать вариант употребления для одного, двух и пяти предметов.

После описания и указания правил перевода – переходим к рассмотрению конкретного .ctp-файла. Собственно, ниже, мы видим как используется функция __n(), следуя правилам, указанным выше. /app/views/…/somefile.ctp

$somestring = "comment";
$count = mt_rand();
$singular = $somestring;
$plural = inflector::pluralize($somestring);
__n($singular,$plural,$count);

В результате мы получим нечто такого вида:

1 комментарий, 2 комментария, 5 комментариев, 666 комментариев и так далее.

Источники:

  • http://translate.sourceforge.net/wiki/l10n/pluralforms
  • http://api.cakephp.org/file/cake/basics.php#function-__n