Gettext
Aus php bar
Inhaltsverzeichnis |
Allgemein
Gettext ist ein Tool zur Internationalisierung (kurz: i18n). D.h. heißt es dient dazu Applikationen mit geringem Aufwand in verschiedenen Sprachen darzustellen.
Ein weiterer Vorteil liegt darin, dass es bereits viele Werkzeuge gibt, die das Übersetzen erleichtern.
Vorbereitungen
Da das gettext Module nicht standardmäßig bei PHP aktiviert ist, muss man es erst aktivieren. Falls das nicht möglich ist, kann man auf die reine PHP-Implementierung[1] zurückgreifen:
Linux
- PHP muss mit --with-gettext kompiliert sein
- Gettext muss kompiliert sein
Windows
- In der php.ini bei ;extension=php_gettext.dll den ';' entfernen
- Achtung: Mit PHP 5.0.0 gibt es Probleme. Daher ist die gettext() Funktion nicht funktionstüchtig. In Version 5.0.1 wurde dieser Fehler behoben.
- Die benötigten Tools zum erstellen von gettext Dateien gibt es bei MinGW
- WICHTIG: Bei der Pfadangabe in
bindtextdomain()ist zwingend ein abschließender "/" erforderlich (im Bsp. unten alsobindtextdomain("test", "./locale/"), getestet mit Apache/2.2.6 (Win32) PHP/5.2.5 unter WinXPSP2).
Beispiel
Und nun kommen wir zum praktischen Teil.
Quelltext
1 <?php 2 // Beginn test.php 3 setlocale(LC_MESSAGES, 'de_DE'); // _NUR_ Sprache auf Deutsch setzen 4 5 bindtextdomain("test", "./locale"); // Ort der Ueberetzungstabellen angeben 6 bind_textdomain_codeset("test", "UTF-8"); // richtigen Zeichensatz angeben (optional) 7 8 textdomain("test"); // Uebersetzung wird nun aus ./locale/de_DE/LC_MESSAGES/test.mo geholt 9 10 // Zu uebersetzender Teil 11 echo _("Hello world"); 12 echo "<br />"; 13 echo gettext("Goodbye"); 14 ?>
Die zu übersetzenden Texte können entweder mit _("Mein Text") oder mit gettext("Mein Text") angeben werden. Die Befehle zuvor dienen dazu, dem System mitzuteilen welche Übersetzungstabelle verwendet werden soll.
Die Angabe des richtigen Zeichensatzes sorgt dafür das auch Umlaute richtig ausgegeben werden. Allerdings muss dafür die komplette verarbeitung der daten mit dem richtigen Zeichensatz erfolgen.
Auslesen von zu übersetzenden Texten
Jetzt muss man erstmal die ganzen zu übersetzenden Teile aus der PHP-Datei bekommen. Dazu wird das Programm xgettext verwendet. Zuerst öffnet man eine Konsole. Danach muss man in den Ordner der test.php wechseln und folgendes eingegeben.
xgettext --default-domain=test -k_ test.php
Jetzt wurde eine test.po Datei erstellt, die etwa folgenden Inhalt haben sollte.
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2004-08-03 12:06+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: F:\xampp\htdocs\wiki\test.php:11 msgid "Hello world" msgstr "" #: F:\xampp\htdocs\wiki\test.php:13 msgid "Goodbye" msgstr ""
Übersetzung anfertigen
Die oben generierte test.po dient nun als Vorlage für alle weiteren Übersetzungen. Die Übersetzungen müssen jeweils zwischen die Anführungszeichen von msgstr "" stehen. Um die Arbeit zu erleichtern gibt es einige Programme.
- poEdit
- KBabel
- poTranslator
- gtranslator
- gted (Eclipse Plugin)
Um das ganze etwas anschaulicher zu gestalten, hier mal eine deutsche Übersetzung.
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2004-08-03 12:06+0200\n" "PO-Revision-Date: 2004-08-03 12:08+0100\n" "Last-Translator: Sebastian Pölsterl <marduk@k-d-w.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: F:\xampp\htdocs\wiki\test.php:11 msgid "Hello world" msgstr "Hallo Welt" #: F:\xampp\htdocs\wiki\test.php:13 msgid "Goodbye" msgstr "Auf Wiedersehen"
Diese Datei speichert man dann z. B. unter de_DE.po
In Binärdatei umwandeln
Jetzt kommt der letzte Schritt. Man muss nun die de_DE.po in eine binäre .mo Datei umwandeln. Dazu öffnet man wieder eine Konsole und wechselt in das Verzeichnis der test.php und gibt folgenden Befehl ein.
msgfmt -o test.mo de_DE.po
Daraufhin erhält man eine test.mo Datei, die man in den Ordner ./locale/de_DE/LC_MESSAGES kopiert.
Endergebnis
Ruft man jetzt die test.php auf, sollte man folgendes Ergebnis erhalten.
Hallo Welt Auf Wiedersehen
--Marduk 13:28, 3. Aug 2004 (CEST)

