Waarom load_plugin_textdomain() niet meer werkte…

Na een recente upgrade van een van mijn WordPress plugins, Skype Online Status, rapporteerde een van de vertalers, Georg Adamsen, dat zijn vertaling niet meer werkte. En na wat testen ontdekte ik dat geen enkele vertaling nog werkte.

De plugin gebruikt de aanbevolen WordPress functie load_plugin_textdomain() zoals ieder andere plugin die het mogelijk maakt om vertalingen in de vorm van .mo vertaalbestanden toe te voegen. En dit al geruime tijd…

Heel eenvoudig, aan het begin van het plugin hoofd-bestand:
// Internationalization
load_plugin_textdomain('skype-online-status', false, dirname(plugin_basename( __FILE__ )).'/languages');

Waarom zou dat plotseling niet meer werken?

Ik besloot een kijkje te nemen naar wat de WordPress Codex over het onderwerp van load_plugin_textdomain te zeggen had maar vond daar niets nieuws. Ik her-controleerde weer eens het pad dat gebruikt werd: nog altijd correct…

Het enige wat me opviel was dat de functie-aanroep daar zo aan het begin van het plugin bestand, nogal naakt aandeed. Yep, je leest het goed: naakt! 😉

Het is een regelrechte aanroep van een interne WordPress functie terwijl ik inmiddels gewend ben geraakt aan een immer groeiende schare “action and filter hooks” in WordPress. En ze zijn er niet voor niets dus ik besloot de naakte load_plugin_textdomain functie-aanroep te (ver)plaatsen binnen de plugins init functie die op zijn beurt wordt toegevoegd aan WP’s init actie… En presto! Alles was weer in orde!

Kennelijk wordt zo’n naakte load_plugin_textdomain aanroep aan het begin van het plugin hoofd-bestand, gedaan voordat WordPress het kan verwerken. Geen foutmelding maar ook geen vertaling was het resultaat.

Conclusie: ondanks dat de WordPress Codex het niet vermeldt blijkt het moment waarop load_plugin_textdomain() wordt aangeroepen van groot belang te zijn: altijd vanuit WP’s init actie!

De correcte methode:
function my_plugin_init() {
// Internationalisatie eerst(!)
load_plugin_textdomain('my-plugin', false, dirname(plugin_basename( __FILE__ )).'/languages');
// Ander init gedoe, doe dit ná load_plugins_textdomain, zeker als daar vertaalbare tekst bij zit(!)
// ...
}
add_action('init','my_plugin_init');

Na deze doe-het-zelf ontdekking vond ik andere artikelen op het internet — is het niet altijd makkelijker te iets vinden wanneer je weet waarnaar je zoekt 😉 — over dit onderwerp. Eén daarvan muntte uit in volledigheid en hoewel het in het Engels is, wil ‘m zeker aanbevelen. Voor diegenen die zo’n beetje alles willen leren wat je moet weten om een plugin geschikt te maken voor meertaligheid: 6 Tips for Localizing Your WordPress Plugin

Geef een reactie