gettext und PHP

Bei einer multilingualen Webapplikation welche in PHP geschrieben ist, kann man natürlich zur Übersetzung mit assoziativen Arrays arbeiten und dann je nach Sprache die richtige PHP Datei einbinden.

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

Das Problem an dieser Variante ist, das sie nicht wirklich gut zu pflegen ist. Schöner ist es das ganze mit gettext zu übersetzen, da man hier nur die po Dateien übersetzen muss, und man das nicht im Quelltext tun muss.

Das Problem an dieser Variante ist allerdings, das nicht auf jeden Webserver gettext vorhanden ist. Hier hilft das Paket php-gettext welches unter https://launchpad.net/php-gettext/ zu finden ist. Mit Hilfe dieses Paketes, kann man gettext nutzen ohne sich darum kümmern zu müssen ob es installiert ist. php-gettext wrappt das ganze und emuliert nicht vorhandene Funktionen.

Das ganze zu benutzen ist auch relativ 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);

Nachdem dies getan ist, kann damit begonnen werden die Texte in der Anwendung zu übersetzen. Dabei wird aus einem:

echo 'Willkommen auf dieser Webseite.';

ein:

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

T_ ist dabei der Name der Übersetzungsfunktion welche von php-gettext bereitgestellt würden. Unter reinem gettext würde diese Funktion nur _ heißen. Nachdem man seinen Quelltext mit den entsprechenden Funktionen bestückt hat muss man diese Strings aus den PHP Dateien extrahieren. Da man das nicht von Hand machen möchte nutzen wir dazu folgendes kleines 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 dieser pot Datei kann mittels PoEdit (http://www.poedit.net/) eine po Datei erzeugt werden. Diese po Dateien können auch wieder mittels der pot Datei aktualisiert werden, falls später neue Strings dazu kommen oder verschwinden. Beim speichern generiert PoEdit aus der po Datei eine mo Datei, bei welcher es sich um die binäre Representation der po Datei handelt. Diese mo Datei wird von gettext letztendlich zur Übersetzung genutzt.

Weitere Informationen 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/

Piwik in Serendipity integrieren

Eigentlich ist es ja ganz einfach Piwik in Serendipity zu integrieren. Einfach das von Piwik bereitgestellt Codeschnippsel in die entries.tpl kopieren und schon funktioniert das ganze. So viel zur Theorie. Das Problem an den Template Dateien von Serendipity ist die Templateengine Smarty. Diese erlaubt keine { und } Zeichen. Diese müssen mittels {ldelim} und {rdelim} maskiert werden. Aus dem Codefragment:

try {
var piwikTracker = Piwik.getTracker(pkBaseURL + „piwik.php“, 1);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
} catch( err ) {}

wird dann:

try {ldelim}
var piwikTracker = Piwik.getTracker(pkBaseURL + „piwik.php“, 1);
piwikTracker.trackPageView();
piwikTracker.enableLinkTracking();
{rdelim} catch( err ) {ldelim}{rdelim}

Damit funktioniert das ganze auch unter Serendipity :)

Weitere Informationen gibt es unter:
http://50226.de/piwik-in-serendipity.html
http://board.s9y.org/viewtopic.php?f=10&t=15683

Piwik datenschutzkonform betreiben

Bei Piwik handelt es sich ja um eine Software zur Webanalyse. Wenn diese auf dem eignenden Webspace läuft bekommt man das ganze sogar datenschutzkonform hin. Dazu muss nur das letzte Oktet der IP Adressen gekürzt werden. Damit man dies nicht manuell machen muss liefert Piwik das Plugin AnonymizeIP mit. Dieses muss einfach unter Einstellungen -> Plugins aktiviert werden. Schon ist man datenschutzkonform :)

Weitere Informationen gibt es unter:
http://www.braekling.de/web-development/3032-piwik-0-5-5-mit-anonymizeip-plugin.html
http://www.heise.de/newsticker/meldung/Datenschuetzer-empfehlen-Piwik-zur-Webanalyse-1208686.html

Piwik in das Simple Machines Forum 2.0 integrieren

Da es noch kein Plugin für Webanalyse Software Piwik in Simple Machines Forum 2.0 gibt muss die Integration manuell vorgenommen werden. Dazu erstellt man eine Datei namens piwik.html und fügt in diese den Tracking Code aus seiner Piwik Installation ein. Diese Datei lädt man dann in den Sources Ordner der SMF Installation hoch.

Anschließend öffnet man in seinem Theme die Datei index.template.php (zu finden im Ordner forum/Themes/xxx/) und sucht dort die Stelle

function template_html_below()
{
	global $context, $settings, $options, $scripturl, $txt, $modSettings;

	echo ' </body></html>';
}

in der Funktion template_html_below und ändert sie in wie folgt:

function template_html_below()
{
	global $context, $settings, $options, $scripturl, $txt, $modSettings;

	// Add in Piwik
	require_once 'piwik.html';

	echo ' </body></html>';
}

Anschließend lädt man die Datei wieder hoch und schon ist Piwik integriert.

Weitere Informationen gibt es unter:
http://piwik.org/
http://www.simplemachines.org/
http://www.phpamigos.com/how-to-install-piwik-on-simple-machine-forums/