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

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

Error Code 1366 of Mysql при записи переводов в базу tmgmt_deepl

Октябрь 4, 2024 г.

Типично ошибка 1366 связана с тем, что кто то пытается записать символы с кодами не соответствующими кодовой таблице символов, установленной для таблицы в базе данных. Но в нашем случае речь идет о иной проблеме. Drupal использует utf8mb4 для текстовых ...

Читать

Как добавить поле "количество" для кнопки add to cart в Drupal Commerce

Июль 13, 2023 г.

Кнопка выводится как элемент product.variations, а вот настройки полей, которые выводятся в этой сущности довольно глубоко зарыты. [crayon-69d37808b621d027282205/] Поле "кол-во товара в корзине" не является частью сущности product variation, ...

Читать

Настраиваем мета информацию о картинке для соц. сетей в Drupal 7

Сентябрь 27, 2016 г.

Когда посетители делятся ссылкой на ваш сайт в какой нить соц.сети, то программа со стороны соц. сети (Facebook или вКонтакте) пытается собрать информацию ...

Читать

PHP код для списка значений поля CCK в drupal

Март 15, 2010 г.

Возможность запрограммировать на PHP (php code) список значений поля CCK, является замечательной опцией для разработчика сайта. Требования к описанию такие: не надо ставить скобки (об этом написано прямо под полем, куда предлагают ввести код) ...

Читать
 

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

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



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