| Autor | Zpráva |
|---|---|
| devilkin Člen |
#1 · Zasláno: 20.8.2005 17:03:04 · Změnil/a: devilkin
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 Člen |
#2 · Zasláno: 20.8.2005 18:03:33
$_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 Člen |
#3 · Zasláno: 20.8.2005 18:20:48
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 Člen |
#4 · Zasláno: 20.8.2005 18:38:02
$jazyky = Array("en", "cs", "it", "de");
if (!in_array($jazyk, $jazyky)) { $jazyk = "CS"; // jako default doporucuju anglicky } else $jazyk = strtoupper($jazyk); |
| devilkin Člen |
#5 · Zasláno: 20.8.2005 19:22:05
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 Člen |
#6 · Zasláno: 20.8.2005 20:13:41
"$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 Člen |
#7 · Zasláno: 20.8.2005 20:33:24
A co navhujete ? ;-)
|
| Leo Člen |
#8 · Zasláno: 20.8.2005 20:38:27
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 Člen |
#9 · Zasláno: 20.8.2005 21:35:35 · Změnil/a: devilkin
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 Člen |
#10 · Zasláno: 20.8.2005 21:47:26
V tom pripade je lepsi jazyk automaticky nemenit a nechat to na uzivateli :-) Leo
|
| halogan Člen |
#11 · Zasláno: 20.8.2005 22:44:17
Leo: Muj kod neni muj kod, je to jen zjednodusena prasarna devilkina.
|
| devilkin Člen |
#12 · Zasláno: 20.8.2005 23:14:47
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 |
#13 · Zasláno: 21.8.2005 00:17:45
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 Člen |
#14 · Zasláno: 21.8.2005 00:30:06
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 Člen |
#15 · Zasláno: 26.8.2006 20:09:01
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 |
#16 · Zasláno: 4.10.2006 20:25:42
array_combine() funguje len v php5.
v php4 som to riešil takto: foreach ( $matches[1] as $index => $value ) { $accept[$value] = $matches[2][$index]; }; |