Как переводить темы на WordPress

Admin Mac OS, PHP, Windows, WordPress

Эта будет несколько необычная заметка. В ней буду рассказывать не столько о работе с программами перевода (хотя о них скажу более чем достаточно), сколько об особенностях внедрения перевода в тему на WordPress.

Что представляют из себя файлы перевода

Файлы перевода имеют расширение .po и .mo. Они создаются с помощью специальных программ, которые будут описаны ниже.

Во время работы с переводом мы используем файл с расширением po:

en_US.po - если планируется перевод с русского на английский
ru_RU.po - если планируется перевод с английского на русский

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

en_US.po - если планируется перевод с русского на английский
ru_RU.po - если планируется перевод с английского на русский

Как поменять язык темы WordPress

Раньше надо было менять язык файла темы в файле wp-config.php, но сегодня это устарелый метод.

Для отображения сайта на другом языке, в настройках сайта меняем язык. Настройки находятся по такому пути (в адрес вставьте свой сайт):

https://ploshadka.net/wp-admin/options-general.php

Чем переводить темы для WordPress

Мне известны две программы для перевода WordPress тем.

Программа Poedit

Poedit — самая популярная, она же появилась первой. Бесплатная версия программы не позволяет проанализировать сайт и создать список для перевода. А вручную всё заносить очень тяжело. Бесплатная версия Poedit может пригодиться, если нужно перевести уже готовый к переводу файл.

В платной версии можно автоматизировать перевод.

Плагин Loco Translate

Плагин бесплатный и позволяет сделать много из того, что программа Poedit делает платно.

Плагин Loco Translate не только переводит темы, но и плагины. Интерфейс у программы очень удобный и ничего лишнего.

В данном случае остановимся на переводе тем. На скриншоте ниже видно, что для сайта созданы два языка. Если языкового файла нет, его можно сгенерировать нажав на ссылку Create template:

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

Как поменять папку для файлов перевода WordPress

Для переводов тем в WordPress существует папка по умолчанию languages. Находится она в не папки темы, а в папке wp-content. Мне не нравится держать файлы одной темы в разных местах, поэтому подключаю папку с темами внутри своей темы. Для этого в файл functions.php надо добавить:

load_theme_textdomain( 'ploshadka', get_template_directory() . '/assets/lang' );

Добавляется это в функцию setup темы:

if ( ! function_exists( 'ploshadka_setup' ) ) :
function ploshadka_setup() {
    load_theme_textdomain( 'ploshadka', get_template_directory() . '/assets/lang' );
}
endif;
add_action( 'after_setup_theme', 'ploshadka_setup' );

Как внедрить перевод в тему своего сайта

Текст в теме WordPress находится в разных конструкциях html и php. Отсюда по разному эти php вариации будут выглядеть.

1. echo __(

Самый простой вариант:

<?php echo __( 'Текст который будет переведен', 'ploshadka' ); ?>

где ploshadka — это ваш домен.

2. printf в несколько строк

Иногда необходимо изменить конструкцию, чтобы было легче внедрить перевод:

<?php
printf('<div>%s<span>%s</span></div>',
    __( 'Текст для перевода 1 ', 'ploshadka' ),
    __( 'Текст для перевода 2', 'ploshadka' )
);
?>

Результат будет иметь такой вид:

Текст для перевода 1 <span>Текст для перевода 2</span>

3. printf в одну строку

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

<?php printf( __( 'Автомобили: %s (BMW) %s ', 'ploshadka' ), '<span>' , '</span>' ); ?>

Результат будет как и в предыдущем варианте:

Текст для перевода 1 <span>Текст для перевода 2</span>

Но при этом в программе перевода потребуется перевести только одну строчку. А это очень удобно.

4. Вместе с произвольными полями

<?php echo __( 'Дата вручения награды: ', 'ploshadka' ) . get_post_meta($post->ID, 'year', true); ?> год

Или так:

<?php printf( __( 'Дата вручения награды: %s год ', 'ploshadka' ), get_post_meta($post->ID, 'year', true) ); ?>

Результат будет один:

Дата вручения награды: 2020 год

5. Несколько переменных php

Если есть конструкция с переменными, например:

echo 'Первый текст ' . $string . ' окончание предложения.';

То выносим переменную и создаем перевод таким образом:

echo sprintf( __( 'Первый текст %s окончание предложения.', 'ploshadka' ), $string );

6. Перевод внутри переменной

Нужно перевести такую конструкцию:

$variable = '<div><p>Перый абзац ' . $string1 . '</p>' . '<p>Второй абзац' . $string2 . '</p></div>';

Переделываем её в такую штуку:

$variable = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Перый абзац', 'ploshadka' ) . $string1,
    __( 'Второй абзац', 'ploshadka' ) . $string2
);

6. Перевод внутри функций

Если внутри функции содержится текст для перевода:

<?php single_cat_title( __( 'Список статей ', 'ploshadka' ) ); ?>

Когда ту же функцию нужно вывести в более сложном варианте. Надо single_cat_title сделать переменной и тогда можно вставлять:

<?php
$string = single_cat_title('', false);
echo sprintf( __( 'Первое предложение %s. Второе предложение  %s.', 'ploshadka' ), $string, $string );
?>

Результат:

Первое предложение заголовок. Второе предложение заголовок.

Как вывести данные в зависимости от языка сайта

И наконец, если не хочется что-то переводить отдельно, то можно написать текст для каждого языка прямо в шаблоне темы сайта. Для этого использовать инструкцию if определяющую язык сайта:

<?php
if ( get_locale() == 'ru_RU' ) {
    echo 'ploshadka.net на русском';
}
elseif ( get_locale() == 'en_US' ) {
    echo 'ploshadka.net на английском';
}
?>

Или так:

<?php if ( get_locale() == 'ru_RU' ) { ?>
Любой текст, когда сайт на русском.
<?php } elseif ( get_locale() == 'en_US' ) { ?>
А здесь выводим для английской версии сайта.
<?php } ?>

У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.

Комментарии к статье “Как переводить темы на WordPress” (6)

  • Светлана
    05.05.2020 в 19:38

    <?php
    if ( get_locale() == 'ru_RU' ) {

    Этого достаточно для того что тема полностью была на русском языке ?)

  • Светлана
    05.05.2020 в 19:41

    Вот так правильно ?))

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

    • Admin
      Автор записи
      05.05.2020 в 20:51

      Даже не знаю как вам объяснить. По тому куда вы это положили и что ожидаете после этого… если метафорически то, то что вы сделали, это как дуршлаг (возьмите любой неподходящий предмет), который используют для мытья ягод, отдать вместо мячика мальчишкам во дворе и ожидать, что это поможет игре в футбол 🙂

      Вам судя по всему нужен перевод шаблона. Вы либо скачиваете уже готовый перевод темы и кладете его в папку languages. Либо устанавливаете на сайт переводчик и переводите самостоятельно — смотрите выше заголовок «Чем переводить темы для WordPress»

      • Светлана
        06.05.2020 в 01:20

        Плагин Локо транслейт как бы его не хвалили для меня он никак , что хочется ему то переводит а то что надо увы ( По поводу готового перевод шаблона темы если вы про сайт вордпрес . орг там и 90 % перевода темы чтоб его скачать установить , поэтому для меня проблема перерыла инет нече толкового чесно … 😁 Не могу я импортированные демо сайты перевести … (😁 и вы правы про дуршлаг я ж в этом нечего не понимаю потому и написала ж вам коммент об этом выше )))

        • Admin
          Автор записи
          06.05.2020 в 22:21

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

          Если просто, то для перевода каждое сообщение в коде, которое требуется перевести должно обрамляться так:

          <?php echo __( 'Текст который будет переведен', 'ploshadka' ); ?>

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

          У меня в этой статье более техническая информация. Возможно более подробно сможете почитать на другом сайте:
          https://wp-kama.ru/id_10492/perevody-v-wordpress.html

  • Tom
    27.03.2023 в 21:06

    А как быть с переводом в функциях обработчик форм. Для примера такой код

    <?php

    /**
    * Form contact us
    */

    global $errors;
    $errors = new WP_Error;

    function handler_contact_us() {
      global $errors;

      if( empty($name) ) {

      $errors->add( 'name', __('Fill in the field "Your   name"', 'my-text-domain') );
    }

      if( $errors->has_errors() ) {
        wp_send_json_error($errors);
      }

    }

    Текст ошибки выводит на фронт через JS, но переводится не корректно, вместо нужного перевода, выводит перевод основного языка на сайте. Используется WP Multisite, несколько языков, основной язык русский. И на других версиях языков/сайтах — выводится именно русский перевод, даже не английский.

Добавить комментарий для Светлана Отменить ответ

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Как переводить темы на WordPress"