Autor Zpráva
devilkin
Profil
Dobre odpoledne,
nějak nemůžu přijít na to, jak dostat do proměné XY Accept-Language prohlížeče.
V článku na Intervelu jsem našel tento postup :

if (!isset($lg)) {
$lg = explode(",",$HTTP_ACCEPT_LANGUAGE);
$lg = StrToLower(Substr(chop($lg[0]),0,2));
}

Měl by zajistit načtení prvních dvou znaků (to je to o co mi jde), ale bohužel echo $lg; nevypíše nic. Jako by ta proměnná vůbec neexistovala. Ten článek je už poměrně starý, tak si říkám, jestli se to nedělá nějak jinak. Pokužívám PHP 4. Možná je i potřeba něco nastavit v php.ini, ale nic na první pohled relevantního jsem tam nenašel.

Můžete mi prosím někdo poradit.

Předem Dík.
Leo
Profil
$_SERVER['HTTP_ACCEPT_LANGUAGE']

Ovsem pokud prohlizec takovou hlavicku neposle, tak bude prazdna. Mimochodem, pocitate s tim, ze accept language nemusi mit jenom jednu hodnotu? Leo
devilkin
Profil
2Leo
Moc díky,
vyřešil jsem to takto (úplně jednoduše ;-))

<?php
if (!isset($lg)) {
$lg = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
$lg = StrToLower(Substr(chop($lg[0]),0,2));
}
if ($lg == 'en' || $lg == 'cs' || $lg == 'it' || $lg == 'de') {

if ($lg == 'en')
$jazyk = "EN";

if ($lg == 'cs')
$jazyk = "CS";

if ($lg == 'it')
$jazyk = "IT";

if ($lg == 'de')
$jazyk = "DE";
}
else
$jazyk = "CS";

?>

Myslím, že je to dostatečné.

Ještě jednou děkuji.
halogan
Profil
$jazyky = Array("en", "cs", "it", "de");
if (!in_array($jazyk, $jazyky)) {
$jazyk = "CS"; // jako default doporucuju anglicky
} else $jazyk = strtoupper($jazyk);
devilkin
Profil
Hmm hezké,
na první pohled trochu nepřehledné, ale opravdu "programátorské" řešení.

Díky.

PS: Ano EN je logičtější volba, ale co když prohlížeč pošle nějaký nesmysl, nebo nic a zrovna majiteli se to zobrazí anglicky. Pak bych poslouchal, že se to čechům zobrazuje anglicky a to nestojí za to.
Ono to stejně hrozí protože spousta lidí ani netuší, že se to nastavuje v prohlížeči a některé alternativní prohlížeče (nic proti nim nemám, naopak) jsou po instalaci nastavené na angličtinu.

Pokud se pletu nebo pokud jsou mé obavy zbytečné, tak mě prosím opravte.
Leo
Profil
"$jazyky = Array("en", "cs", "it", "de");
if (!in_array($jazyk, $jazyky)) {
$jazyk = "CS"; // jako default doporucuju anglicky
} else $jazyk = strtoupper($jazyk);"

Asi nebude od veci sem napsat, jak je hlavicka definovana v HTTP. Prohlizec muze poslat toto (a casto posila neco podobneho):

Accept-language: en;q=0.5, fr;q=0.0, nl;q=1.0, tr;q=0.0

Coz znamena, ze klient nejradeji nizozemskou verzi stranek, pak anglickou, a francouzskou a tureckou nechce za zadnych okolnosti. Na poradi jazyku nezalezi, podstatne jsou je relativni preference q (v intervalu 0-1). Kontrolni otazka - jak si s tim poradi haloganuv kod? Leo
devilkin
Profil
A co navhujete ? ;-)
Leo
Profil
Specifikaci mate, takze podle ni to musite parsovat, pro kazdy jazyk se musi nacist i hodnota q, podle ni to setridit, a pak to brat podle klesajiciho q / mam nl, poslu ji, nemam, testuju en, nemam, testuju dalsi, az vycerpam vsechny moznosti, tak poslu vychozi variantu. Napriklad. Leo
devilkin
Profil
Tak jsem zvažoval, nakolik se takové zdokonalení vyplatí.
Testl jsem několik prohlížeců které mám po ruce (Mozilla 1.7.8, Firefox1.0, Opera 8,IE6) a ani u jednoho se nestalo že by se základní jazyk ocitl někde vzadu a to jsem si hrál s nastavením jak to šlo. Myslím, že nám to vývojáři ulehčují :-) .

A navic se dost často vyskytuje tato možnost .

Accept-Language: cs,it;q=0.9,az;q=0.8,am;q=0.7,en;q=0.6

Takže hlavní jazyk je cs, druhá možnost it. To znamená, že by se muselo ošetřit i tohle.

........ Snažím se nějak opravedlnit svoji lenost :-), ale možná se to toho někdy pustím.
Leo
Profil
V tom pripade je lepsi jazyk automaticky nemenit a nechat to na uzivateli :-) Leo
halogan
Profil
Leo: Muj kod neni muj kod, je to jen zjednodusena prasarna devilkina.
devilkin
Profil
2Leo : V tom pripade je lepsi jazyk automaticky nemenit a nechat to na uzivateli.
To si nemyslím. Možná jsem to špatně napsal. Jazyk který zvolím v prohlížečí jaho hlavní je IMHO ve většině případů na prvním místě. Samozřejmě nespoléham jen na to, ale myslím, že když se to většíně uživatelů zobrazí hned ve spravném jazyce, tak je to potěší. Aby bylo jasné o čem je řeč, tak zde je odkaz na ty stránky které dodělávám (ještě není vše přeložené).

2halogan zjednodusena prasarna devilkina
Souhlasím, ale řešil jsem něco jiného než hezký kód.
Kajman
Profil *
To q jsem ignoroval. Leo, díky za upozornění.

Asi časem předělám to moje odfláknuté testování pomocí strpos na koukání na to q.
halogan
Profil
Tak ted to tu mate i s q, serazene podle chuti:

$str = "en;q=0.5, fr;q=0.0, nl;q=1.0, tr;q=0.0";

preg_match_all("/([a-z]{2});q=(\d\.\d)/", $str, $s);
$jazyky = array_combine($s[1], $s[2]);
arsort($jazyky);
print_r($jazyky);
dgx
Profil
Jazyk může obsahovat pomlčku a velká písmena (en-US), není však na velikost citlivý. Kvalita nemusí být desetinné číslo (q=1, q=0), může mít až tři desetinná místa nebo nemusí být uvedena vůbec (výchozí je 1).

Kód bych upravil asi takto:

$s = "en;q=0.50, fr;q=0.0, nl, tr;q=0.0";

preg_match_all('#([a-z-]+) *(?:; *q=([0-9.]+))?#', strtolower($s), $matches);
$accept = array_combine($matches[1], $matches[2]);
// doplni vychozi hodnoty, zaroven prevede na typ float
foreach ($accept as $key => $val)
$accept[$key] = $val == '' ? 1.0 : (float) $val;
arsort($accept);

print_r($accept);
Ján Koštial
Profil *
array_combine() funguje len v php5.

v php4 som to riešil takto:

foreach ( $matches[1] as $index => $value ) {
$accept[$value] = $matches[2][$index];
};
Toto téma je uzamčeno. Odpověď nelze zaslat.

0