PHP-Logo
Druckansicht von http://www.php-homepage.de/artikel/artikel6.html

PHP-Logo
[ Main Menue ]
Homepage
Downloads
Artikel
Scripts
Forum
PHP-Manual
Links
News
Freelancer
Bücher
RuDolF
Suche
Misc
Über diese Seite
Kontakt
Wunschzettel
MyGuestbook
*
[ Suche ]
*
[ Partner ]


Domain Webhosting
*
[ Partner Sites ]
Dynamic-Webpages
PHP-Center
PHP-Welt
phpUG.de
Random Link
*
[ Autoren gesucht! ]
PHP-Homepage.de sucht laufend Autoren für News und Artikel
Interesse?
*

Follow on Twitter - @phphomepage

RSS Feed blogoscoop

Das kleine PHP i18n HowTo von Thomas Fromm und Florian Wesch

Florian Wesch php@dividuum.de
Thomas Fromm thomas.fromm@inubit.com

Was ist i18n ?

i18n wird meist ist c oder cpp Programmen verwendet um dort die verschiedenen Uebersetzungen von Texten in Applikationen besser zu verwalten. Aus dem Quellcode werden Strings extrahiert und in eigene Dateien gespeichert, welche beim Aufruf je nach gesetzter Language-Variable die entsprechende Übersetzungsdatei einliest. Was muss ich tun ?

Zuerst einmal muss php mit der Option --with-gettext[=/usr] compiliert werden. Der Pfad muss nicht immer gesetzt werden dabei, unter Suse z.B. liegt gettext unter /usr . Defaultmaessig schaut die Option im Verzeichnis /usr/local nach. Gettext muss installiert sein auf dem System.

Um die Texte auslesen zu können, müssen diese speziell im Quelltext markiert sein. Dies geschieht in php mit der Funktion _("text").

z.B. eine Datei Namens index.php

<?php
// wir legen hier die Sprache fest (jetzt mal englisch)
putenv("LANG=en");
// jetzt wird die domain fuer gettext festgelegt
// die bezeichnung domain hat jetzt nichts mit dem Webdomains zu tun
// die domain legt die Bezeichung und position der .mo dateien fest
// in den .mo dateien befinden sich die Übersetzungen
bindtextdomain('index', './locale');
textdomain('index');
// damit haben wir festgelegt, das die Datei die position
// ./locale/LANG/LC_MESSAGES/index.mo
// hat. Die jeweiligen Dateien in den Verzeichnissen werden je nach Wert
für
// LANG geladen. Bei LANG=en laedt er ./locale/en/LC_MESSAGES/index.mo
echo _("Hallo"); 
?>

Da diese Verzeichnisse noch nicht existieren müssen sie erzeugt werden, fuer jede geplante Übersetzung.

z.B.:

mkdir locale/en/LC_MESSAGES

So, jetzt müssen wir nur noch alle _() Texte aus dem ganzen Quellcode herausbekommen, dazu verwenden wir das GNU-Tool xgettext in der shell.

xgettext -C index.php -o index.po --keyword=_

Der Parameter -C gibt an, das es im C-Mode geparst wird, mit -o lenkt man das Ergebnis in eine Datei index.po um und zu guter Letzt geben wir mit --keyword=_ an, das alle _("") markierten Texte zu extrahieren sind.

Jetzt haben wir eine Datei index.po:

 
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR Free Software Foundation, Inc.
# FIRST AUTHOR , YEAR.
#
#, fuzzy   
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2000-05-11 23:02+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
  
#: index.php:14
msgid "Hallo"
msgstr ""

Diese Datei kann nun den Übersetzern zur Verfügung gestellt werden. Wir sehen dort zum einen den Text aus der Datei als msgid und die jeweilige Übersetzung kann nun in msgstr geschrieben werden. z.B.:

msgstr "Hello"

Sind alle Übersetzungen getaetigt, wird die .po (Portable Object) Datei noch in eine .mo (Machine Object) Datei verwandelt, wo die Textdaten in Binaerdaten umgewandelt wurden, was einen schnelleren Zugriff erlaubt. Das geschieht mit dem Tool msgfmt

msgfmt index.po --output-file=index.mo

Da diese Datei jetzt mal fuer die englische Übersetzung genommen werden soll kopieren sie wir in das locale/en/LC_MESSAGES Verzeichnis.

Bei einem Aufruf von dex index.php erscheint nun die Ausgabe:

Hello

Ist der Wert von LANG auf z.B. wurstbrot gesetzt kann die Übersetzungsdatei nicht gefunden werden und die Ausgabe des Standarttextes 'Hallo' wird erfolgen.

Hinweise:

Da jeder Webserver Childprozess diese LANG variable nutzt, aber ein Child mehrer Requests abarbeiten muss ( verschieden User surfen ) muss die LANG zu Beginn immer gesetzt werden, je nachdem welche Sprache der User eingestellt hat, sonst kann es zu Verwirrungen kommen. :-)

Falls diese Funktion nicht sofort funktioniert, einfach mal Webserver neu starten.

Zum editieren der .po Dateien gibt es auch einen formschoenen und praktischen Editor unter: http://i18n.kde.org/tools/kbabel/


Zurück zur Übersicht
© Copyright 1999 - 2011 by Mark Kronsbein | Impressum | NutzungsbedingungenWeiterempfehlen | Seitenanfang
0.0018