Sprach Umschalter in Typoscript

In TYPO3 CMS einen Sprachumschalter in Typoscript zu generieren ist entweder sehr viel Handarbeit, Fleißarbeit und Gefrickel – und zieht dann immer unendlich viel Anpassungsaufwand nach sich, wenn neue Sprachen hinzukommen oder wegfallen. Vor allem wenn nicht alle Seiten immer Übersetzungen haben und man einen ordentlichen Fallback für solche Fälle benötigt.

Ich zeige euch hier eine schicke, etwas schlankere Lösung per HMENU, der einfach zu erstellen und zu warten ist und obendrein auch noch gute Fallback-Möglichkeiten für nicht übersetzte Seiten bietet

Ich gehe davon aus, dass HMENU ausreichend bekannt ist und Typoscript auch geläufig ist (stdWrap, etc.). Vorab benötigen wir die IDs der Sprachen (0 für default) wie sie auf der Rootseite in TYPO3 CMS angelegt sind.

Also ans Werk: Als erstes erstellen wir ein Menu und sagen ihm, dass es ein Sprachmenü ist.

lib.langSwitch = HMENU
lib.langSwitch {
 special = language
 special.value = 0,1
 special.normalWhenNoLanguage = 0
}

Als special.value werden die IDs der zu rendernden Sprachen eingetragen. In manchen Situationen macht es sinn hier mit einer Typoscript-Konstante zu arbeiten.

special.normalWhenNoLanguage ist entweder 0 oder 1 (boolean) und entscheidet, ob bei nicht vorhandenen Übersetzungen der normale Link-Zustand gerendert wird oder nicht. Wir wollen das eben nicht und setzen hier eine 0.

Um nun die einzelnen Sprachen einzubinden benutzen wir TMENU und dessen Zustände. Als erstes widmen wir uns NO — dem Normalzustand. Um mehr Einfluss auf den Fallback zu bekommen und alle Get-Parameter zu erhalten überschreiben wir den Link mit eigenen Einstellungen und generieren ihn händisch neu:

1 = TMENU
1 {
  # Standard Sprachen
  NO = 1
  NO {
    linkWrap = |
    
    # Standard-Titel für den Link wäre Seitenttitel
    # => anderer Text als Link-Text (Optionsschift)
    stdWrap.override = deutsch || english
 
    # Standardmäßige Verlinkung des Menüs ausschalten
    # Da diese sonstige GET-Parameter nicht enthält
    doNotLinkIt = 1
 
    # Nun wird der Link mit den aktuellen GET-Parametern neu aufgebaut
    stdWrap.typolink {
      parameter.data = page:uid
      additionalParams = &L=0 || &L=1
      addQueryString = 1
      addQueryString.exclude = L,id,cHash,no_cache
      addQueryString.method = GET
      useCacheHash = 1
      no_cache = 0
    }
  }
}

In Zeile 10 wird der Link-Titel überschrieben, der ansonsten dem Seitentitel in der jeweiligen Übersetzung entspricht.

In Zeile 19 werden die jeweiligen Sprachparameter neu angehängt

In den Zeilen 21-24 werden die derzeitigen GET-Parameter chash, id, L und no_cache aus dem Link entfernt, und danach dir korrekten Parameter neu an den Link angehängt.

Damit steht unser Sprachmenü erstmal, allerdings sind noch keine Fallbacks o.ä. festgelegt.

Um die Sprachfallbacks anzulegen werden die Zustände USERDEF1 und USERDEF2 genutzt.

USERDEF1 ist der Zustand, wenn eine Übersetzung der Seite in der Sprache nicht existiert.

USERDEF2 ist der Zustand, wenn eine Übersetzung der Seite in der Sprache nicht existiert und aktuell angezeigt wird (das ist sehr selten der Fall, z.B. wenn eine 404 Seite die Seite überlagert o.ä.)

Damit erweitern wir unser Sprachmenü um die Zustände USERDEF1, USERDEF2 und ACT:

# Aktive Sprache
ACT < .NO
ACT.stdWrap.typolink >

# NO + Übersetzung nicht vorhanden
USERDEF1 < .NO
USERDEF1 {
  stdWrap.typolink >
  stdWrap.typolink.parameter = {$rootPage}
  stdWrap.typolink.additionalParams = &L=0 || &L=1
  stdWrap.typolink.addQueryString = 1
  stdWrap.typolink.addQueryString.exclude = L,id,cHash,no_cache
  stdWrap.typolink.addQueryString.method = GET
  stdWrap.typolink.useCacheHash = 1
  stdWrap.typolink.no_cache = 0
}

# ACT + Übersetzung nicht vorhanden
USERDEF2 < .ACT
USERDEF2.stdWrap.typolink.parameter = {$rootPage}

Zeile 3: Die aktuelle Sprache soll nicht verlinkt werden. Alternativ reicht hier auch ein rel=“nofollow“.
Da im NO-Zustand schon doNotLinkIt gesetzt ist würde das erweitern um ACT.doNotShowLink = 1 die aktuelle Sprache komplett ausblenden.

Zeile 8-15: Hier wird der Link neu generiert – das ist notwendig, da das Kopieren von NO sonst ungewollte Nebenwirkungen mitbringen kann.
In Zeile 9 wird per Typoscript-Konstante das Fallbackverhalten festgelegt – in unserem Fall soll die Home-Seite angezeigt werden, wenn eine Übersetzung der aktuellen Seite nicht existiert. Hier wären aber auch Szenarien denkbar, in denen z.B. immer auf eine Kategorie-Seite verlinkt wird.

Ab Zeile 19 wird der seltene Fall USERDEF2 festgelegt.

Damit entlasse ich euch mit dieser schicken Sprachnavigation und schicke euch in die Typoscript-Sandbox um den Code beliebig zu erweitern.

Hilfreich dabei könnten folgenden Links sein:

Kommentare? Her damit!