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

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

Drupal migration из CSV файла

Март 1, 2024 г.

API миграции в Drupal позволяет "тащить" данные из разных источников, но работает это на базе контрибных модулей, т.е. не из коробки. Например, модуль migrate_source_csv добавляет возможность добавить CSV файл как источник данных. Создание каких ...

Читать

Скрипт экспорта в базу публикаций Drupal

Март 1, 2016 г.

Когда заказывают переделать сайты с "историей", приходится перетаскивать имеющиеся публикации на новый сайт. Хочу поделиться некоторыми моментами, связанными ...

Читать

Получим объект публикации (node) внутри кода модуля

Апрель 20, 2014 г.

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

Читать

Загрузить данные параграфов для связанного с ними entity

Июль 8, 2023 г.

Пример кода для загрузки параграфов. В данном примере будем загружать параграфы, связанные с entity commerce_product_variation (это сущность модуля Commerce). Я привязал информацию по остаткам складов к вариациям в виде параграфов (тип - stocks). ...

Читать
 

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

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



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