Обновлено 23.11.2018г. 03:33 (UTC+3)

Как настроить определение языка пользователя по IP и зачем это нужно

Большинство мультиязычных сайтов используют технологию автоматического определения языка пользователя. Выглядит это так: пользователь, заходя на ресурс, видит перед собой страницы с контентом на родном для него языке. Самый простой метод определения – по IP каждого посетителя. Технология простая и во многом удобная для посетителей. Но в ней есть свои нюансы.

Особенности, преимущества и недостатки определения языка по IP

Использование IP или, точнее, GeoIP – наиболее доступный и простой способ. Но в то же время часто он бывает неточным. Многие пользователи жалуются: когда они находятся за пределами России, то первоначально все сайты загружаются на языке страны, в которой они пребывают. Это дико неудобно, и самое интересное, что этим грешат и такие крупные площадки, как Facebook.

Подобная проблема наблюдается, если пользователь заходит на ресурс через прокси-сервер или VPN – то есть, выходит в Интернет не с российского IP. В такой ситуации GeoIP полностью бесполезен – ведь будет считываться информация о местонахождении прокси либо VPN-сервера. Аналогичная ситуация – если провайдер обеспечивает доступ клиентов через NAT (а это происходит все чаще, так как со свободными IPv4 адресами сейчас очень большие проблемы).

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

  • легкое применение, возможность реализации на разных языках
  • если не брать во внимание описанные выше проблемы – высокая точность определения;
  • высокая (мгновенная) скорость – для получения результата достаточно одного запроса к базе.

К недостаткам метода определения языка по IP относят:

  • необходимость постоянно актуализировать базу IP;
  • невозможно проверить, насколько достоверны данные;
  • данные IP по России не всегда точные.

Как настроить определение языка сайта по IP

Первый и самый простой способ – использование бесплатной библиотеки. К примеру, для сайтов на PHP можно применять расширение GeoIP. По ссылке доступна подробная инструкция по установке и другие рекомендации.

В PHP имеются стандартные элементы супеглобального массива $_SERVER для определения айпишника и переключения на нужную языковую версию. Вот конкретно используемый элемент

$_SERVER["HTTP_ACCEPT_LANGUAGE"]

Он отвечает за передачу серверу данных о языке пользователя, возвращая значение ru, en или любое другое. Вот так примерно выглядят эти данные:

ru-RU,ru;q=0.8,

en-US;q=0.5,

en;q=0.3

Первое значение – язык, второе – регион, а коэффициент указывает на приоритет (то, какой язык пользователь предпочитает больше). Благодаря подобной логике, например, стартовая страница Google для русскоязычного пользователя, который находится в Украине, загрузится на русском, но с сервера Google.com.ua.

Для определения языка можно использовать следующий код:

<?php<br >

preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]), $matches); // вычисляем соответствия с массивом $matches<br >

$langs = array_combine($matches[1], $matches[2]); // Создаём массив с ключами $matches[1] и значениями $matches[2]<br >

foreach ($langs as $n => $v)<br >

$langs[$n] = $v ? $v : 1; // Если нет q, то ставим значение 1<br >

arsort($langs); // Сортируем по убыванию q<br >

<br >

echo key($langs); // Выводим язык по умолчанию<br >

?></br ></br ></br ></br ></br ></br ></br ></br >

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

<?php<br >

preg_match('/^\w{2}/',$_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);<br >

<br >

switch (strtolower($matches[0])){<br >

case "ru": $accept_lang="ru";break; // если русский<br >

case "de": $accept_lang="de";break; // если немецкий<br >

case "en": case "uk": case "us": $accept_lang="en";break; // если английский<br >

case "ua": $accept_lang="ua";break; // если украинский<br >

<br >

default: $accept_lang="en";break; // если нет совпадений, то по умолчанию, например, английский<br >

}<br >

<br >

echo $accept_lang;<br >

?></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br >

Чтобы автоматически направить посетителя на нужную языковую версию на PHP-сайте, нужно взять массив с адресами и поддоменами каждого из языков.

// Создаем массив с адресами для каждого языкового кода<br >

$sites = array(<br >

"ru" => "http://mysite.com/",<br >

"en" => "http://en.mysite.com/",<br >

"es" => "http://es.mysite.com/",<br >

"fr" => "http://fr.mysite.com/",<br >

);<br >

<br >

// получаем язык<br >

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // вырезаем первые две буквы<br >

<br >

// проверяем язык<br >

if (!in_array($lang, array_keys($sites))){<br >

$lang = 'ru';<br >

}<br >

<br >

// перенаправление на субдомен<br >

header('Location: ' . $sites[$lang]);</br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br ></br >

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