Wie setze ich am besten Mehrsprachigkeit auf Seiten um?
Matthias Jütte
- programmiertechnik
0 Kalle0 Hoscha0 Matti Maekitalo
Hallo!
Ich habe mir mal wieder vorgenommen, ein größeres Projekt anzugehen. Und dabei stellt sich für mich folgende Frage:
Wenn ich die komplette Seite mehrsprachig darstellen möchte (sprich sämtliche in der Sprache variable Zeichenketten in Abhängigkeit einer PHP-Variable, z.B. $lan, austauschbar machen möchte), wie stelle ich es am sinnvollsten an diese abzuspeichern und wieder aufzurufen?
Dabei sollte berücksichtigt werden, daß jede Sprache nach Bedarf eingebunden werden können soll.
Ich denke bisher an zwei Alternativen:
languages/de.lan.php
$text['de'][title] = "Meine Homepage";
$text['de'][menu] = "Hauptmenu";
languages/us.lan.php
$text['us'][title] = "My Homepage";
$text['us'][menu] = "Main menu";
languages/fr.lan.php
$text['fr'][title] = "Mon site internet";
$text['fr'][menu] = "Menu principal";
zur Augabe dann: echo $text[$lan][was_gerade_gebraucht_wird];
In diesem Fall müßte halt für jede Seite der Satz enthaltener Zeichenketten abgerufen werden, hätte aber doch den Vorteil, daß nicht immer der _komplette_ Satz Text eingebunden wird.
Was meint ihr? Was währen noch weitere Alternativen? Wie unterscheiden sich diese in der Serverbelastung (ruhig auch nur rein hypothetisch, kann mir nicht vorstellen, daß meine Seite jemals einen Andrang generieren würde, die eine Server in die Knie zwingt).
Gruß
Matthias
Hallo!
Was meint ihr? Was währen noch weitere Alternativen?
Ansatz ohne Datenbank, beim Blättern bleibst du in deiner Sprache, kannst aber auf JEDER Seite umspringen in eine andere Sprache:
http://www.shanthi-guesthouse.de/index_gb.htm
Gruss, Kalle
Hallo!
»»kannst aber auf JEDER Seite umspringen in eine andere Sprache:
Kann ich mit der DB auch:
$query = "SELECT title, ... FROM $languages WHERE lan=$lan";
Gruß
Matthias
Hi Matthias,
bist du auf PHP beschränkt oder erlaubt dein WebServer auch JSP?
Eine sehr elegante Variante ist Jakarta Struts, das auf JavaServer Pages aufbaut (und auch noch das Model-View-Controler Konzept erfüllt). Dort legst du einfach für jede Sprache eine ApplicationResources.properties Datei an und verwendest die darin definierten Platzhalter in deinen JSP-Seiten.
Ein Platzhalter könnte dann so lauten:
index.title=Tool für Softwareversionen und Ressourcen
und auf englisch:
index.title=Tool for software versions nand resources
Alles andere erledigt Struts für dich automatisch.
Grüße,
Hoscha
Hallo!
Ich kenne W/LAMP und nix anderes ;-) Bis JSP habe ich es noch nicht geschafft.
Gruß
Matthias
Das Thema wurde in den Bereich "Programmiertechnik" und nicht in "PHP" gestellt. Deswegen dachte ich, du meinst die Frage Programmiersprachen-übergreifend. :D
Grüße,
Hoscha
Hallo!
Hast ja Recht...
Gruß
Matthias
use Mosche;
Wenn ich die komplette Seite mehrsprachig darstellen möchte (sprich sämtliche in der Sprache variable Zeichenketten in Abhängigkeit einer PHP-Variable, z.B. $lan, austauschbar machen möchte)
Ich denke bisher an zwei Alternativen:
- pro Sprache eine include-Datei mit einem fest definierten Array
- über eine MySQL-Datenbank: in Feld pro verwendetem String, ein Datensatz pro Sprache
Meinst du das so:
Sprache | Kennung | String
------------------------------
de | title | Meine Homepage
en | title | my website
... ?
Was meint ihr? Was währen noch weitere Alternativen? Wie unterscheiden sich diese in der Serverbelastung (ruhig auch nur rein hypothetisch, kann mir nicht vorstellen, daß meine Seite jemals einen Andrang generieren würde, die eine Server in die Knie zwingt).
Ist es nun ein größeres Projekt oder nicht? Für ein kleineres Projekt reicht sicherlich 1 aus. Wird aber umständlich, wenn du viele Strings hast, die übersetzt werden müssen, da die Datei dann unnötig groß wird.
Wenn du sowieso auf vielen Seiten eine Verbindung zur DB aufbaust, dann würde ich zu 2 tendieren.
Am Ende mußt du auch entscheiden, wie du deine Homepage wartest. Ist die HP insgesamt recht statisch, dann würde ich verschiedene Versionen deiner HP statisch hochladen (statisch bezieht sich nur auf die Sprache, nicht auf deinen restlichen PHP-Teil). Das ist sicherlich die performanteste Methode. Das erstellen deiner Seiten kannst du dann ja einem kleinen make-Script erledigen lassen, als Vorlage hast du zB deinen Vorschlag 1, und dein Script ersetzt dann alle Platzhalter-Variablen %%%STRING%%% durch den entsprechenden String deiner Sprache.
use Tschoe qw(Matti);
Meinst du das so:
Sprache | Kennung | String
de | title | Meine Homepage
en | title | my website
... ?
Es geht doch um WEB- Seiten, also überwiegend Fließtext ???
Das ist m.E. nicht so zweckmäßig, habe sowas schon probiert. Du hast irgendwann eine Unzahl von Text- Schnippseln in 2 oder mehr Sprachen. Neben den Texten musst du auch noch die Namen für die diversen Platzhalter (Kennungen) verwalten und das PHP- Programm muss all diese Platzhalter kennen.
Nach kurzer Zeit blickst du garantiert nicht mehr durch.
Finde es immer noch am besten, eine WEB- Seite komplett und zusammenhängend in einer Sprache zu machen.
Bei Formularen wäre es was anderes.
Kalle.
Hallo!
Das ist m.E. nicht so zweckmäßig, habe sowas schon probiert. Du hast irgendwann eine Unzahl von Text- Schnippseln in 2 oder mehr Sprachen. Neben den Texten musst du auch noch die Namen für die diversen Platzhalter (Kennungen) verwalten
So wird es wohl sein.
und das PHP- Programm muss all diese Platzhalter kennen.
Strenggenommen nicht, denn wenn die Platzhalter den gleichen Namen wie die Datenbankfelder oder die Feld-Schlüssel haben ist das Referenzieren glaube ich recht einfach zu bewerkstelligen. Aber der Umfang ist halt ggf. enorm.
Nach kurzer Zeit blickst du garantiert nicht mehr durch.
Wäre eine mögliche Folge ;-)
Finde es immer noch am besten, eine WEB- Seite komplett und zusammenhängend in einer Sprache zu machen.
Soll ja auch so sein, bloß für mehrere Sprachen. Es geht mir darum die Seite jedem Benutzer in seiner Muttersprache anzubieten, sprich alle Eingabeaufforderunge, Warnungen, Feldbezeichnungen, etc. in der jeweiligen Sprache anzuzeigen.
Gruß
Matthias
Hallo!
Dachte da eher an sowas:
Sprache | title | kennung2 | ... | kennungX
-----------------------------------------------------
de | Meine Homepage | irgendwas | ... | ...
us | My Homepage | something | ... | ...
Gruß
Matthias
use Mosche;
Dachte da eher an sowas:
Sprache | title | kennung2 | ... | kennungX
de | Meine Homepage | irgendwas | ... | ...
us | My Homepage | something | ... | ...
Schlecht, weil du die Tabellen_struktur_ verändern mußt, wenn du einen neuen String einfügst. Dann nimm lieber meine Methode. Äußer dich doch bitte zu der Größernvorstellung deines Projektes.
use Tschoe qw(Matti);
Hallo!
Schlecht, weil du die Tabellen_struktur_ verändern mußt, wenn du einen neuen String einfügst.
War mir bewußt, ist aber doch auch nix anderes, als meinem array ein neues Feld hinzuzufügen, oder?
»»Äußer dich doch bitte zu der Größernvorstellung deines Projektes.
Soll als eine recht simple, dafür aber funktionale Adressenverwaltung anfangen, die ich dann, je nach Motivation und Disziplin sukzessive ausbauen möchte. Mit denen neuen Funktionen kämen dann jeweils neue Textbausteine.
Gruß
Matthias
Also ich mach ds bisher so:
ID | en | de
------------------------------
title | my website | Meine Homepage
Und beim initialisieren, wird die Spalte der Sprache in ein HASH eingelesen.
%TEXT = [ ID => de ]
und die Ausgabe ist dann immer:
print TEXT{title};
In wirklichkeit ist es etwas komplizierte, da die Strings Platzhalter für printf enthalten können, so dass ich immer eine Funktion aufrufe, die eventuelle Parameter mit sprintf umwandelt. z.b.:
ID | en | de
------------------------------
title | my website | Meine Homepage
msg | Hallo %s | Hello %s
sub Text
{
my $id = shift;
return sprintf $TEXT{$id}, @_;
}
(das ist jetzt Perl, aber ich denke das ist mit PHP auch möglich )
So läßt sich auch leicht der Datensatz ändern, da man immer alle Sprachen gleichzeitig abfragen kann mit der ID, außerdem läßt sich die ID auf unique setzten dann hat man keine doppelten Texte.
Struppi.