Lokalizace PHP webových stránek není úplně jednoduchá věc a lokalizovat musíte hned několik věcí zároveň. Musíte lokalizovat obsah databáze, PHP skripty, šablony, javascript a obrázky.
Pokud jde o databázi, tam jednoduše musíte mít rozdílný obsah pro rozdílné jazyk. V případě šablon, záleží na šablonovacím jazyku (u Albirea musíte mít pro každý jazyk svoji šablonu a v Nette doporučuji použít filter Translate ve spojení s GettextExtractor), obrázky s textem musíte vytořit pro každý jazyk zvlášť a pro JavaScript jsem optimální řešení ještě nenašel.
Překlad PHP skriptů se většinou řeší buď pomocí konstant (joomla) nebo pomocí nástroje GNU gettext (Albireo IS ;-), gettext však není úplně triviální na zprovoznění.
Gettext je dostupný jako rozšíření PHP (ale podporuje i spoustu dalších programovacích jazyků). Ve své PHP aplikaci budete muset na začátku nastavit několik věcí a následně všechny texty obalit překladovou funkcí.
Gettext vám umožní všechny texty z PHP skriptů následně vyextrahovat do speciálního souboru a vy (případně váš překladatel) je přeložíte a v binární formě umístíte zpět do aplikace.
Kupodivu gettext nijak výrazně aplikaci nezpomaluje, což je dobře.
Gettext v PHP zapnete povolením rozšíření gettext, které je součástí PHP.
Dále si doporučuji stáhnout nástroj Poedit, který vám umožní se soubory gettext překladů pracovat pomocí desktopové aplikace a vyhnete se tím příkazové řádce.
Následně přichází mocná magie nastavení PHP pro práci s gettextem. Někde na začátku aplikace (klidně v index.php) musíte provést tato nastavení:
// jazyk aplikace preferovaný uživatelem
$language = "cs";
$codeset = "cs_CZ.UTF-8"
// doména s překlady (ovlivňuje jméno souboru s překladem)
$domain = "messages";
// nastavení jazyku (ovlivňuje jméno složky, kde bude hledán překlad pro jazyk)
putenv ( "LANG=" . $language );
// nastavuje kódování na UTF-8
bind_textdomain_codeset($domain, "UTF8");
// nastavuje jazykové prostředí
setlocale(LC_ALL, $codeset);
// nastavuje cestu k adresáři s lokalizacemi
bindtextdomain($domain, realpath("locale"));
// spustí doménu s překlady
textdomain($domain);
Podle tohoto nastavení budete muset uložit soubor s gettext překladem na adresu:
./locale/cs/LC_MESSAGES/messages.mo
Pokud gettext nenajde soubor s překladem nebo mu schází překlad nějakého textu, jednoduše vrátí text v původním tvaru v aplikaci. Nedochází k vyvolání žádné chyby.
V PHP musíte všechny texty obalit pomocí funkce gettext nebo jejiho aliasu _.
echo "translate me please";
se změní na
echo _("translate me please");
Nedoporučuji používat volání proměnných způsobem
echo _("translate the $variable");
lepší je používat funkce printf a sprintf
printf (_("translate the %s"),$variable);
Gettext je skvělý nástroj. Jakmile se vám podaří jej jednou nastavit, už se s ním pracuje dobře. Jeho nastavování však může být noční můrou, proto doufám, že můj návod někomu pomůže.
V případě problémů můžete dávat dotazy sem do komentářů.