TYPO3-Testaccount
Testen Sie die aktuellste TYPO3-Version kostenlos und unverbindlich für einen Monat!

Jetzt testen!

Schulungen

jetzt buchen

Sprachwechsler - wenn keine Übersetzung vorhanden ist...


Autor Nachricht
Verfasst am: 13. 12. 2006 [14:49]
Freshmeat
Themenersteller
Dabei seit: 29.09.2005
Beiträge: 190
Servus Forum,


ich habe mir über TS ein Sprachwechsler programmiert. Eigentlich funktioniert dieser tiptop .. nur ein Problem. Wenn keine Übersetzung zur Seite vorhanden ist wird eine Fehlerseite ausgegeben
HTML
Error!
 
Reason: Page is not available in the requested language.


Wie kann ich den Sprachwechsler (in TS) umschreiben damit er in diesem Falle auf die Startseite der gewünschten Sprache verlinkt?

TYPOSCRIPT
temp.sprachwechsler = COA
temp.sprachwechsler {
 
	10 = TEXT
	10 {
		value = <img src="fileadmin/images/icons/flag_german.png" border="0" alt="German" />
		typolink.parameter.data = page:uid
		typolink.additionalParams = &L=0
		typolink.ATagParams = class="nav_flag"
	}
 
	20 = TEXT
	20 {
		value = <img src="fileadmin/images/icons/flag_french.png" border="0" alt="French" style="margin-left:5px;" />
		typolink.parameter.data = page:uid
		typolink.additionalParams = &L=1
		typolink.ATagParams = class="nav_flag"
	}
 
	30 = TEXT
	30 {
		value = <img src="fileadmin/images/icons/flag_english.png" border="0" alt="English" style="margin-left:5px;" />
		typolink.parameter.data = page:uid
		typolink.additionalParams = &L=2
		typolink.ATagParams = class="nav_flag"
	}
 
}


typo3 dschungelkämpfer
Profil
Verfasst am: 30. 04. 2009 [13:30]
matrox
Dabei seit: 08.09.2008
Beiträge: 81
Gibt es dafür schon eine Lösung?

www.starnberg-werbeagentur.de
ProfilWWW
Verfasst am: 26. 06. 2009 [16:40]
Nathanael
Dabei seit: 15.03.2006
Beiträge: 33
Genau an dem Problem sitze ich auch gerade. Viele Leute benutzen dafür die Extension sr_language_menu, aber die rendert mir zu unflexibel und ich brauche ja auch nur einen gewrappten typolink und kein ganzes Menü (und das div mit der PlugIn-Klasse im gerenderten Code will ich auch nicht haben).

Momentan bin ich auf der Suche nach einer Möglichkeit, in TypoScript herauszufinden, ob eine Übersetzung in einer gewählten Sprache existiert. Dazu fallen mir zwei Möglichkeiten ein:

1. Man macht mit dem CONTENT-Objekt eine Datenbankabfrage auf die Pages-Tabelle und baut die fragliche Sprache mit in das Select ein. Das sollte irgendwie machbar sein. Die Frage ist dann aber, ob man in TypoScript abfragen kann, ob diese Datenbankabfrage Erfolg hatte oder nicht. Kennt sich jemand damit aus?

2. Man schreibt eine PHP-Funktion, die diese Datenbankabfrage mal eben schnell zusammenbaut. Die kann true oder false ausgeben, was man prima mit der Condition [userFunc = has_translation(page:id, 1)] in TypoScript verwursten kann.


Hat jemand noch andere Ideen? Es kann doch nicht sein, dass man nit normalem TypoScript nicht herausfinden kann, ob es eine Übersetzung gibt.

Liebe Grüße,
Nathanael
Profil
Verfasst am: 27. 06. 2009 [04:30]
Nathanael
Dabei seit: 15.03.2006
Beiträge: 33
So, ich habe mir die Nacht um die Ohren gehauen und die TSRef studiert und etwas rumprobiert. Schlussendlich hat sich mein erster Ansatz als erfolgreich herausgestellt. Ausprobiert habe ich es an einem Testsystem mit einer Hand voll Seiten, hier funktioniert es soweit hervorragend. Vielleicht will das ja auch mal jemand ausprobieren:

TYPOSCRIPT
#######################
### In your face, TYPO3!
### Build the Language-Switcher only, if a translation is present for the
### current page. Limitation: Does not work on a root page (a page without
### a parent page, where pidInList does not work correctly)
lib.languageSwitch = CONTENT
lib.languageSwitch {
  table = pages
  select {
     # we only need the count (can only be 0 or 1 in this case)
    selectFields = COUNT(*)
     # pidInList must be set to the current page's pid or the select selects
     # all child pages
    pidInList.data = page:pid
     # the table pages_language_overlay cannot be accessed directly, so we have
     # to join it into pages
    join = pages_language_overlay ON (pages_language_overlay.pid = pages.uid)
     # limit the result to the language ID to check for
    where = pages_language_overlay.sys_language_uid = 1
     # limit the result to translations of the current page
    andWhere.data = page:uid
    andWhere.wrap = pages_language_overlay.pid = |
  }
  renderObj = COA
  renderObj.10 = TEXT
  renderObj.10 {
     # render only, if the DB-query had a positive result
    if.isPositive.field = COUNT(*)
 
     # the normal rendering starts here
    value = Englisch
    typolink.parameter.data = page:uid
    typolink.additionalParams = &L=1
  }
}
[treeLevel = 0]
# on a root page, the link must be set manually
lib.languageSwitch = TEXT
lib.languageSwitch {
  value = English
  typolink.parameter.data = page:uid
  typolink.additionalParams = &L=1
}
[global]
[globalVar = GP:L = 1]
# the default language is always present and is shown on all translated pages
lib.languageSwitch = TEXT
lib.languageSwitch {
  value = Deutsch
  typolink.parameter.data = page:uid
  typolink.additionalParams = &L=0
}
[global]


Für mehr Sprachen muss man mal schauen, ob es reicht, zu vererben und die where-Zeile entsprechend zu ändern. Ich hab nur zwei Sprachen, deswegen probiere ich das nicht selber aus. Bei mehr als zwei Sprachen ist der Einsatz einer Sprachschalter-Extension aber wahrscheinlich sowieso die bessere Wahl.

Ob das mit RealUrl und CoolUri harmoniert weiß ich noch nicht und werde es erst nach Abschluss des Projektes wissen. Da ich die Typolink-Funktionen benutze, sollte das aber kein Problem darstellen.

Feedback wäre schön.
Profil
Verfasst am: 04. 07. 2009 [18:24]
Nathanael
Dabei seit: 15.03.2006
Beiträge: 33
Also ich habe das obige noch mal etwas getestet und hatte ganz vergessen, die Versteclmöglichkeiten einer Übersetzung zu berücksichtigen. Also Startzeit, Endzeit, versteckt und gelöscht. Die habe ich jetzt in die Where-Klausel gebastelt und auch das scheint wunderbar zu funktionierenm übrigens auch mit CoolUri. So sieht der Code jetzt aus:

TYPOSCRIPT
#######################
### In your face, TYPO3!
### Build the Language-Switcher only, if a translation is present for the current page
### Limitation: Does not work on a root page (without a parent page)
lib.sprachschalter = CONTENT
lib.sprachschalter {
  table = pages
  select {
      # we only need the count (can only be 0 or 1 in this case)
    selectFields = COUNT(*)
      # pidInList must be set to the current page's pid or the select selects
      # just the child pages, don't know why it doesn't work on a root page
    pidInList.data = page:pid
      # the table pages_language_overlay cannot be accessed directly, so we have
      # to join it into pages
    join = pages_language_overlay ON (pages_language_overlay.pid = pages.uid)
      # limit the result to the language ID to check for
      # also take care of the hide conditions of the translation
    where (
      pages_language_overlay.sys_language_uid = 1
      AND pages_language_overlay.deleted != 1
      AND pages_language_overlay.hidden != 1
      AND ( pages_language_overlay.starttime = 0
        OR pages_language_overlay.starttime < UNIX_TIMESTAMP() )
      AND ( pages_language_overlay.starttime = 0
        OR pages_language_overlay.endtime > UNIX_TIMESTAMP() )
)
      # limit the result to translations of the current page
      # uidInList should do this, but cannot hold strWrap, but just a static list
    andWhere.data = page:uid
    andWhere.wrap = pages_language_overlay.pid = |
  }
  renderObj = COA
  renderObj.10 = TEXT
  renderObj.10 {
      # render only, if the DB-query had a positive result
    if.isPositive.field = COUNT(*)
 
      # the normal rendering starts here
    value = English
    typolink.parameter.data = page:uid
    typolink.additionalParams = &L=1
  }
}
[treeLevel = 0]
# on a root page, the link must be set manually
lib.sprachschalter = TEXT
lib.sprachschalter {
  value = English
  typolink.parameter.data = page:uid
  typolink.additionalParams = &L=1
}
[global]
[globalVar = GP:L = 1]
# the default language is always present and is shown on all translated pages
lib.sprachschalter = TEXT
lib.sprachschalter {
  value = Deutsch
  typolink.parameter.data = page:uid
  typolink.additionalParams = &L=0
}
[global]


Ich weiß allerdings immer noch nicht, wieso meine pidInList Geschichte nicht auf einer Rootpage funktioniert und ich das mit [treeLevel = 0] manuell abfangen muss. Seiten auf dem Rootlevel haben als pid ja eigentlich 0 stehen, insofern müsste mein "pidInList.data = page:pid" hier eigentlich genau so greifen wie bei Unterseiten. Hat da jemand ne Idee?
Profil
Verfasst am: 15. 10. 2009 [12:21]
cschnell
Dabei seit: 23.03.2006
Beiträge: 145
Hey, danke für dieses Script, hat mir sehr geholfen. Damit ist es z.B. auch möglich auf einer Seite bei Content Fallback zusätzlich noch etwas im Sinne von "Diese Seite existiert in der gewünschten Sprache nicht" anzuzeigen (anstatt das Sprachmenü zu verändern).

Profil
Verfasst am: 15. 10. 2009 [12:29]
Nathanael
Dabei seit: 15.03.2006
Beiträge: 33
Gut, dass Du mich an das Script erinnerst: Es hat eine Schwachstelle beim Thema Workspaces. Sprich: Es weiß nichts von Workspaces und macht Probleme in der Workspace-Preview. Kann man mit leben, könnte man aber vielleicht auch beheben. Aber das lohnt meist nicht, man kann den Redakteuren auch einfach sagen, dass der Sprachschalter in der Preview spinnt.
Profil
Verfasst am: 20. 01. 2012 [15:10]
mediew
Dabei seit: 11.07.2011
Beiträge: 2
Falls jemand wie ich auch auf der Suche nach eine komfortablen Lösung ist, hier ist eine...

TYPOSCRIPT
lib.lang_switch = COA
lib.lang_switch {
  10 = HMENU
  10 {
    special = language
    special.value = 1
    1 = TMENU
    1 {
      noBlur = 1
      NO = 1
      NO {
        stdWrap.cObject = TEXT
        stdWrap.cObject.value = // ENGLISH
        ATagParams = class="lang-switch"
      }
      # Wenn es keine englische Übersetztung gibt
      USERDEF1 < .NO
      USERDEF1 {
        doNotLinkIt = 1
        stdWrap {
          typolink {
            # Fallback-Zielseite (hier Startseite)
            parameter = 1
            additionalParams = &L=1
            ATagParams = class="lang-switch"
          }
        }
      }
    }
  }
}
 
[globalVar = GP:L=1]
lib.lang_switch {
  10 {
    special.value = 0
    1.NO.stdWrap.cObject.value = // DEUTSCH
    1.USERDEF1.stdWrap.typolink.additionalParams = &L=0
  }
}
[global]



Quelle: Sprachumschalter mit Fallback auf die Startseite

Tags: Sprache, Sprachschalter, Sprach-Switch, Language-Switch

[Dieser Beitrag wurde 2mal bearbeitet, zuletzt am 20.01.2012 um 15:12.]
Profil