xyzya


Petka Sokolnikov

блог обыкновенного фрилансера


Previous Entry Share Next Entry
Автоматический выбор необходимой пользователю языковой версии сайта на PHP
xyzya

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

Немного теории.

Я выбрал самый простой вариант определения языка у пользователя (есть и сложные), но не самый надежный (хотя абсолютно надежных вариантов не существует).
У каждого браузера есть поддержка локализаций (это то, на каком языке интерфейс браузера у вас). У FireFox локализация выставляется в меню «Инструменты->Дополнения->Локализации», в Opera в меню «Настройки->Общие настройки->Основные->Язык», в остальных ищите сами. Так вот наша задача узнать какой язык выставлен у пользователя, и согласно этому языку отдавать необходимую версию сайта.
У себя я сделал так, что если у пользователя выставлена русская, украинская или белорусская локализация, то отдавать ему русскую версию сайта, в противном случае отдавать английскую. Значение локализации браузера хранится в строке $_SERVER["HTTP_ACCEPT_LANGUAGE"], эту строку мы и будем проверять (учтите, что в этой строке через запятую могут быть указаны разные локализации, нам же важно только самое первое значение — оно имеет высший приоритет). Но проверять значение этой строки мало, могут быть ситуации, когда пользователю надо другую языковую версию сайта, например, он иностранец, сидящий в русском интернет кафе, и ему нужна англоязычная версия сайта, не смотря на русскую локализацию браузера. Этому пользователю при первой загрузке отдаем версию согласно его локализации, но далее, если он вручную на сайте выберет другую, более приемлемую ему версию сайта, то надо его выбор запомнить, и больше не навязывать ему то, от чего он ушел. Поэтому выбор пользователя мы будем сохранять в куках при помощи setcookie(); и далее проверять не сохранен ли выбор пользовательских языковых предпочтений в куках, если сохранен, то отдавать ему согласно его предпочтений до тех пор, пока эти предпочтения не поменяются.

А теперь практика.

Если теория ясна, то написать код не составит проблем, но для примера делюсь своим вариантом с комментариями.

// действие с проверкой языка и установкой куки языка проводим только на странице index.php
>if (strpos($_SERVER["REQUEST_URI"], "/index.php") or (substr($_SERVER["REQUEST_URI"], -1)  == "/")) {
	// если вход произведен без указания языка
	if (!$_GET['lang']) {
		// то проверяем, может язык указан в куках, если нет, то то смотрим локализацию браузера
		if (!$_COOKIE['lang']) {
			$b_lang = explode(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
			// если локализация русская или украинская или белорусская, то считаем, что пользователю необходимо отдавать русскую версию сайта.
			if (($b_lang[0] == "ru") or ($b_lang[0] == "be") or ($b_lang[0] == "ru-UA")) $lang = "rus";
			// при всех остальных локализациях отдаем английскую версию
			else $lang = "eng";
		}
		// если язык уже указан в куках, то его и используем в системе
		else $lang = $_COOKIE['lang'];
	}
	// если страница запрошена с указанием языка, то этот язык и используем в системе, и запоминаем его в куку
	else {
		$lang = $_GET['lang'];
		setcookie("lang", $lang, time()+30758400, "/");
	}
}

На выходе в переменной $lang получаем рабочее значение языка – rus или eng.

Это сообщение опубликованно в моём основном блоге. Вы можете комментировать как и тут, так и напрямую под сообщением в блоге.

?

Log in

No account? Create an account