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

29 мая, 2010
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 сеть в вашем доме.

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

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в PHP, Web разработка, WordPress Комментарии (40) »

]]>

Вы можете оставить комментарий. Трекбеки закрыты.

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

  • http://303blog.ru Дмитрий

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

  • Сергей

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

  • http://www.simplecoding.org Владимир

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

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

  • 009808

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

  • Alex

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

    • http://www.simplecoding.org Владимир

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

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

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

  • Alex

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

  • Alex

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

    • http://www.simplecoding.org Владимир

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

      • Гость

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

        • http://www.simplecoding.org Владимир

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

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

  • Arbrix

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

    • http://www.simplecoding.org Владимир

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

    • http://www.simplecoding.org Владимир

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

  • http://twitter.com/RodgerFox_ru RodgerFox

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

    • http://www.simplecoding.org Владимир

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

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

    • http://twitter.com/RodgerFox_ru RodgerFox

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

      • http://www.simplecoding.org Владимир

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

        • http://twitter.com/RodgerFox_ru RodgerFox

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

        • http://www.simplecoding.org Владимир

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

        • http://twitter.com/RodgerFox_ru RodgerFox

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

        • http://www.simplecoding.org Владимир

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

        • http://twitter.com/RodgerFox_ru RodgerFox

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

  • http://twitter.com/RodgerFox_ru RodgerFox

    Не могу разобраться, как мне быть? У меня есть тема готовая, как я понимаю, нужно весь текст который есть в шаблоне ввести в теги _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 русский.

    • http://www.simplecoding.org Владимир

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

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

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

      Да, нужно. Особенно если вы видите ошибку "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

        Спасибо!

        • http://www.simplecoding.org Владимир

          Код, который вы привели загружает 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');

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

    • http://www.simplecoding.org Владимир

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

  • Cheshir

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

  • OlegT

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

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

    • http://www.simplecoding.org Владимир

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

      • OlegT

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

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

        • http://www.simplecoding.org Владимир

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

        • http://www.simplecoding.org Владимир

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

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

]]>
Tweet