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