PHP Sprachsystem

  • Ein elegantes Sprachsystem in PHP.

    Eine Webseite in andere Sprachen zu übersetzten ist gut für SOE und für die Besucher welche deine Webseite benutzten. In seiner eigenen Sprache versteht man meist mehr als in einer fremden. Ich möchte euch meine Methode zeigen wie ich verschiedene Sprachen unterstütze und dabei versuche ich es so zu machen, dass es jeder versteht.

    Als erstes möchte ich über meine Ziele mit euch teilen. Ich möchte ein sicheres, aber einfaches System haben welches mir ermöglicht die Übersetzungen in einer einzigen Datei einbinden zu müssen. Das heißt wenn wir die Struktur oder das Design der Seite ändern wollen, müssen wir nur eine Datei bearbeiten. Als persönliche Preferenz würde ich die verschiedenen Inhalte gerne in einer JSON Datei speichern. Auch wollen wir die Sprache des Benutzers in einem cookie speichern und daraus lesen. Wie ihr cookies speichert, werde ich nicht zeigen, das solltet ihr können.

    Fangen wir also an, ich erstelle eine neue Datei "LanguageLoader.php". In dieser wollen wir die Dateien laden und die Funktion zum Abrufen eines Strings bereit stellen.

    $supportedLangs ist ein Array mit den Sprachen welche vom System unterstützt werden. Mit dem Array könnte man auch gut ein Auswahl-Dropdown machen, ein schönes Nebenprodukt. Aber was machen wir in dem Konstruktor? Als erstes fragen wir ab, ob ein cookie mit dem Schlüssel "lang" existiert, wenn nicht setzen wir eine Variable $lang auf den Wert "de", das wäre dann die Standardsprache der Website. Wenn die Abfrage aber richtig ist, suchen wir in dem $supportedLangs nach dem Wert aus unserem cookie. Wenn es keinen Treffer gibt, setzten wir wieder die Standard Sprache, wenn es richtig ist, setzten wir $lang auf den Wert aus dem cookie. Damit haben wir also alle Möglichkeiten abgedeckt und können sicher sein, dass immer eine Sprache ausgewählt ist. Natürlich lassen sich hier noch weiter Methoden einarbeiten. Zum Beispiel in die URL mit einem GET-Parameter oder ähnlichem.

    Nachdem wir nun also sicher sein können, dass eine Sprache ausgewählt ist, können wir unsere JSON Datei laden und speichern. Dafür haben wir die nächsten drei Zeilen. mit $file = dirname(__FILE__)... Setzten wir die Variable $file auf einen String, der aus unserem Pfad und dem Namen der Sprachdatei zusammengesetzt wird. Meine Sprachdatein sind in dem Ordern "languages" und fangen alle mit "messages_" an und haben dann die Abkürzung der Sprache dahinter mit einem ".json" natürlich. Also meine Sprachdatei in dem Bespiel ist: "messages_de.json" und ist in dem Ordner "languages".

    Dann brauchen wir natürlich noch eine Funktion um Nachrichten (oder Strings) zu laden. Dafür gibt es die Funktion #getMessage($key). Diese Funktion nimmt also einen Schlüssel um einen Wert zurück zu geben. Natürlich ist ein Schlüssel wichtig, trotzdem möchte ich kurz einmal die JSON Struktur vorstellen.

    JavaScript: messages_de.json
    1. {
    2. "title": "Das hier ist ein Test",
    3. "body": "Das hier ist ein Testbody"
    4. }

    Wir haben also nur einen Schlüssel und den dazugehörigen Wert. Dies ermöglicht uns auch in einer großen Datenmenge den Überblick zu behalten. Wenn unsere Sprachdatein also mehrere Hundert Zeilen haben, ist es einfach die richtigen Begriffe zu finden ohne jedes mal mühsam suchen zu müssen (Bsp.: "dashboard_settings_user_private_email").
    Nun gut, aber die Funktion was macht die jetzt? Letzendlich wählt sie nur den Wert zu dem Schlüssel den wir ihr geben, es gibt also keine Art von Fehler-catching. Vielleicht eine Sache die man noch zusätzlich einbauen kann, aber eigentlich nicht nötig.

    Okay, jetzt haben wir gelernt wie die Klasse aufgebaut ist und wie sie funktioniert, aber wie wenden wir das an? Ist ganz einfach, versprochen:

    Ich setzte in der ersten Zeile den cookie immer auf "de", das solltet ihr natürlich in eurer Version nicht machen. Danach müssen wir die eine neue Instanz der Klasse erstellen, dafür müssen wir aber erstmal die Datei einbinden. Das machen wir dem "inlude("LanguageLoader.php")" und setzten dann $ll auf "new LanguageLoader();" Danach können wir mit $ll->getMessage("schlüssel") auf alle Strings zugreifen!

    Tipp: Die Kurzschreibweise für "<?php echo $ll->getMessage("s") ?> ist <?= $ll->getMessage("s") ?> !


    Ich hoffe ihr könnt damit was anfangen und macht eure Webseiten und eure Systeme besser! :)

Teilen