SEO und TYPO3: HREFLANG Link-Tag realisieren

Der Suchmaschinenoptimierer quengelt, dass die mehrsprachige Webseite ein HREFLANG Link-Tag haben soll? Kein Problem, gibt ja schon reichlich Snippets, um TYPO3 zur Ausgabe von <link rel="alternate" hreflang="X" href="http://domain.tld/X/"> zu animieren. Allerdings: Bei näherem Hinschauen sind die meisten davon doch nicht ganz so, wie man's gern hätte. Also schnell selbst Hand angelegt ...

Nach kurzem Googeln finden sich zwar Umsetzungen für HREFLANG in TYPO3 wie Sand am Meer. Aber eine eigene Extension nur für eine einzelne Zeile im Sourcecode? Scheint mir Overkill. Und die kurzen Typoscript-Snippets sind oft auch nicht perfekt: Mal muss man die Domain von Hand in den wrap schreiben. Oder es wird ein relativer Link zu den Alternativ-Sprachen ausgespuckt, obwohl Google gern einen absoluten hätte.

Also basierend auf den oben verlinkten Snippets schnell selbst Hand angelegt. Die Umsetzung basiert auf einem einfachen HMENU mit der Option special = language:

 

config.absRefPrefix = / 
page.headerData.157 = HMENU
page.headerData.157 {
 special = language
 special.value = 0,1,1
 1 = TMENU
 1 {
  # Link zu nicht-aktiven Sprachen anzeigen
  NO = 1
  NO.stdWrap.cObject = TEXT
  NO.stdWrap.cObject.value = de || en || x-default
  NO.linkWrap = <link rel="alternate" hreflang="|
  NO.doNotLinkIt = 1
  NO.after.cObject = TEXT
  NO.after.cObject {
   stdWrap.wrap = " href="|" />
   stdWrap.typolink.parameter.data = page:uid
   stdWrap.typolink.additionalParams = &L=0 || &L=1 || &L=1
   stdWrap.typolink.returnLast = url
   stdWrap.typolink.forceAbsoluteUrl = 1
   stdWrap.typolink.addQueryString = 1
   stdWrap.typolink.addQueryString.exclude = L,id,cHash,no_cache,gclid
  }
  # Link zur gerade aktiven Sprache zeigen
  ACT = 1
  ACT < .NO
  # Link zu fehlenden Übersetzungen NICHT anzeigenUSERDEF1 = 1
  USERDEF1.doNotShowLink = 1
 }
}

Die verwendeten Sprachen müssen dabei - aus gutem Grund - zwei Mal angegeben werden. In der Zeile

 

stdWrap.typolink.additionalParams = &L=0 || &L=1

stehen die Sprach-IDs, wie sie in TYPO3 angelegt sind. Dies ist für die Generierung des Links erforderlich. Mit der zweiten Zeile

 

NO.stdWrap.cObject.value = de || en

kann aber nicht nur die zugehörige Sprache festgelegt werden (z.B. "en"), sondern auch noch eine regionale Gültigkeit (z.B. "en-gb") gemäß RFC 1766. Google empfiehlt das, falls man z.B. eine Seitenversion im britischen Englisch und Preisen in £ anbieten möchte und eine zweite Version mit amerikanischem Englisch und Preisen in US-$.

 

stdWrap.typolink.forceAbsoluteUrl = 1

sorgt für die Ausgabe der absoluten URL. Da das Ganze über ein normales Menü-Objekt realisiert ist, funktioniert übrigens auch das Umschreiben der Ausgabe "schöne" URLs, etwa via RealURL oder SimulateStatic tadellos.

PS: Das Snippet ist getestet mit TYPO3 4.5, 6.1 und 6.2. Sollte, da Standrad-Typoscript, auch mit dem TYPO3 7er-Zweig funktionieren, das habe ich aber noch nicht selbst getestet.


[Update vom 17. Februar 2014] Tippfehler korrigiert, Dank an Martin Bless!

[Update vom 22. Juli 2015] Neu ergänzte Zeile

 

config.absRefPrefix = / 

Diese Zeile ist NUR ist für Mutli-Domain-Lösungen (.de | .fr | .com) erforderlich.

Ohne sie generiert typolink URLs, die auf die gerade aktuelle Domain zeigen. Das reicht, solange die Sprachen auf derselben Domain in Subfoldern liegen (.com/de/ | .com/fr/ | .com/en/ ) – aber bei separaten Domains je Sprache ist eben absRefPrefix = / erforderlich. Dank an Benjamin Stelter.

[Update vom 2. September 2015] Änderung

 

ACT < .NO 

Die aktive Sprache soll ebenfalls ausgegeben werden, wünscht Google. Dank an Miriam Hofmann für den Hinweis.

[Update vom 26. Augsut 2016]

Den x-default-Link ergänzt. Das geht ganz einfach mit

 

NO.stdWrap.cObject.value = de || en || x-default

und dann bei

 

special.value = 0,1,1

bzw. bei

 

.additionalParams = &L=0 || &L=1 || &L=1

eine der Sprach-IDs doppelt eintragen, sinnvollerweise das Englische, hier also die 1.