Hallo zusammen.
Wollte hier mal meine und Gedanken meinen Lösungsansatz zu einem Mehrsprachigkeitsproblem zur Diskussion stellen.
Ausgangsbasis:
Mehere Top Level Domains (TLDs):
www.supremacy1914.com
www.supremacy1914.de
www.supremacy1914.at
Mehrsprachigkeit (englisch = default / deutsch [uid=1]) mit Umschaltmöglichkeit durch das sr_language_menu.
Bisher kein RealURL.
Bisher hatte ich es so geregelt, dass ich auf der deutschen Domain (.at ist neu) per mod_rewrite in der .htaccess eine Weiterleitung auf http://www.supremacy1914.com/index.php?id=25&L=1 eingerichtet hatte. Nun war aber meine Zielsetzung:
Auf beiden deutschsprachigen Domains sollte die jeweilige TLD-Endung bestehen bleiben, die Sprache sollte allerdings umschaltbar auf englisch bleiben. Ein Domainwechsel auf die .com Domain sollte dabei nicht erfolgen. Heißt http://www.supremacy1914.at/index.php?id=25&L=0 soll dem Nutzer die englische Seite auf der österreichischen Domain präsentieren.
Fehlgeschlagener Ansatz:
Mein erster Ansatz war, die Sprache per TypoScript in Abhängigkeit von der verwendeten Domain zu setzen:
[globalString = IENV:HTTP_HOST = *supremacy1914.de]
config {
sys_language_uid = 1
language = de
locale_all = de_DE
htmlTag_langKey = de
baseURL = www.supremacy1914.de
}
[global]
Das funktioniert auch soweit gut. Aller Inhalt wird auf deutsch dargestellt. Das Problem: Es funktioniert zu gut. Das umschalten auf die englische Sprache (default uid=0) ging natürlich nicht mehr, da dort a) gar kein L gesetzt wurde und b) die obige Abfrage eh alles wieder überschreibt.
Funktionierende Lösung:
Nach ziemlich vielem rumlesen/-probieren habe ich mich für eine Lösung entschieden die:
Auf der .de und .at Domain jeweils ein &L=1 anhängt solange kein anderer L Parameter an der URL hängt.
Für den Wechsel auf die .com Domain den &L=0 Parameter erzwingt.
Das Anhängen eines L Parameters aussetzt, sollte nicht die index.php aufgerufen werden oder ein eID Skript. (Nötig, da sonst kein statischer Content von .de oder .at geliefert werden kann.)
Der Hauptteil des Codes, der das macht musste in die .htaccess:
# 1) wenn eine de, at oder ch domain aufgerufen wird ohne index.php, hänge es an mit Link auf Landing Page
# 2) wenn at oder ch domain keinen L Parameter haben, hänge L=1 an
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{HTTP_HOST} ^[a-z\.]*supremacy1914\.(at|ch|de)+(.*) [NC]
RewriteRule .* http://www.supremacy1914.%1/index.php?id=25 [L,R=301]
RewriteCond %{HTTP_HOST} ^[a-z\.]*supremacy1914\.(at|ch|de)+(.*) [NC]
RewriteCond %{REQUEST_URI} ^/index\.php(.*)$ [NC]
RewriteCond %{QUERY_STRING} !^(.*)&L=(.*)$ [NC]
RewriteCond %{QUERY_STRING} !^(^eID=|.*&eID=)(.*)$
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING}&L=1 [L,R=301]
Die ersten beiden Zeilen checken, ob wir uns auf einer beliebigen Subdomain von supremacy1914 in einem deutschsprachigen Top Level Gebiet (de|at|ch) befinden wobei die erste Cond sicher stellt, dass es sich um einen Pfad ohne Dateiangabe handelt. Da ich RealURL derzeit nicht nutze greift diese Regel also für Aufrufe eines Verzeichnisses (was ich nirgendwo benötige) oder der alleinigen Domain. Diese Werden dann einfach weitergeleitet auf die Startseite mit der jeweiligen TLD (siehe %1).
Die unteren Zeilen beschreiben die folgenden Abfragen:
Sind wir unter TLD at,ch oder de unterwegs?
Enthält die URL index.php? (--> Betrifft keinen statischen Inhalt)
Enthält das, was als Parameter an index.php übergeben wird keinen L=... Wert? (--> erlaubt Browsen in anderer Sprache unter der Domain (Annahme ist, dass L nie der erste Parameter ist, da das normalerweise id ist...))
Enthält die URL keinen eID Parameter? (Es wird getestet, ob er direkt am Anfang, oder später nach einem & kommt um falsche Positive zu vermeiden.)
Wenn die Abfragen alle bejaht werden, wird an den Link ein &L=1 angehängt.
Hat mich einige Zeit gekostet, das zusammenzustückeln 😉
Soweit so gut. Wir haben also den richtigen L=1 Flag dran und ich könnte auf beliebige andere Sprachen umschalten, da bestehende L Werte nicht umgeschrieben werden.
Das große Problem hier ist nur die default Sprache. Typo3 unterdrückt den L=0 Parameter für meine Standardsprache englisch. Das ist insofern blöd als dass unter der Englandflagge auf unserer Seite nur http://www.supremacy1914.de/index.php?id=25 verlinkt war, nicht allerdings, wie ich es wollte, die URL mit &L=0 am Ende. Resultat war, dass man die Sprache nicht auf englisch ändern konnte.
Ich habe also nach einem Weg gesucht, Typo zu zwingen, den L=0 Parameter an die URLs zu hängen. Genauer gesagt, macht typoLink das wunderbar, wenn er erstmal dran ist. Das Problem war, dass das sr_language_menu es nicht machte. Ich hab erst gesucht und dann auch im Code nachgeschaut, aber leider ist das für das sr_language_menu nicht konfigurierbar.
Daher hilft nur auskommentieren der Zeile 286 in class.tx_srlanguagemenu.php:
if(!$this->rlmp_language_detectionLoaded) $TSFE->linkVars = ereg_replace('&L=0' , '', $TSFE->linkVars);
Die Zeile ersetzt für alles, was nicht RealURL heißt den L=0 Parameter mit dem leeren String. Das geändert, den Cache gecleared und alles läuft wie geschmiert.
Ich frage mich jetzt:
Geht das auch besser? Diese Lösung hat zum einen den Nachteil, dass man in fremden Extensions rumschmieren muss (wenn auch minimal invasiv). Der größere Nachteil ist allerdings, dass die rewrite rules nicht wirklich mit sich spaßen lassen. Ein Aufruf an das index.php Skript bei dem ein eID Parameter als POST Variable übertragen wird und schon kommt der Aufruf nicht an der richtigen Stelle an, da mein Apache versucht, einen L Parameter anzuhängen...
Hat jemand vielleicht Meinungen hierzu?
(Ruhig kürzer als das hier 😉)
Grüße,
Christopher[/list]