Понравилась мне тема Snow Summit для WordPress (что-то этот сайт сейчас выпилен, но тему всё ещё можно найти на просторах интернета). Нашёл русскую версию, начал кастомизировать шаблон под себя. Заметил некоторые корявости перевода, и вообще не переведённые вещи. Дальше расскажу как допиливал перевод до приемлемого уровня и разбирался с окончаниями слов во множественном числе. Чтобы не резало глаза «One Response to» , «Responses to» в русском переводе.
Локализация тем для WordPress производится с помощью файлов .po .mo .pot. . В этих файлах содержатся пары англ. слово — перевод, с указанием места в .php файла, где именно используются эти слова. Главным файлом явялется .po, два других компилируются на его основе автоматически. Для редактирования .po файлов используется программа: Poedit.
Начнём допиливать перевод.
Открываем .po файл в программе. Первым делом указываем папку к исходникам темы и кодировку исходных файлов темы (Каталог-> Свойства):
Далее научим нашу тему понимать формы множественного числа русского языка. Для этого вставляем в поле «Формы множественного числа» выражение:
nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10=20) ? 1 : 2)
.
Это выражение я взял с официального сайта. Здесь три формы, включая единственное число. Получается: «один комментарий», «два комментария», «десять комментариев». По ссылке выше можно найти такие же выражения для других языков.
Предварительные приготовления завершены. Теперь пора лезть в код темы.
Открываем functions.php. Ищем функцию load_theme_textdomain.
Находим
load_theme_textdomain( 'snowsummit', TEMPLATEPATH . '/languages' );TEMPLATEPATH . '/languages' );
. Запоминаем ‘snowsummit’. Это метка, говорит о том, что для переводов используется файл, находящийся в папке /language темы.
Теперь ищем слова, которые нам режут глаза. В моём случае это «2 responses to» . Искать их нужно конечно же в comments.php
.
Находим
printf( _n( 'One Response to %2$s', '%1$s Responses to %2$s', get_comments_number(), 'snowsummit' ), number_format_i18n( get_comments_number() ), '<span>' . get_the_title() . '</span>' );
функция _n() выводит «One response» или «Responses» в зависимости от того, один у нас комментарий или много. Переводить напрямую это место мы не будем. Во-первых Poedit заругается, потому что в единственном числе здесь один параметр, а во множественном числе два, а ему нужно чтобы везде было одинаковое число параметров. Во-вторых, именно с этой функцией у меня почему-то не получилось корректно работать, обрезало первые несколько символов и выводило «омментариев». Потому я переписал эту функцию вот так:
$n = number_format_i18n( get_comments_number() ); printf(__ngettext('%d Response to ', '%d Responses to ', $n, 'snowsummit'), $n); printf('<span>"' . get_the_title() . '"</span>');
__ngettext — «Запрашивает множественную или единственную форму основываясь на величине.»
Добавляем эту функцию в список функций, из которых poedit берёт текст для перевода:
Далее жамкаем на большую клавишу «Обновить». Программка обрабатывает исходники, и говорит нам, что нашла новые слова. В списке появляется слово «%d Responses to». Щёлкаем его, и переводим по-русски три его формы:
пишем:
1 «%d комментарий к »
2 «%d комментария к »
3 «%d комментариев к «
Вот и всё. Теперь можно поискать другие огрехи перевода, после того, как всё вроде бы выправлено, щёлкаем кнопку «Сохранить», .po файл сохранится, одновременно с этим скомпилируются .mo .pot файлы. Остаётся только закинуть их на сервер, и, до кучи закинуть изменнённый нами
comments.php.
ПС
Для корректного указания множественной формы иногда помогает плагин «Multilingual Comments Number». В моём случае он не помог.
3 комментария к "Руссификация темы wordpress, корректная русификация множественного числа"