Jak správně vybrat jazyk webu pro návštěvníka

PHP, Tipy & triky

V článku vám ukážu jednoduchou funkci, která zjistí, jaké jazyky návštěvník webu preferuje, seřazeny od nejvíce po nejméně preferované. Pokud web je ve více jazycích, okamžitě víte, jaký jazyk je pro uživatele nejlepší.

Jak správně vybrat jazyk webu pro návštěvníka

Prohlížeč s každým požadavkem posílá kromě mnoha jiných HTTP hlavičku Accept-Language, která obsahuje jazyky, jaké surfař preferuje. Kromě toho, ke každému jazyku může být přidán koeficient q, pomocí kterého zjistíme jestli, který jazyk by návštěvník viděl raději než jiný.

Rozpársování hlavičky Accept-Language

Hlavička Accept-Language je posílána prohlížečem, na základě jeho nastavení. Toto nastavení je ve většině prohlížečů zvlášť a nemá nic společného s jazykem OS nebo samotného prohlížeče

V hlavičce jsou jednotlivé jazyky odděleny čárkou, a pak za každým jazykem může být ještě středník, za kterým je koeficient mezi 0 a 1. Pokud koeficient chybí, počítá se, že je 1. Následující kód tuto hlavičku přečte a vrátí pole jazyků seřazených podle koeficientů. 

function language_by_q($simpleLang = true){
    $primary = array();
    $accept = explode(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
    for($i = 0; $i < count($accept); $i++){
        $lang = explode(";", $accept[$i]);
        $q = 1;
        if(isset($lang[1])){
            $pos = strpos($lang[1], "=");
            if($pos !== false)
                $q = floatval(substr($lang[1], $pos + 1));
        }
        if($simpleLang){
            $pos = strpos($lang[0], "-");
            if($pos !== false)
                $lang[0] = substr($lang[0], 0, $pos);
        }
        if(in_array($q, $primary))
            $q -= 0.001;
        if(isset($primary[$lang[0]]))
            continue;
        $primary[$lang[0]] = $q;
    }
    arsort($primary,SORT_NUMERIC);
    return $primary;
}

Volitelný parametr $simpleLang rozlišuje, jestli jazyk en, en-US a en-GB apod jsou rozdílné nebo stejné. Snad to ujasní více ukázka výsledků.

// Hlavička Accept-Language obsahuje
"cs,en;q=0.8,en-GB;q=0.6"

$simpleLang = true;
[
    "cs" => 1,
    "en" => 0.8,
]


$simpleLang = false;
[
    "cs" => 1,
    "en" => 0.8,
    "en-GB" => 0.6
]

Věčný problém češtiny a slovenštiny

Když jsem tuto metodu poprvé nasadil na webové stránky SkiBila.cz, otestoval jsem to a vše bylo OK. Než jsem na stránky šel z počítače kamaráda, který je slovák a web se mu zobrazil anglicky. Je to logické, čeština tam nebyla a další nejbližší shoda byla angličtina.

Proto jsem si funkci ještě trochu upravil, a to třetí řádek jsem nahradil kódem níže. Je to výjimka a pro všechny slovenské návštěvníky zobrazím český web. Rozhodně to je lepší než angličtina, pokud do slovenštiny není  web přeložen.

$accept = explode(",", str_replace(
    array("sk-sk","sk"),
    array("cs-cz","cs"), 
    $_SERVER["HTTP_ACCEPT_LANGUAGE"])
);

Podělte se s námi v kometářích o své zkušenosti s výběrem jazyků ať už pomocí této funkce nebo jiných.

K tomuto článku již není možné přidávat další komentáře