Аргерих Л. О языке РНР. Часть 5. Страница 58


В РНР заголовок 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);