mehrsprachige Website

maceis

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
hallo zusammen,

ich habe die Aufgabe eine größere Website auf mehrsprachig (deutsch, englisch, holländisch, französisch) zu erweitern.

Die übliche Methode mit MultiViews (html.de, html.en etc.) funktioniert hier leider nur beschränkt, da die meisten Seiten dynamisch generiert werden.
Erschwerend kommt hinzu, dass aufgrund der "Entwicklungsgeschichte" der Site sowohl php als auch Perl (teilweise sogar gemischt) angewendet wurden.

Mein Ansatz ist nun der, bei den Seiten, die von cgi Skripten erstellt werden , die Umgebungsvariable HTTP_ACCEPT_LANGUAGE auszuwerten.

Erste Frage:
Kann man davon ausgehen, dass alle Browser diese Variable übermitteln, oder muss man damit rechnen, dass die Variable manchmal leer ist?

Zweite Frage:
Wie geht man bei der Methode mit MultiViews (html.de, html.en etc.) damit um, dass Sprachen gewählt sind, für die man keine Version der Webeite bereitstellt.
Oder anders gefragt, wie definiert man eine default-Sprache, damit die englische Version ausgegeben wird, wenn ein Browser z. B. auf Japanisch gestellt ist?

Bin über jede Hilfe froh, auch Hinweise auf passende Anleitungen o. ä.
 
Zuletzt bearbeitet:
Guter Hinweis, vielen Dank.

Bei den PHP Seiten bin ich durch Ausprobieren auf folgendes Problem gestoßen:
Wenn ich eine Seite habe (seite1.php.de, seite1.php.en etc.) die alle eine andere Seite mit "include" einbeziehen soll (z. B. navi.php), dann hatte ich gehofft, ich könnte jeweils länderspezifische navi.php's erzeugen (navi.php.de, navi.php.en etc.) und die passende würde automatisch includiert werden.
Stattdessen wird immer die englische Version includiert.

Und selbst das funktioniert nur, wenn man schreibt:
PHP:
include "http://server.dom/pfad/file.html";
Mit
PHP:
include "relativer_pfad/file.html";
wird die Datei nicht gefunden und man erhält den entsprechenden Fehler.
 
Ich weis nicht ob ich Dich jetzt richtig verstanden habe.

Du hast also die Dateien "navi.php.de", "navi.php.en" etc. und willst diese über die Apache-Sprach-Funktionalität (keine Ahnung wie das heisst, hab noch nie was damit gemacht ;)) dynamsich einbinden?
Das kann so, glaube ich, nicht funktionieren.

Code:
include "relativer_pfad/file.html";
Das kann nicht gehen, da hier der Apache nicht mehr greift. Auf diese Weise kannst Du nur per PHP auf die richtige Datei verweisen.

Code:
include "http://server.dom/pfad/file.html";
Gute Idee. Hier hast Du jedoch das Problem dass die Seite nicht über den Browser des Nutzers angefordert wird, sondern in einem extra HTTP-Prozess über PHP. Demnach sind hier keine Informationen über den Browser vorhanden und deswegen wird die Standard-Sprache (en) verwendet.

Die einfachste Möglichkeit die korrekte Datei über PHP einzubinden würde dann wohl so aussehen:
Code:
include "/pfad/file.html.".$lang;
 
warum lagerst du die verschiedenen sprachen nicht in in entsprechende language-
files aus und includierst die, je nach sprache? vorteil: eine datei für alle, die bei
bedarf nur den entsprechenden content lädt.

so nach dem motto ( vereinfacht ) : if english then en.php else if french then fr.php
und so weiter. so kenne ich das von mehrsprachigen webportalen.

:)
 
dms schrieb:
...
Du hast also die Dateien "navi.php.de", "navi.php.en" etc. und willst diese über die Apache-Sprach-Funktionalität (keine Ahnung wie das heisst, hab noch nie was damit gemacht ;)) dynamsich einbinden?
Das kann so, glaube ich, nicht funktionieren.
...
Das habe ich vor, ja; (heisst übrigens "Content Negotiation" ;))
...Die einfachste Möglichkeit die korrekte Datei über PHP einzubinden würde dann wohl so aussehen:
Code:
include "/pfad/file.html.".$lang;
Ja, so ähnlich hab ich das mal probeweise gelöst.
Dachte nur, das geht evtl. einfacher.

HAL schrieb:
warum lagerst du die verschiedenen sprachen nicht in in entsprechende language-
files aus
...
Das ist ja schon geschehen.
HAL schrieb:
...
und includierst die, je nach sprache? vorteil: eine datei für alle, die bei
bedarf nur den entsprechenden content lädt.

so nach dem motto ( vereinfacht ) : if english then en.php else if french then fr.php
und so weiter. so kenne ich das von mehrsprachigen webportalen.
Ja, das geht, ist nur leider ziemlich umständlich, da die Site ziemlich komplex und auch ein wenig unübersichtlich aufgebaut ist.
Die meisten Seiten werden aus cgi Skripten (mit Modulen), HTML::Templates und Datenbankinhalten zusammengebastelt. Teile sind dann wieder in PHP usw.

Im Augenblick fehlt mir ein wenig der Durchblick.
Ich denke das ist das Hauptproblem, aber da muss ich mich wohl durchbeissen.
 
So, inzwischen bin ich ein gutes Stück weitergekommen.

Ich habe die Struktur vereinfacht und die Seitengenerierung vereinheitlicht.
Im Ergebnis sieht das so aus, dass jetzt alle Seiten von einem zentralen Perl cgi Skript zusammengebaut werden, das von einer .htaccess Datei mit einer "RewriteRule" aufgerufen wird.
PHP habe ich komplett eliminiert.
Die eigentlichen Inhalte stehen in einer Datenbank und in verschiedenen Templates.

Die Auswahl der Sprache habe ich durch Auswertung von HTTP_ACCEPT_LANGUAGE realisiert, was auch ganz gut funtioniert.
Die Pflicht wäre also damit erledigt; jetzt kommt die Kür.

Die Frage:
Ich möchte nun erreichen, dass der Benutzer durch Anklicken von entsprechenden Links die Sprache auch abweichend von der Vorgabe wählen kann.
Meine Überlegung war, dafür ein Cookie zu erzeugen, welches auf allen Seiten ausgewertet wird und die HTTP_ACCEPT_LANGUAGE Festlegung überschreibt.

Es würde mich nun interessieren, ob es dazu alternative Vorschläge gibt, die evtl. auch ohne Cookies funktionieren.

Vielen Dank im voraus für Eure Vorschläge.

Ach, und noch was:
Ich bilde mir ein, ich hätte der irgendwo in Mac Hilfe (oder woanders) so eine Seite gesehen, wo lauter Länderflaggen im runden "Drops"-Look abgebildet waren.
Weiss jemand vielleicht zufällig, wo das zu finden ist?
 
Ich hätte da evtl. einen Vorschlag der ohne Cookies auskommt. Wieder das RewriteRule des Apache verwenden. :)

/seite.ext bleibt /seite.ext
/de/seite.ext wird zu /seite.ext?lang=de
/en/seite.ext wird zu /seite.ext?lang=en
etc.

Einmal die Sprache ausgewählt (was sich praktisch nur durch die änderung des Pfades auswirkt) bleibt die sprache aktiv, da alle relativen links ja wieder in den Unterordner zeigen.
 
Zuletzt bearbeitet von einem Moderator:
maceis schrieb:
Ach, und noch was:
Ich bilde mir ein, ich hätte der irgendwo in Mac Hilfe (oder woanders) so eine Seite gesehen, wo lauter Länderflaggen im runden "Drops"-Look abgebildet waren.
Weiss jemand vielleicht zufällig, wo das zu finden ist?

Ich hab so ziemlich alle Länderflaggen als 18x12 px GIF Dateien im Büro liegen, allerdings eckig, wenn du die brauchen kannst schreib mir kurz ne E-Mail, dann schick ich dir die morgen früh :)
 
Grundsätzlich ein interessanter Lösungsansatz.
Im Augenblick sieht's ja bei mir so aus:
Code:
RewriteRule index.html /cgi-bin/index.cgi
RewriteRule ([a-z]+).html /cgi-bin/index.cgi

Wenn ich Dich richtig verstanden habe, müsste ich nun mit den Links, die zur Auswahl der Sprache dienen sollen, eine subroutine des cgi Skriptes starten, die mich sozusagen in einen virtuellen Unterordner befördert.

Das könnte klappen, ich werds mal probieren und dann berichten.
 
VMPR schrieb:
Ich hab so ziemlich alle Länderflaggen als 18x12 px GIF Dateien im Büro liegen, allerdings eckig, wenn du die brauchen kannst schreib mir kurz ne E-Mail, dann schick ich dir die morgen früh :)
Danke, das ist sehr nett.
Ich suche allerdings genau diese runden mit dem Glanz Effekt.
 
Ich kenne mich mit CGI/Perl-Kram nicht aus. Mit einem PHP-Script würde ich es so machen:
Code:
RewriteRule   ([^/]*?)/([a-z]+).html  /rewrite_test/index.php?lang=$1&action=$2

Natürlich kannst Du auch über _SERVER["REQUEST_URI"] auf die originale Anfrage zugreifen und die Sprache herausfummeln.

Um die Sprache nun über die Bildchen zu ändern musst du einfach nur einen neuen Ordner vor den Dateinamen schreiben. Die Links könnten dann so aussehen:

(Wieder PHP-Kram)

Code:
<a href="/de/<?=$_SERVER["PHP_SELF"]?>">Deutsch</a>
<a href="/en/<?=$_SERVER["PHP_SELF"]?>">English</a>
<a href="/it/<?=$_SERVER["PHP_SELF"]?>">Italiano</a>
...
 
dms schrieb:
Ich kenne mich mit CGI/Perl-Kram nicht aus. Mit einem PHP-Script würde ich es so machen:
Code:
RewriteRule   ([^/]*?)/([a-z]+).html  /rewrite_test/index.php?lang=$1&action=$2

Ich würde aber noch Ziffern und Grossbuchstaben einbeziehen :)

RewriteRule ([^/]*?)/([a-zA-Z0-9]+).html /rewrite_test/index.php?lang=$1&action=$2

Gruß, Micha
 
Vielen Dank für die Tips.
Meine RewriteRule schreibt aber alle Anfragen auf die selbe Datei um.
Insofern brauche ich mir über solche Details keine Gedanken machen.
 
maceis schrieb:
Ach, und noch was:
Ich bilde mir ein, ich hätte der irgendwo in Mac Hilfe (oder woanders) so eine Seite gesehen, wo lauter Länderflaggen im runden "Drops"-Look abgebildet waren.
Weiss jemand vielleicht zufällig, wo das zu finden ist?

Ich war gerade so am stöbern in meinem neuen Tiger-System und bin zufällig drauf gestossen:

Unter (Nutzername)/Pictures/iChat Icons/Flags liegen Icons die genau auf Deine Beschreibung passen.
 
Tatsache, da sind sie in voller Pracht.
Vielen Dank.
Ich hatte sie zwischenzeitlich im iTunes Music Store gefunden und einfach ab"fotografiert".
 
Zurück
Oben Unten