aneb lokalizace WordPressu z pohledu neprogramátora.
Půjdeme na to malou oklikou. WordPress je systém, který se skládá z jádra (to je to, co si nainstalujete po stažení z webu), z řady motivů vzhledu, které vytváří komunita uživatelů zdarma nebo na kšeft, a z řady přídavných skriptů, tzv. pluginů, které dodávají funkce, v jádře neobsažené, nebo obsažené funkce nějak vylepšují. Tyto pluginy jsou opět vesměs vytvářeny nadšenci, v tomto případě programátory, kteří to berou jako rozcvičku, zviditelnění, a nebo prostě umí a chtějí pomoci. Dříve bylo téměř pravidlem, že doplňky WP byly vytvářeny v anglicky mluvících zemích, a případné snahy o lokalizaci do jiných jazyků byly velkoryse přehlíženy. Pokud se ale podíváme dnes, vidíme, že velká část vzhledů je vytvářena někde v Asii (Indie, Thajsko, Turecko, Pakistán…) a velká část pluginů někde na východě (Rusko, Srbsko, Polsko, ČR…). Stále častěji se objevuje tvorba, která je pro lokalizaci přizpůsobena, říká se tomu internacionalizace (i18n). K této internacionalizaci vydala skupina vývojářů WordPressu řadu doporučení, která jsou (někdy bohužel pomalu) uváděna do praxe.
Soubory WP obsahují textové řetězce, které se objevují na obrazovce v čitelné podobě. Jsou to buď výstupy PHP funkcí, např.:
echo('word');
nebo výpis obsahu proměnných, např.:
$name = 'word';
nebo jde o přímý výpis textů v HTML, např.:
<h2>Name</h2>
Aby bylo možné zajistit překlad těchto textů do jiných jazyků, používá WordPress PHP proměnnou WPLANG, definovanou v souboru wp-config.php:
define ('WPLANG', 'xx_XX');
kde xx_XX je označení cílového jazyka, pro nás je to cs_CZ. Dále používá PHP skript gettext, který vyhledává výše zmíněné textové řetězce a snaží se najít jejich překlad v souboru, označeném xx_XX.mo, v našem případě tedy cs_CZ.mo. Tento soubor musí být umístěn v adresáři wp-includes\languages. Pokud překlad nebo příslušný soubor nenajde, použije původní text. Aby gettext mohl tyto řetězce najít, musí být nějak označeny. Ve WP se používá označení __ (dvě podtržítka za sebou), _e, __c nebo __ngettext (dvě podtržítka na začátku).
__ se označují řetězce uvnitř PHP funkcí, např.:
<? php....
$name = __('word');
....
?>
_e se označují řetězce mimo PHP, které se vypisují za použití PHP funkce echo. Takto je nutné postupovat v případě HTML, např.
<h2>Name</h2>
se zapíše jako
<h2><?php _e('Name'); ?></h2>
__c je totéž jako __, ale za textový řetězec lze přidat znak |, za který lze uvést komentář (comment). To se dá použít v případě, že má angličtina shodný výraz, jehož význam se mění podle kontextu (výborné jako informace pro překladatele, bohužel málo využívané), např.:
__c('Editor|role');
– česky Redaktor v případě role pro WordPress
__c('Editor|rich-text textarea');
– česky Editor v případě, že jde opravdu o editor textu
Jako další příklad lze uvést name (jméno vs. název) a řadu dalších.
__ngettex se používá v případě, že je nutné vyjádřit rozdíl mezi singulárem (image) a plurálem (images). Funkce __ngettext má tři argumenty: tvar singuláru, tvar plurálu a počet, např.
__ngettext('%s image available', '%s images available', $image_count');
Pokud máme správně nastaveno rozlišení plurálů v překladatelském programu, funkce nám umožní zadat správné tvary pro různé počty v češtině:
1 obrázek k dispozici
2 obrázky k dispozici
5 obrázků k dispozici
Použití proměnných v řetězcích:
Často je obsahem textového řetězce nějaká proměnná:
echo "We deleted $count spams."
Pokud tento řetězec zapíšeme jako
_e("We deleted $count spams.");
nebude to fungovat, protože gettext vezme $count jako normální text. V tomto případě se používá funkce printf, např.
printf(__("We deleted %d spams."), $count);
Proměnná %d je pak při každém volání funkce nakrmena hodnotou z $count. V případě použití více hodnot proměnných musí být patřičně označeny:
printf(__("Your city is %1$s, and your zip code is %2$s."));
Takovýto zápis má výhodu v tom, že překladatel, který musí dodržet zápis proměnných, může jejich pořadí přehodit podle potřeby, např. může zapsat překlad takto:
"Adresa je %2$s %1$s", ve výsledku "Adresa je 62800 Brno"
Nyní se vrátíme k řetězci ohledně spamů výše. Pokud bychom jej přeložili jako „Je vymazáno %d spamů“, a spam byl jenom jeden, výsledek by byl tristní: „Je vymazáno 1 spamů“. Nyní je potřeba použít funkci __ngettext:
printf(__ngettext("We deleted %d spam.", "We deleted %d spams.", $count), $count);
a překládáme:
Vymazal jsem 1 spam.
Vymazal jsem 2 (3,4…) spamy.
Vymazal jsem 5 (a více) spamů.
Jednoduché, co?
Příště se budeme věnovat použití zřejmě nejrozšířenějšího editoru překladů, který umí pracovat s gettextem, českého PoEditu. Ten umí převádět seznamy textových řetězců a jejich překladů do tvaru, který používá gettext ve WordPressu, tj. do souborů s příponou .mo.