В РНР заголовок Accept-Language автоматически становится доступным как глобальная переменная $HTTP_ACCEPT_LANGUAGE. Это строка, в которой перечислены принимаемые языки в порядке их приоритета. Если передать эту строку то будет получен массив, с которым можно работать.
Вот функция, которая принимает массив имеющихся языков и возвращает лучшие из них с учетом $HTTP_ACCEPT_LANGUAGE. Массив имеющихся языков следует упорядочить так, чтобы первый из них использовался по умолчанию, если $HTTP_ACCEPT_LANGUAGE не соответствует ни одному из имеющихся языков:
function getBestLanguage($avail_lang) {
$accept_lang = explodeC, \ $GL0BALS[ 'HTTP..ACCEPT.LANGUAGE' ]);
while (list($key, $lang) = each($accept_lang)) { if (in_array($lang, $avail_lang)) { return $lang;
)
}
return reset($avail_lang);
}
С помощью этой функции легко выбрать язык для первого вывода ее пользователю. Конечно, пользователь должен иметь возможность при желании изменить язык. Весьма раздражает, если все веб-страницы вдруг начинают появляться на чешском языке и неизвестно, как вернуться к английскому.
Теперь мы можем определить, какой язык предпочитает пользователь. Если сайт поддерживает этот язык, тогда локаль должна обеспечить нас информацией о том, какой набор символов должен отображаться на
Можем расширить наш маленький броузер файловой системы, применив то, о чем сейчас узнали:
<?php
class App {
var $output; var $avail_lang;
Конструктор инициализирует массив доступных языков и выбирает среди них лучший:
function Арр() I
$this->avail_lang = array('en', 'da', 'pi'); $this->setLanguage($tlus->getBestLanguage());
>
Исходя из массива имеющихся языков ($avail_lang) и заголовка Accept-Lan- guage, переданного броузером, эта функция возвратит код лучшего языка:
/function getBestLanguageO {
$accept_lanc = explode( ' , ' , $GL0BALS[' http://http.accept.language/">HTTP.ACCEPT.LANGUAGE ' ] );
while (list($key, $lang) = each($accept_lang)) {33 if (in_array($lang, $this->avail_lang)) jjH
return $lang;
}
> ,
return reset($this->avail_lang);
Функция setLanguage() осуществляет переход на другой язык путем создания нового объекта вывода:
function setLanguage($new_language = ")
{
switch ($new_language) [ case 'en':
$this->output = new English_Output();
break;
case 'da' : :
$this->Output = new Danish_Output(); break;
case 'pi':
$this->output - new PolishJ)utput();
break;
default:
$this->setLanguage($this->getBestLanguage);