Перевод в 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