Установка языка по умолчанию в drupal 6 на мультиязычном сайте

Столкнулся с интересной проблемкой в Drupal 6 при создании мультиязычного сайта.

Сама мультиязычность создавалась довольно типичным способом — пара стандартных модулей locate, content translate + i18n. Для каждого языка был выбран свой префикс пути (ru — для русских статей, en — для английских и cs — для чешских), и все было отлично и работало ожидаемо, пока сайт был открыт с правами администратора. Надо заметить, что сайт должен был быть приоритетно на английском. И он был установлен языком по умолчанию, и у администратора (admin) выбран в профиле.

Что происходило, когда мы выходили из профиля админа.

Главная страница, для которой в пути не было указания на язык, как для остальных страниц сайта, начинала отображаться на двух языках одновременно. В качестве главной, была выбрана англоязычная версия одной из статей, и она отображалась на английском, а вот меню, breadcrumbs и прочее — на русском. Т.е. не смотря на то, что на странице /admin/settings/language был выбран по умолчанию английский, drupal решал, что язык надо выбрать русский.

Возникал резонный вопрос — а почему? Ответ кроется в недрах ф-ции language_initialize() (/common/language.inc). Оказалось, что сначала drupal выясняет язык пользователя, и если тот авторизирован на сайте, язык берется из его профиля. Вот почему администратор получал верное отображение главной страницы — его языком в профиле был анлийский.

Вторым по значимости оказалось значение, передаваемое браузером — а именно русский язык. Его и устанавливал drupal для анонима. Статья отображалась на английском, а все остальное согласно работе модуля «интернационализации» — на русском.

А вот в последнюю очередь бралось значение языка по умолчанию. Не трудно догадаться, что современные браузеры всегда передают значение языка — и потому вариант со значением по умолчанию в данной функции остается не использованным. Разве что для ботов :), или если язык пользователя не поддерживается на сайте.

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

Вот пара более «правильных вариантов».

1. Записать в setting.php — cтроку

Затираем переменную HTTP_ACCEPT_LANGUAGE в настройка сайта, и drupal её уже не сможет проанализировать при инициализации языка.

2. Оформить вариант 1 в виде hook-а, который вызывается до инициализации языка. К примеру как то так

Если значение этой переменной важно, то его можно сохранять в зацепке (hook) boot и восстанавливать, к примеру, в зацепке init, когда язык уже выбран.

Мало букафф? Читайте есчо !

Поиск и замена терминов. Пример реализации.

Август 15, 2016 г.

Задача поиска и замены каких либо терминов в тексте кажется на первый взгляд довольно простой в PHP.  Есть очень мощные инструменты вроде str_replace, а также поиск и замена с помощью регулярных выражений, например, preg_replace и preg_replace_callback. ...

Читать

Программно удаляем тип публикации в Drupal

Март 15, 2018 г.

Всё, что вы можете сделать из админки, может быть сделано программно. Удаление типа публикации в Drupal тоже можно сделать из кода на PHP. Перед тем как удалить тип публикации, возможно, стоит подчистить экземпляры нод данного типа. Потому сначала ...

Читать

Как рендерить отдельные поля элемента field collections

Январь 31, 2019 г.

Модуль field_collection всю свою историю существования (аж 2010 года) проходит в статусе beta версии. Тем не менее многие разработчики используют его в своих проектах. На текущий момент это версия 7.x-1.0-beta13. Хотя FC - это ещё один entity, ...

Читать

Форма поиска товаров на Drupal

Май 11, 2023 г.

Здесь подробно рассмотрим небольшую задачу для сайта под управлением CMS Drupal. Требуется выводить поисковую форму для товаров в виде блока. Форма ...

Читать
 

Комментарии к «Установка языка по умолчанию в drupal 6 на мультиязычном сайте»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: