Poznámka na úvod: Tohle zcela výjimečně nebude o šibách a ani nepůjde o vtipný text, tentokrát zcela vážně a profesionálně.
Publikační systém WordPress je velice mocný nástroj, ale v některých ohledech lehce překombinovaný a zmateně napsaný. Právě jsem se hodinu mořil s překladem několik pluginů a možná tak tenhle článeček ušetří někomu podobnou krutou hodinku :)
WordPress a Gettext (pot a mo soubory s překladem) je teoreticky skvělá volba, překlady jsou hotové za chvíli a není potřeba zasahovat do kódu. Je tu ale jedno “ale” – zatímco implementace load_theme_textdomain, což slouží k inicializaci lokalizace vzhledů (ok, jmenného prostoru, ale nebudeme to komplikovat), se povedla a funguje vždy, u pluginů je situace odlišná. Nebudu zacházet do detailů, ale load_plugin_textdomain se chová jinak, než je popsáno v dokumentaci. Takže pluginy jsou teoreticky lokalizovatelné, ale pokud si vygenerujete gettext překlad, můžete si s ním ve většině případů tak maximálně vytapetovat… Naštěstí je oprava velmi snadná. Jako referenční použiji známé Twitter-tools, ale funguje to ve všech pluginech programovaných “dle dokumentace”.
Oprava ve dvou krocích
Nejprve v pluginu najdeme řádku s load_plugin_textdomain, bude asi vypadat nějak takto:
load_plugin_textdomain(’twitter-tools’);
To bohužel nestačí, neb WP neumí odkázat na samotnou složku s překladem (a pluginem) jen z definice textdomain. Nahradíme tedy tuto řádku následujícím kódem:
load_plugin_textdomain(’twitter-tools’, false, dirname(plugin_basename(__FILE__)) . ‘/language’);
A jsme hotovi. Zbývá jen přesunout soubory s překladem do podsložky “language” ve složce pluginu a vše bude fungovat jak má. Celé kouzlo spočívá v tom, že WP z modifikovaného kódu vezme první a poslední parametr a druhý ignoruje (měla by tam být cesta, ale proč se s tím psát…). V původním kódu si vzal pouze textdomain a soubory hledal bůh ví kde. Ano, není to “košer”, ale funguje to. Tedy do vydání WordPressu 2.9, tam má být tohle chování opraveno.
Poznámka na závěr: obecně onen kód vypadá takto: load_plugin_textdomain(’textdomain-pluginu’, false, dirname(plugin_basename(__FILE__)) . ‘/libovolná-složka’); přičemž není potřeba používat “language” – i samotný root pluginu bude fungovat (‘/’) – jen to nevypadá tak profesionálně :)