Часто на сайте требуется автоматическое определение языка пользователя, в одном из проектов потребовалось решить эту задачу. Как всегда на ум пришло самое быстрое решение, определить язык с помощью константы 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/"; }
Данное решение не будет зависеть от того закешировалась страничка или нет. Решение простое и надежное, работает во всех браузерах.
в браузерах opera не работает javascript
Здравствуйте, а как осуществить редирект на посредством ява скрипт, при помощи кода приведённого выше?
Как, используя выборку языка по java, сделать тогда селектор языка на сайте? Например, я зашел с англ браузера, но хочу выставить русский язык. Как сделать селектор?
И чтобы в куках сохранялось