PHP: Zwischen Sprachen wechseln?
Hallo allerseits!
Ich habe mir zum Üben letztens mal überlegt, Seiten über eine GET Variable in Deutsch und Englisch anzubieten.
Dafür nutze ich im Header einfach eine GET-Variable namens lang. Steht diese auf =de, soll die Seite in Deutscher Sprache ausgegeben werden. Steht sie auf =en, soll die Seite in Englischer Sprache ausgegeben werden.
Davor natürlich noch die Überprüfung, ob die GET-Variable lang gesetzt ist. Wenn nicht, wird im Header um lang=en ergänzt. Dann natürlich noch die Überprüfung, ob lang entweder en oder de ist.
Soweit hab ich auch alles geplant und teils umgesetzt. Auch die Links auf Unterseiten werden um die aktuelle Sprache (lang=..) ergänzt.
Nun aber zu meinem eigentlichen Anliegen:
Es ist echt mühsam, jede Seite um die Überprüfung der Sprache zu erweitern und anschließend die jeweilige Sprache zu 'laden'.
Würde ich dann beispielsweise deutsch.php per oder englisch.php per require einbinden, würde das nicht gerade für eine gute Performance sorgen, meine ich.
Außerdem entsteht dann doch irgendwann ein unüberblickbarer Haufen an Dateien...
Wie machen professionellere Seiten / Entwickler das? Bzw. wie würdet ihr das machen?
LG
5 Antworten
wie ich es machen würde (und mit sicherheit werden das auch viele andere so in der art machen):
ein eigenes system für lokalisation bauen. heißt eine eigene klasse die die ganze arbeit für dich erledigt was das laden der strings in korrekter sprache angeht.
diese klasse nutzt du dann einfach auf jeder seite die übersetzt werden muss.
die lokalisations klasse überprüft dann im konstruktor welche sprache geladen werden muss. an jeder stelle in deiner html/php seite wo dann ein string übersetzt werden muss rufst du dann eine methode der lokalisationsklasse auf. diese methode läd dann aus einer datenbank/datei den entsprechenden string.
bin nicht so wirklich in php drin deswegen hier mal nur etwas pseudo php wie das in etwa aussehen würde
die klasse fürs übersetzen
<?php
class Localizator {
private $lang;
function __construct() {
//Lang tag aus header auslesen/setzen und in $lang speicher
}
function get($varName) {
switch($lang) {
case 'de':
//string $varName aus datei/db mit deutschen strings laden
break;
case 'en':
//string $varName aus datei/db mit englischen strings laden
break;
}
return $translatedString
}
}
?>
und in der html seite
...
<?php
$loc = new Localizator();
?>
<h1><?php $loc->get('headerMain') ?></h1>
keine garantie auf korrektheit/funktion des codes, sollte aber reichen für eine ungefähre idee wie man das lösen könnte.
Cool! Objektorientiert ist immer nett!
Ich glaube ich baue einen an dein Beispiel angelehnten 'Language Controler'.
Je nach Sprache wird dann wie von threadi erwähnt ein Array mit Schlüssel (der bei en/de den gleichen Namen hat) und Wert in verschiedenen Sprachen returned.
Danke!
Nun genau wegen so Problemen nutzt man i.d.R. einen FrontController bzw. hat einen einzigen Einsprungspunkt, die index.php. Von dort aus kann man dann einige Sachen steuern, die für alle geladenen Inhalte gelten. Ansonsten solltest du mal nach den Begriffen i10n und i18n suchen was diese Themen angeht. PHP hat diesbezüglich auch schon eine Implementation von gettext an Bord.
Am GET würde ich das nicht in allen Fällen abhängig machen, sondern mir merken, anstatt dieses dauernd mitzuschleppen. Sei es in der SESSION oder sofern es User gibt an deren Einstellungen. Natürlich kann man über entsprechende IP Bereiche auch schon eine Defaultsprache anzeigen, die wahrscheinlich stimmt.
Da es hier ja nur um eine Sprachauswahl geht, würde ich mich für die Bestimmung einer Standardsprache vorzugsweise an der Browsereinstellung orientieren.
Alle Texte musst Du in jedem Fall dynamisch gestalten - nichts sollte irgendwo fest stehen. Um sie zu verwalten gibt es enorm viele Möglichkeiten. Im einfachsten Fall ist es ein PHP-Array pro Sprache wobei der Key dem Textplatzhalter entspricht. Beispiel:
$lang["de"] = array( "text1" => "Beispiel" );
$lang["en"] = array( "text1" => "Example" );
Ausgabe:
echo $lang[$_GET["lang"]]["text1"];
Die aktuelle Sprache würde ich empfehlen in der PHP-Session zu speichern. Dann musst du sie nicht in allen URLs mitschleifen.
Ausführlicher geht das natürlich auch mit anderen Dateiformaten. Hilfreich ist z.B. eine PO-Datei. Die kann man in Editoren wie POEdit auch übersichtlich bearbeiten.
Die Sprache in einer Session zu speichern ist ungünstig. Dann bekommen nämlich Suchmaschinen nur eine Sprache zu Gesicht und nur die wird indiziert. Auch lassen sich keine Links auf eine bestimmte Sprache setzen.
Üblich ist es die Sprache in der URL am Anfang zu setzen: example.net/de/seite
Das wird dann per URL-Rewrite intern bspw. auf eine zentrale index.php umgeleitet und in dem Script stehen dann die Sprache und restliche URL per GET zur Verfügung. Der Inhalt wird dann danach zusammengebaut.
Eigentlich gäbe es hierfür Content-Negotiation.
Uneigentlich lässt sich das aber nur mäßig gut mit PHP zusammenbringen.
Strukturell ist natürlich das Übersichtlichste, die Sprachnegotiation zentral in eine Datei zu packen, die Du immer einbindest, das bewahrt Dich vor Duplikation und Inkonsistenzen.
Die Inhalte der jeweiligen Datei werden dann sprachgesteuert über l10n nachgezogen (inklusive Fallback-Mechanismus).
Aber so richtig optimal ist das eben auch nicht.
Doch, mit include oder require kannst du das schon machen. Egal ob mit Klassen (was abstrakte Programmierung wäre) oder ohne: Es werden immer Files mitgeladen, ob nun per include/require oder autoload (was aber noch andere Parameter voraussetzt.
Hier eine simple Lösung für den Anfang(!). Nach und nach solltest du dich mit Frameworks wie z.B. Lumen (ein Leichtgewicht) beschäftigen, die dir viel Arbeit abnehmen.
if (isset($_GET['lang']) && $_GET['lang'] == 'de) {
$lang = 'de';
$langFile = 'deutsch.php';
} else {
$lang = 'en';
$langFile = 'englisch.php';
}
$contentFolder = 'inhalte/';
$serverRoute = $_SERVER['DOCUMENT_ROOT'] . $contentFolder . $langFile;
if (file_exists($serverRoute)) {
include($serverRoute);
} else {
header('HTTP/1.0 404 Not Found');
exit('File not found!');
}