Руссификация темы wordpress, корректная русификация множественного числа

Понравилась мне тема Snow Summit для WordPress (что-то этот сайт сейчас выпилен, но тему всё ещё можно найти на просторах интернета). Нашёл русскую версию, начал кастомизировать шаблон под себя. Заметил некоторые корявости перевода, и вообще не переведённые вещи. Дальше расскажу как допиливал перевод до приемлемого уровня и разбирался с окончаниями слов во множественном числе. Чтобы не резало глаза «One Response to» , «Responses to» в русском переводе.

Локализация тем для WordPress производится с помощью файлов .po .mo .pot. . В этих файлах содержатся пары англ. слово — перевод, с указанием места в .php файла, где именно используются эти слова. Главным файлом явялется .po, два других компилируются на его основе автоматически. Для редактирования .po файлов используется программа: Poedit.

Начнём допиливать перевод.

Открываем .po файл в программе. Первым делом указываем папку к исходникам темы и кодировку исходных файлов темы (Каталог-> Свойства):

Poedit. Указываем папку с исходными файлами темы.

Poedit. Указываем папку с исходными файлами темы.

Poedit. Устанавливаем кодировку файлов темы.

Poedit. Устанавливаем кодировку файлов темы.

Далее научим нашу тему понимать формы множественного числа русского языка. Для этого вставляем в поле «Формы множественного числа» выражение:
nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10=20) ? 1 : 2).
Это выражение я взял с официального сайта. Здесь три формы, включая единственное число. Получается: «один комментарий», «два комментария», «десять комментариев». По ссылке выше можно найти такие же выражения для других языков.

Poedit, Указываем выражение для форм множественного числа.

Poedit, Указываем выражение для форм множественного числа.

Предварительные приготовления завершены. Теперь пора лезть в код темы.
Открываем 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 берёт текст для перевода:

Poedit. Распознаваемые имена функций.

Poedit. Распознаваемые имена функций.

Далее жамкаем на большую клавишу «Обновить». Программка обрабатывает исходники, и говорит нам, что нашла новые слова. В списке появляется слово «%d Responses to». Щёлкаем его, и переводим по-русски три его формы:

Poedit. Корректно переводим Responses.

Poedit. Корректно переводим Responses.

пишем:
1 «%d комментарий к »
2 «%d комментария к »
3 «%d комментариев к «

Вот и всё. Теперь можно поискать другие огрехи перевода, после того, как всё вроде бы выправлено, щёлкаем кнопку «Сохранить», .po файл сохранится, одновременно с этим скомпилируются .mo .pot файлы. Остаётся только закинуть их на сервер, и, до кучи закинуть изменнённый нами
comments.php.

ПС
Для корректного указания множественной формы иногда помогает плагин «Multilingual Comments Number». В моём случае он не помог.

3 комментария к "Руссификация темы wordpress, корректная русификация множественного числа"

  1. zbs
    Спасибо, на вп 3.5 первый вариант пашет исправно:
    printf( _n( ‘%d comment’, ‘%d comments’, get_comments_number()…

    (_n:1,2)

  2. Привет! Не знаешь где в этой теме можно увеличить стандартные шрифты?

  3. Спасибо за подробности работы с прогой.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.