Отличный плагин Polylang, который вы можете скачать с репозитория плагинов WordPress, позволяет сделать ваш сайт мультиязычным путем добавления отдельных страниц, записей, пользовательских типов записей и т.п. на нужных вам языках.
Плюсом этого плагина является то, что он позволяет создавать:
- Копии страниц/записей на вашем сайте на другом (других) языках:
- Добавлять отдельные виджеты на разных языках:
- Добавлять переключатель языков в меню:
Все эти опции вы получаете вместе с установкой, активацией и настройкой языков плагина. Однако при использовании какой-либо темы или при написании своей темы вы, скорей всего, столкнетесь с тем, что часть строк или опций не переведены на все нужные вам языки.
Добавление кода вывода языков в шапке сайта
Допустим, вы решили вынести переключатель языков из меню в шапку сайта отдельным блоком для мобильных и планшетов. Вы можете это сделать с помощью такого кода:
1 2 3 4 5 | <ul class="list-unstyled lang"> <?php if(function_exists('pll_the_languages')){ pll_the_languages(array('show_names'=>1)); } ?> </ul> |
В примере ниже в настройках языка плагина Polylang выбрано не полное название, а часть слова, поэтому на сайте выведены языки в виже сокращенных названий из 3-х букв.
Вы можете посмотреть, какие аргументы передавать в функцию pll_the_languages()
в официальной документации. Давайте познакомимся с ними здесь:
1 2 3 4 5 6 7 8 9 10 11 | 'dropdown' => отображает список, если установлено значение 0, выпадающий список, если установлено значение 1 (по умолчанию: 0) 'show_names' => отображает названия языков, если установлено значение 1(по умолчанию: 1) 'display_names_as' => либо 'name', либо 'slug' (по умолчанию: 'name') 'show_flags' => отображает флаги, если установлено значение 1(по умолчанию: 0) 'hide_if_empty' => скрывает языки без записей(или страниц), если установлено значение 1 (по умолчанию: 1) 'force_home' => принудительно ссылается на домашнюю страницу, если установлено значение 1 (по умолчанию: 0) 'echo' => отображает строку, если установлено в 1, или возвращает строку без ее вывода на экран, если установлено в 0(по умолчанию: 1) 'hide_if_no_translation' => скрывает язык, если не существует перевода, если установлено значение 1 (по умолчанию: 0) 'hide_current' => скрывает текущий язык, если установлено значение 1 (default: 0) 'post_id' => если установлено, отображает ссылки на переводы записи (или страницы), по определенному post_id(по умолчанию: null) 'raw' => используйте это, чтобы создать свой собственный переключатель языка (по умолчанию:0) |
Как можно использовать эти параметры?
Например, довольно часто необходимо вывести только короткие названия языков, которые обычно состоят из 2-х букв и являются кодом (slug) в настройках плагина Polylang. Если же нужны полные названия, то вы можете их вывести полностью, если оставите их названия такими в настройках плагина.
Код для вывода слагов:
1 2 3 4 5 | <ul class="d-flex lang"> <?php if(function_exists('pll_the_languages')){ pll_the_languages(array('display_names_as' => 'slug')); } ?> </ul> |
Если вам необходимо создать свой вариант вывода меню, вы можете использовать функцию pll_current_language( 'slug' )
для вывода текущего языка, но при этом скрыть его из выпадающего списка, который можно создать с помощью функции pll_the_languages()
:
1 2 3 4 5 6 7 8 9 | <ul class="lang" id="top-lang"> <li class="pll-parent-menu-item"><a href="#pll_switcher"><?php echo pll_current_language( 'slug' ) ?></a> <ul class="sub-menu"> <?php if(function_exists('pll_the_languages')){ pll_the_languages(array('display_names_as' => 'slug', 'hide_current' => 1)); } ?> </ul> </li> </ul> |
Результат будет таким:
Выпадающий список можно сделать с помощью css-стилей. Но саму разметку вы создаете с помощью функции pll_the_languages()
.
Добавление поддержки перевода строк Polylang в функции темы
Для того чтобы ваш код мог быть переведен на любой язык, доступный в WordPress-плагине Polylang, необходимо использовать специальные функции, описанные в документации этого плагина. Также документацию по функциям можно найти здесь.
В документации описаны 2 функции - pll__('Text')
и pll_e('Text')
, которые позволяют вывести любую строку в файлах вашей темы с переводом, который определяется в настройках плагина. Разница в них заключается в том, что pll__('Text')
вызывает функции перевода, но не выводит строку, а pll_e('Text')
содержит в себе оператор echo
для вывода перевода.
Вы можете добавить эти функции в любом месте любого файла вашей темы. Например, для вывода элементов формы:
1 2 | <h5 class="subscribe-header"><?php pll_e( 'Subscribe to news', 'mytheme' ) ; ?></h5> <label for="email"><?php echo pll__( 'Enter your email' , 'mytheme') ; ?></label> |
Для файла single.php вы можете использовать перевод строк в цикле WordPress:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <div class="container"> <?php while ( have_posts() ) : the_post(); get_template_part( 'template-parts/content', get_post_type() ); the_post_navigation( array( 'next_text' => '<span class="screen-reader-text" aria-hidden="true">Далее</span> <span class="post-nav">'. pll__( 'Next<br>news', 'mytheme' ) .'</span> ', 'prev_text' => '<span class="screen-reader-text" aria-hidden="true">Назад</span> <span class="post-nav">'. pll__( 'Prev<br>news', 'mytheme' ) .'</span> ' ) ); $newsId = get_option('page_for_posts', true); $news_link = get_the_permalink($newsId); $newsTitle = pll__('News archive', 'mytheme'); ?> <div class="news-archive"> <a href="<?php echo $news_link ?>" class="btn btn-flat btn-lg"> <?php echo $newsTitle ?></a> </div <?php endwhile; // конец цикла WP ?> </div> |
В этом коде мы еще выводим ссылку на архив новостей, т.е. стационарную страницу блога со всеми записями.
Однако, это только полдела.
Для того чтобы нужные вам строки попали в настройки перевода строк, необходимо привязать вызов функции к action init и использовать в ней функции плагина Polylang pll_register_string()
c 2 параметрами: вашим названием и текстом строки, который вы ранее использовали в функциях pll_e
или pll__
. Обратите внимание, что в двух строках используется тег перевода строки <br>
, и при этом перевод учитывает его, а затем отображает на страницах сайта.
1 2 3 4 5 6 7 8 9 | add_action('init', function() { pll_register_string('mytheme-subscribe', 'Subscribe'); pll_register_string('mytheme-subscribe-news', 'Subscribe to news'); pll_register_string('mytheme-enter-email', 'Enter your email'); pll_register_string('mytheme-prev-news', 'Prev<br>news'); pll_register_string('mytheme-next-news', 'Next<br>news'); pll_register_string('mytheme-prev-news', 'Prev<br>news'); pll_register_string('mytheme-news-archive', 'News archive'); } |
В результате работы этой функции вы увидите добавление настроек в таблице, доступной через меню Languages → Strings translations. Вам нужно ввести верный перевод для ваших строк в соответствии с указанными языками.
Проверим теперь на сайте, как выводятся переведенные строки. При переключении языков мы видим идентичную разметку, но разный текст.
Настройки Customizer для вывода постов на главной для 2-х языков
С точки зрения разработки темы обычно возникает вопрос о переводе настроек темы, которые на данный момент чаще всего располагаются в Customizer - Настройщике.
Например, вам необходимо в настройках сделать выбор постов для вывода их на главной странице в количестве 3-х штук. Главная страница существует, например, в 2-х вариантах - на русском и на украинском языке. Внешний вид настроек показан на скриншоте слева.
Каким образом можно выбрать отдельно посты для русской версии страницы, отдельно - для украинской? Вариант кода представлен ниже. В нем вы проверяем, входит ли пост в выборку по русскоязычным постам if($post->ID == pll_get_post($post->ID,'ru')
или украиноязычным: if(pll_get_post($post->ID,'uk'))
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | function theme_slug_customize_register( $wp_customize ) { ...;//создание панели настроек и секции theme_slug_homepage_section $posts = get_posts( array('numberposts' => 0 ) ); //выбираем все посты $choosen_posts=[]; // массив для постов на русском языке $choosen_posts_uk=[]; // массив для постов на украинском языке foreach( $posts as $post ){ setup_postdata($post); if($post->ID == pll_get_post($post->ID,'ru')) $choosen_posts[$post->ID] = $post->post_title; else if(pll_get_post($post->ID,'uk')) $choosen_posts_uk[$post->ID] = $post->post_title; } wp_reset_postdata(); // сброс for($i=1;$i<4; $i++){ $wp_customize->add_setting('theme_slug_home_post'.$i, array('capability' => 'edit_theme_options', 'default' => '', ) ); $wp_customize->add_control('theme_slug_home_post'.$i, array('type' => 'select', 'choices' => $choosen_posts, 'label' => 'Выберите новость '.$i.' для главной страницы', 'section' => 'theme_slug_homepage_section', ) ); } for($i=1;$i<4; $i++){ $wp_customize->add_setting('theme_slug_home_post_uk'.$i, array('capability' => 'edit_theme_options', 'default' => '', ) ); $wp_customize->add_control('theme_slug_home_post_uk'.$i, array('type' => 'select', 'choices' => $choosen_posts_uk, 'label' => 'Виберіть новину '.$i.' для головної сторінки', 'section' => 'theme_slug_homepage_section', ) ); } } add_action( 'customize_register', 'theme_slug_customize_register' ); |
Обратите внимание, что код для файла customizer.php представлен не полностью, а только для выборки постов. В функции theme_slug_customize_register()
нужно еще создать панель настроек с помощью $wp_customize->add_panel()
и секцию $wp_customize->add_section('theme_slug_homepage_section')
.
Подключаем файл стилей, записывая в functions.php темы такой код:
1 2 3 4 | function theme_slug_admin_styles(){ wp_enqueue_style("style-admin", THEME_URI."/css/admin/mytheme-admin.css"); } add_action('admin_enqueue_scripts', 'theme_slug_admin_styles'); |
Сами стили мы записываем в файле, который размещаем в папке css/admin/ нашей темы:
1 2 3 4 5 6 7 8 | label[for*="theme_slug_home_post"]{ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAE2SURBVHjaYvz69T8DAvz79w9CQVj/0MCffwwAAcQClObiAin6/x+okxHMgPCAbOb//5n+I4EXL74ABBALxGSwagTjPzbAyMgItAQggBg9Pf9nZPx//x7kjL9////9C2QAyf9//qCQQCQkxFhY+BEggFi2b/+nq8v46BEDSPQ3w+8//3//BqFfv9BJeXmQEwACCOSkP38YgHy4Bog0RN0vIOMXVOTPH6Cv/gEEEEgDxFKgHEgDXCmGDUAE1AAQQCybGZg1f/d8//XsH0jTn3+///z79RtE/v4NZfz68xfI/vOX+4/0ZoZFAAHE4gYMvD+3/v2+h91wCANo9Z+/jH9VxBkYAAKIBRg9TL//MEhKAuWAogxgZzGC2CCfgUggAoYdGAEVAwQQ41egu5AQAyoXTQoIAAIMAD+JZR7YOGEWAAAAAElFTkSuQmCC") no-repeat right 10px; padding-right: 20px; } label[for*="theme_slug_home_post_uk"]{ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFQSURBVHjaYmRo/c8AB//+MfwBkgwg8s8/KPoFI4GIgQEgAIdycgMACAMxUAF6oygqoQ1q45dkzSH5N26XR/8zCEuepggsVEPFkxB+S9bcRwCxMDCBVD/5+h+o9O8/BqDE378Mv/+DpCGKfgERmCHLw8jw4x9AAIFs+AdUBLQWZDZI9a/////8BSuFawBzf/8FuQMggFiALvsLsh2k+g/cbCTVUBLkKgaGDwwAAcTCIHJKhFPh19+fIHf/+/cbpBNI/gO75x+I/RfKluFiY5A6AhBAjH8fMjDI5P///+A/wy8GoFf/A+34hZVkYlJ6f/wUQACxAEOSESwEDEhURSiqwbJ/gKENEEAgDcwgDlAIrgiLNgaGvyD0hwEggEAamP4DdUrCREE6GRl/gyMPQv6BqgYG+z8GgABi/HoTFL///kBJBjgbwmBAcEEcBgaAAAMASIdu6OFHDhsAAAAASUVORK5CYII=") no-repeat right 10px; padding-right: 20px; } |
В файле front-page.php, который отвечает за формирование статической главной страницы, запишем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php for($j=1; $j<4; $j++){ $my_lang = pll_current_language(); // определяем текущий язык if ( $my_lang == 'ru' ) ${'theme_slug_home_post'.$j} = theme_slug_get_option('theme_slug_home_post'.$j);//посты на русском языке else ${'theme_slug_home_post'.$j} = theme_slug_get_option('theme_slug_home_post_uk'.$j); //посты на украинском языке } ?> <div class="container"> <div class="row"> <?php for($j=1; $j<4; $j++): $the_post = get_post( ${'theme_slug_home_post'.$j}); if ( has_post_thumbnail($the_post->ID) ) { $bg_post_image = get_the_post_thumbnail_url( $the_post->ID, 'post-medium'); } else $bg_post_image = THEME_URI. "/images/default-post.jpg"; ?> <div class="col-md-4 mb-4"> <div class="post-preview" style="background-image: url(<?=$bg_post_image ?>)"> <a href="<?php echo get_the_permalink($the_post->ID); ?>"> <h2 class="post-preview-title"><?= get_the_title($the_post->ID); ?></h2> <div class="post-preview-excerpt"> <div class="post-preview-datebox"> <?php echo the_time(get_option( 'date_format' )) ?> </div> <?= get_the_excerpt($the_post->ID); ?></div> </a> </div> </div> <?php endfor; ?> </div><!-- /.row --> </div> |
Небольшие пояснения к коду:
theme_slug_get_option()
- функция, отвечающая за получение всех настроек темы. Вы можете написать ее сами.THEME_URI
- константа, определенная в файле functions.php методомdefine('THEME_URI', get_template_directory_uri());
get_the_post_thumbnail_url( $the_post->ID, 'post-medium')
- получение url изображения записи, которое устанавливается справа внизу в настройках записи для того, чтобы использовать его в качестве фона для блока с записью на главной.
Результат - на разных языках посты выглядят по-разному, подтягивая только статьи на нужном языке:
Плагины для перевода настроек с помощью Ploylang
Добавление строк для перевода плагинов и тем
Плагин Theme and plugin translation for Polylang (TTfP) позволяет найти строки в плагинах и темах, которые можно обернуть в функции pll_e('Text')
или pll__('Text')
. Как правило, в темах и плагинах, которые создаются согласно рекомендациям Кодекса WordPress, вывод строк, предназначенных для перевода на другие языки, формируется с помощью WordPress-функций _e('Text', 'theme_domain')
или __('Text', 'theme_domain')
. Первый параметр в этих функция 'Text' - это текст для перевода, а второй - 'theme_domain' - это, как правило, название вашей темы (и имя папки с ней).
В результате работы плагина, в меню Languages → Strings translations у вас появятся строки из нужных плагинов/темы, которые вы отмечаете в настройках Theme and plugin translation for Polylang (TTfP):
Плагин изменения настроек темы в зависимости от языка
Для перевода настроек тем предназначен плагин Customizer Polylang, который добавляет создает переключатель языков в настройках темы и позволяет вам сделать отдельные настройки для каждого из указанных в настройках Polylang языков. На изображении видно, каким образом вы можете использовать этот плагин после установки и активации.
подскажите плиз, как в полиленге сделать, чтоб в выпадающем окне, в месте с названиями выводились и флажки, а то такой настройки нет (
Пробовала аддон к плагину Polylang (Add Polylang support for Customizer.), действительно решает вопросы с конструктором главной страницы, позволяет добавлять ID рубрик к каждой языковой версии. Спасибо разработчику.
У меня вопрос, вдруг кто-то поможет. Настроила два языка на своём блоге. Всё отлично. Но вот название главной, которое отображается в браузере никак не хочет переключаться. В строках перевода указано верно, но по факту почему-то не меняется.
Посмотрите, каким образом оно у вас отображается в теме. Обычно его выносят в в функцию pll_e() в файле темы. Либо это будет header.php, либо index.php, либо front-page.php.
Обычно вывод заголовка страницы осуществляется в тегах
Недавно я разработал решение для объединения Polylang и Customizer... в случае, если кому-то интересно: https://wordpress.org/plugins/add-polylang-support-for-customizer/
Добрый день) долго изучала инструкцию и то чем помогали разработчики в данной теме. Но пробую реализовать все это у себя и не получается, я начинающий разработчик. Буду благодарна за помощь!
Мне необходимо перевести фразу "Buy now", добавить ее в Strings translations. Эта фраза прописана отдельно в теме и woocommerce ее не переводит поэтому необходимо попробовать через Strings translations. Что конкретно нужно прописать в function.php? Просто pll_register_string( 'mythemeorpluginslug', 'English text to translate' ); он не понимает. Буду благодарна за помощь!!
Вот сам код где вызывается эта кнопка
Добрый день.
Если я правильно понимаю ваш код, то нужно сделать 2 шага, а не 1.
1.Ваш текст 'Buy now' берется из настроек темы. Поэтому в строке
echo sprintf( '%s', wp_kses_post( supro_get_option( 'product_buy_now_text' ) ) );
необходимо добавить функцию переводаpll__()
таким образом:echo sprintf( '%s', wp_kses_post( pll__(supro_get_option( 'product_buy_now_text' ) ) ) );
2. Затем в файле functions.php необходимо добавить такие строки:
Правда, у меня появился вопрос - вам на несколько языков этот текст надо перевести или только на русский? Если на один язык, то стоит перейти в меню Внешний вид > Настроить и поискать поле ввода с меткой Product Buy now Text или подобной, а затем ввести нужный текст.
Привет.
Я выпустил плагин, который добавляет поддержку Customizer - Add Polylang support for Customizer.
Просто подумал, что некоторые заблудшие души могут найти в этом применение.
Извините за спам.
Спасибо за информацию. "Заблудшие души" вполне могут воспользоваться вашим плагином.
Спасибо за статью! Как раз то, что нужно насчет Polylang.