Hledat
Přihlásit se
  • Věda a technika
  • Herní doupě
  • Tipy pro PC
  • IT Byznys
  • Mobily
  • Počítače
  • Počítače
  • Témata
  • Poradna
  • Diskuzní fórum
  • Video
  • Bazar
  • Blogy
  • MĚŘENÍ RYCHLOSTI
  • RSS
  • Facebook Twitter Google+ YouTube
  • Hardware
  • Software
  • Počítače
  • Notebooky
  • Služby na webu
  • Apple
  • Google
  • Microsoft
  • Seznam
  • Tiskové zprávy
Další témata
  • Týden Živě
  • Zprávy Živě
  • Testy
  • Pitvy
Všechna videa
X

Doporučit článek

Vaše jméno:

Váš e-mail:

E-mail adresáta:

Komentář:

kontrolní kód

Odeslat

Blogy Živě » Zaachi blog

Zaachi blog

Nový blog na adrese Blog.zive.cz
 

PHP: vícejazyčný web

11. 8. 2008, z@chi

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é.

Předávání hodnoty jazyku

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ý.

Mod_Rewrite a vytvoření adresy

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:

  • řetězec, který se předá jako hodnota $_GET[‘lang’]
  • řetězec „items“, čímž odlišíme, že chceme přesměrovat do souboru items.php
  • řetězec, který se předá jako hodnota $_GET[‘url’]

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.

První načtení, zjištění jazyka

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]

Uchovávání textů na webu

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.

Závěrem

Možností, jak vytvořit vícejazyčný web, je spousta, a tato zmíněná je pouze jedna z nich.

Štítky: PHP


Publikováno v rubrice PHP. Reakce v diskuzi lze sledovat prostřednictvím RSS 2.0. Můžete přidat komentář, nebo se na článek odkázat ze svého webu.

« Pohyb kamery v OpenGL
Java: Twitter sender – jednoduchý program pro odesílání zpráv »
 

Komentáře v diskuzi

1.  ThomasBlue(88.100.79.xxx)   11. 8. 2008, 20:54

Wow, neuveritelne, temer do puntiku shodne se systemem, ktery pouzivam ja :-)

2.  z@chi(ověřeno)   11. 8. 2008, 21:40

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.

3.  Suczker(81.201.48.xxx)   16. 8. 2008, 15:49

O gettextu panove neracili slyset, ze?

4.  Suczker(81.201.48.xxx)   16. 8. 2008, 15:53

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.

5.  Suczker(81.201.48.xxx)   16. 8. 2008, 16:05

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.

6.  Suczker(81.201.48.xxx)   16. 8. 2008, 16:08

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.

7.  z@chi(ověřeno)   16. 8. 2008, 18:50

Ahoj, poznamku ke gettextu jsem cekal uz drive, chtel jsem o tomto zpusobu napsat v pristim pokracovani

8.  sh(85.13.85.xxx)   27. 8. 2008, 16:46

A bude taky i18n&l10n a xliff ? :)

9.  anom(89.176.63.xxx)   30. 9. 2008, 00:30

Tak nerozumím vám ani slovo :-) tady asi nezjistím recept na gulášek co ?

Přidat komentář

*
Opište prosím text z obrázku.
Anti-Spam Image


Aktuální články a bleskovky

Lenovo uvádí nové ThinkPady s čipy Ivy Bridge
Lenovo uvádí nové ThinkPady s čipy Ivy Bridge
Brýle Google Glass jsou patentované
Brýle Google Glass jsou patentované
Ifttt.com: Propojte a automatizujte svůj internet
Ifttt.com: Propojte a automatizujte svůj internet
Nejlepší programy pro práci s Wi-Fi
Nejlepší programy pro práci s Wi-Fi



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


  • Kategorie

    • Algoritmy (4)
    • Bezpečnost (7)
    • hardware (4)
    • Java (7)
    • Mimochodem (9)
    • MySQL (2)
    • OpenGL (4)
    • PHP (23)
    • software (6)
    • technologie (8)
  • Poslední příspěvky

    • Java: parsování HTML
    • Debian: když vám server nakyne
    • Google aktualizoval PageRank!
    • Jak se učíte programovat?
    • VirtualBox: jak přežít více systémů
  • Štítky

    řazení 3g Algoritmy apple autorizace Bezpečnost c++ datum eclipse gd gd2 google grafy graphs hash http https internet iphone Java javascript kamera knihovna kodovani lamp library linux mlha MySQL nusphere OpenGL operační systém optimalizace PHP phped plynulá změna pohyb popup request server slovník twitter visual studio window windows
  • Kalendář

    Srpen 2008
    P Ú S Č P S N
    « Čvc   Zář »
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • Seznam odkazů

    • Zaachi.com
  • Administrace

    • Přihlásit se

1209_Computer.png

Časopis Computer

  • Sportujte s moderní technikou
  • Test 11 výkonných grafických karet
  • Technologie: architektura Ivy Bridge
  • Výkonný notebook Acer Aspire TimeLIneU M3
  • Poradíme vám s nákupem PC skříně

Partnerská sekce pro IT profesionály:
Microsoft TechNet/MSDN


Video Živě

Bluetooth stojánky pro Android: Philips AS111, AS141 a AS351
Ifttt.com -- založení úkolu
Zprávy Živě - 12. května 2012
iPad docky Logitech AV Stand a Logitech Speaker Stand

další videa »






Mladá Fronta a.s. Mladá Fronta a.s.
Tiráž | Autoři | Připomínky | Odběr novinek | RSS | Textová verze
Copyright 2000–2012 Mladá fronta a.s. | Inzerce: onlinesales@mf.cz | Kontakt na redakci | Návštěvnost měří NetMonitor