Polylang: pll_e() și pll__() în functions.php nu funcționează

13 feb. 2013, 12:34:42
Vizualizări: 16K
Voturi: 2

Am în functions.php câteva funcții care afișează blocuri de HTML. Problema apare cu pluginul Polylang, care utilizează funcțiile personalizate pll_e() și pll__().

Acestea funcționează corect în index.php în orice temă, dar nu funcționează corespunzător în functions.php, care practic întotdeauna îmi returnează șirurile din limba implicită, chiar dacă acestea sunt înregistrate în administrare.

Deci, acele blocuri afișate în index.php folosind funcțiile pll_, funcționează bine. Dar aceleași blocuri afișate în functions.php, apar întotdeauna în engleză.

Am postat acest lucru pe forumul oficial de suport al pluginului. Încă nu am primit răspuns.

Are cineva de aici vreo idee despre ce ar putea fi?

Vă mulțumesc mult!

1
Comentarii

Am folosit pll__ în functions.php fără nicio problemă. Ești sigur că ai furnizat traducerea necesară folosind pll_register_string sau prin panoul de control?

RRikesh RRikesh
29 apr. 2013 09:31:13
Toate răspunsurile la întrebare 1
3

Nu am experiență cu pluginul Polylang, dar cred că este sigur să presupunem că acest lucru are legătură cu ordinea de încărcare a pluginului Polylang și fișierul functions.php al temei tale. Când apelezi o funcție în scope-ul global (adică nu din interiorul unei alte funcții) din index.php sau orice alt fișier de template, aceasta va fi executată într-o etapă târzie a procesului de încărcare a paginii, după ce WordPress a fost complet inițializat și chiar după ce serverul a început să trimită răspunsul către client.

O funcție apelată din scope-ul global al fișierului functions.php, însă, va fi executată într-un moment mult mai devreme. În timpul unei încărcări tipice a unei pagini, ceea ce se întâmplă în esență este că mai întâi WordPress se configurează, apoi încarcă pluginurile și în final tema. Totuși, acest proces nu este atât de liniar pe cât ai putea crede, deoarece unele pluginuri ar putea depinde de funcționalități care ar putea să nu fie disponibile până când WordPress nu este complet inițializat, tema este încărcată sau răspunsul paginii a început să fie trimis. WordPress rezolvă acest lucru folosind hook-uri, care permit unui plugin sau unei teme să execute cod în anumite etape ale procesului de încărcare.

Pentru a face un răspuns lung scurt și mai lung, ceea ce trebuie să faci este să te asiguri că nu apelezi pll_e() sau pll__() până când nu ești sigur că pluginul Polylang este pregătit. Acest lucru poate fi determinat prin analizarea codului sursă (sau poate din documentație), dar presupun că folosirea hook-ului init va fi suficientă. Funcțiile apelate în scope-ul global al functions.php vor fi executate înainte de hook-ul init, dar prin adăugarea unui hook init poți face ca o funcție să ruleze într-o etapă ulterioară. Iată cum:

function my_setup() {
    global $some_var;
    $some_var = pll__('Un șir care necesită localizare', 'localization_domain'); // Aceasta presupune că această funcție se comportă similar cu __() 

    pll_e("Vom afișa pur și simplu acest lucru, undeva", 'localization_domain');
}
add_action('init', 'my_setup');
13 feb. 2013 13:11:10
Comentarii

Nu... nu funcționează... :( Nu știu ce să fac!

Lightworker Lightworker
14 feb. 2013 11:25:11

Ce ai încercat? Ai folosit alt hook în loc de init? De asemenea, sper că nu ai copiat/lipeșt pur și simplu codul meu, pentru că era o eroare în el. :)

Simon Simon
14 feb. 2013 12:52:25

M-am uitat la Polylang și pll__($string) este doar un wrapper peste __($string, 'pll_string') care este integrat în WordPress. Totuși, plugin-ul adaugă filtre la override_load_textdomain, gettext și gettext_with_context. De asemenea, încarcă propriul textdomain pe hook-urile wp, login_init, admin_init, așa că probabil funcțiile ar fi disponibile după oricare dintre acestea. De asemenea, după ce setup-ul este complet, se declanșează pll_language_defined, care ar putea fi de asemenea demn de luat în considerare. În general, cel mai bun sfat este să te uiți la codul sursă al Polylang pentru a înțelege cum funcționează.

Simon Simon
14 feb. 2013 13:02:36