Часто на сайте требуется автоматическое определение языка пользователя, в одном из проектов потребовалось решить эту задачу. Как всегда на ум пришло самое быстрое решение, определить язык с помощью константы 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/";
}

Данное решение не будет зависеть от того закешировалась страничка или нет. Решение простое и надежное, работает во всех браузерах.

Читать похожие статьи:

4 комментариев “Определение языка пользователя (PHP, JavaScript)”

  1. в браузерах opera не работает javascript

  2. Здравствуйте, а как осуществить редирект на посредством ява скрипт, при помощи кода приведённого выше?

  3. Максим:

    Как, используя выборку языка по java, сделать тогда селектор языка на сайте? Например, я зашел с англ браузера, но хочу выставить русский язык. Как сделать селектор?

  4. Максим:

    И чтобы в куках сохранялось