Forgot your password?

Forgot your username?

All about IT, Web and Development.
By users for users.

Mehrsprachige Webseiten mit PHP und JSON



Vor allem bei international ausgerichteten Webseiten und Plattformen ist Mehrsprachigkeit ein gefragtes Thema. Mit PHP und JSON ist es auf einfachem Wege möglich neue oder bestehende Webapplikationen zu übersetzen.



Funktionsweise


Anstatt den auszugebenden Text direkt in den Quelltext zu schreiben, verwenden wir Platzhalter (Variablen) für diesen. Beispielsweise wird der Text "Hallo Welt" (Deutsch) bzw. "Hello World" in der Variable hello_world gespeichert.

Anschließend legen wir für jede Sprache eine JSON Datei an. In dieser befindet sich dann zu dem eindeutigen Schlüssel hello_world die entsprechende Übersetztung.



JSON Sprachdatei


Legen wir also zunächst eine deutsche Sprachdatei mit dem Namen de.json an. Die verschiedenen Sprachelemente unterteilen wir zur Übersichtlichkeit in verschiedene Gruppen.

{
   "Actions": {
      "New": "Neu",
      "Add": "Hinzufügen",
      "Edit": "Anpassen",
      "Delete": "Löschen",
      "Apply": "Übernehmen",
      "Close": "Schließen",
      "Enable": "Aktivieren",
      "Disable": "Deaktiveren",
      "Yes": "Ja",
      "No": "Nein"
   },
 
   "Menus": {
      "Home": "Home",
      "About": "Über",
      "Contact": "Kontakt"
   }
 
}



PHP Klasse


Zum Laden der Übersetzung und Ausgeben der Werte erstellen wir eine eigene Klasse.

<?php 

class language {

   public 
$data;

   function 
__construct($language) {
      
$data file_get_contents($language ".json");
      
$this->data json_decode($data);
   }

   function 
translate() {
        return 
$this->data;
   }
}

?>


Beim Erzeugen eines neuen Objektes wird die Sprache übergeben. Hierdurch wird die Sprachdatei eingebunden. Über die Funktion translate() wird dann ein Objekt mit den einzelnen Keys (Sprachelementen) bereitgestellt.

<?php 
$language 
= new language("de");
$lang $language->translate();

echo 
$lang->Actions->New;
?>


Damit wird die Übersetzung "Neu" ausgegeben.


Einbettung


Dieser Code lässt sich jetzt natürlich am besten im Header der Applikation bzw. der Webseite einbetten.

<?php 
   $language 
= new language("de");
   
$lang $language->translate();

?>
<html>
   <head>
      <title>Mehrsprachige Webapplikationen mit PHP und JSON</title>
   </head>
   <body>
      <button><?php echo $lang->Actions->New ?></button>
   </body>
</html>



Vorteile


Im Vergleich zur Möglichkeit jede Quellcode Datei für Deutsch und Englisch doppelt vorzuhalten und dementsprechend auch zu pflegen ist diese Methode deutlich einfacher und übersichtlicher.

Weiterhin muss die Übersetzung durch den einfachen Syntax von JSON nicht zwingend von einem Entwickler durchgeführt werden. Der Syntax ist sehr leicht verständlich und kann damit auch von Laien gepflegt werden.

JSON kann von fast jeder Programmier- und Skriptsprache verarbeitet werden. Somit ist z.B. auch die Verwendung der Sprachdateien innerhalb von JavaScript möglich. Zum Beispiel beim Einsatz von Modals und Diagrammen.



Geschwindigkeit


Im Hinblick auf die Geschwindigkeit ist diese Art der Übersetzung natürlich etwas langsamer als das Vorhalten von doppeltem Code. Allerdings bewegt sich dieser Nachteil in einem so kleinen Bereich, dass es nicht ins Gewicht fällt

Selbst auf dem kleinen Raspberry Pi waren keine Geschwindigkeitseinbußen festzustellen.



Fazit


Mit JSON existiert eine sehr gute Möglichkeit Sprachdateien strukturiert und ohne viel Overhead abzulegen. Nahezu jede Programmiersprache kann diese verarbeiten. In PHP sind nur wenige Zeilen hierzu nötig.

Viele größere Projekte, darunter z.B. auch das in PHP geschriebene Piwik verwenden in der neuesten Version ebenfalls JSON Sprachdateien.

Michael Kostka

Fachinformatiker / Systemintegration
Ich schreibe hier regelmäßig zu den Themen Android, Web, Linux und Hardware.

Raspberry Pi Starter Kit
DataCloud

Leave a comment

I have read the privacy policy and agree to electronically store and process my input data to answer the request.

MarProg

02.11.2015 12:01

Hallo Michi, auch ich finde das eine übersichtliche Lösung.

..werde ich wahrscheinlich mal übernehmen wenn mein www.zublii.com mehr Sprachkenntnisse braucht!

Danke!

Johannes Hamecher

09.01.2015 15:29

Sehr gute Lösung!

WIlli

02.12.2014 10:09

Ich habe das Problem gefunden, es lag am Format der json Datei. Ich habe es als UTF8 ohne BOM gespeichert und dann ging es. :)

Sehr gutes Tutorial, vielen Dank dafür.

WIlli

01.12.2014 14:14

Hallo Michael,

ich habe die JSON Datei geprüft und dort scheint alles in Ordnung zu sein. Ich habe die JSON Datei eins zu eins kopiert und erstellt und habe dann den Rest auch Copy-Pasted.
Trotzdem wird bei mir nichts angezeigt.
Wenn ich ein "var_dump($language);" mache, kommt das hier raus:

object(language)#1 (1) {
["data"]=>
NULL
}

Das selbe mit "var_dump($lang);" gibt NUll aus. Ich bin ratlos.
Hast du noch eine Idee ?

LG Willi

Michael Kostka

30.11.2014 17:08

Hallo Willi,

der Fehler tritt in der Regel auf wenn die JSON Datei nicht valide ist (z.B. durch einen Syntax Fehler).

Mit http://jsonlint.com/ kannst du die JSON Datei auf Fehler überprüfen.

Evtl. hilft dir das weiter.

Viele Grüße
Michael

WIlli

26.11.2014 17:48

Hi ich habe gerade mal deinen Vorschlag getestet, aber irgendwie gibt er mir immer wieder NULL aus, wenn ich echo $lang->Actions->New ausgebe. Es kommt keine Fehlermeldung, die Cookies sind gesetzt, die de.json datei existiert. Ich bin ratlos. Mfg Willi

Michael Kostka

16.11.2014 15:49

Hallo Joschka,

kein Problem, jeder fängt mal bei Null an :).

Die Cookie Variable lässt sich nach dem Setzen auf jeder Unterseite über das Array $_COOKIE abfragen.

Die Einbindung würde dann folgendermaßen aussehen:

$language = new language($_COOKIE["language"]);
$lang = $language->translate();

Gerne kannst du auch die Fehlermeldung hier posten. Dann findet sich sicherlich eine Lösung.

Viele Grüße
Michael

Joschka

10.11.2014 23:43

Hallo Michael,
danke für deine rasche Antwort.

Nur wie übertrage ich die als cookie gespeicherte Sprache auf die translate() funktion?

Wenn ich den Cookie hier einbinde:
$language = new language("de");
$lang = $language->translate();
wird mir eine fehlermeldung ausgegeben, wahrscheinlich binde ich es falsch ein.

Tut mir leid wenn ich blöde fragen stelle, ich bin noch neu in dem gebiet.

Gruß,
Joschka

Michael Kostka

04.11.2014 19:18

Hallo Joschka,

prinzipiell wäre es am einfachsten über einen Button ein Skript anzusteuern, welches für den angemeldeten Benutzer in der Datenbank die Sprache wegschreibt (z.B. "de" oder "en").

Alternativ kannst du die Sprache per PHP auch als Cookie setzen:

setcookie("language", "de");

... und dann später auslesen:

echo $_COOKIE["language"];

Praktisches Beispiel:

PHP Skript (actions-language.php):
<?php
// Cookie setzen
setcookie("language", $_GET['language']);
// Zurück
header("Location: index.php");
?>

HTML Teil (index.php):
<a href="actions-language.php?language=de">Deutsch</a>
<a href="actions-language.php?language=en">Englisch</a>

Viele Grüße
Michael

Joschka

04.11.2014 18:45

Hi Michael,

danke für den Code, eine wirklich gute Idee ihn so aufzuteilen. Übersichtlich und einfach.

Ich habe gerade meine Probleme mit dem "Sprachumschalter". Wie genau könnte der aussehen? Ich habe versucht die Sprache durch "onclick" zu ändern, es will aber nicht so richtig :/

Gruß,
Joschka

Michael Kostka

07.12.2013 22:20

Hallo Alex,

freut mich, dass Dir der Artikel gefällt.

Habe in meinen Projekten bisher immer je nach Spracheinstellung des Benutzers in der Datenbank die entsprechende Datei (de.json oder en.json) nachgeladen.

Viele Grüße
Michael

Alex

07.12.2013 22:03

Danke für den Code :-)

Jetzt bräuchte man nur noch einen Sprachumschalter und dann wäre die Sache perfekt, wobei ich aus einem uralten Script mir einen Umschalter gebaut hatte. Dein Code ist in Sachen Mehrsprachigkeit um viele Längen besser als mein damaliges Script.