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.
MarProg
02.11.2015 12:01
..werde ich wahrscheinlich mal übernehmen wenn mein www.zublii.com mehr Sprachkenntnisse braucht!
Danke!
Johannes Hamecher
09.01.2015 15:29
WIlli
02.12.2014 10:09
Sehr gutes Tutorial, vielen Dank dafür.
WIlli
01.12.2014 14:14
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
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
Michael Kostka
16.11.2014 15:49
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
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
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
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
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
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.