Все ленты — последние статьи

PHP: определение предпочитаемого посетителем языка

В данном уроке демонстрируется техника использования PHP для определения предпочитаемого для посетителя языка. Такой функционал является важной частью сайтов, предназначенных для интернациональной аудитории. Как минимум, он дает возможность установить язык интерфейса, понятный посетителю. Наш скрипт определяет 180 языков.

sourse


Шаг 1. Таблица языков

Сначала формируем массив с кодами доступных языков:
1 <?php
2
3 // all the possible languages codes
4 $aLanguages = array(
5 'aa' => 'Afar',
6 . . .
7 );
8 ?>


Шаг 2. Функция

Основная идея — разобрать глобальную переменную $_SERVER['HTTP_ACCEPT_LANGUAGE']. Известно, что данная переменная содержит заголовок запроса Accept-Language, который очень похож на Accept, но ограничен набором языков, которые предпочтительны при формировании ответа на запрос. Подробно они описаны в протоколе (на Английском языке).
01 // Определяем предпочтительный язык
02 function tryToFindLang($aLanguages, $sWhere, $sDefaultLang) {
03
04 // Устанавливаем текущий язык как язык по умолчанию
05 $sLanguage = $sDefaultLang;
06
07 // Изначально используется лучшее качество
08 $fBetterQuality = 0;
09
10 // Поиск всех подходящих парметров
11 preg_match_all("/([[:alpha:]]{1,8})(-([[:alpha:] -]{1,8}))?(s*;s*qs*=s*(1.0{0,3} 0.d{0,3}))?s*(, $)/i", $sWhere, $aMatches, PREG_SET_ORDER);
12 foreach ($aMatches as $aMatch) {
13
14 // Устанавливаем префикс языка
15 $sPrefix = strtolower ($aMatch[1]);
16
17 // Подготоваливаем временный язык
18 $sTempLang = (empty($aMatch[3])) ? $sPrefix : $sPrefix . '-' . strtolower ($aMatch[3]);
19
20 // Получаем значения качества (если оно есть)
21 $fQuality = (empty($aMatch[5])) ? 1.0 : floatval($aMatch[5]);
22
23 if ($sTempLang) {
24
25 // Определяем наилучшее качество
26 if ($fQuality > $fBetterQuality && in_array($sTempLang, array_keys($aLanguages))) {
27
28 // Устанавливаем текущий язык как временный и обновляем значение качества
29 $sLanguage = $sTempLang;
30 $fBetterQuality = $fQuality;
31 } elseif (($fQuality*0.9) > $fBetterQuality && in_array($sPrefix, array_keys($aLanguages))) {
32
33 // Устанавливаем текущий язык как значение префикса и обновляем значение качества
34 $sLanguage = $sPrefix;
35 $fBetterQuality = $fQuality * 0.9;
36 }
37 }
38 }
39 return $sLanguage;
40 }

А использовать функцию достаточно просто:
1 // Получаем все доступные коды языков
2 require_once('langs.php');
3 $sLanguage = tryToFindLang($aLanguages, $_SERVER['HTTP_ACCEPT_LANGUAGE'], 'en');

В переменной $sLanguage содержится код предпочитаемого языка.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.script-tutorials.com/php-language-detector/
Перевел: Сергей Фастунов