Часто на сайте требуется автоматическое определение языка пользователя, в одном из проектов потребовалось решить эту задачу. Как всегда на ум пришло самое быстрое решение, определить язык с помощью константы HTTP_ACCEPT_LANGUAGE одного из суперглобальных массивов, она содержит в себе строку типа “en-US,en;q=0.8″. Это значение берётся из заголовков запроса страницы. Браузер отправляет соответсвующий заголовок исходя из собственных языковых настроек и не учитывает локаль ОС (если хотите протестировать решение, достаточно поменять языковые предпочтения браузера)
PHP
Этот код просто определяет, присутствует ли запись о языке в заголовке запроса и если да, то скрипт перенаправляет пользователя в соответствующий раздел сайта. Англоязычные пользователи будут перекинуты на http://site.com/en
Переменная $lang извлекает значение константы HTTP_ACCEPT_LANGUAGE. Тут мы используем функцию substr с тремя параметрами для того, чтобы извлечь нужный нам язык.
Далее следует строка, в которой мы проверяем, поддерживается ли язык пользователя на нашем сайте. Если да, то перенаправляем его в соответствующий раздел сайта, если нет, выставляем язык по умолчанию. Также необходимо записывать в cookie какой раздел сайта он просматривал, чтоб не мучить пользователя постоянным переходом на неизвестный ему язык
// получаем язык
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
//записываем определившийся язык в куки
setcookie ("lang",'en',time()+3600*24*62,"/");
// если язык английский то перенаправляем
if(($lang=='en' || $_COOKIE['lang']=='en') && empty($_COOKIE['at_en']))
header('Location: http://site.com/en');
$_COOKIE['at_en'] – (хранится как сессия до закрытия окна браузера) показывает что пользователь вернулся с английской версии на главную страницу сайта и не нужно его обратно перекидывать на английскую версию. Также при заходе в английскую версю сайта необходимо записывать в куки предпочтение пользователя для того чтоб при последующем входе он оставался в той версии сайта которую он просматривал в последний раз. Пишем скрипт где то в корневом index.php:
if(mb_strrpos("/".$_SERVER['REQUEST_URI'],"/en/",0,'utf-8')) {
setcookie ("lang",'en',time()+3600*24*62,"/");
setcookie ("at_en",'1',0,"/");
}
else {
setcookie ("lang",'ru',time()+3600*24*62,"/");
}
JavaScript
Вроде все работает и все отлично, но проект был на битриксе. Включено кеширование, и он просто кешировал html код страницы не отрабатывая постоянно php скрипт. Поэтому потребовалось также решение на js.
Оно также достаточно быстро, ко всему тому что у нас уже есть необходимо просто добавить javascript на главную страницу сайта:
// функция определения языка пользователя на javascript
function LanguageInfo(){
var n = navigator;
this.UALanguage = n.language ? n.language : n.browserLanguage ? n.browserLanguage : null;
this.userLanguage = n.userLanguage ? n.userLanguage : n.systemLanguage ? systemLanguage : null;
}
function getCookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split(";");
for (i=0;i<ARRcookies.length;i++)
{
x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
x=x.replace(/^\s+|\s+$/g,"");
if (x==c_name)
{
return unescape(y);
}
}
}
var oLanguage = new LanguageInfo();
var at_en=getCookie('at_en');
if((oLanguage.userLanguage == "ru" || oLanguage.UALanguage == "ru") || at_en==1) {
}
else {
location.href="/en/";
}
Данное решение не будет зависеть от того закешировалась страничка или нет. Решение простое и надежное, работает во всех браузерах.