Установка языка по умолчанию в 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, когда язык уже выбран.

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

Вывод сообщений валидации формы рядом с формой

Март 20, 2019 г.

При возникновении ошибок, во время проверки формы друпал выполняет две вещи, которые отражаются на фронт-энд - добавляет сообщение об ошибке в стек сообщений и маркирует классом error поле, содержащее ошибку. Если форма находится далеко от места вывода ...

Читать

Анимация смены картинок с помощью jquery

Декабрь 26, 2012 г.

Ещё одна типовая задача, для которой найдено приличное решение. Типично суть задачи состоит в следующем. Есть набор изображений, которые демонстрируются поочередно в некотором контейнере. Ставится задача по анимации периодической смены этих картинок средствами ...

Читать

Получить список типов товаров в Drupal Commerce

Июль 23, 2023 г.

В терминологии Drupal, типы товаров это - бандлы (bundle) сущности commerce_product. Получить их список можно вот так: [crayon-69e0bfa60c3df998203343/] Как результат, в $product_types вы получите массив типов товаров, где ключом является ...

Читать

Пример создания Field Collection из кода

Октябрь 14, 2018 г.

Продолжаю создавать хинты по работе с модулем Field Collection. Сегодня поделюсь примером кода, создающего новый объект field collection. Пример для Drupal ...

Читать
 

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

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



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