Mehrsprachige Website erstellen

Hallo,

als nächstes würde ich gerne der Homepage eine zweite Sprache verpassen.

Ich habe jetzt schon ne Weile im Internet recherchiert. Da finde ich wieder dutzende von verschiedenen Methoden und Codes, außerdem verstehe ich davon gar nichts und es funktioniert bei mir auch nicht.
Bevor ich es wieder falsch mache frage ich hier ein weiteres mal nach :slight_smile: .

Ich habe gesehen manche machen es mit Session/Cookies, andere mit Datenbanken, andere gleich nur mit Variablen oder Weiterleitungen.

Was ist die beste Methode dafür ?

Ich denke ich habe den Fehler gemacht, dass ich anfangs nicht gleich 2 verschiedene Verzeichnisse für die jeweiligen Sprachen gemacht habe.

Über ein Klick auf einem Button würde ich gerne die zweite Sprache aufrufen. Für die zweite Sprache lege ich dann neue html Seiten an die ich verlinke.
Würde es nicht gehen die index.php mit index_LANG.php beim klicken der Sprache auszutauschen, das erscheint mir als einfachste Methode.

Um die Sprache zu speichern muss ich ein Cookie für den Benutzer setzen oder auch eine Session, falls der Benutzer keine Cookies speichert ? Brauch ich dafür auch eine Datenbank um eine ID zu zuweißen oder wird das in diesem Fall nicht benötigt?

:wink: ,
Danny77.

Das sollte ohne Cookies/Sessions laufen, indem die Sprache einfach im URL übergeben wird – denn Suchmaschinen essen keine Kekse …

Wenn du das in der Form
example.com/sprache1/seite-foo.php
und analog dazu
example.com/sprache2/seite-foo.php
aufbaust, dann brauchst du auch keinen besonderen Aufwand betreiben, damit die Links auf weitere Unterseiten jeweils auf die gleiche Sprachversion verweisen – in dem du einfach relative Links setzt, die innerhalb des aktuellen „Sprach-Verzeichnisses“ bleiben.

(Ich hoffe mal, das ist bei dem hiesigen Apachen freigeschaltet, habe es nicht nachgesehen):
Wenn du sowieso unterschiedliche Seiten anbietet, kannst du das auch mit dem Modul ‘mod_negotiation’ vom Apachen erledigen, der regelt das dann automatisch mit dem Brauser anhand einer geeigneten Dateiendung.
Zudem solltest du natürlich für die manuelle Auswahl auf jeder Seite ein kleines Menü einfügen, also jeweils Veweise auf die anderen Sprachversionen.
Es bietet sich ferner an, dort beim a-Element das rel-Attribut anzugeben und die anderen entsprechend als Sprachalternativen zu identifizieren (siehe auch etwa die HTML4-Empfehlung, wie man das richtig macht).

Wenn ‘mod_negotiation’ nicht läuft oder man es nicht nutzen mag, kann man die automatische Auswahl auch mit einem PHP-Skript durchführen, welches dann die vom Brauser kommenden Informationen auswertet, um eine geeignete Sprache auszuwählen (der Brauser gibt auch eine Gewichtung an, wenn der Nutzer mehrere Sprachen angegeben hat, sollte man dann auch korrekt auswerten und nicht nur gucken, welche Sprachen überhaupt vom Nutzer angegeben sind - der Apache handelt das mit dem Brauser automatisch aus.)

PHP braucht man dafür alternativ, wenn man für ähnliche Strukturen mehrere Sprachen mit einem Skript abhandeln will, nicht für jede Sprache ein neues Skript. Der Vorteil davon kommt primär zum tragen, wenn man kompliziertere Skripte hat, aber wenig Textinhalt, etwa bei einer Photogalerie.
Das kommt auch oft bei Programmen vor, wo man praktisch nur die Menüeinträge als einzelne Wörter hat, die dann einfach ausgetauscht werden. Die haben dann oft nur Listen dieser Wörter, die solch ein Programm nutzt, um sich an die bevorzugte Sprache anzupassen. Wenn man viel Fließtext hat, ist die Methode eher ungünstig.

[quote=“chrisb”]Das sollte ohne Cookies/Sessions laufen, indem die Sprache einfach im URL übergeben wird – denn Suchmaschinen essen keine Kekse …
[/quote]

Hallo chrisb =),

danke für die Rückmeldung.

Wie meinst du einfach URL übergeben ? Dass die Textseiten automatisch von Google übersetzt werden? Das möchte ich nicht so gerne falls dies der Fall sein sollte.

[quote=“chrisb”]
Wenn du das in der Form
example.com/sprache1/seite-foo.php
und analog dazu
example.com/sprache2/seite-foo.php
aufbaust, dann brauchst du auch keinen besonderen Aufwand betreiben, damit die Links auf weitere Unterseiten jeweils auf die gleiche Sprachversion verweisen – in dem du einfach relative Links setzt, die innerhalb des aktuellen „Sprach-Verzeichnisses“ bleiben.[/quote]

Leider kann ich das so nicht mehr machen, weil ich anfangs nicht mit gedacht habe und kein Sprach-Verzeichnis für die aktuelle Sprache gemacht habe. Das wäre zu umständlich auf allen html-Textseiten (~500) den Link anzupassen.

:wink: ,
Danny77.

Nunja, ich weiß ja nicht wie gut du mittlerweile in PHP drauf bist, aber das wäre doch eine gute Übung, alle Links per Script automatisiert zu ersetzen :wink:

[quote=“Mgier”][quote=“danny77”]

Leider kann ich das so nicht mehr machen, weil ich anfangs nicht mit gedacht habe und kein Sprach-Verzeichnis für die aktuelle Sprache gemacht habe. Das wäre zu umständlich auf allen html-Textseiten (~500) den Link anzupassen.
[/quote]

Nunja, ich weiß ja nicht wie gut du mittlerweile in PHP drauf bist, aber das wäre doch eine gute Übung, alle Links per Script automatisiert zu ersetzen :wink:[/quote]
Zusatz: Oftmals nutzen größere Seiten Frameworks, die spezielle Tools beinhalten zum erzeugen von URLs. Statt also alle URLs hardgecodet im HTML einzutippen, nutzt man kleine PHP Klassen oder Funktionen, die das zusammenstellen von URLs für dich übernehmen, und dabei dann auch automatisch extra Infos für z.B. Sprachen in die URL einfügen.

Eine simple Form könnte z.B. so ausschauen:

<a href="<?php echo url_builder('home'); ?>"><?php echo gettext('Home'); ?></a> <a href="<?php echo url_builder('imprint'); ?>"><?php echo gettext('Imprint'); ?></a>
Welche Parameter so eine Funktion nimmt, ist einem dann natürlich selbst überlassen.
url_builder erzeugt anhand eines keys dann eine URL zu der entsprechenden Seite und gettext liefert eine Übersetzung des angegeben Wortes.
Das sind natürlich Funktionen, die so nicht existieren. Man müsste sie schon selbst implementieren, was häufig ziemliche Arbeit ist.

Zusätzlich hier noch ein (englisches) Video zur Internationalisierung von Webseiten und wie schmerzhaft das ganze sein kann :wink:
https://www.youtube.com/watch?v=0j74jcxSunY

mfg Balmung

Hallo,
danke für die Rückmeldungen.

Ich besitze momentan noch kein Apache. Damit kann man auch offline arbeiten oder ?

[quote=“Balmung”][quote=“Mgier”][quote=“danny77”]

Leider kann ich das so nicht mehr machen, weil ich anfangs nicht mit gedacht habe und kein Sprach-Verzeichnis für die aktuelle Sprache gemacht habe. Das wäre zu umständlich auf allen html-Textseiten (~500) den Link anzupassen.
[/quote]

Nunja, ich weiß ja nicht wie gut du mittlerweile in PHP drauf bist, aber das wäre doch eine gute Übung, alle Links per Script automatisiert zu ersetzen :wink:[/quote]
Zusatz: Oftmals nutzen größere Seiten Frameworks, die spezielle Tools beinhalten zum erzeugen von URLs. Statt also alle URLs hardgecodet im HTML einzutippen, nutzt man kleine PHP Klassen oder Funktionen, die das zusammenstellen von URLs für dich übernehmen, und dabei dann auch automatisch extra Infos für z.B. Sprachen in die URL einfügen.

Eine simple Form könnte z.B. so ausschauen:

<a href="<?php echo url_builder('home'); ?>"><?php echo gettext('Home'); ?></a> <a href="<?php echo url_builder('imprint'); ?>"><?php echo gettext('Imprint'); ?></a>
Welche Parameter so eine Funktion nimmt, ist einem dann natürlich selbst überlassen.
url_builder erzeugt anhand eines keys dann eine URL zu der entsprechenden Seite und gettext liefert eine Übersetzung des angegeben Wortes.
Das sind natürlich Funktionen, die so nicht existieren. Man müsste sie schon selbst implementieren, was häufig ziemliche Arbeit ist.

Zusätzlich hier noch ein (englisches) Video zur Internationalisierung von Webseiten und wie schmerzhaft das ganze sein kann :wink:
https://www.youtube.com/watch?v=0j74jcxSunY

mfg Balmung[/quote]

Das hört sich für mich etwas kompliziert an =).
Ich würde aber gerne für der zweiten Sprache eigene Textseiten erstellen nicht generieren.

Gibt es da für mich keine andere Methoden ?
Vielleicht dass ich in der index.php abfrage welche Sprache ausgewählt wurde und anhand dieser Auswahl separate Seiten inklusive main_header usw einbinde.

Ich würde die Homepage zwar schon gerne so professionell wie möglich machen. Aber ich denke, dass ich dieses Problem auch anders lösen könnte ?

:wink: ,
Danny77.

Apache ist der Webserver, der hier auf den bplaced Server läuft. Falls du fürs lokale Arbeiten z.B. XAMPP nutzt, dann nutzt du ebenfalls den Apache.

[quote=“danny77”]Gibt es da für mich keine andere Methoden ?
Vielleicht dass ich in der index.php abfrage welche Sprache ausgewählt wurde und anhand dieser Auswahl separate Seiten inklusive main_header usw einbinde. [/quote]
Klar kannst du das.
Es geht halt primär darum der index.php klarzumachen, welche Sprache ausgewählt wurde. Dafür musst du die Sprachinfo auf irgendeine Art und Weise von Seite zu Seite weiterreichen, in der Regel als extra Parameter über die jeweiligen Links.
Ob du das als zusätzlichen Query-String Parameter oder als „fake“ Pfadangabe (wie chrisb vorgeschlagen hat) ist letztendlich nur eine Frage des Geschmacks.

Der Vorschlag von chrisb lässt sich übrigens relativ leicht mit mod_rewrite realisieren. d.h. selbst wenn der Pfad nicht existiert, du kannst die Adresse quasi zur index.php umleiten und von der index.php behandeln lassen. Der Browser bekommt von der Umleitung in der Regel nichts mit.

Hallo.

Danke für den Hinweiß ;D, hier kann ich immer wieder etwas dazulernen.

[quote=“Balmung”]
Klar kannst du das.
Es geht halt primär darum der index.php klarzumachen, welche Sprache ausgewählt wurde. Dafür musst du die Sprachinfo auf irgendeine Art und Weise von Seite zu Seite weiterreichen, in der Regel als extra Parameter über die jeweiligen Links.
Ob du das als zusätzlichen Query-String Parameter oder als „fake“ Pfadangabe (wie chrisb vorgeschlagen hat) ist letztendlich nur eine Frage des Geschmacks.

Der Vorschlag von chrisb lässt sich übrigens relativ leicht mit mod_rewrite realisieren. d.h. selbst wenn der Pfad nicht existiert, du kannst die Adresse quasi zur index.php umleiten und von der index.php behandeln lassen. Der Browser bekommt von der Umleitung in der Regel nichts mit.[/quote]

Ich denke ich behalte mir diese Arbeit für den nächsten Sommer auf, sobald ich die übersetzten Textseiten bekomme. Es sei denn ich habe noch genügend Zeit vor Schulanfang.

Edit: Ich habe mir noch überlegt, ob ich es nicht einfach so machen könnte (ich war noch zu faul bis jetzt für die gegebenen Vorschläge weitere Informationen zu suchen =)):

Ich lasse entweder ein Cookie oder eine Session setzen beim Klick auf der Flagge.
Dann mache ich in der Index.php eine Abfrage und je nach Inhalt des Cookies binde ich entweder den einen Header+Footer für die jeweilige Sprache ein oder die andere.

Das müsste doch auch gehen ? Oder sollte man das in dieser Form nicht machen ?

:wink: ,
Danny77.

Die cookies sind ja eine Variante, um Sitzungen (sessions) zu verwalten. Weil die Nutzer die natürlich nicht annehmen müssen, ist es dann immer sinnvoll, PHP dazu zu veranlassen, gegebenenfalls die Sitzung anders zu verwalten, etwa per GET-Parameter.
Als Unterschied gegenüber der Methode, selbst GET-Parameter zur URI bei Verweisen hinzuzufügen, hat man dann im zweiten Falle eben einen automatisch erzeugten GET-Parameter mit kryptischen Wert statt etwas, was mit dem Problem zu tun hat. Nimmt der Nutzer solch ein cookie an, hat er dann eben stattdessen ein cookie mit diesem kryptischen Wert und zusätzlich der Sprachinformation drin. Weil man die komplette Sitzung dann im PHP-Skript auswerten muß und nicht nur einen simplen GET-Parameter, der die Sprachangabe direkt enthält, ist das etwas mehr Aufwand beim Programmieren und kann zur formalen Bedenken führen, wenn man auch noch Formulare mit der POST-Methode verschickt.

Jedenfalls, wenn du noch gar keine Texte in anderen Sprachen hast, ist es ja allenfalls sinnvoll, die Skripte, die Methode, die Verweise oder die Dateinamen gleich richtig vorzubereiten, dann brauchst du damit nicht von vorne anzufangen, wenn du die mehrsprachigen Inhalte wirklich hast.

[quote=“danny77”]

[quote=“chrisb”]
Wenn du das in der Form
example.com/sprache1/seite-foo.php
und analog dazu
example.com/sprache2/seite-foo.php
aufbaust, dann brauchst du auch keinen besonderen Aufwand betreiben, damit die Links auf weitere Unterseiten jeweils auf die gleiche Sprachversion verweisen – in dem du einfach relative Links setzt, die innerhalb des aktuellen „Sprach-Verzeichnisses“ bleiben.[/quote]

Leider kann ich das so nicht mehr machen, weil ich anfangs nicht mit gedacht habe und kein Sprach-Verzeichnis für die aktuelle Sprache gemacht habe. Das wäre zu umständlich auf allen html-Textseiten (~500) den Link anzupassen.

:wink: ,
Danny77.[/quote]
Wo ist das Problem dabei? :wink:
Verzeichnisse kannst du doch immernoch anlegen…
Den aktuellen Ordner mit deinen php-Dateien kopieren, übersetzen und in einen neuen Ordner hochladen… (zB /eng/)
In dem Fall wäre es nur nötig, dass du entweder alle deine Verzeichnis-Verlinkungen anpasst (sofern sie relativ sind).
Alternativ könntest du bei dem Unterordner einen html-base-Tag hinzufügen…

Da wir den Aufbau deiner Seite nicht genau kennen, wird es schwer eine möglichst einfache Variente zu Empfehlen…
Allein die Tatsache, dass wir nicht wissen ob du eine header.php hast stellt einen schon vor Probleme - denn hier wird ja wahrscheinlich der Title-Tag definiert. Wie dieser definiert wird, übergeben wird usw. wäre schon interessant für das weitere Vorgehen…

Kleine Anmerkung am Rande: Hättest du die Seite mit einer Template-Engine (zB CakePHP) erstellt, könntest du einfach i18n aktivieren… Das ganze dafür aber jetzt umzubauen, würde wahrscheinlich mehr Arbeit in Anspruch nehmen als alles per Hand neu zu verlinken…

Sofern du einen neuen Unterordner erstellen willst, kannst du übrigens via .htaccess-Weiterleitung einfach alle Zugriffe auf “vor dem Sprach-Ordner” auf die alten de-Dateien weiterleiten lassen…

lg