Gettext

Aus php bar
Wechseln zu: Navigation, Suche

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 also bindtextdomain("test", "./locale/"), getestet mit Apache/2.2.6 (Win32) PHP/5.2.5 unter WinXPSP2).

Beispiel

Und nun kommen wir zum praktischen Teil.

Quelltext

 <?php
  // Beginn test.php
  setlocale(LC_MESSAGES, 'de_DE'); // _NUR_ Sprache auf Deutsch setzen
 
  bindtextdomain("test", "./locale"); // Ort der Ueberetzungstabellen angeben
  bind_textdomain_codeset("test", "UTF-8"); // richtigen Zeichensatz angeben (optional)
 
  textdomain("test"); // Uebersetzung wird nun aus ./locale/de_DE/LC_MESSAGES/test.mo geholt
 
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.

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)