Anzeige
Tutorialbeschreibung

PHP - Teil 35 - Mehrsprachige Webseiten aufbauen (Teil 2)

PHP - Teil 35 - Mehrsprachige Webseiten aufbauen (Teil 2)

Will man mehrsprachige Webseiten auf Basis von PHP umsetzen, führt eigentlich kein Weg an gettext vorbei. Im ersten dieser beiden Mehrsprachigkeits-Video-Trainings wurde bereits beschrieben, was es mit dieser Extension auf sich hat und wie man diese installiert. In diesem zweiten Video-Training geht es nun darum, wie ihr gettext zusammen mit dem Tool Poedit nutzen könnt, um wirklich funktionstüchtige mehrsprachige Webseiten aufzubauen, die auch tatsächlich professionellen Ansprüchen genügen.

Icon-Ersteller: Artua.com

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


Natürlich lassen sich Texte auch manuell in den Skriptdateien bearbeiten. Das funktioniert erfahrungsgemäß allerdings nur bei kleinen Projekten. Sobald die Projekte umfangreicher werden und häufig neue zu übersetzende Zeichenketten hinzukommen, ist das nicht mehr praktikabel. An diesem Punkt sollte dann professionelles Übersetzungswerkzeug eingesetzt werden. Eines dieser Übersetzer-Tools ist Poedit. Diesen Editor könnt ihr euch von der Seite http://www.poedit.net/ herunterladen.

Bilder



 
Aus didaktischen Gründen stelle ich hier zunächst Poedit vor. In der Praxis ist es allerdings besser, wenn ihr erst eure Skripte, dann die notwendige Verzeichnisstruktur anlegt und euch erst abschließend an die Übersetzungen mit Poedit macht. Daher empfehle ich, dieses Tutorial zunächst vollständig zu lesen.

Nachdem Poedit installiert und gestartet wurde, muss das Tool konfiguriert werden. Nur so arbeitet Poedit später nämlich wie gewünscht und liest tatsächlich alle benötigten Übersetzungen aus den Dateien automatisch ein.

Um Poedit zu konfigurieren, ruft man Datei>Einstellungen>Parser auf. Dort markiert man PHP und klickt auf Bearbeiten.

Bilder



Hier werden in den jeweiligen Feldern die folgenden Einstellungen vorgenommen:

*.php
xgettext --force-po -o %o %C %K %F
-k%k
%f
--from-code=%c

 
Interessant ist vor allem die Zeile xgettext --force-po -o %o %C %K %F. Diese gibt an, wie gettext aufgerufen werden soll. Tatsächlich ist Poedit nämlich eigentlich nichts anderes als ein Frontend für die Verwaltung von gettext.

Die gezeigten Einstellungen werden mit OK übernommen.


Einen Katalog erstellen

Nachdem die Poedit-Grundkonfiguration abgeschlossen ist, muss ein sogenannter Katalog erstellt werden. Ein solcher Katalog ist eine Datei, in welcher der originale und der übersetzte Text liegen. Zu erkennen sind solche Dateien an der Erweiterung *.po.

Um einen neuen Katalog anzulegen, muss Datei>Neuer Katalog aufgerufen werden. Im Register Projektinfo werden allgemeine Informationen angegeben. Aussehen könnte das folgendermaßen:

Bilder



 
Wichtiger ist das Register Pfade. Gebt dort das Verzeichnis an, in dem die zu übersetzenden PHP-Dateien liegen. Am besten gibt man hier einen absoluten Pfad an.

Im Register Schlüsselwörter müssen die Schlüsselwörter angegeben werden, anhand derer Poedit die zu übersetzenden Zeichenketten erkennt. Bei PHP wird dafür oft der Unterstrich verwendet.

Bilder



Was es mit diesem Unterstrich auf sich hat bzw. welches Prinzip sich dahinter verbirgt, wird bei einem Blick auf folgendes Skript deutlich:

<?php
   echo _("Hello World!");
?>


Durch den vor der Zeichenkette stehenden Unterstrich erkennt Poedit, dass es sich dabei um eine zu übersetzende Zeichenkette handelt.

 
Wenn ihr die Einstellungen gemacht habt, bestätigt ihr diese mit OK und speichert den Katalog ab. Poedit überprüft jetzt automatisch, ob sich in dem angegebenen Verzeichnis Dateien befinden, in denen Strings enthalten sind, die übersetzt werden sollen. Ist das der Fall, gibt es eine entsprechende Meldung.

Bilder



Dort ist zu erkennen, wie viele zu übersetzende Zeichenketten gefunden wurden. Mit OK bestätigt man das Fenster.

 
In dem sich öffnenden Dialogfenster ist nun zunächst die Originalzeichenkette zu sehen. Um eine Übersetzung einzufügen, markiert man die Zeichenkette und trägt die Übersetzung in das untere Feld ein.

Bilder



 
Poedit zeigt die Übersetzung dann direkt neben der Originalzeichenkette an.

Bilder



Nachdem alle Übersetzungen gemacht sind, kann der Katalog über die betreffende Schaltfläche gespeichert werden. Beim Abspeichern legt Poedit automatisch zwei Dateien an:

*.mo – Das ist eine kompilierte Übersetzungstabelle. Das ist die Datei, die vom PHP-Interpreter verwendet wird.
*.po – Das ist ebenfalls eine Übersetzungstabelle; diese ist allerdings auch von Menschen lesbar.

Sollte die *.mo nicht mit angelegt werden, muss unter Datei>Einstellungen>Editor die entsprechende Option aktiviert werden.

Nachdem der Katalog angelegt ist, müssen die PHP-Skripte für die Übersetzung vorbereitet werden. Zunächst muss man dafür die richtige Verzeichnisstruktur anlegen. Dabei bildet im aktuellen Beispiel das Verzeichnis locale die oberste Ebene. Dieses Verzeichnis liegt auf derselben Ebene wie die eigentliche PHP-Datei, die übersetzt werden soll. Für jede Sprache, die bei der Übersetzung berücksichtigt werden muss, wird innerhalb von locale ein eigenes Verzeichnis angelegt. Für die deutsche Übersetzung würde das Verzeichnis de_DE heißen. Dabei repräsentiert de die Sprache, während DE das Land meint. So gibt es für Englisch u.a. die folgenden beiden Varianten:

en_GB – Englisch/England
en_US – Englisch/USA

Bei der Bezeichnung der Verzeichnisse hat man sich auf den Einsatz der ISO-Normen ISO 639 und ISO 3166 verständigt, deren Werte durch einen Unterstrich miteinander verbunden werden.

Innerhalb dieser Verzeichnisse wird dann üblicherweise jeweils das Verzeichnis LC_MESSAGES angelegt. (Welche anderen Varianten es neben LC_MESSAGES noch gibt, wird dann gleich noch gezeigt). Insgesamt sollte die Verzeichnisstruktur für eine deutsche Übersetzung dann also folgendermaßen aussehen:

locale/de_DE/LC_MESSAGES/

LC_MESSAGES ist dabei für Textausgaben zuständig. Es gibt jedoch auch Anwendungsfälle, die über die Übersetzung einfacher Texte hinausgehen. Denkt beispielsweise an Datumsangaben, die man vielleicht – trotz Übersetzung – lieber im deutschen Format anzeigen lassen möchte. Daher gibt es eben nicht nur LC_MESSAGES. Insgesamt stellt PHP die folgenden sieben Kategorien zur Verfügung:

LC_CTYPE (0) – Umwandlung von Zeichen (z.B. strtouper('a') == 'A').
LC_NUMERIC (1) – Dezimale Zahlenformatierungen (z.B. 1,34 oder 1.34).
LC_TIME (2) – Datums- und Zeitformatierungen (z.B. '03. Oktober' oder '10/03').
LC_COLLATE (3) – Vergleiche von Zeichenketten (z.B. 'ABS' < 'KLM', da A vor K kommt).
LC_MONETARY (4) – Monetäre Zahlenformatierungen (z.B. 1'2456,00€ oder 1,2456.00€).
LC_MESSAGES (5) – Textausgaben (bspw. 'Hallo, Welt!' oder 'Hello World!').
LC_ALL (6) – Für alle zuvor aufgeführten Werte.

In das Verzeichnis LC_MESSAGES muss nun die betreffende Übersetzungsdatei eingefügt werden. Zurückgegriffen wird dabei auf die *.mo-Dateien.

Die Vorarbeiten sind damit abgeschlossen. Was jetzt noch fehlt, ist das eigentliche PHP-Skript. Hier zunächst ein Blick auf die Syntax:

<?php
  setlocale(LC_ALL, 'de_DE'); 
  bindtextdomain('messages', './locale');
  textdomain('messages');
  echo _('Hello World');
  echo _('News');
?>


 
Ruft man diese Seite im Browser auf, ergibt sich folgendes Bild:

Bilder



Deutlich wird hier, dass anstelle der im Skript verwendeten Zeichenkette Hello World die Übersetzung Hallo, Welt! angezeigt wird. Damit das möglich wird, müssen im Skript zunächst einmal die Lokalisierungsinformationen angegeben werden.

setlocale(LC_ALL, 'de_DE');


Im nächsten Schritt muss angegeben werden, wo die Übersetzungen zu finden sind. So wird im folgenden Beispiel festgelegt, dass die Übersetzungen für die Domain messages unter locale zu finden sind.

bindtextdomain('messages', './locale');


 
Anschließend wird die Domain gesetzt, nach der gesucht werden soll.

textdomain('messages');


In diesem Fall heißt die Übersetzungsdatei messages.po. Die zu übersetzenden Zeichenketten sind an dem vorangestellten Unterstrich zu erkennen.

echo _('Hello World');


Ist eine Übersetzung in der *.mo-Datei zu finden, wird diese eingesetzt; anderenfalls zeigt PHP die originale Zeichenkette an.

Wenn weitere zu übersetzende Zeichenketten hinzukommen, muss in Poedit über die gleichnamige Schaltfläche der Katalog aktualisiert und die *.mo-Datei neu angelegt werden. Sollten die Änderungen auf der Webseite nicht sichtbar werden, muss man - wenn man lokal arbeitet - ggf. den Server neu starten.


Fazit

Dieses Tutorial hat gezeigt, wie sich mehrsprachige Webseiten aufbauen lassen. Im Idealfall greift man dabei auf Poedit zurück, da man damit Übersetzungen sehr einfach erstellen kann. Welche Möglichkeiten PHP hinsichtlich gettext noch zu bieten hat, wird beispielsweise auch auf der Seite http://www.php.net/manual/de/ref.gettext.php gezeigt.

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 15.05.2017 - 14:42

Ein sehr lehrreiches Tutorial! Vielen Dank!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 07.10.2016 - 13:05

Danke tolles Video !

Portrait von dmtw2107
  • 16.11.2013 - 09:50

verständlich und toll erklärt danke für das tutorial

Portrait von Rata
  • 12.12.2011 - 09:42

@ Daniel: Auch von mir mal ein herzliches Dankeschön!

@ Redaktion: Ich schließe mich der Quetschkommode ;) an. Das wäre wirklich sehr hilfreich, zumal vor einigen Tagen schon Teil 37 erschien, was mich doch sehr verwirrte.

Portrait von Quetsche1
  • 11.12.2011 - 12:45

Vielen Dank! Feine und hilfreiche Arbeit

Anm.a.d.R.: Macht es viel Arbeit, wenn man bei den Einzel-Parts einer Tutorial-Serie einen Link der gesamten Liste verfügbarer Teile einbindet? So muss man nicht erst mühselig diese zusammensuchen, wenn man erstmals in einem späteren/letzten Teil darauf stößt...?

Portrait von MrJimiHancock
  • 06.07.2012 - 08:25

Oha, klingt einleuchtend.
@ Quetsche 1: Dieser Idee kann ich mich nur anschließen

Portrait von MrJimiHancock
  • 06.07.2012 - 08:25

Oha, klingt einleuchtend.
@ Quetsche 1: Dieser Idee kann ich mich nur anschließen

x
×
×