Caracterele UTF-8 prin gettext

Revin cu alt ball-breaker care mi-a pierdut mai bine de jumate de zi și pe care l-am rezolvat destul de ciudat.

Cei care au avut de lucru cu limbile unei aplicații pe web, au auzit probabil de gettext de la GNU. Și WordPress folosește gettext cu fișiere po/mo pentru traduceri. Practic tu încarci un catalog cu definiții și traduceri la acele definiții, printezi în limba care trebuie cu

echo gettext('definitie');

Mai are și shorthand _(), eu folosesc __(), definită de mine, în caz că mai vrei să faci ceva in momentul traducerii.

Anyway. Prima problemă e că gettext se bazează pe set_locale, iar pe windows e aproape imposibil să le setezi cum trebuie; sunt atâtea variabile și particularitați la versiunile de windows încat nu există o soluție care sa meargă sigur.

Să zicem că ai rezolvat totuși cu localele, poate ai linux. Ok, când dai sus cu proiectul poți avea surpriza să meargă, dar numai pe jumătate. La ce mă refer: problema mea e că scotea traducerile din fișierul .mo dar nu scotea cum trebuie diacriticele sau alte caractere care în mod normal se văd ok pe UTF-8. Asta se întâmpla in condițiile în care tot site-ul era UTF-8, headere, răspunsuri de la server, tot tacâmul. În plus, diacriticele care veneau din baza de date erau bine mersi.

În mod normal, ca să-i zici scriptului unde să caute fișierul cu definiții folosești:

bindtextdomain("domain", $path);
textdomain("domain");

Ajungea la ele fără probleme, însă când scotea traducerea, nu o scotea encodata cum trebuie. Până la urmă am găsit soluția in ultimul comentariu (cu 0) la un post pe stackoverflow:

bindtextdomain("domain", $path);
bind_textdomain_codeset("domain", "UTF-8");
textdomain("domain");

Daca ați văzut vreodată locale de genul en_US.utf8 sau ro_RO.utf8, bind_textdomain_codeset adaugă particula “utf8”, care se numește codeset și este un modifier pentru locale.

Articol scris de adrian

Sunt Adrian Basalic și fac lucrurile să meargă cu mai mult sau mai puțin succes de câțiva ani buni.

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>