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ě :)

Vyštěkat

Můžete použít standardní HTML tagy a taky Texy formátování!