Создание файлов переводов для плагинов и тем WordPress

Владимир | | PHP, Web разработка, WordPress.

wp translations logo

Всегда приятно, когда можно без особых усилий перевести плагин или тему для движка WordPress на свой язык. Под «особыми усилиями» я подразумеваю необходимость ковыряться в исходных файлах.

WordPress предоставляет механизм для работы с файлами переводов, который, по-идее, должен использовать каждый разработчик. Если, конечно, он хочет распространять свою работу.

В этой статье я постараюсь рассказать о создании и использовании файлов переводов, а также о программах, которые позволяют упростить работу.

Шаг первый. Определяем, какие строки нужно перевести.

Для этого, в исходных файлах плагина или темы все текстовые строки, которые нужно перевести, помещаем внутрь функций:

_e() – выводит (echo) текст;
__() – возвращает (return) текст;
_n() – позволяет работать с единственным и множественным числом;
_x() – работает аналогично __(), но имеет дополнительный параметр – контекст.

Подробно их использование описано в статье I18n for WordPress Developers. Повторять их примеры я не буду, но советую обратить внимание на два момента.

1) Очень желательно использовать второй параметр в этих функцих (domain). Для плагинов обычно используют название плагина, для темы — название папки в которой она расположена (а вообще, подойдет любая уникальная строка).

2) Символы окончания строк (EOL) должны быть в Unix-формате, т.е. \n, а не \r\n, как принято в windows. Иначе могут быть проблемы при использовании утилиты gettext. Большинство редакторов вроде notepad++ позволяют легко заменить окончания.

Шаг второй. Создаём файлы переводов.

Тут вам нужно сначала создать .po файлы, в которых будут находиться оригинальные строки и переводы, а затем, скомпилировать их в .mo файлы, с которыми работает WordPress.

Вообще для этих целей предназначена утилита gettext, но она консольная и пользоваться ей не очень удобно.

Гораздо приятнее работать с программой Poedit, т.к. она сделает все рутинные операции за вас.

При её первом запуске желательно сразу указать личные данные (Меню Файл -> Установки), т.к. они сохраняются в файлах переводов.

poedit options

После этого можно приступать к созданию файлов переводов.

Заходим в меню Файл -> Создать каталог и в открывшемся окне внимательно заполняем настройки.

Общие данные о проекте

poedit project options

Тут всё довольно просто, главное не ошибиться с кодировкой.

Вкладка «Путь». Тут нужно указать путь к папке плагина или темы.

poedit project options 2

PoEdit будет просматривать файлы в этих папках и выбирать строки, которые нужно перевести.

Вкладка «Ключевые слова». Это важный момент. Тут нужно перечислить название функций, которые вы использовали для перевода строк. Без скобок!!!

poedit project options 3

После этого, программа импортирует строки из файлов с исходым кодом.

Если строки нужно обновить, выбираем в меню «Каталог» пункт «Обновить из исходного кода».

После импорта строк можно приступать к переводу.

Сам перевод особой сложности не представляет. Если, конечно, вы хорошо знаете язык 😉 Выбираете строку и пишите в нижней части экрана перевод для неё.

Сохраняем файл. Poedit автоматически создает два файла .po и .mo.

Важный момент — имя файла.

Обычно формируется следующим образом

pluginname-locale.po
pluginname-locale.mo

Например
termdescription-ru_RU.mo

Шаг третий. Загружаем файлы переводов в плагине.

Для этого можно использовать следующий код.

function myplugin_init() {
…
$plugin_dir = basename(dirname(__FILE__));
load_plugin_textdomain( $domain, '/wp-content/plugins/'.$plugin_dir, $plugin_dir );
…
}

Тут предполагается, что плагин и файлы переводов находятся в папке pluginname.

Этот код должен быть вызван при инициализации плагина. Например, в функции, которая вызывается действием init или admin_init (если переводы нужны только для админки)

add_action( 'init', 'myplugin_init' );

В случае с темами, подключение файлов переводов немного проще. В файл functions.php добавьте вызов

load_theme_textdomain(domain-name);

Имя файла при этом должно иметь вид:

locale.mo

например, ru_RU.mo. И находиться он должен в папке с темой.

Шаг четвёртый. Выбор файла перевода.

WordPress должен определить, какой именно перевод использовать. Указать это можно в настройках блога (файл wp-config.php). Найдите строку в которой определена константа WPLANG и установите нужное значение.

Например, так

define ('WPLANG', 'ru_RU');

Если у вас возникли вопросы или замечания, пишите, постараюсь ответить.

Удачи!

Интересно почитать

Как установить и настроить wifi сеть в вашем доме.

Банкам и службам инкассации: инкассаторские сумки собственной разработки, возможна печать вашего логотипа

  • Pingback: Не для простых()

  • Информативная статья, все разжевано! спасибо;)

  • Сергей

    не читает верпрес 9,2 переводы и все немогу понятьт в чем проблемма

  • Что такое «верпрес 9,2 переводы»? wordpress 2.9?
    О каких переводах речь? К плагинам? темам?
    Переводы ваши собственные или готовые?
    В wp-config.php язык указан?

  • Pingback: Перевод плагинов и шаблонов WordPress на русский язык (создание файлов перевода) | WebNine()

  • 009808

    Спасибо, помогла очень статья, перевел нужный шаблон!

  • Alex

    Все сделал по инструкции, но почему-то никаких слов для перевода не нашлось, только один раз одно слово из одной темы нашлось и всё..хм…

    • Alex, вы формулируете вопрос так, что на него невозможно ответить 🙂

      Локализация в WP работает, это точно 🙂 Можете проверить, скачав любой
      плагин с переводами.

      Значит, ваш код всё-таки чем-то отличается. Очень часто ошибки
      возникают из-за имен файлов и их размещения.

  • Alex

    Разобрался в чем дело. ПОпробовал другую тему-там все английские слова для перевода нашлись, с другими же темами так не хочет, видимо там как-то нестандартно прописаны слова для перевода что poedit не может найти их((( Значит описанный вами метод применим не ко всем темам((( Придется по старинке переводить темы-вручную.

  • Alex

    Просмотрел сейчас фйалы в темах, в которых слова для перевода не нашлись-там слова для перевода прописаны без всяких функций типа «_e» и «__» в отличие от темы, в которой слова нашлись для перевода. Сорри за постинг, просто чтобы другие знали если у них такая же трабла будет.

    • Ничего страшного 🙂
      Главное, разобрались.

      • Гость

        переводимый файл должен находтся на локальном сервере? или возможен перевод поросто темы, плагина лежащего в любом месте на компьюторе?

        • Файл должен быть на сервере. Причем путь к папке в которой он находится должен быть указан при вызове load_plugin_textdomain. Иначе WP его не найдет.

  • Pingback: idFree - @социальная сеть | Blog | Создание файлов переводов для плагинов и тем WordPress()

  • Arbrix

    спасибо за статью, помогла разобраться что к чему. Вопрос про путь файла переводов.
    load_theme_textdomain(domain-name); — тут нужно указывать абсолютный путь к файлу перевода?
    Функция по умолчанию должна подтягивать мо файлы из корня темы. Или я не прав? Судя по всему так, потому что перевод не происходит.
    Возможно мешает плагин qTranslate?

    • load_theme_textdomain — да, путь должен быть абсолютный.
      Если хотите переместить файлы переводов в отдельную папку
      используйте load_theme_textdomain('my_theme', get_template_directory().'/lang');Имя файла должно быть вида — ru_RU.mo
      и совпадать с константой WPLANG.

    • qTranslate практически не использовал. Не думаю, что он мешает.
      В любом случае, вы можете его деактивировать и проверить работу переводов.

  • Не могу разобраться, как мне быть? У меня есть тема готовая, как я понимаю, нужно весь текст который есть в шаблоне ввести в теги _e и в программе ссылку на что вводить? на шаблон? так их там несколько, хоть даже index.php программа же не сможет понять мои вызовы сайдбаров и других шаблонов. Подскажите пожалуйста. 

    • Допустим, есть разметка
      привет
      заменяете его на

      THEME_NAME — идентификатор, который вы придумываете для ваших файлов переводов. Его нужно использовать при вызове
      load_theme_textdomain(THEME_NAME);

    • теперь, еще глупее проблема. Постоянно выдает ошибку, ссылкаясь на путь.
      ***/wp-content/themes/themtname/index.php и т.д., верно же все? или что не так? 
      Ошибку пишет- неможет обнвоить каталог, в подробнее ссылается сначало на файлы которые я указал в пути.
      есть делать ссылку просто на папку шаблона, тоже самое =

      • Пожалуйста, приведите описание ошибки полностью.

        • Обновление каталога завершилось неудачей. Нажмите 'Подробности >>' для получение дополнительной информации. 
          При нажатии на Подробности идет список ошибок такого типа:
          Не могу пересчитать файлы в каталоге ( ссылка путя, который вводил) ( ошибка 123: синактическая ошибка в имени файла, имени папки или метке тома.)

        • Попробуйте указать абсолютный путь к папке с файлами темы

        • так я указывал абсолютный путь. 
          http://site.ru/wp-content/themes/themename/ 
          , где site.ru — домен.
          а themename — название шаблона.

        • Это не абсолютный путь, это — абсолютный URL.
          Чтобы получить путь к папке с темой используйте
          get_stylesheet_directory()

        • да как хоть нет, вот использую функцию bloginfo('stylesheet_directory');  , выводит мне путь к шаблону. он такой же который написал выше. какой еще может быть? оО

  • Не могу разобраться, как мне быть? У меня есть тема готовая, как я понимаю, нужно весь текст который есть в шаблоне ввести в теги _e и в программе ссылку на что вводить? на шаблон? так их там несколько, хоть даже index.php программа же не сможет понять мои вызовы сайдбаров и других шаблонов. Подскажите пожалуйста. 

  • Pingback: Как перевести BuddyPress плагин на русский язык? | Русский BuddyPress и WordPress MS, плагины, шаблоны, хаки()

  • Дмитрий Страхов

    Здравствуйте!

    Сделал много попыток перевести тему http://bokeh.photocrati.com/, руководствуясь Вашей статьей и некоторыми другими, используя программу Poedit. Пока безрезультатно.
    Тема к переводу подготовлена, в коде файлов присутствуют символы «__» и «_e». Но англоязычных файлов en_EN.po, .mo нет. Делаю всё поэтапно как описано в ваших инструкциях. Создаю новый каталог, ввожу название (содержание его важно? Оно должно соответствовать названиям папки или названиям темы?), язык. 

    В вкладке пути вводил два варианта:
    1. c:WPserverhomelocalhostwwwdimastrahovwp-contentthemesphotocrati-theme когда тема расположена на локальном хосте
    2. c:photocrati-theme просто для пробы и простоты.
    Каталог и файлы темы и там, и там.
    При это не совсем понятно, нужно ли самому вводить путь в графу начинающуюся с «.»? И нужно ли вводить за точкой или вместо точки или вообще не вводить? Пробовал всеми возможными способами. Думаю,  проблема где-то здесь.

    В ключевых словал вводил __ _e, оставляя уже имеющиеся _, gettext, gettext_noop и убирая последние три.

    При создании каталога выдаётся 2 ошибки:

    в первом случае:

    Poedit не нашёл никаких файлов в просканированных папках.
    Элементы каталога, возможно, неверны.
    Обновление каталога завершилось неудачей…

    во втором случае:

    xgettext: Non-ASCII string at c:WPserverhomelocalhostwwwdimastrahovwp-contentthemesphotocrati-theme/index.php:82
    я так понимаю, что проблемы с кодировкой символов в этой строчке <a href="» title=»» rel=»bookmark»> Хотя это странно.
    Элементы каталога, возможно, неверны.
    Обновление каталога завершилось неудачей…

    Строчка load_theme_textdomain( 'photocrati-framework', TEMPLATEPATH . '/languages' ); находится в папке themesphotocrati-themefunctionsmisc-functions.php
    Файлы ru_RU.po, .mo сохраняю в каталог themesphotocrati-themelanguages

    В wp-config.php константа WPLANG определена ru_RU.

    Я использую WordPress 3.3 русский.

    • К сожалению, я не могу попробовать создать файл перевода сам, т.к. тема платная и у меня её нет.

      Поэтому общие советы.

      >> нужно ли самому вводить путь в графу начинающуюся с «.»?

      Да, нужно. Особенно если вы видите ошибку «Poedit не нашёл никаких файлов в просканированных папках.»
      Для простоты сначала лучше указать полный путь к папке с темой.

      >> «xgettext: Non-ASCII string at…»
      Проверьте кодировку файла. И убедитесь, что в параметрах функций __, _e, … нет спец. символов.

      • Дмитрий Страхов

        Сделал таки перевод с помощью редактора Poedit, скомпелировал файлы ru_RU.po и  ru_RU.mo. Согласно коду в файле misc-functions.php, раположенному в директории themesphotocrati-themefunctions

        Код:
        `load_theme_textdomain( 'photocrati-framework', TEMPLATEPATH . '/languages' );

        $locale = get_locale();
        $locale_file = TEMPLATEPATH . «/languages/$locale.php»;
        if ( is_readable($locale_file) )
        require_once($locale_file);`

        помещал файл ru_RU.mo и в папку темы, и в подпапку /languages. Тема не переводится. В wp-config.php константа WPLANG определена ru_RU.

        Тема на локальном хостинге. Win 7 x64

        Спасибо!

        • Код, который вы привели загружает mo файл, который должен находится в папке TEMPLATEPATH . '/languages' и php файл ru_RU.php из этой же папки. О назначении второго файла ничего сказать не могу.

  • Cheshir

    Далек от пхп…исправляюсь, но все равно не понимаю какой именно код необходимо вставлять в файл.

    Есть плагин CubePoints Под WP 3.3.x, есть в структуре пустая языковая папка.
    Перевел файлы при помощи Poedit, выхлопом послужили два файла .mo и .po, названные ru_RU.mo и ru_RU.po (после сохранения в файле .po пришлось заменить пути локального размещения плагина, на wp-content/plugins/cubepoints). Поместил в эту самую папку — /wp-content/plugins/cubepoints/languages. Методом научного тыка, определил что участок кода отвечающий за перевод находится в файле cubepoints.php, по пути /wp-content/plugins/cubepoints/.

    Код выглядит так —
     /** Loads the plugin's translated strings */
    load_plugin_textdomain('cp', false, dirname(plugin_basename(__FILE__)).'/languages');

    И тут вот не могу понять что нужно прописывать…
    Хелп пжалста мозго-опытоимущие…

    • Поставьте слеш после /languages, т.е. так
      load_plugin_textdomain('cp', false, dirname(plugin_basename(__FILE__)).'/languages/');

  • Cheshir

    Нашлось проще решение… Есть, простите за тавтологию, Плагин перевода плагинов, Codestyling Localization. Удобен а главное не надо искать куда интегрировать код…но, единственный минус — перевод ограничивается только плагинами, темы не переведешь

  • OlegT

    А у меня вот какой вопрос. Есть программа-генератор тем, которая создает темы. В ней есть файлы локализации. Но не все определения локализованы, некоторые термины выпущены. В принципе, если редактировать файл локализации темы, то  все работает. Я хочу создать файл локализации неописанных терминов и прицепить в настройках темы как дополнительный файл локализации. Ну чтобы допустим, создавая новые темы, не править в каждой файл локализации, а просто присоединять уже созданный файл к новым темам как дополнительный. Новый файл локализации можно поместить где-то в общей папке, а не в папке темы, но нужно чтобы тема подхватывала его в дополнение к уже существующему файлу локализации темы.

    Как и где прописать подключение дополнительного файла локализации, чтобы он не заменял и не мешался основному?

    • Скорее всего, не получится. Подключать файл переводов нужно в коде темы с помощью load_plugin_textdomain. Вы можете добавить вызов этой функции и подключить сколько угодно файлов переводов. Но как только тема обновится ваш код будет удалён и придется подключать файл переводов заново.

      • OlegT

        Ну, собственно, мне это и надо. Просто хочу к однотипным темам сделать один раз файлик перевода и просто в тему прицеплять файл одной строкой. 

        И, кстати, наверное надо сделать плагин, который установлен по умолчанию, чтобы он просто этот файлик включал в темах и все.
        Вот только с синтаксисом я затрудняюсь. Если живой пример кода использования load_plugin_textdomain покажете, чтобы понятно было, где путь указывать, где имя файла, то буду благодарен.

        • Живой пример кода использования load_plugin_textdomain — лучше всего посмотрите новую тему WP — twentyeleven (файл functions.php, строка 81).

        • Прошу прощения, подумал, что вы имели в виду load_theme_textdomain.

          Пример load_plugin_textdomain можно посмотреть, например, в моем плагине Terms Descriptions — файл td_admin_terms.php (строка 163).

  • Александр

    Здравствуйте

    А если файлов .ро несколько ,как именовать файлы .мо?
    Созданы .ро с помощью сайта  http://www.icanlocalize.com/tools/php_scanner

    Все ru_RU?

    Как их тема различит?

    • Каждому .po файлу должен соответствовать .mo файл с таким же именем. Файлы .po с одинаковыми именами вы не сможете сохранить в одной и той же папке. Поэтому у темы не будет проблем с загрузкой файлов (при загрузке вы указываете путь к файлу).

  • Tormovies

    отличная статья, но я пробую перевести плагин Quick Adsense, и не совсем понимаю как там можно подключить файл переводов, как бы Poedit всё находит и переводит но перевод не работает  — думаю там в php скрипт куда то надо вписать подключение файла переводов но как и где хз , помогите разобраться 
    http://quicksense.net/2009/09/16/quick-sense/  
    перевожу не для себя а для пользователей соц.сети ибо они не понимают английского 

    • Я перевел несколько строк этого плагина и результат запаковал в архив. Код вам придется немного поправить. Когда будете используйте программу вроде WinMerge чтобы сравнить мою версию с оригиналом.

  • Максим

    Привет!
    Я тут пытаюсь перевести тему, но…
    В файле functions.php (/htdocs/wp-content/themes/cameleon/functions.php):
    ___________________________________________
    /* Initialize translation mechanism */
    load_theme_textdomain( 'dp_theme', get_template_directory().'/languages' );

    $locale = get_locale();
    $locale_file = TEMPLATEPATH . «/languages/$locale.php»;
    if ( is_readable($locale_file) )
    require_once($locale_file);
    ____________________________________________

    Я перевёл файл dp_theme.po (/htdocs/wp-content/themes/cameleon/languages/dp_theme.po) и получил файлы dp_theme-ru_RU.mo и dp_theme-ru_RU.po
    Поместил эти два файла туда же (/htdocs/wp-content/themes/cameleon/languages/dp_theme-ru_RU.po и /htdocs/wp-content/themes/cameleon/languages/dp_theme-ru_RU.mo)

    Вот как помещены текстовые строки в функцию _re():
    _______________________________________

    *

    _______________________________________

    При переводе ключевое слово тоже было _re помимо выше названных у вас.

    НЕ переводит)) Что делать!!??????

    • Максим

      Вот как помещены текстовые строки в функцию _re():
      _______________________________________

      *
      _______________________________________

      При переводе ключевое слово тоже было _re помимо выше названных у вас.

      НЕ переводит)) Что делать!!??????

      • Максим

        Вот как помещены текстовые строки в функцию _re():
        (мне нужно перевести слово message — к примеру)

        • 1) Для тем имя файла с переводами должно иметь вид: ru_RU.mo, ru_RU.po, а не dp_theme-ru_RU.mo (такая запись используется для плагинов).

          2) Откуда взялась функция _re() ? В WP для перевода используются функции _e(), __(), _x(), _n().

  • Александор

    Здравствуйте. Я скачал плагин Send email only on Reply to My Comment —
    чтобы читатель мог отслеживать комментарии только к своим вопросам .

    • В этот плагин уже входит файл с переводами на русский. Проверьте, установлен ли русский язык у вас в wp-config.php
      define ('WPLANG', 'ru_RU');

  • inweb.in.ua

    Автор подробно разжевал о локализации тем и многим людям это поможет. Но есть люди у которых нет времени и желания во всем этом разбираться. Если вы такой человек, то предлагаю вам свои услуги по русификации тем для WordPress. Приходилось переводить шаблоны от всех популярных издателей: Themeforest, WooThemes, AppThemes, Churchthemes, Elegant Themes, mojo-themes, Mysitemyway, Tempatic, WPMUDev, Yoarts, YOOtheme… Обращайтесь! (dizer7@gmail.com)

  • Максим Гусев

    Добрый день! А как мне указать путь к файлу перевода, который находится в папке (lang), лежащей в папке плагина (wp-plugin-name)? Получается такой путь: site.ru/wp-content/plugins/wp-plugin-name/lang/wp-plugin-name-ru_RU.po
    Как мне его в коде указать?

    • Добавить lang к относительному пути.

      load_plugin_textdomain( 'my-plugin-name', false, dirname( plugin_basename( __FILE__ ) ) . '/lang/' );

  • Владислав

    Как подключить файл перевода плагина в дочерней теме?

    • Например так,
      load_theme_textdomain('your_text_domain', get_stylesheet_directory() . '/languages');

      Главное, правильно указать путь к папке с файлами переводов. В данном случае они находятся в папке languages дочерней темы.

      Обратите внимание, что функция get_template_directory вернет путь к родительской теме, поэтому нужно использовать именно get_stylesheet_directory.

  • Николай Иванов

    У меня графический плагин? при написании русского текста? воспроизводит ???? Хотел сделать перевод, не оказалось файлов .op? Как перевести и устранить?????

    • О каком плагине речь? И что это за файлы .op?

      • Николай Иванов

        Плагин WPSalesGraphic.
        Файлы локализации с расширением .po

        23 октября 2015 г., 23:26 пользователь Disqus написал:

        • Вполне возможно, что плагин вообще не переводился, т.е. разработчики просто прописали текст на английском в коде плагина.
          Т.к. плагин платный, скачать его и посмотреть как именно они сделали я не могу, но отсутствие .po файлов указывает именно на этот вариант.

        • Николай Иванов

          Я могу дать ссылку на скачивание https://yadi.sk/d/xGJBvK25jyaV5 Подскажите, что можно сделать?

          24 октября 2015 г., 23:43 пользователь Disqus написал:

        • Посмотрел. Чтобы добавить переводы придется исправлять код плагина.
          Дело в том, что в плагине некоторые строки обернуты в вызов _e(…), но большинство — нет. Но даже там где обернуты, не указан текстовый домен, т.е. переводы WP будет искать в файлах переводов движка.

          В данной ситуации нужно сделать следующее:
          1) создать файл переводов, как описано в этой статье.
          2) подключить его с помощью load_plugin_textdomain
          3) все строки обернуть в вызов _e() или __() и во втором параметре указать текстовый домен.