Определение языка посетителя по ip-адресу

В предыдущих статьях описывалось создание многоязычного сайта, и на таком сайте иногда бывает полезно автоматически определять язык посетителя по его ip-адресу. Для определения страны по адресу посетителя используются данные GeoLite, созданные компанией MaxMind (www.maxmind.com). На странице GeoLite Сountry следует найти ссылку Download the latest GeoLite Country CSV Format и скачать нужный архив, после чего извлечь из него файл с данными о соответствии стран и ip-адресов. На основе этого файла в MODx будет создана соответствующая таблица в базе данных.

Модуль для создания таблицы базы данных

Создание и заполнение нужной таблицы выполняется с помощью дополнительного модуля. Скачав файл с текстом модуля, создайте в административной части MODx новый модуль, назвав его langIP. Перед первым запуском модуля необходимо выполнить его настройку. Кстати, просмотрев код модуля, вы можете познакомиться с принципами создания модулей в MODx, оформленных в стиле административной части системы.

Так как нашей задачей является определение языка, а не страны посетителя, при записи в базу данные преобразуются. Для некоторых стран задается один язык, для некоторых – другой, а для всех остальных стран, для которых будет использоваться язык по умолчанию, данные не заносятся в базу. В качестве примера в модуле используется такая строка настройки: $langs = array ("RU"=>"ru", "UA"=>"ru", "BY"=>"ru", "FI"=>"fi");. В этом случае посетителям из России, Украины и Белоруссии ставится в соответствие русский язык, а посетителям из Финляндии назначается финский язык. Остальным посетителям будет назначен язык по умолчанию, задаваемый сниппетом, описанным ниже. Соответствие стран и языков задается с помощью массива, в котором два символа международного кода страны являются ключом, а два символа языка – значением элемента массива.

После настройки запустите модуль, естественно, получив заранее данные об ip-адресах. Выберите для загрузки скачанный ранее файл с данными GeoLite Country, после чего нажмите кнопку Добавить записи. Процедура заполнения базы информацией может занять продолжительное время. При необходимости удаления базы, нажмите кнопку Удалить базу.

Внимание! Обработка данных требует значительных вычислительных ресурсов и в некоторых случаях могут возникать ошибки из-за ограничений хостинга на объем выделяемой памяти и время выполнения программ. В этом случае необходимо разбить исходный файл на несколько частей и произвести их загрузку отдельно.

Сниппет для определения языка посетителя

Для использования загруженных данных следует добавить небольшой сниппет. В нашем примере он возвращает название языка, но можно в зависимости от языка выдавать различную информацию, а также осуществлять переход на соответствующие страницы сайта.

В первых строках сниппета задаются его настройки. Команда $language='en'; определяет язык по умолчанию, то есть тот язык, который будет выдаваться при отсутствии адреса в базе. В нашем случае описан английский язык. Командой $local='ru'; задается язык для локальных пользователей, то есть для тех, кто работает на том же компьютере, где размещен сайт, или в одной с веб-сервером локальной сети. В сниппете для них выбран русский язык.

<?php
$language='en';
$local='ru';
$basename = $modx–>getFullTableName("ipbase");
$ip_array = explode('.',$_SERVER['REMOTE_ADDR']);
$ip = ($ip_array[0]*16777216) +
 ($ip_array[1]*65536) + ($ip_array[2]*256) +
 ($ip_array[3]);
if (3232235520<=$ip && 3232301055>=$ip)
  $language=$local;
else {
  $result=$modx–>db–>select('language', $basename,
    "`begin`<=".$ip." AND `end`>=".$ip);
  if ($row = $modx–>db–>getRow($result))
    $language=$row['language'];
}
return $language;
?>

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

Ограничения использования

Исходные данные по соответствию адресов и стран ежемесячно обновляются, и для более точного определения языка следует раз в месяц заново заполнять базу. Однако это не является основным ограничением при использовании данного сниппета.

Определить язык посетителя достаточно просто, но что следует делать после этого на многоязычном сайте? Можно выдавать разный контент для различных языков, а можно осуществлять редирект на соответствующие страницы, но оба эти варианта не слишком удачны. Не совсем ясно, как реагировать на посещение роботов поисковых систем, и даже определившись с этим, можно получить проблемы в продвижении сайта. Поисковые системы могут расценить редирект и выдачу разного контента как попытку их обмана и исключить сайт из своего индекса.

Также следует помнить, что всегда остается вероятность неверного определения языка посетителя, поэтому необходимо давать возможность ему явно указать язык, причем лучше, если его выбор сохранился бы в файлах cookie для дальнейшего использования при путешествии по сайту.

Реклама

Партнеры

Поиск на сайте

Введите ваш запрос для начала поиска.