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:

  1. 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.
  2. 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.

14 Reaktionen zu “RealURL mehrsprachig: pro Domain eine Sprache ohne Get-Parameter / preVars”

  1. FerienNews

    super spannende geschichte … klappt das mit jedem browser?

  2. Ben

    Mit Browsern hat das eigentlich nichts zu tun, sondern es geht viel mehr um die URLs, unter denen Seiten in verschiedenen Sprachen ausgeliefert werden.

  3. Michael Fritz

    Danke für die super Anleitung!!

    “super spannende geschichte … klappt das mit jedem browser?”

    -> 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;
    }

  4. Ben

    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?

  5. Michael Fritz

    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.

  6. Christian

    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!!!

  7. pixelmord

    Ich kann mich Christian nur anschließen. Ich doktor hier auch vergeblich an Sprachumschaltungen für o.g. Methodik rum, bisher ohne Erfolg

  8. realUrl + Mehrsprachigkeit + mehrere Domains - TYPO3forum.net

    […] (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 […]

  9. Daniel Pötzinger

    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]

  10. Ben

    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?

  11. Helmut Hummel

    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;
    }
    }

  12. Sacha Vorbeck

    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

  13. Typo3 Agentur

    Nettes How-To … man lernt ebend nie aus…. DANKE!

  14. Augenlaser

    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.

Einen Kommentar schreiben