Не обращать внимания на другие языки при разработке вашей WordPress темы очень просто, но это плохая привычка, и она мгновенно отвергает целый рынок WordPress пользователей, и потенциальные тысячи долларов потерянной прибыли. Из ТОП-10 стран, которые ищут WordPress темы в Google, только одна англоговорящая (США), остальных – 9. В момент написания это статьи в базе данных тем WordPress из более чем 1500 тем было всего 269, которые помечены как готовые к переводу. То есть всего 18%. Я покажу вам, как сделать вашу тему одной из них.
Как это работает
Обычно, когда вы создаете тему, вы просто пишете напрямую в коде любой текст темы, например, сообщение о 404 ошибке в файле 404.php или метки типа «Comments:» или «Author». Если пользователь темы, например, — немец или русскмй, эти части темы все равно будут отображаться на английском.
Решение этого вопроса – возвращать или показывать эти тексты, используя одну из четырех функций WordPress, которые разработаны для отсылки к языковому файлу за нужным текстом. Когда ваш текст заключен в эти функции, вы можете создать файл, содержащий все переводы, и к которому будут обращаться каждый раз, когда тема загружается.
Вот три файла переводов, которые мы используем:
- .pot (Portable Object Template) – шаблон, который содержит ссылку на каждую строку текста в вашей теме, которая нуждается в переводе. Файл не содержит перевода. Это обычный текстовый файл.
- .po (Portable Object) – созданный из .pot файла, .po содержит все строки и их переводы на один конкретный язык. Это тоже текстовый файл, который можно редактировать.
- .mo (Machine Object) – бинарная версия .po файла. При использовании машинного кода, файл может использоваться гораздо быстрее, чем текстовый его вариант.
Шаг 1. Четыре функции
Каждая из четырех функций требует как минимум один аргумент – текст, который нужно перевести. Функции:
- __() – (два нижних подчеркивания) базовая функция, которую вы будете использовать в большинстве случаев. Возвращает текст на правильном языке.
- _e() – то же самое ,что __() , но она выводит текст вместо того, чтобы возвращать его.
- _n() – используется, когда текст может быть во множественном числе, например, если вы хотите показать, сколько комментариев было оставлено, вы можете захотеть вывести «Х отзыв» или «Х отзывов», в зависимости от того, сколько будет комментариев.
- _x() – полезная функция в том случае, если перевод слова зависит от контекста. «Post» может значить запись или «разместить», в зависимости от контекста. Для переводчика важно знать, что вы имеете в виду, чтобы перевод был точным. _x() в основном используется для отдельных слов.
__() и _e()
Это самые простые функции для перевода, которые может предложить WordPress. Давайте рассмотрим пример для каждой функции:
<?php if( is_single() ) { //If this is a "post" echo __( 'This is a post.' ); } ?>
<?php if( is_single() ) { //If this is a "post" _e( 'This is a post.' ); } ?>
Обе эти функции делают одно и то же. Утверждение "this is a post" проверяется на наличие в файле .mo и возвращается результат.
__() и _e() требуют только один аргумент, который им нужно передать – текст для перевода. Единственная разница между этими функциями — для __() нужно выражение echo. Давайте рассмотрим пример, где __() работает лучше, чем _e():
<?php the_content( __( 'Click here to read more' ) ); ?>
Вместо того, чтобы передавать строку функции _content(), мы использовали __(), чтобы текст можно было перевести. Если бы мы использовали вместо этого _e(), вместо того, чтобы передать текст в the_content(), перевод текста был бы выведен в документ, что могло бы вызвать разного рода неприятности.
_n()
Что, если у вас ситуация, когда текст, который вы выводите, может иметь множественное или единичное число, как «Х отзывов» в примере выше? Вместо того, чтобы давать две разных строки текста для перевода, вы можете сказать, что у вас есть часть текста, для которого нужен перевод в единичном и множественном числе. Следующие два примера выводят для пользователя один и тот же результат:
<?php if(get_comments_number() == 1) { _e( 'There is a comment' ); } else { _e( 'There are comments' ); } ?>
<?php echo _n( 'There is a comment' , 'There are comments' , get_comments_number() ); ?>
_n() требует три аргумента. Первый – версия текста в единичном числе, второй – в множественном, а третий – количество, к которому он относится. В данном случае, get_comments_number() определяет, сколько комментариев есть к посту и затем _n() выбирает подходящий текст.
_x() и _ex()
Допустим, вы переводите .pot файл и вы проходите мимо слова "scroll". Вы интерпретируете его как «кусок скрученной бумаги» или «прокрутить сайт»? Вы можете использовать контекст, чтобы объяснить, как его нужно переводить. Эти функции дадут вам такую возможность своим вторым обязательным атрибутом, который требует короткое описание фразы или слова. Посмотрите на пример:
<?php echo _x( 'post link' , 'A link to the post' ); _ex( 'post link' , 'Submit a link' ); ?>
Пример показывает вам разницу между _x() и _ex(). Это то же e, как в функции _e, что заставляет функцию выводить результат вместо того, чтобы возвращать его. Для обеих функций первый параметр – наш текст, который нужно перевести, а второй – комментарий или заметка о переводимом тексте, чтобы обозначить точно, о чем идет речь.
Продвинутые методики
Допустим, у нас ситуация, когда текст, который вы хотите генерировать, состоит из текстовой строки, которая является результатом функции или значения переменной где-то внутри нее. Вам, возможно, захочется написать что-то вроде такого:
<?php $color = the_color(); _e( "You have chosen the $color theme" ); ?>
Когда вы будете создавать ваш .pot файл, POEdit проигнорирует это, поскольку он не хочет использовать переменную внутри предложения. В .pot файл добавится You have chosen the $color theme, но когда будет происходить поиск перевода, когда скрипт исполняется, будет искаться строка You have chosen the blue theme, которая не будет найдена. Вот, что мы сделаем:
<?php $color = the_color(); echo __( 'You have chosen the ' ) . $color . __( ' theme.' ); ?>
Таким образом, скрипт сможет получать переводы, но теперь стало сложнее переводить, так как предложение разбито. Это предложение может даже не иметь перевода на некоторых языках, которые сильно отличаются синтаксисом, например, в немецком, где их перевод слова “chosen” должен быть в конце предложения. Вам нужно объяснить, что эти две отдельные текстовые строки — часть одной, и что “theme” может не переводиться как “theme”.
Решение – использовать одну текстовую строку. Здесь пригодятся функции printf() или sprintf(). Давайте посмотрим, на что должен быть похож наш код:
<?php echo sprintf( __( 'You have chosen the %s theme.' ) , the_color() ); printf( __( 'You have chosen the %s theme.' ) , the_color() ); ?>
Это не только решит нашу проблему, но и будет гораздо аккуратнее по исполнению, а также использует всего одну строку кода. Первый аргумент функций printf() или sprintf() – строка для вывода, которая включает как минимум один заполнитель, в данном случае %s (что значит строчный тип “string”), а все другие аргументы – переменные, которые надо вставить в начальную строку.
Есть много разных заполнителей, который вы можете использовать внутри строки, вы можете найти полный список по sprintf в PHP руководстве. Обратите внимание, что отличие между printf() и sprintf() подобно отличию между _e() и __() соответственно.
Шаг 2. Введение в POEdit
Теперь, когда вы правильно разметили весь выводимый в вашей теме текст, вам нужно собрать эту информацию в .pot файл. POEdit – фантастическая программа, которая дает возможность создавать ваш .pot файл и также предоставляет простой в использовании GUI, который можно использовать для создания ваших .po и, что еще более важно, также .mo файлов.
Во-первых, вам нужно скачать POEdit, который вы можете найти для Windows, Mac и Linux по этой ссылке.
Когда POEdit установлен, вы можете создать ваш файл .pot. Чтобы сделать это, перейдите в File → New Catalog. Вы увидите диалоговое окно, где вам нужно будет ввести базовые данные. Во вкладке "Project Info" — название проекта и ваш язык/страна. Вы также можете ввести в блоке "Plural Forms"следующее:
Plural Forms: nplurals=2; plural=n != 1;
Во вкладке "Paths" введите путь, где могут быть найдены файлы, по отношению к месту, где лежит этот.pot файл. Например, если вы размещаете файл .pot в корневой папке темы, введите . (точку). Если вы хотите разместить .pot файл в папке "language" внутри корневой папки темы, введите .. (две точки).
Теперь вам нужно сообщить POEdit, какие ключевые слова искать при сканировании наших файлов. Введите следующее:
- __
- _e
- _n:1,2
- _x:1,2c
- _ex:1,2c
:1,2 — указывает POEdit, что эти ключевые слова состоят из двух частей. По умолчанию, второй аргумент – множественное число, если только вы не включили c, которое обозначает, что второй аргумент — комментарий.
Теперь нажимайте «ОК» и выбирайте место для сохранения вашего .pot файла. Запомните, что он должен соотноситься с путем, который вы определили ранее. POEdit теперь просканирует ваши файлы, чтобы найти все места, где встречаются ваши функции перевода и сохранит их без перевода в ваш .pot файл.
Если вы хотите обеспечить минимальную поддержку международному переводу, вы можете предоставить ваш .pot файл вместе с темой и на этом остановиться, но если вы можете перевести тему на другой язык самостоятельно, вы можете предоставить свою тему с подготовленным переводом, как описано на шаге 3.
Шаг 3. Перевод и создание своего .po файла
- Список всех строк для перевода.
- Текущая переводимая строка.
- Ваш перевод строки.
- Единственное и множественное число текущей строки.
- Вкладки для переключения между единственным и множественным числом.
- Ваш перевод.
Когда вы перевели все строки в .pot файле, вы можете сохранить это в вашем .po файле. Любая строка, для которой вы не сделали перевод, при просмотре темы будет отображаться на оригинальном языке.
Названия вашего файла .po имеет ключевое значение. Gettext использует стандарт ISO 639 для аббревиатур языков и ISO 3166 для локализаций. Если ваш перевод сделан на американском английском, например, то ваше имя будет выглядеть по типу en-US.po. Заглавные буквы в данном случае тоже важны. Полный список языков и кодов стран есть по ссылкам:
- Gettext коды языков
- Gettext коды стран
Как только вы сохраняетесь, POEdit по умолчанию автоматически создает .mo файл помимо .po файла. Рекомендуется включать все три файла в вашу тему, чтоб люди могли создать свои переводы и легко редактировать существующие.
Шаг 4. Настройка WordPress
Давайте подведем итог, что вы уже сделали. Вы сказали WordPress о всем тексте, который вы хотите сделать доступным для перевода, затем вы использовали POEdit для сбора всех строк и помещения их в файл .pot, который может быть переведен в файлах .po и .mo. Эти файлы затем были включены в файлы темы.
Последний шаг – это запаковать вашу тему, установить ее и дать WordPress понять, .mo файл какого языка вы хотите использовать. Это очень простая процедура, где вы обращаетесь к файлу wp-config.php в корневой папке вашего WordPress.
/** * WordPress Localized Language, defaults to English. * * Change this to localize WordPress. A corresponding MO file for the chosen * language must be installed to wp-content/languages. For example, install * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German * language support. */ define('WPLANG', '');
Ваш файл должен уже содержать define('WPLANG', ''); — но если этого нет, вы можете добавить. Вам просто нужно добавить свой язык и код локализации в define. Если вы переводили вашу тему на русский, у вас будет следующее:
define('WPLANG', 'ru_RU');
Ваша работа закончена! Не забудьте добавить ваш .pot файл в вашу тему, и если вы можете перевести вашу тему на другой язык, включить также файлы .po и .mo.
Комментарии к записи: 25
Такой вот попрос: А если ручками все тексты в файлах шаблона переменовал на язык который нужен (например русский), то можно ли удалить папку – languages из темы? Или если её просто удалить, то что-то нарушится? Вдруг она как-то, где-то в каком-то файле прописана и если её не будет, то в движке будет ошибка.
Или как?
Если удалить папку languages, то всегда будет использоваться язык, который прописан в коде файлов самой темы. Ничего не нарушится.
Спасибо вам за ответ.
Просто интересно влияет ли на скорость работы блога эта папка (её присуствие или отсуствие) languages или нет?
Вот уже есть готовый к переводу файл — en_US.po в составе темы. Как этой чертовой прогой его перевести? Открываю этот файл в программе — вижу соответственно список всех слов. Перевожу внизу любое слово, сохраняю. Выдает кучу ошибок!
Все вобщем-то написано правильно, только работать это не будет :-) Здесь пропущен достаточно важный шаг без которого WordPress не будет смотреть на все ваши языковые файлы.
Я нашел вот это описание в котором не пропущен шаг с регистрацией «load_theme_textdomain»
Спасибо! Полезная статья!
Приветствую!
Всё делал по Вашей инструкции. Ничего не получилось.
Делал через POEdit, всё перевёл, зашёл к себе на хостинг (ру-центр) в
файловый менеджер и добавил файл .mo, обновил сайт, всё также, ничего не
перевелось. Также, добавлял и .po, не вышло. Подскажите, как правильно
перевести, потому-что делал всё по инструкции и не получилось
:(
Файл добавлял в папку с самой темой, в корень.
После сохранения перевода у вас на выходе должно быть 2 файла: .po и .mo. При чем они должны иметь специфическое окончание в названии, так для русского языка файлы должны называться ru_RU.po и ru_RU.mo. Далее заливать их нужно не в корень с темой, а в папку languages, что в корне темы. Если такой папки нет, ее нужно создать.
Спасибо за ответ!
Да да, такие файлы появились, оба файла я закинул через файловый менеджер на свой хостинг, /themes/моя тема/languages. Оба файла туда слил, там уже находился файл .pot С ним я так понял ничего делать не нужно было. Обновил тему, все равно ничего не перевелось, скажите в чём может быть проблема? Я не совсем спец в этом, делал по уроку, но ничего не вышло. Перевод причём получился, всё вышло. Я открывал сразу в POEdit и переводил несколько десятков слов и фраз. Я вычитал в интернете, что после всего этого нужно в теме найти functions.php кажется и вставить эту строчку для вызова load_theme_textdomain(domain-name) через Notepad, чтобы тема смогла подключиться к этому языку, это правда? Так я ещё не пробовал, так как не совсем понял куда, что и зачем вставлять. Если просто добавить эти два файла в папку languages самой темы, повторюсь, то ничего не происходит, все фразы в теме остаются на английском, хотя тема была готова к переводу, я её нашел как раз на вашем сайте с ссылкой на themeforest :)
Помогите, пожалуйста, уж очень хочется чтобы она запахала на русском, так как перевод готов, но видимо что-то нужно подключить куда-то!
Ничего дополнительно прописывать в functions не нужно. Убедитесь, что в файле wp-config.php в корне сайта прописан правильный языковой идентификатор define(‘WPLANG’, ‘ru_RU’);
Снова перевёл, на руках ru_RU.mo и ru_RU.po, оба файла добавил в папке с темой, а именно в папку languages, там был уже .pot родной файлик. Проверил wp-config, там так уже и было. Перезапустил сайт, даже тему заново залил (не через фтп-клиент, а внутри админки вордпресса), все равно все фразы остались на английском, не конектит он что-то. Написал разработчикам этим, они ответили что тема готова к переводу. В общем путаница полная, спасибо за ответы и помощь, видимо я совсем криворукий, всё делаю по схемам, толку нет :(
Вот, кстати, та тема, нашёл на вашем сайте в новостной ленте и сразу перешёл купить:
http://themeforest.net/item/super-agency-responsive-wordpress-single-page/3617215
Знаете, сделал всё с 0, вроде вышло!
В который раз спасибо вашему замечательному сайту, инфу черпаю только с него!! Спасибо!
Единственное перевелось частями как-то, что-то осталось на англ, 130 фраз переводил, а первый раз получилось меньше 30-40. Видимо, тот раз директорию указал не правильно. Перевёл и два файла скину в нужную папку, по крайней мере всё меню настройки темы стало на русском, а то что отображается посетителям, местами почему-то, хотя бы уже что-то.
В PoEdit откройте ваш ru_RU.po и нажмите Каталог — Обновить из .pot файла — должны загрузиться все пропущенные локализации.
Спасибо!!!
Ребят, такой вопрос, тему удалось перевести и вправду, установил, уже всё работает. Но если вышел апдейти на премиум тему к примеру на днях (меня по почте установили), но в админке не предлагается обновить эту тему. Как её тогда обновить можно? Не смог найти здесь никакую статью по обновлению тем. Подскажите, пожалуйста, буду очень благодарен. Не хотелось бы потерять настройки все мои, которые сделал. Я должен просто скачать новую версию и перебросить в эту же папку, верно, старые файлы заменятся на новые? Или как лучше сделать? Главное ничего не потерять из настроек :) Бэкап папочки с темой сохранить на комп я так понял на всякий надо.
Просто скачайте обновленную тему и загрузите файлы по ФТП. Все настройки темы хранятся в БД вашего сайта, а не в файлах темы. Если ничего не менялось в коде исходной темы, то нужно сохранить только файл локализации из папки languages
WPcafe, вы THE BEST!)
Спасибо за оперативный ответ, так уже и делаю! Качаю обнову и буду закидывать по фтп в папку с темой. Этого не знал, спасибо. Файл сохранил локализации, мой перевод :)
у меня та же проблема. перевела в Poedit — но на сайте ничего не изменилось. Вопроса 2:
«сделал всё с 0» — перезаливали движок и тему, заново переводили в poedit?
«Видимо, тот раз директорию указал не правильно» — какую директорию нужно указать, может я тоже не верно прописываю.
заранее,спасибо!
Автор рассказал о том, как самому локализировать тему и многим эта статья сильно поможет. Но есть люди, которые не хотят на это тратить свое время и разбираться во всех тонкостях этого не минутного процесса. Если вы относите себя к этой второй группе, то тогда предлагаю свои услуги по русификации тем для WordPress.
Перевел шаблон и создал ru_Ru.po и ru_Ru.mo. Закинул их в директорию шаблона в папку language, в /wp-content/languages/themes, переименовав файлы в названиешаблона-ru_Ru.po/.mo.
Добавил в wp-config строку define( ‘WPLANG’, ‘ru_RU’ );
Добавлял множество вариантов в functions.php шаблона.
Ничего не помогло. Что делать?
А в каталоге непосредственно вашей темы есть такая папка? /wp-content/themes/вашатема/language ? Обычно туда нужно помещать файлы локализации, потому что в той папке что вы указали — хранятся локализации от штатных тем типа twentyfifteen и т.д.
День добрый! Есть такая проблемка: приобрел тему Avada, в файле wp-config.php нет строки define('WPLANG', ''); Добавил после define('WP_DEBUG', true); Загрузил файлы .po и .mo в директории темы. Перевелось, но не все. Хотя в файле .po перевод есть. Что я не верно сделал?
Подскажите. Все сделал как положено. Все перевелось. Но при проверке сайта на валидность вылbзиет ошибка о том что сайт использует en_EN а у вас в коде прописано ru_RU. Вот вырезка ошибки.
his document appears to be written in English but the html start tag has This document appears to be written in English but the html start tag has lang=»ru_RU». Consider using lang=»en» (or variant) instead.
А вот мой код.
↩
↩ — — — -Вот именно за это он и ругается.
↩
↩
В чем может быть проблемма. Даже когда заходишь с телефона
https://yadi.sk/i/9h9pQ5RLwySXH
Спасибо, очень качественная статья. Помогла разобраться в переводе нужной темы.