Language Switcher сделать языки ссылками на главную страницу языка или на перевод страницы, если есть

Drupal: 

Многоязычный сайт с модулем Internationalization и, возможно, Entity Translation обязательно имеет блок перехода на языковые версии. Этот блок обычно создают модулем Language Switcher или надстройкой над ним - модулем Language Switcher Dropdown. В двух этих случаях ссылки на переводы работают по-разному, сделать как надо позволит хук.

Language Switcher

При обычной настройке модуль добавляет названия всех активированных языков сайта. Но если перевода страницы нет на каком-либо языке, то этот язык не является ссылкой и показывается перечёркнутым. То же самое, если добавить флаги с модулем Language Icons - флаг тоже перечёркнутый. Это неправильно.
В настройках блока этого модуля - Переключатель языка (Текст пользовательского интерфейса) - нет каких-либо опций, поэтому нужно писать хук hook_language_switch_links_alter(), чтобы добавить ссылки на языки, для которых нет перевода текущей страницы.
Модуль Language Dropdown не умеет самостоятельно различать, существует ли перевод или нет, поэтому использование следующего кода в своём модуле или теме, в файле template.php решает вопрос.
В предложенном ниже хуке для языков, на которые не переведена текущая страница, устанавливается ссылка на главную страницу языка. (А перечёркнутый стиль останется, нужно просто поправить в CSS).

Language Switcher Dropdown

Этот модуль - надстройка - имеет более продуманный функционал и настройки блока:
"Показывать все активные языки", или "Show all enabled languages" - если эта галка отмечена, тогда в блоке выбора языка будут показываться все активные языки, а если нет перевода для некоторых - они будут ссылаться на главную страницу языковой версии.
"Переходить на главную при выборе", или "Redirect to home on switch" - эта опция для любой страницы сайта при выборе языка открывает главную страницу языковой версии, и не учитывает есть ли перевод сущности или нет (перевод пользователя, материала, термина). Поэтому если ваш сайт небольшой, и большинство страниц переведены, желательно оставить возможность перехода на языковую версию материала и не включать эту опцию.

Как сделать переход на перевод статьи, термина, пользователя, если переведено - или на главную, если нет перевода?

Открывать переводы материалов - очень удобно для Администратора и Редактора, и, наверное, только для 0.5% посетителей сайтов, поэтому чаще на других CMS ссылки на языки ведут на главную страницу языковой версии, так как делать языки ссылками на переводы материалов - сложно и никому не нужно. Но в друпал всё гораздо эффективнее и удобнее для пользователя и разработчика.

Изначально с отключенной галкой "Переходить на главную" именно модуль Language Switcher Dropdown без каких-либо настроек переходит на перевод, если есть, и на главную страницу языка - если нет перевода данной страницы. То есть работает удобно, как надо!

Но если включить Entity Translation (например, для перевода профилей пользователей), то эта умная функция модуля не срабатывает, и Language Switcher Dropdown открывает иностранный интерфейс и оригинал или перевод страницы - что неправильно: русский текст на странице с английским интерфейсом никому не нужен - нужно переходить на главную.

Следующий хук решает задачу. При включенном Entity Translation модуль Language Switcher Dropdown будет адресовать пользователя либо на перевод, если есть, либо на главную если перевода нет.

Хук можно использовать, если вы пользуетесь блоком Language Switcher или Language Switcher Dropdown, хук работает с ссылками выбора языков.

Сделать ссылки на языки либо на перевод текущей страницы, либо на главную страницу языка, если перевода нет
  1. /* Implements hook_language_switch_links_alter().
  2.  * drupal_get_path_alias($path = NULL, $path_language = NULL)
  3.  */
  4. function MYMODULE_language_switch_links_alter(&$links, $type, $path) {
  5. global $language;
  6. if ($type == LANGUAGE_TYPE_INTERFACE && isset($links[$language->language])) {
  7. // get languages paths strings and if it is not aliased replace
  8. foreach ($links as $langcode => &$link) {
  9. // if language switcher element is not active,
  10. // create a link to language front
  11. if (!isset($link['href'])) { $link['href'] = '<front>'; }
  12. $linkpath = drupal_get_path_alias($link['href'], $link['language']->language);
  13. if (($link['language']->language != $language->language) && ($linkpath == $link['href'])) {
  14. $link['href'] = '<front>';
  15. }
  16. }
  17. }
  18. }