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>