Для этого вам понадобятся:

  • Некоторый опыт в программировании или общее представления о синтаксисе PHP ;)
  • Текстовый редактор, которым вы обычно пользуетесь для редактирования php-файлов (я для правок по мелочам предпочитаю Edit+)
  • Poedit

Первый этап: разметка текстовых строк

Вариант 1: с помощью функции _e()

Эта функция echo-ит строку и обычно используется для перевода фрагментов интерфейса модуля или элементов темы:

_e('string'[, 'textdomain'])

Здесь и далее:
string— подлежащая переводу строка
textdomain— пространство перевода — указание на то, где искать перевод для строки: в файле перевода модуля/темы или, если этот параметр пропущен, в файле с переводом ядра WordPress.

До:

<h2>Broken Link Checker Options</h2>

После:

<h2><?php _e('Broken Link Checker Options', 'broken-link-checker'); ?></h2>

Вариант 2: с помощью функции __()

Эта функция просто возвращает строку и используется в тех случаях, когда надо перевести часть составной строки, сообщение об ошибке и тому подобное:

__('string'[, 'textdomain'])

До:

add_options_page('Link Checker Settings', 'Link Checker', 'manage_options',
            __FILE__,array(&$this, 'options_page'));

После:

add_options_page(__('Link Checker Settings', 'broken-link-checker'), __('Link Checker', 'broken-link-checker'),
            'manage_options', __FILE__,array(&$this, 'options_page'));

Вариант 3: с помощью функции _c()

Эта функция необходима в тех случаях, когда у одной и той же строки может быть несколько значений:

_c('string|case'[, 'textdomain'])

case— «расшифровка», один из вариантов использования

До:

<?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
        <h2 class="pagetitle"><?php printf('Archive for %s', get_the_time('F, Y')); ?></h2>
<?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
        <h2 class="pagetitle"><?php printf('Archive for %s', get_the_time('Y')); ?></h2>

После:

<?php /* If this is a monthly archive */ } elseif (is_month()) { ?>
        <h2 class="pagetitle"><?php printf(_c('Archive for %s|Monthly archive page', 'kubrick'), 
                get_the_time(__('F, Y', 'kubrick'))); ?></h2>
<?php /* If this is a yearly archive */ } elseif (is_year()) { ?>
        <h2 class="pagetitle"><?php printf(_c('Archive for %s|Yearly archive page', 'kubrick'), 
                get_the_time(__('Y', 'kubrick'))); ?></h2>

Вариант 4: с помощью функции __n() (ранее называлась _ngettext())

Эта функция используется в тех случаях, когда может меняться число упоминаемых объектов («1 комментарий», «2 комментария», «5 комментариев»). Она возвращает строку:

__n('single', 'plural', value[, 'textdomain'])

single— подлежащая переводу строка в единственном числе
plural— подлежащая переводу строка во множественном числе
value— подстановочное значение
textdomain— пространство перевода — указание на то, где искать перевод для строки: в файле перевода модуля/темы или, если этот параметр пропущен, в файле с переводом ядра WordPress.

До:

<?php printf('%s hit(s)', number_format_i18n($file->file_hits)) ?>

После:

<?php printf(__n('%s hit', '%s hits', number_format_i18n($file->file_hits),'wp-downloadmanager'),
        number_format_i18n($file->file_hits)) ?>

Второй этап: добавление функций, загружающих перевод

1. В модуль
Для загрузки перевода модуля необходимо вызвать функцию load_plugin_textdomain(). У нее три аргумента:

load_plugin_textdomain('textdomain, 'abspath', 'plugindir-path')

textdomain— пространство перевода — часть названия .mo-файла с переводом (например, broken-link-checkerиз broken-link-checker-ru-RU.mo)
abspath— путь к файлу с переводом относительно ABSPATH
plugindir-path— путь к файлу с переводом относительно директории с модулями

Обычно это выглядит примерно так:

### Create text domain for translations
add_action('init', 'blc_textdomain');
function blc_textdomain() {
	load_plugin_textdomain('broken-link-checker', false, 'broken-link-checker');
}

2. В тему
Для загрузки перевода темы в файл functions.phpнеобходимо добавить функцию load_theme_textdomain('textdomain'), где textdomain— название вашего .mo-файла с переводом.

Обычно это выглядит так:

load_theme_textdomain('kubrick');

Третий этап: создание файла с переводом и перевод текста с помощью Poedit

Откройте Poedit и создайте новый каталог с помощью команды File -> New Catalog.

Заполните необходимые поля: укажите название и версию проекта, сведения о переводчике, язык, кодировку текста, и, если необходимо, формулу обработки множественных чисел — именно с помощью этой формулы слово «комментарий», например, будет принимать правильные формы.

Poedit: информация о проекте

Для русского языка plural formula такова:

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: путь к файлам модуля или темы

Укажите «ключевые слова» — то есть те функции, которые использованы для пометки строк:

Poedit: ключевые слова

Сохраните изменения, сохраните файл.
Имейте в виду, что название файла с переводом модуля должно формироваться по следующему принципу:

texdomain-languagecode

Где textdomain— пространство перевода (как правило, совпадает с названием темы или модуля или является сокращением от него), а languagecode— код языка.
Например: wp-downloadmanager-ru_RU.

Название файла с переводом темы состоит только из кода языка. Название пространства перевода используется только при пометке строк.

Переведите модуль или тему. Все готово!

Комментарии (3)

  • Ольга22.06.2009 10:39

    Больше спасибо за статью! Очень помогло, особенно описание функции подключения mo файлов.

    Кстати, может пригодится мой плагин для WP — Target Visitors — показывает сообщение для пользователей, пришедших с поисковых систем, очень полезный. Вчера доделала поддержку русского и английского, благодаря вам :)

    Ссылка Ответить
  • Ян05.10.2009 10:54

    Спасибо. Для меня оказалась полезной информация о существовании редактора «Poedit». До него альтернативы редактору «Vi» не видел :-) но для редактирования словарей «Poedit» безусловно лучше.

    Ссылка Ответить
  • Maya01.11.2009 23:19

    Спасибо за полезную информацию. Всё понятно и подробно расписано!

    Ссылка Ответить

Комментировать

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