Zum Inhalt springen

Sprachmenü Link URL ohne Standardsprachkürzel

Erstellt am 11. September 2014 · 5 Antworten · letzte Antwort am 12. September 2014

Tags: URLs & Routing, TYPO3 6, Frage

sxbxstxxn ·

Hallo,

folgende Ausgangssituation: Ich habe eine rein deutsche Seite. Die Links werden ohne sprachkürzel erstellt. (Bsp: www.meineseite.de/kontakt/). Nun baue ich eine zusätzliche Sprache ein. Es funktioniert problemlos, dass sich übersetzte Seiten über www.meineseite.de/fr/contact aufrufen lassen und die deutschen Seiten wie bisher!

Nun habe ich aber ein Sprachmenü eingebaut, welches immer direkt von der deutschen auf die frz Seite leitet und umgekehrt. Bei letzterem habe ich jetzt aber immer ein "de" im Link. Also www.meineseite.de/de/kontakt. Im "normalen" Seitenmenü ist dagegen alles wieder korrekt ohne de. Gibt es hier eine Einstlelung die ich übersehen habe?

Hier mein Typoscript für das Language Menu

lib.languageMenu = HMENU
lib.languageMenu {
	# Ein Sprach-Menü wird erzeugt
	special = language
	# Reihenfolge und Auswahl der Sprachen im Menü
	special.value = 0,1
	special.normalWhenNoLanguage = 0
	wrap = <ul id="language_switch">|</ul>
	1 = TMENU
	1 {
		noBlur = 1
		# Standard Sprachen
		NO = 1
		NO {
			linkWrap = <li>|</li>
			# Standard-Titel für den Link wäre Seitenttitel
			# => anderer Text als Link-Text (Optionsschift)
			stdWrap.override = <span class="lang-icon icon-de"></span><span class="lang-text text-de">DEU</span> || <span class="lang-icon icon-fr"></span><span class="lang-text text-fr">FR</span>
			# 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
			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
		}
		# Aktive Sprache
		ACT < .NO
		ACT.linkWrap = <li>|</li>
		
		# NO + Übersetzung nicht vorhanden
		USERDEF1 < .NO
		USERDEF1.linkWrap = <li>|</li>

		# ACT + Übersetzung nicht vorhanden
		USERDEF2 < .ACT
		USERDEF2.linkWrap = <li>|</li>

	}
}
Chrissli ·

Wenn der Sprachparameter gesetzt ist, wird auch das Language-Teil eingebunden.
Theoretisch sollte es reichen wenn du das ersetzt:

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

mit

stdWrap.typolink.additionalParams = &L=1
stdWrap.typolink.additionalParams.if.isTrue.data = GP:L
sxbxstxxn ·

Danke für die Antwort!

Leider führt das jetzt dazu, dass das Menü gar nicht mehr richtig arbeitet. (immer nur link auf startseite de). Ich denke ich brauche ja auch die Language Identifizierung über den Parameter, ich will ja lediglich in der URL das DE kürzel nicht. Beim normalen Seitenaufruf oder Menülinks, ist dieses ja auch nicht vorhanden...

Chrissli ·

Stimmt, kann ja gar nciht, das ist mein Fehler.

Zum Problem:
Deine RealURL-Config steht vermutlich auf bypass, d.h. wenn "de" oder "en" ist nur dann in der URL enthalten wenn der GET-Wert "L" gesetzt ist. Wenn du ihn über dein Menü via additionalParams aber hinzufügt ist der Wert in jedem Falle enthalten, daher werden die URLs mit "de" generiert.

Wieviele Parameter hast du denn, dass du einen so Umständlichen Sprachumschalter generieren musst?
Ich habe da schon deutlich einfachere gesehen, z.b. diesen hier von etux was das glaube ich:

lib.sprachmenue = HMENU
lib.sprachmenue {
  special = language
  special.value = 0,1,2,3
  wrap = <ul class="languages-list">|</ul>
  1 = TMENU
  1 {
    NO = 1
    NO {
      allWrap = <li>|</li>
      stdWrap.cObject = TEXT
      stdWrap.cObject {
        value = français || italiano || deutsch || english
      }
    }
    ACT < .NO
    ACT {
      allWrap = <li class="current-language">|</li>
    }
    USERDEF2 < .ACT
  }
}
sxbxstxxn ·

Das bypass stand tatsächlich drin. Komisch allerdings, dass ihn das außerhalb des Sprachmenüs nicht gestört hat. Auch das Entfernen des noMatch => bypass war ohne erfolg...

was dann letztendlich zum Erfolg führte war folgendes (auch wenn es vielleicht nicht optimal ist):

        'preVars' =>
        array(
            0 =>
            array(
                'GETvar' => 'L',
                'valueMap' =>
                array(					
                    '' => '0',
		    'fr' => '1',
                ),
		'valueDefault' => '',
                'noMatch' => 'bypass',
            ),
        ),

Vielen Dank für die Hilfe!