|
|
Snad každý, kdo se zajímá o PHP, se někdy potýkal s vytvořením vícejazyčného webu. Možností jak takový web vytvořit je několik, ale ne všechny mohou být ty pravé.
Jako první věc, při vytváření vícejazyčného webu, je nutné vyřešit otázku předávání hodnoty daného jazyku mezi jednotlivými URL adresami na webu.
V podstatě máme několik možností, jak předávání hodnoty jazyku dosáhnout, z nichž všechny mají své výhody a nevýhody. Hned na začátku vysvětlím dvě, asi nejpoužívanější, metody.
První z nich je metoda pomocí SESSION proměnných.
SESSION má tu výhodu, že stačí nastavit jednou a potom už jenom kontrolovat její hodnotu, kterou lze při přepnutí jazyku velmi jednoduše změnit a změnit tak používaný jazyk celého webu.
Tato metoda má jednu velkou nevýhodu, a to při posílání nebo odkazování URL adresy, protože URL adresa je pro všechny jazyky stejná a jazyk, ze kterého bylo odkázáno není možné při načtení adresy získat. Návštěvník se tedy nemusí dostat přesně na tu adresu, na kterou bylo odkazováno.
Druhá možnost, kterou můžeme využít, je předávání hodnoty jazyka pomocí GET požadavku. Tímto způsobem se vyhneme problému, který byl zmíněn u uchovávání jazyku v SESSION, ovšem zase vzniká problém, že musíme jazyk doplňovat do všech URL adres, které na webu vytváříme.
I přes komplikovanější vytváření URL adres je určitě lepší využívat druhý způsob a hodnotu jazyka předávat v URL adrese. Výhoda je jak informativní, kdy uživatel už z odkazu stránky vidí, v jakém jazyce se bude pohybovat, tak praktická, že není nutné při prvním otevření z odkazu dohledávat jazyk, který není z adresy patrný, a nevznikají kolize.
Ve článku se zaměřím právě na tento, druhý, způsob, ale způsob pomocí SESSION je podobný.
Pro vícejazyčný web je určitě nejlepší využívat Mod_Rewrite a vytvářet si přijatelné URL adresy, které mají na první pohled hlavně větší informativní hodnotu než adresa sestavená z několika proměnných a hodnot přímo v URL.
Před napsáním podmínky je nutné pamatovat na to, že hodnota jazyka musí být uvedena v každé adrese, na kterou se na webu odkazuje, čili je nutné si předem rozmyslet strukturu adres.
Já jsem zvolil adresu, potobnou tvaru:
http://www.web.cz/cs/items/clanek.html
V této url adrese je jazyk předáván hned za názvem domény webu, a toto pravidlo bude platit u všech adres, které se budou na webu generovat.
Konkrétně v této adrese je kromě jazyku použito další klíčové slovo „items“, které znamená, že se jedná o článek, čímž odlišíme, do jakého souboru se bude směrovat. Podobných URL adres s různými klíčovými slovy může na webu existovat několik. Jednotlivé parametry, které jsou pro nás důležité si v adrese oddělíme lomítkem.
Pravidlo v .htaccess pro tuto URL adresu může vypadat velmi jednoduše takto:
RewriteRule ^(.*)/items/(.*)$ /items.php?url=$2&lang=$1 [L,QSA]
Podmínka pro adresu může být samozřejmě přísnější, ale pro demonstrační účely úplně dostačuje.
Aby adresa splnila podmínku, musí být ve tvaru, kde jsou jednotlivé hodnoty oddělené lomítkem:
Takto vytvořeným pravidlem dosáhneme přesně toho co potřebujeme, že se nám vytvořená adresa předá včetně hodnot do souboru items.php.
Při prvním načtení webu, který se nachází na dané adrese, samozřejmě jazyk, ve kterém se daný uživatel chce pohybovat neznáme, a tento jazyk musíme nejprve zjistit nebo vytvořit.
Nejjednodušší způsob je, si vytvořit soubor, pojmenujme jej například settings.php, ve kterém budeme nastavený jazyk kontrolovat a v případě, že nebude existovat, vytvoříme správnou URL adresu, na kterou návštěvníka přesměrujeme. Tento soubor, nebo kód, je nutné vkládat do všech souborů, v nichž se pracuje s jazykem.
Opět máte dvě možnosti, jak uživatele přesměrovat a jaký jazyk uživateli nabídnout.
První možnost spočívá v defaultním nastavení tohoto jazyka, který bude použit v případě, že není jazyk v adrese definován.
Druhá možnost je zjištění jazyka, který uživatel používá, například ze superglobálního pole SERVER, a pokud tento jazyk podporuje i váš systém, tak jej na něj přesměrovat.
Tento problém ve článku řešit nebudu a nechám jej na vás.
Soubor settings.php může vypadat potom takto:
if( !isset( $_GET['lang'] ) ){
//jazyk, ktery jsme zjistili od uzivatele, a ktery uzivatel pouziva
$zjisteny_jayzk = ‘cs’;
//podporovane jazyky v mem systemu
$moje_jazyky = array(0 => ‘cs’, ‘en’, ‘de’);
//zjistime, jestli je zjisteny jazyk v podporovanych jazicich
if( in_array($zjisteny_jayzk, $moje_jazyky ) ){
//pokud ano, presmerujeme uzivatele na tuto jazykovou verzi
Header(”Location: http://” . $_SERVER['HTTP_HOST'] . “/” . $zjisteny_jayzk . “/index”);
}
else{
//pokud ne, presmerujme jej na defaultne nastaveny jazykovou mutaci
Header(”Location: http://” . $_SERVER['HTTP_HOST'] . “/” . $moje_jazyky[0] . “/index”);
}
}
V případě, že nebude existovat hodnota LANG v poli GET, je jasné, že neexistuje platná adresa pro náš web, nebo uživatel zadal adresu webu do prohlížeče a jazyk v adrese prozatím obsažený není.
Skript přesměruje uživatele na adresu:
http://web.cz/cs/index
kde „cs“ je název jazyku.
Pro tuto url adresu je nutné doplnit pravidlo do .htaccess:
RewriteRule ^(.*)/index /index.php?lang=$1 [L,QSA]
Důležitou otázkou při vytváření vícejazyčného webu je uchovávání textů, které na webu používáme.
I v případě, že se zobrazované řetězce (například články) získávají z databáze, není většinou možné všechny hodnoty do databáze ukládat a je nutné, si tyto hodnoty uložit přímo na server.
Nejjednodušší způsob je vytvořit si pro tento účel zvlášť soubory s přeloženými hodnotami, uloženými například v poli, nebo jako definice.
Před používáním stačí příslušný soubor, odlišený například jménem, includovat a používat.
Soubor s přeloženými řetězci může vypadat takto:
$lang = array();
$lang[0] = ‘Registrace’;
$lang[1] = ‘Přihlášení’;
$lang[2] = ‘Zapoměnuté heslo;
$lang[3] = ‘Odhlásit se’;
Pro každou jazykovou mutaci bude existovat podobný soubor, s přeloženými frázemi. Po naincludování je nutné, aby hodnoty určené pro stejné použití ve všech jazycích měli stejné indexy v tomto poli.
Možností, jak vytvořit vícejazyčný web, je spousta, a tato zmíněná je pouze jedna z nich.
Štítky: PHP
Wow, neuveritelne, temer do puntiku shodne se systemem, ktery pouzivam ja ![]()
No jo, tento zpusob ja pouzivam jenom nekdy.
Pro vicejazycny web mam hotovou knihovnu, ktera je sice zalozena z casti na tomto zpusobu, ale tohle je opravdu asi to nejjednoduzsi, jak jde dostat vicejazycny web.
Bohuzel tridu sem dat nemuzu.
O gettextu panove neracili slyset, ze?
Dale pak si dovoluji poznamenat, ze mnohem jednodussi a elegantnejsi reseni, nez uvedeny rewrite je pomoci direktivy forcetype a jednoho ridiciho souboru (mozno diti “kontroleru”), ktery rozhazuje (mozno diti “marshaluje”) prichazejici pozadavky.
Tedy, abych byl zcela konkretni, do apache napisu
ForceType application/x-httpd-php
ForceType application/x-httpd-php
atd, co kdo chce
a tyto soubory jsou pak ve skutecnosti symlinky na soubor:
kontroler.php , jez uz si z promenne $_SERVER['REQUEST_URI'] vybere co raci.
Je to transparentni a netreba resit pro kazdy tvar URI zvlast.
kdyby zive melo koule, dovolilo by psat do textu mensitko a vetsikto, a potom bychom videli okolo radek , na kterych je napsano ForceType direktivu “Files”.
Jelikoz se ale zda byti pravdivou negace vyse uvedene implikace, budeme muset odkazat laskave ctenare na manual od apache, coz ma tu vyhodu ze se o direktive Files dozvi spoustu dalsich zajimavych veci.
Ahoj, poznamku ke gettextu jsem cekal uz drive, chtel jsem o tomto zpusobu napsat v pristim pokracovani
Tak nerozumím vám ani slovo
tady asi nezjistím recept na gulášek co ?
Zaachi blog využívá WordPress MU a běží na Blog.zive.cz. Vytvořte si svůj vlastní blog
Sledování přes RSS: články
a komentáře
Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN