аватар |

Статьи / PHP /

Как определить язык пользователя средствами PHP?


В наше время считается нормальной практикой делать сайт с интерфейсом на нескольких языках. Вы, наверное, уже замечали, что зайдя, например, на facebook.com сайт автоматически определяет Ваш язык и пишет уже на русском. Как это происходит? Поскольку изначально тот же facebook был написан на php, то и пример в разделе php-статей приведу на этом языке.

Всё очень просто. Для определения ip, домен, адреса, браузера и других вещей в php есть стандартные элементы суперглобального массива - $_SERVER. Но нам нужен один из них:

$_SERVER["HTTP_ACCEPT_LANGUAGE"]

Данный элемент передаёт серверу информацию о языке посетителя. Он возвращает нам, например, либо en, либо ru и тд. Сама информация выглядит примерно следующим образом:

ru-RU,ru;q=0.8,
en-US;q=0.5,
en;q=0.3

Сначала язык (ru), потом регион (RU), а после уже приоритет (q=0.8). Чем больше приоритет (q), тем больше пользователь предпочитает данный язык. Если q нет, значит, оно равно 1. Например, у ru-RU нет q, значит, оно равно 1, и данный язык наиболее подходящий.

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

Код PHP

<?php
  preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]), $matches); // вычисляем соответствия с массивом $matches
  $langs = array_combine($matches[1], $matches[2]); // Создаём массив с ключами $matches[1] и значениями $matches[2]
  foreach ($langs as $n => $v)
    $langs[$n] = $v ? $v : 1; // Если нет q, то ставим значение 1
  arsort($langs); // Сортируем по убыванию q

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

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


И другой способ определения языка пользователя PHP



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

switch (strtolower($matches[0])){
    case "ru": $accept_lang="ru";break; // если русский
    case "de": $accept_lang="de";break; // если немецкий
    case "en": case "uk": case "us": $accept_lang="en";break; // если английский
    case "ua": $accept_lang="ua";break; // если украинский

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

echo $accept_lang;
?>



Как автоматически переслать посетителя нужную языковую версию сайта PHP?


Для начала создаём массив с адресами (+ нужные поддомены) для каждого языка. Допустим, русская версия будет иметь стандартный адрес. Английская будет иметь вначале en. , испанская es. , а французская fr.

// Создаем массив с адресами для каждого языкового кода
    $sites = array(
    "ru" => "http://mysite.com/",
    "en" => "http://en.mysite.com/",
    "es" => "http://es.mysite.com/",
    "fr" => "http://fr.mysite.com/",
);

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

// проверяем язык
if (!in_array($lang, array_keys($sites))){
    $lang = 'ru';
}

// перенаправление на субдомен
header('Location: ' . $sites[$lang]);


Спасибо за внимание!
 



Похожие статьи


Комментарии к статье (vk.com)