Anzeige
Tutorialbeschreibung

PHP - Teil 34 - Mehrsprachige Webseiten aufbauen (Teil 1)

PHP - Teil 34 - Mehrsprachige Webseiten aufbauen (Teil 1)

Die Gründe, eine Webseite mehrsprachig aufbauen zu wollen, können ganz unterschiedlicher Natur sein und sollen nicht Gegenstand dieses Video-Trainings sein. Vielmehr geht es hier darum, welche Möglichkeiten es gibt, so etwas umzusetzen. Denn in der Tat kann man Webseiten auf verschiedene Arten mehrsprachig gestalten. In diesem Video-Training wird zunächst die einfachste Variante gezeigt, über die sich mehrsprachige Webseiten anlegen lassen. Außerdem wird ein erster Blick auf gettext geworfen, eine der komfortabelsten Möglichkeiten zum Umsetzen einer Mehrsprachigkeit.

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!


Gleichgültig, für welche der hier vorgestellten Varianten ihr euch letztendlich entscheidet, ein Aspekt muss immer im Vordergrund stehen: Die Texte der einzelnen Sprachen und der Programmcode sollten voneinander getrennt werden. Nur so können – das gilt natürlich vor allem bei größeren Webseiten – die Übersetzer unabhängig vom Programmcode arbeiten.

Üblicherweise geht man bei mehrsprachigen Projekten so vor, dass sämtliche Zeichenketten bei der Ausgabe eine Funktion durchlaufen werden. Diese Funktion überprüft die Spracheinstellungen beim jeweiligen Benutzer. Je nachdem, welche Sprache dort eingestellt ist, wird dann die passende Sprachdatei geladen.

Im einfachsten Fall verwendet man für die Übersetzung ein assoziatives Array, in dem der eigentliche Text und dessen Übersetzung gespeichert werden. Das folgende Beispiel zeigt, wie sich so etwas umsetzen lässt.

<?php
function translate($string) {
  global $translation;
  if (isset($translation[$string]) && !empty($translation[$string])) {
  return $translation[$string];
   } else {
   return $string;
 }
}
require_once './german.php';
echo translate('Welcome to our homepage!');
echo '<br />';
echo translate('Here you can find informations about our products.');
?>


 
Die Funktion translate() überprüft mit (isset($translation[$string]) ), ob die übergebene Zeichenkette im Array mit den Übersetzungen existiert. Außerdem wird mit !empty($translation[$string]) kontrolliert, ob überhaupt eine Übersetzung vorhanden ist. Wie eine typische Übersetzungsdatei aussieht, zeigt das folgende Beispiel:

<?php
$translation['Welcome to our homepage!'] = 'Willkommen auf unserer Webseite!';
$translation['Here you can find informations about our products.'] = 'Hier finden Sie Informationen über unsere Produkte.';
?>


Ruft man jetzt das Skript auf, werden die Übersetzungen wie gewünscht angezeigt.

Bilder



 
Gibt es für einen String keine Übersetzung, ist stattdessen der Originaltext zu sehen.

Bilder



 
Das sieht zunächst einmal gut aus, das Übersetzungssystem funktioniert also. Dennoch hat es deutliche Schwächen, die allerdings erst auf den zweiten Blick sichtbar werden. Was passiert nämlich, wenn es in der Übersetzung einen Fehler gibt?

<?php
$translation['Welcome to our homepage!'] = 'Willkommen auf unserer Webseite!';
$translation['Heere you can find informations about our products.'] = 'Hier finden Sie Informationen über unsere Produkte.';
?>


In dieses Beispiel hat sich ein typischer Tippfehler eingeschlichen. Anstelle von Here wurde Heere geschrieben. Ruft man die Seite im Browser auf, ergibt sich folgendes Bild:

Bilder



Schuld daran ist die translate()-Funktion, die nach dem Schlüssel Here you sucht, den es – aufgrund des Tippfehlers – allerdings nicht gibt. Demzufolge wird die Zeichenkette dann auch nicht übersetzt.

Problematisch wird diese Art der Übersetzung vor allem, wenn mehrere Personen daran beteiligt sind. Denn fügt beispielsweise ein Entwickler einen neuen String ein, merkt der Übersetzer davon zunächst einmal nichts, sondern müsste die Dateien immer auf neue Strings hin manuell untersuchen. Bei kleineren Projekten mag das gehen, früher oder später wird ist aber schlichtweg nicht mehr praktikabel.


gettext als Alternative

Wie eingangs erwähnt, gibt es ganz unterschiedliche Möglichkeiten zur Umsetzung mehrsprachiger Anwendungen. Eine der effizientesten ist dabei zweifellos die gettext-Extension. Diese Extension wurde unabhängig von PHP entwickelt und steht somit eben auch nicht nur für diese Sprache bereit. So kann gettext neben PHP beispielsweise auch in C/C++ und in Java verwendet werden. gettext ist ein Open-Source-Projekt. Die offizielle Anlaufstelle für dieses Paket findet ihr unter http://www.gnu.org/s/gettext/.

Bilder



PHP unterstützt gettext bereits seit Version 4. Diese Übersetzungsbibliothek bietet zahlreiche Tools, durch die sich die Verwaltung mehrsprachiger Webseiten deutlich einfacher gestaltet. So kann man sich beispielsweise anzeigen lassen, ob sich Strings geändert haben oder neue Zeichenketten hinzugekommen sind, die noch nicht übersetzt wurden.


gettext installieren

Damit ihr mit gettext arbeiten könnt, muss die Extension installiert werden. Bei den Windows-Binär-Distributionen von PHP genügt es, wenn innerhalb der php.ini die folgende Zeile auskommentiert, also das vorangestellte Semikolon entfernt wird.

extension=php_gettext.dll


Ob gettext auf eurem System vorhanden ist, zeigt dann auch ein Blick in die PHP-Konfiguration, die man sich über phpinfo() anzeigen lassen kann.

Bilder



 
Innerhalb eurer Skripte könnt ihr dann natürlich auch jederzeit überprüfen, ob gettext verfügbar ist.

<?php 
if (!function_exists("gettext")){
    echo "gettext ist nicht verfügbar\n";
}
else{
    echo "gettext ist verfügbar\n";
}
?>


Wenn gettext installiert ist, sieht die Ausgabe folgendermaßen aus:

Bilder



 
Wer unter Linux arbeitet, muss sich normalerweise nicht um die Installation kümmern, da hier gettext ebenfalls mit an Bord ist. Nur wer PHP selbst kompiliert, benötigt üblicherweise noch das gettext-dev-Paket aus der Distribution. Für das Konfigurationsskript genügt dann folgender Aufruf:

--with-gettext=DIR


DIR kann weggelassen werden, wenn gettext ausschließlich an den üblichen Orten liegt.


Die grundlegende Funktionsweise von gettext

Bevor man gettext einsetzt, sollte man sich mit dessen grundlegender Arbeitsweise vertraut machen. Die Übersetzung läuft immer über mehrere Phasen. Zunächst wird das eigentliche PHP-Skript erstellt. Innerhalb dieses Skripts werden sämtliche zu übersetzende Zeichenketten speziell markiert. Das könnte folgendermaßen aussehen:

<?php
$language = $_GET["lang"];
setlocale(LC_ALL,$language);
bindtextdomain("meineanwendung","./locale");
textdomain("meineanwendung");
echo gettext("Welcome");
echo "<br />";
echo gettext("Our Products");
?>


Üblicherweise wird hier die Funktion gettext() verwendet. Alternativ dazu kann man aber auch den Funktions-Alias _() einsetzen.

Im nächsten Schritt müssen die zu übersetzenden Zeichenketten aus dem Skript extrahiert werden. Dafür kann man beispielsweise das Tool xgettext verwenden. Dieses Tool speichert die betreffenden Zeichenketten in einer Datei. Solche Dateien werden als Portable Object Template (pot) bezeichnet und bilden den Ausgangspunkt für die Übersetzungen. Innerhalb dieser pot-Dateien sind neben den übersetzten Inhalten auch noch die folgenden Optionen enthalten:

• Daten über die übersetzten Zeichenketten
• Allgemeine Metainformationen
• Einfügestellen für dynamische Textpassagen. Bei diesen Passagen kann es sich beispielsweise um das Datum oder die Uhrzeit handeln.

Hier ein Beispiel für eine solche Datei:

msgid ""
msgstr ""
"Project-Id-Version: psd-tutorials\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-09-30 11:50+0100\n"
"PO-Revision-Date: 2011-09-30 12:36+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-KeywordsList: _;gettext;gettext_noop;_(\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-Language: German\n"
"X-Poedit-Country: GERMANY\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-SearchPath-0: arbeitsdateien_php_34\n"
#: arbeitsdateien_php_34/welt.php:17
msgid "Hello World!"
msgstr "Hallo , Welt!"


Diese Datei werden in binäre mo-Dateien umgewandelt, die dann auch letztendlich von PHP genutzt werden.

*Hello World!Project-Id-Version: psd-tutorials
Report-Msgid-Bugs-To: 
POT-Creation-Date: 2011-09-30 11:50+0100
PO-Revision-Date: 2011-09-30 12:36+0100
Last-Translator:
Language-Team:
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Poedit-KeywordsList: _;gettext;gettext_noop;_(
X-Poedit-Basepath: .
X-Poedit-Language: German
X-Poedit-Country: GERMANY
X-Poedit-SourceCharset: utf-8
X-Poedit-SearchPath-0: arbeitsdateien_php_34
Hallo , Welt!


Auch das geschieht automatisch.

Für die Arbeit mit Übersetzungen bietet sich der Einsatz von Poedit an. Das ist ein Editor, über den sich Übersetzungen über eine WYSIWYG-Oberfläche ganz einfach umsetzen lassen. Dieses kostenlose Tool könnt ihr euch von der Seite http://www.poedit.net/ herunterladen. Wie sich auf Basis dieses Tools mehrsprachige Webseiten umsetzen lassen, ist dann Gegenstand des nächsten Tutorials.

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

Vielen Dank für die interessanten Erläuterungen!

Portrait von mario_P
  • 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 aosekai
  • 23.02.2013 - 20:27

Mir geht es leider genauso wie meinem Vorgänger.
Der Titel macht echt was her, wie man Websites mehrsprachig gestaltet interessiert mich sehr.
In diesem Tutorial wird jedoch während der ersten Hälfte ausschließlich erklärt, wie man es _nicht_ machen sollte, worauf auch immer wieder hingewiesen wird. Erst dann wird eine Alternative erklärt, die mir aber eher für einzelne Sätze oder kleine Textstücke sinnig erscheint, nicht aber für eine ganze Unterseite, die übersetzt werden soll.
Zu einem Codeschnipsel wird einfach erklärt, dass er "weggelassen werden könne", wenn das Tool "ausschließlich an den übligen Orten liegt". Welche das aber letztendlich sind, wird nicht erklärt.

Portrait von renetalk
  • 08.03.2012 - 16:13

Also ich finde das Tutorial echt zu lückenhaft. Ich weiß einfach nicht, wie ich das erste Setup machen muss, damit mit Poedit nicht immer eine Fehlermeldung ausspuckt, dass keine Dateien in den verarbeiteten Verzeichnissen gefunden werden. Ich hätte mir das ausführlicher gewünscht.

Was für eine Datei muss ich denn anlegen (und wie und wo) damit ich die später übersetzen kann? Erstelle ich einfach eine php Datei und schreibe dort das rein?

$language = $_GET["lang"];
setlocale(LC_ALL,$language);
bindtextdomain("meineanwendung","./locale");
textdomain("meineanwendung");
echo gettext("Welcome");
echo "<br />";
echo gettext("Our Products");

Und dann? Wo lade ich die hoch und wie mache ich dann weiter? Und welchen Zweck hat das Tool xgettext. Und wie benutze ich das?

Bitte um Hilfe.

x
×
×