2.5k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von timoxy Mitglied (133 Punkte)
Hallo zusammen,

ich suche eine Lösung, wie ich den Aufbau meiner bilingualen Webseite am einfachsten ohne Datenbanken löse.

Meine bisherige Lösung:
$lang = (isset($_SESSION['ht_lang'])) ? $_SESSION['ht_lang'] : 'de';
if(isset($_GET['lang'])) {$_SESSION['ht_lang']=$_GET['lang']; $lang = $_SESSION['ht_lang'];}

[......]

<a href="?lang=de"><img src="images/deutsch.jpg" alt="Sprache auf Deutsch umstellen" /></a>
<a href="?lang=en"><img src="images/englisch.jpg" alt="Switch language to English" /></a>

[......]

<?php if($lang=='en') { ?>

<h1>Englisch</h1>

<?php } else { ?>

<h1>Deutsch</h1>

<?php }?>


Das funktioniert ja dann soweit. Nur finde ich die Lösung irgendwie nicht so überzeugend, vor allem wenn man mit $_GET[''] Verlinkungen arbeitet. Ich weiß nicht wie man das sonst nennen soll, hier kommt ein Bsp:

http://localhost/~timoxy/daten/handytech/produkte.php?kategorie=1&sub=6&id=31


und ich dann den Link:
<a href="?lang=en"><img src="images/englisch.jpg" .....
aufrufe lande ich wieder bei produkte.php ohne weitere GET Angaben.

Mit .htaccess möchte ich dann zwar mal noch diese URL produkte.php?kategorie=1&sub=6&id=31 verschönern dass sie irgendwie so in der Art aussieht: produkte/elektrogeraete/230v/mixer dies kommt jedoch erst in naher Zukunft und ich würde gerne jetzt schon eine funktionierende Sprachwechslung haben ohne dass ich meine GET angaben verliere.

Ich hoffe ihr habt verstanden um was es mir geht :-)

Nochmal kurz zusammengefasst:
[*]schlanke, schlichte und nachhaltige Lösung für eine Zweisprachige Webseite
[*]keine GETs in der URL verlieren
[*]einfach zu warten

Ich danke für alle Antworten. Bei Fragen einfach kurz nach mlden.

Grüße Timo

4 Antworten

0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Hallo Timo,


Mit Deinem Link "http://localhost/..." kann ich nichts anfangen.

Zu Deinen Fragen:

-- GET/POST --

Du willst bei jedem Seitenaufruf wissen, welche Sprache verwendet werden soll. Diese Information musst Du also speichern.
Seiteninformationen speichern kannst Du mit GET oder POST.
Ich würde ein Globales Array oder Objekt benutzen, in dem alle Seiteneigenschaften, die pro Sitzung beibehalten werden müssen, gespeichert sind. Diese Daten werden bei jedem Seitenaufruf mit GET oder POST erhoben und in diesem Array/Objekt abgelegt.

Die Links würde ich mit einer funktion/methode generieren, welche diese gespeicherten Seiteneigenschaften berücksichtigt, zB. createLink("elektrogeraete").
Ab einem gewissen Umfang der Site, würde ich eine Liste (Array) mit allen möglichen Links machen, so: ... elektrogeraete => "produkte/elektrogeraete" ...
in createLink würde dann der Link zusammengesetzt aus
- der "rootposition" (domain, start verzeichnis),
- dem zielverzeichnis oder -datei (zB "produkte/elektrogeraete") und
- weiteren Eigenschaften


-- bilingual content --

Datenbank hast Du als Möglichkeit ausgeschlossen.
Dein bisheriger Ansatz (beide Sprachen auf einer Seite) ist meiner Ansicht nach auch für Sites mit mehr als einer Seite der falsche Weg.
Ich würde wahrscheinlich den Text jeweils pro Seite und Sprache in eine eigene Datei schreiben (kann auch eine TXT Datei sein), und damit (abhängig von den Eingenschaften der Seite) ein Template befüllen (welches ebenfalls als eigene Datei abgespeichert ist).
Du hättest also lauter Dateien wie
de_elektrogeraete.txt
de_home.txt
en_elektrogeraete.txt
en_home.txt
...
vielleicht auch in verschiedenen Verzeichnissen "de" und "en".
(Das entspricht eigentlich auch schon einer Datenbank, aber ich glaube, Du wolltest die Verwendung eines Datenbankservers/systems und SQL und sowas vermeiden.)

Diese Dateien können ruhig HTML Tags enthalten, sofern die resultierende Seite (nach dem zusammenführen) eine korrekte HTML Seite ist.

zB:
$targetPage = "elektrogeraete"
$tpl = loadFile("template.tpl")
$content = findAndLoadCorrectPage( $targetPage )
$content = convertLinks( $content )
$output = applyTemplate( $tpl, $content )


Für einzelne Worte, Linktexte, Buttons, ...
würde ich eine Text Datei (bzw. CSV Datei) pro Sprache machen, mit einem Inhalt wie:
home;Startseite
elektrogeraete;Elektrogeräte
...
0 Punkte
Beantwortet von timoxy Mitglied (133 Punkte)
ich danke dir für deine antwort, ich werde mal schauen wie ich damit zurecht komme.
0 Punkte
Beantwortet von timoxy Mitglied (133 Punkte)
Ich habe mein GET Problem jetzt ganz einfach gelöst.

<?php foreach($_GET as $key => $value) $get .= $key.'='.$value.'&amp;'; ?>
<a href="?<?php echo $get; ?>lang=de"><img src="images/deutsch.jpg"
alt="Sprache auf Deutsch umstellen" title="Sprache auf Deutsch umstellen" /></a>


Somit werden nun alle vorher gesendeten GET-Daten plus die neue Spracheinstellung übermittelt.

-- bilingual content --

Meine Seite ist aktuell schon in Design und Inhalt getrennt:

<?php include '_head.php'; ?>
Inhalt als HTML
<?php include '_foot.php'; ?>


Englischen und deutschen Content jeweils in eine Datei und dann zusätzlich noch die Datei die alle Inhalte zusammenführt -> somit insgesamt 3 Dateien, sind mir zu viel.

Ich habe es jetzt einfach wie im ersten Post gelöst. Dann sind alle Informationen zu einer Seite am gleichen Ort (in einer Datei). Und Design in Head und Foot ausgelagert und mittels include eingebunden.

Dadurch gibt es dann auch keine Pfadprobleme.
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Die beste Möglichkeit - auch im Hinblick auf Suchmaschinenoptimierung (SEO) - wäre, die Sprache als fixes Präfix der Seiten-URL hinzuzufügen, also z.B.

http://domain/de/produkte/elektrogeraete/...

oder

http://domain/en/produkte/....

Das läßt sich gut mit der von "kicia" vorgeschlagenen Methode einer Funktion zum Generieren der internen Links kombinieren.

Um eine Seite mit einer anderen Sprache anzuzeigen, mußt du dann nur dieses Präfix austauschen. Diese Methode funktioniert ohne extra Parameter und ohne Cookies und ist daher auch sehr suchmaschinenfreundlich.

Die Übersetzungen für kurze Texte würde ich in einer externen Datei speichern, die dann bei Bedarf und ja nach verwendeter Sprache geladen wird. Hier gibt es mehrere Möglichkeiten, neben den gettext-Funktionen gibt es auch die Möglichkeit, einfach eine INI-Datei zu verwenden (so macht es z.B. Joomla!) oder auch eine statische PHP-Datei, in der die Texte als Array oder Konstantendefinitionen abgelegt sind.

Längere Fließtexte (z.B. AGB, Produktbeschreibungen) würde ich ebenfalls in externe Dateien auslagern, die dann je nach aktueller Sprache included werden.
...