RealURL mehrsprachig: pro Domain eine Sprache ohne Get-Parameter / preVars
Bei der Umsetzung von mehrsprachigen Websites (multilingual) mittels TYPO3 hat man die Wahl zwischen zwei verschiendenen Konzepten:
- Mehrere Seitenbäume (pro Sprache ein Seitenbaum):
Dieses Konzept ist sehr einfach umzusetzen. Jedem Seitenbaum wird ein Domainrecord zugewiesen und mittels einer TypoScript-Condition kann der Host abgefragt und die gewünschte Sprache zugewiesen werden. Lösungsansätze findet man wie Sand am Meer, darum werde ich hierauf nicht weiter eingehen. - Ein Seitenbaum für alle Sprachen (one tree fits all):
Die angeforderte Sprache wird über einen Get-Parameter (oft “L”) abgefragt, welcher bei suchmaschinenfreundlichen (SEF) URLs dennoch immer Bestandteil der URL ist. Die verbreiteten Lösungsansätze tendieren zu einer Verwendung von RealURL-preVars.
“One tree fits all” ohne sichtbaren Get-Parameter / preVars
Angenommen es soll eine zweisprachige Website (deutsch + englisch) über zwei Domains (www.website.de + www.website.com) über einen Seitenbaum realisiert werden, dann stellt sich die Frage, wie man die überflüssigen Get-Parameter für die Spracherkennung aus der URL herausbekommt, denn die Unterscheidung kann ja schon anhand der aufgerufenen Domain getroffen werden. So würde beispielsweise die URLs für eine Seite Aktuelles/News aussehen, wenn man sich an die verbreiteten Lösungsansätze hält:
http://www.domain.de/de/aktuelles/
http://www.domain.com/en/news/
Das ist zwar schon suchmaschinenfreundlich (SEF), kann aber noch weiter optimiert werden (SEO):
http://www.domain.de/aktuelles/
http://www.domain.com/news/
Ohne die überflüssigen Pfad-Segmente “de” und “en” muss man RealURL aber dennoch mitteilen, in welcher Sprache die aufgerufene Seite angezeigt werden soll. Diese Sprachweiche (nachträgliches Einfügen der Get-Parameter) baut man in der localconf.php vor der RealURL-Konfiguration ein:
// Host abfragen und getVar setzen:
switch(t3lib_div::getIndpEnv('HTTP_HOST')){
case 'www.domain.de';
$_GET['L'] = 0;
break;
case 'www.domain.com';
$_GET['L'] = 1;
break;
}
Diese Fallunterscheidung kann man natürlich um beliebig viele Domains erweitern. (Eine Alterative zu diesem Script: s.u. – Kommentar von Michael Fritz)
Und so könnte die darauf folgende RealURL-Konfiguration aussehen:
$TYPO3_CONF_VARS['EXTCONF']['realurl'] = array(
'_DEFAULT' => array(
'init' => array(
'enableCHashCache' => 1,
'appendMissingSlash' => 'ifNotFile',
'enableUrlDecodeCache' => 1,
'enableUrlEncodeCache' => 1,
),
'preVars' => array(
array(
'GETvar' => 'L',
'valueMap' => array(),
'noMatch' => 'bypass',
),
),
'pagePath' => array(
'type' => 'user',
'userFunc' => 'EXT:realurl/class.tx_realurl_advanced.php:&tx_realurl_advanced->main',
'spaceCharacter' => '-',
'languageGetVar' => 'L',
'expireDays' => 7,
'disablePathCache' => 0,
'rootpage_id' => 1,
),
),
);
Es ist zu beachten, dass zwar die GETvar in den preVars definiert werden musste, es aber keine valueMap gibt, sondern nur das ‘noMatch’ => ‘bypass’, welches jetzt – aufgrund der fehlenden valueMap – immer angewendet wird.
Jetzt müssen die verschiedenen Domains noch im TypoScript (Setup) mittels Conditions unterschieden werden, damit diese Domains den einzelnen Sprachen zugeordnet werden können:
page.config {
simulateStaticDocuments = 0
tx_realurl_enable = 1
prefixLocalAnchors = all
linkVars = L
sys_language_mode = content_fallback
# deutsch:
baseURL = http://www.domain.de/
sys_language_uid = 0
htmlTag_langKey = de-DE
language = de
locale_all = de_DE
}
# englisch:
[globalString = ENV:HTTP_HOST=www.domain.com]
page.config{
baseURL = http://www.domain.com/
sys_language_uid = 1
language = en
locale_all = en_EN
htmlTag_langKey = en
}
[global]
(Konfigurationsvorlage für weitere Sprachen: siehe Artikel TYPO3 Konfiguration für verschiedene Sprachen)
Die gesamte Umsetzung wurde in Zusammenarbeit mit NDH-Websolutions entwickelt.
Abschließend noch ein Tipp bezüglich der RealURL-Konfiguration bei mehreren Domains: Wenn sich für eine zusätzliche Domain nur ein oder wenige Parameter des Array ändern, so empfiehlt es sich den gesamten “_DEFAULT”-Block nicht für jede Domain zu duplizieren, denn die gesamten Parameter kann man bequem über eine einzige Zeile übernehmen (Zeilenumbruch nicht übernehmen!):
$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.domain.com']=
$TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'];
Mit unset kann man danach bei Bedarf einzelne Felder entfernen (nicht im Falle unsere obigen RealURL-Konfiguration geeignet. Zeilenumbruch nicht übernehmen!):
unset($TYPO3_CONF_VARS['EXTCONF']['realurl']
['www.domain.com']['preVars'][0]['noMatch']);
Werte überschreiben kann man z.B. folgendermaßen, wenn man zuvor den “_DEFAULT”-Block kopiert hat (Zeilenumbruch nicht übernehmen!):
$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.domain.com'];
['pagePath']['rootpage_id'] = 999
Falls Dir dieser Artikel hilfreich war, oder Du eine Anregung oder einen Verbesserungsvorschlag hast, so hinterlasse doch bitte einen Kommentar.
Am 13. Januar 2007 um 16:59 Uhr
super spannende geschichte … klappt das mit jedem browser?
Am 13. Januar 2007 um 17:03 Uhr
Mit Browsern hat das eigentlich nichts zu tun, sondern es geht viel mehr um die URLs, unter denen Seiten in verschiedenen Sprachen ausgeliefert werden.
Am 18. Januar 2007 um 12:44 Uhr
Danke für die super Anleitung!!
-> Was meinte denn der? :-)
Eine gaanz kleine Verbesserung:
$domainset = explode('.',t3lib_div::getIndpEnv('HTTP_HOST'));switch($domainset[count($domainset)-1]){
case 'de':
$_GET['L'] = 1;
break;
case 'es':
$_GET['L'] = 2;
break;
case 'com':
default:
$_GET['L'] = 0;
break;
}
Am 18. Januar 2007 um 12:59 Uhr
Hallo Michael, wenn Du den String erst zerlegst, dann kann die Unterscheidung nur anhand der TLD getroffen werden und das bedeutet, dass beispielsweise Subdomains (www.en.domain.de) nicht abgefangen werden könnnen. Welchen Vorteil siehst Du darin?
Am 18. Januar 2007 um 13:17 Uhr
ok, aber in meinem fall ist es eine erleichterung, weil mein kunde mit subdomains usw. ca. 20 domains hat, die aber alle ausnahmslos über den TDL der jeweiligen Sprache zugeorndet werden können.
Am 31. Januar 2007 um 19:26 Uhr
Wie bekomm ich mit diesen Einstellungen einen LanguageSwitch auf die Website? Ich möchte gern auf jeder Seite eine Sprachauswahl anzeigen. Wenn sich der Benutzer auf www.test.de/kontakt.htm befindet soll er über die Sprachauswahl auf www.test.com/contact.htm kommen usw.
Gibts hierfür auch schon so ein geniales Tutorial? Wäre wirklich super!!!
Am 20. April 2007 um 00:26 Uhr
Ich kann mich Christian nur anschließen. Ich doktor hier auch vergeblich an Sprachumschaltungen für o.g. Methodik rum, bisher ohne Erfolg
Am 22. Juni 2007 um 13:23 Uhr
[…] (wegen der BaseUrl) immer die de Domain angezeigt werden. Dazu habe ich dieses Tutorial gefunden: RealURL mehrsprachig: pro Domain eine Sprache ohne Get-Parameter / preVars Nun habe ich aber ein paar Fragen (vor allem, weil ich das ja bei einer Live Seite machen muss […]
Am 13. Dezember 2007 um 11:09 Uhr
Hmm guter Ansatz - aber der PHP Code in der localconf.php ist nicht nnötig und macht das ganze nur unwartbarer. Dafür gibt es Conditions im typoscript:
[globalString = IENV:HTTP_HOST = *url1.de]
config {
sys_language_uid = 1
language = en
locale_all = en_EN
htmlTag_langKey = en
baseURL = www.url1.de
}
[global]
Am 13. Dezember 2007 um 11:30 Uhr
Hallo Daniel, hast Du das getestet? Conditions verwende ich auch (s.o.) um u.a. die sys_language_uid zu setzen. Soweit ich das richtig in Erinnerung habe, greift RealURL bei der URL-Generierung (sprachabhängige URLs) aber nicht auf die sys_language_uid zurück, sondern auf $_GET[’L'] und diesen Wert kann ich mittels TypoScript nicht überschreiben, oder irre ich mich?
Am 29. Dezember 2007 um 22:27 Uhr
Einen Sprachwechsler kann man beispielsweise so realisieren:
# Language Menu
includeLibs.tx_mylanguage_menu = fileadmin/template/scripts/class.tx_mylanguage_menu.php
temp.menu4.20 = TEXT
temp.menu4.20 {
value = English
typolink.parameter.data = TSFE:id
typolink.additionalParams = &L=1
# typolink.userFunc = tx_mylanguage_menu->main
wrap = |
}
Und die userFunc sieht so aus:
class tx_mylanguage_menu {
function main($content) {
$tag = ‘‘;
return $tag;
}
}
Am 11. Februar 2008 um 16:43 Uhr
Hi,
noch ein Hinweis zur ienv Condition. Bei Mittwald funktioniert nur die, hostname liefert nichts zurück. Ausserdem sollte man bei Umlaut-Domains die Punycode-Schreibweise verwenden. Also für z. B. akdüsseldorf.de:
[globalString = IENV:HTTP_HOST=www.xn--akdsseldorf-vhb.de]
config.baseURL = http://www.akdüsseldorf.de/
[global]
ciao,
Sacha
Am 11. Mai 2008 um 01:38 Uhr
Nettes How-To … man lernt ebend nie aus…. DANKE!
Am 6. Juni 2008 um 16:05 Uhr
Wann stirbt RealUrl endlich aus? Ich hab nur Ärger damit. (Das fängt schon damit an, dass die RealUrl-Auflösungen nicht funktionieren, wenn man im BE engelogggt ist….) Cooluri ist tausendmal einfacher und leistet in etwa das selbe. Kann ich nur jedem empfehlen.