Обнаружить язык с PHP


Я создаю многоязычный сайт, поэтому мне нужна какая-то функция, чтобы определить язык пользователя, а также не отпугнуть поисковых систем, поэтому я написал такой метод, чтобы обнаружить язык. Приоритетом является как следующие:

  1. Мы смотрим, если пользователь имеет активную языке в $_SESSION;

  2. Если нет, мы посмотрим в базе данных для выявления предпочтений пользователя;

  3. Если ничего в базе данных, мы смотрим на доменное имя и попытаться обнаружить локализацию доменного имени и суперглобальный массив $_SERVER;

  4. Если бы мы потерпели неудачу, мы смотрим на язык браузера пользователя ($_SERVER для раз) и попытаться обнаружить его.

  5. Если мы совершенно неудачным, то переход на английский.

Этот метод вызывается на каждой странице сайта.

public static function detect_locale() {
    if(isset($_SESSION["lang"])){
        $lang = $_SESSION["lang"];
        return $lang;
    }
    if(isset($_SESSION["id"])){
        $user = new User($_SESSION["id"]);
        $lang = $user->get_locale();
        return $lang;
    }
    if($_SERVER["HTTP_HOST"] == "ru.mysupersite.com" || $_SERVER["HTTP_HOST"] == "www.mysupersite.ru"){
        $lang = "ru";
        return $lang;
    }
    if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
        $lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
        return $lang;
    }
    $lang = "en";
    return $lang;
}

Я вижу это как очень простое решение, но что-то в глубине моего сознания говорит, что там могут быть некоторые недостатки. Есть ли или я просто параноик?

Спасибо!



2716
4
php
задан 9 ноября 2011 в 01:11 Источник Поделиться
Комментарии
1 ответ

Ваши основные иерархии кажется достаточно надежным. Есть только одна вещь - HTTP_ACCEPT_LANGUAGE не так просто. Я написал ответ на него здесь. Ниже приводится соответствующий код из этого:

// Parse the Accept-Language according to:
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
preg_match_all(
'/([a-z]{1,8})' . // M1 - First part of language e.g en
'(-[a-z]{1,8})*\s*' . // M2 -other parts of language e.g -us
// Optional quality factor M3 ;q=, M4 - Quality Factor
'(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i',
$_SERVER['HTTP_ACCEPT_LANGUAGE'],
$langParse);

$langs = $langParse[1]; // M1 - First part of language
$quals = $langParse[4]; // M4 - Quality Factor

$numLanguages = count($langs);
$langArr = array();

for ($num = 0; $num < $numLanguages; $num++)
{
$newLang = strtoupper($langs[$num]);
$newQual = isset($quals[$num]) ?
(empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0;

// Choose whether to upgrade or set the quality factor for the
// primary language.
$langArr[$newLang] = (isset($langArr[$newLang])) ?
max($langArr[$newLang], $newQual) : $newQual;
}

// sort list based on value
// langArr will now be an array like: array('EN' => 1, 'ES' => 0.5)
arsort($langArr, SORT_NUMERIC);

// The languages the client accepts in order of preference.
$acceptedLanguages = array_keys($langArr);

// Set the most preferred language that we have a translation for.
foreach ($acceptedLanguages as $preferredLanguage)
{
if (in_array($preferredLanguage, $websiteLanguages))
{
$_SESSION['lang'] = $preferredLanguage;
return $preferredLanguage;
}
}

Вы должны определить языки сайт или просто набор наиболее предпочтительный язык.

И как очень мелкие точки я бы изменил:

$lang = xxx;
return $lang;

К:

return xxx;

2
ответ дан 10 ноября 2011 в 03:11 Источник Поделиться