У WPML есть свой переключатель языка в виде раскрывающегося списка языков. Он довольно гибкий, но этого всегда мало.

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

Получение списка (других) языков

Используйте команду icl_get_languages() для получения списка переводов любой страницы.

icl_get_languages('skip_missing=N&orderby=KEY&order=DIR&link_empty_to=str')

* N=0/1
* KEY=id/code/name (name -> translated_name), (по умолчанию: id)
* DIR=asc/desc (по умолчанию: asc)
* link_empty_to = str (по умолчанию: пусто, работает в связке со skip_missing=0 и позволяет использовать пользовательские ссылки для языков, на которых нет переводов данного элемента. {$lang} можно использовать в качестве заполнителя языкового кода)

Примечания:

  • Параметр skip_missing указывает для функции что делать, если на языке нет переводов.
  • Сочетание orderby и order позволяет создать раскрывающийся переключатель языка или переключатели языка, в которых языки всегда отображаются в одной позиции.

Функция возвращает массив с элементами каждого языка. Например, в случае сайта WordPress на английском, французском и итальянском языке она вернет следующее:

Array
(
 [0] => Array
  (
   [id] => 1
   [active] => 1
   [native_name] => English
   [missing] => 0
   [translated_name] => English
   [language_code] => en
   [country_flag_url] => http://yourdomain/wpmlpath/res/flags/en.png
   [url] => http://yourdomain/about
  )

 [1] => Array
  (
   [id] => 4
   [active] => 0
   [native_name] => Français
   [missing] => 0
   [translated_name] => French
   [language_code] => fr
   [country_flag_url] => http://yourdomain/wpmlpath/res/flags/fr.png
   [url] => http://yourdomain/fr/a-propos
  )

 [2] => Array
  (
   [id] => 27
   [active] => 0
   [native_name] => Italiano
   [missing] => 0
   [translated_name] => Italian
   [language_code] => it
   [country_flag_url] => http://yourdomain/wpmlpath/res/flags/it.png
   [url] => http://yourdomain/it/circa
  )
)

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

  • id: Внутренний идентификатор ссылки
  • active: Это активный в данный момент язык (только один язык является активным)
  • native_name: Родное название языка (не переводится)
  • translated_name: Перевод названия языка на активный в настоящее время язык
  • country_flag_url: URL-адрес изображения флага страны в формате PNG
  • url: Ссылка на перевод на данном языке
  • missing: 1, если у этого элемента нет перевода; 0, если есть.

Если нет переводов

Некоторые страницы могут не переводиться на все языки. Можно указать icl_get_languages, что отображать, если на язык нет перевода.

Если ‘skip_missing=1’, этот язык не будет отображаться. Если ‘skip_missing=0’, все языки будут отображаться, но язык, на который нет перевода, будет ссылаться на свою главную страницу.

Использование функций в теме

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

Приведенные ниже примеры PHP-функций необходимо добавить в файл functions.php (в папке темы) — он не входит в состав плагина.

Эта запись также доступна на…

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

function icl_post_languages(){
  $languages = icl_get_languages('skip_missing=1');
  if(1 < count($languages)){
    echo __('This post is also available in: ');
    foreach($languages as $l){
      if(!$l['active']) $langs[] = '<a href="'.$l['url'].'">'.$l['translated_name'].'</a>';
    }
    echo join(', ', $langs);
  }
}

Эта функция выполняет следующее:

  1. получает список языков от WPML — $languages = icl_get_languages(‘skip_missing=1’);
  2. проверяет, есть ли эта запись на других языках — if(1 < count($languages))
  3. создает выходную страницу, пропуская отображаемый язык — if(!$l[‘active’])

Примечания:

  1. Сообщение пропускается через вызов gettext. Это очень важно для того, чтобы сообщение, которые вы будете добавлять в записи на разных языках, отображалось на правильном языке:  __(‘Эта запись также доступна на: ‘);
  2. Здесь используются переведенные названия языков. Таким образом, все предложение будет на одном языке: $l[‘translated_name’]

В результате мы получим следующее:

Сообщение о том, что запись доступна на других языках
Сообщение о том, что запись доступна на других языках

Чтобы это сообщение отображалось в записях, добавьте вызов к icl_post_languages() из single.php.

Список названий языков с их флагами в нижнем колонтитуле

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

function languages_list_footer(){
    $languages = icl_get_languages('skip_missing=0&orderby=code');
    if(!empty($languages)){
        echo '<div id="footer_language_list"><ul>';
        foreach($languages as $l){
            echo '<li>';
            if($l['country_flag_url']){
                if(!$l['active']) echo '<a href="'.$l['url'].'">';
                echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
                if(!$l['active']) echo '</a>';
            }
            if(!$l['active']) echo '<a href="'.$l['url'].'">';
            echo icl_disp_language($l['native_name'], $l['translated_name']);
            if(!$l['active']) echo '</a>';
            echo '</li>';
        }
        echo '</ul></div>';
    }
}

Эта функция выполняет следующее:

  1. создает элемент DIV и составляет неупорядоченный список, если есть хоть один язык перевода: if(!empty($languages)){ echo ‘<div id=»footer_language_list»><ul>’;
  2. проходит по всем языкам и добавляет их в список.
  3. если этот язык не является активным, она также добавляет ссылку на страницу на этом языке: if(!$l[‘active’]) echo ‘<a href=»‘.$l[‘url’].'»>’;
  4. добавляет флаг языка: <img src=»‘.$l[‘country_flag_url’].'» alt=»‘.$l[‘language_code’].'» width=»18″ height=»12″ />
  5. добавляет родное название языка и его перевод, если они отличаются: echo icl_disp_language($l[‘native_name’], $l[‘translated_name’]);

Функцию icl_disp_language() создает WPML. Она проверяет, различаются ли эти два аргумента (native_language_name, translated_language_name). Если да, она возвращает оба, в противном случае она возвращает только один.

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

#footer_language_list{
  margin-bottom: 25px;
  text-align: center;
}

#footer_language_list ul{
  list-style: none;
  margin:0;
  padding:0;
}

#footer_language_list ul li img{
  margin-right:5px;
}

#footer_language_list ul li{
  display:inline;
  margin:0 5px 0 5px;
  padding:0;
}

#footer_language_list ul li a, #footer_language_list ul li a:visited{
  color: #fff;
  text-decoration:underline;
}

#footer_language_list ul li a:hover, #footer_language_list ul li a:active{
  color: #fff;
}

Вот так будет выглядеть переключатель языка:

Языки в нижнем колонтитуле
Языки в нижнем колонтитуле

Чтобы разместить нижний колонтитул с языками в своей теме, добавьте вызов к languages_list_footer в файл footer.php.

* Обратите внимание: этот горизонтальный переключатель языка легко превратить в вертикальный. Просто удалите оператор display: inline из CSS-кода.

Селектор языка только с флагами

Простая функция для отображения флагов, связанных с переводами текущей страницы.

function language_selector_flags(){
    $languages = icl_get_languages('skip_missing=0&orderby=code');
    if(!empty($languages)){
        foreach($languages as $l){
            if(!$l['active']) echo '<a href="'.$l['url'].'">';
            echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
            if(!$l['active']) echo '</a>';
        }
    }
}

Выход этой функции требует отдельного оформления (например, разместить ее в div-блок и определить пользовательские стили для меток img).

<div id="flags_language_selector"><?php language_selector_flags(); ?></div >

CSS-код:

#flags_language_selector img{
      margin:1px;
      border:1px solid #333;
}
Селектор языков с флагами

Замена флагов стран и изменение названий языков

В WPML есть графический интерфейс для изменения информации о языке. Перейдите в WPML->Языки и нажмите Изменить языки. Здесь можно изменить названия языков, их стандарт и выбрать другие флаги.

'skip_missing=0&orderby=name'