seeseekey.net - Invictus Deus Ex Machina

Bei einer mul­ti­lin­gua­len Webap­pli­ka­tion wel­che in PHP geschrie­ben ist, kann man natür­lich zur Über­set­zung mit asso­zia­ti­ven Arrays arbei­ten und dann je nach Spra­che die rich­tige PHP Datei einbinden.

$lang['welcome'] = 'Willkommen auf dieser Webseite.';
$lang['maintenance'] = 'Die Webseite befindet sich in der Wartung.';

Das Pro­blem an die­ser Vari­ante ist, das sie nicht wirk­lich gut zu pfle­gen ist. Schö­ner ist es das ganze mit get­text zu über­set­zen, da man hier nur die po Dateien über­set­zen muss, und man das nicht im Quell­text tun muss.

Das Pro­blem an die­ser Vari­ante ist aller­dings, das nicht auf jeden Web­ser­ver get­text vor­han­den ist. Hier hilft das Paket php-gettext wel­ches unter https://launchpad.net/php-gettext/ zu fin­den ist. Mit Hilfe die­ses Pake­tes, kann man get­text nut­zen ohne sich darum küm­mern zu müs­sen ob es instal­liert ist. php-gettext wrappt das ganze und emu­liert nicht vor­han­dene Funktionen.

Das ganze zu benut­zen ist auch rela­tiv einfach:

 //gettext initialisieren
 $locale = "de_DE"; //Sprache definieren
 $domain = 'default'; //Domäne definieren
 $encoding = 'UTF-8'; //Zeichenkodierung definieren

 //include gettext
 require_once('./ext/php-gettext/gettext.inc');

 //Sprache setzen
 T_setlocale(LC_MESSAGES, $locale);

 //Pfad zu den Übersetzungen definieren
 T_bindtextdomain($domain, './locale/');

 //Zeichenkodierung setzen
 T_bind_textdomain_codeset($domain, $encoding);

 //Domäne setzen
 T_textdomain($domain);

Nach­dem dies getan ist, kann damit begon­nen wer­den die Texte in der Anwen­dung zu über­set­zen. Dabei wird aus einem:

echo 'Willkommen auf dieser Webseite.';

ein:

echo T_('Willkommen auf dieser Webseite.');

T_ ist dabei der Name der Über­set­zungs­funk­tion wel­che von php-gettext bereit­ge­stellt wür­den. Unter rei­nem get­text würde diese Funk­tion nur _ hei­ßen. Nach­dem man sei­nen Quell­text mit den ent­spre­chen­den Funk­tio­nen bestückt hat muss man diese Strings aus den PHP Dateien extra­hie­ren. Da man das nicht von Hand machen möchte nut­zen wir dazu fol­gen­des klei­nes Skript:

 #!/bin/sh

 #Schreibe alle PHP Dateien in eine Textdatei
(find ./data -name "*.php" && find ./system -name "*.php") > update-translations.txt

 #Rufe xgettext auf um die pot Datei zu erzeugen
 xgettext -f update-translations.txt -kT_ngettext:1,2 -kT_ --language=PHP -o update-translations.pot

Mit die­ser pot Datei kann mit­tels PoEdit (http://www.poedit.net/) eine po Datei erzeugt wer­den. Diese po Dateien kön­nen auch wie­der mit­tels der pot Datei aktua­li­siert wer­den, falls spä­ter neue Strings dazu kom­men oder ver­schwin­den. Beim spei­chern gene­riert PoEdit aus der po Datei eine mo Datei, bei wel­cher es sich um die binäre Rep­re­sen­ta­tion der po Datei han­delt. Diese mo Datei wird von get­text letzt­end­lich zur Über­set­zung genutzt.

Wei­tere Infor­ma­tio­nen gibt es unter:
http://phpmagazin.de/itr/online_artikel/psecom,id,874,nodeid,62,_language,de.html
http://blog.medianetix.de/2008/12/ubersetzung-von-quelltexten-mit-gettext-und-poedit/