Sprachwechsler - wenn keine Übersetzung vorhanden ist...

  • Freshmeat Freshmeat
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    13. 12. 2006, 14:49

    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.
    [/HTML]

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

    [TS]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"
    }

    }[/TS]


  • 1
  • matrox matrox
    R2-D2
    0 x
    103 Beiträge
    1 Hilfreiche Beiträge
    30. 04. 2009, 13:30

    Gibt es dafür schon eine Lösung?

  • Nathanael Nathanael
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    26. 06. 2009, 16:40

    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

  • Nathanael Nathanael
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    27. 06. 2009, 04:30

    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:

    [TS]#######################
    ### 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][/TS]

    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.

  • Nathanael Nathanael
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    04. 07. 2009, 18:24

    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:

    [TS]#######################
    ### 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][/TS]

    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?

  • cschnell cschnell
    Jedi-Ritter
    0 x
    145 Beiträge
    0 Hilfreiche Beiträge
    15. 10. 2009, 12:21

    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).

  • Nathanael Nathanael
    Padawan
    0 x
    37 Beiträge
    0 Hilfreiche Beiträge
    15. 10. 2009, 12:29

    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.

  • mediew mediew
    T3PO
    0 x
    19 Beiträge
    0 Hilfreiche Beiträge
    20. 01. 2012, 15:10

    Falls jemand wie ich auch auf der Suche nach eine komfortablen Lösung ist, hier ist eine...

    1. lib.lang_switch = COA
    2. lib.lang_switch {
    3. 10 = HMENU
    4. 10 {
    5. special = language
    6. special.value = 1
    7. 1 = TMENU
    8. 1 {
    9. noBlur = 1
    10. NO = 1
    11. NO {
    12. stdWrap.cObject.value = // ENGLISH
    13. ATagParams = class="lang-switch"
    14. }
    15. # Wenn es keine englische Übersetztung gibt
    16. doNotLinkIt = 1
    17. # Fallback-Zielseite (hier Startseite)
    18. parameter = 1
    19. additionalParams = &L=1
    20. ATagParams = class="lang-switch"
    21. }
    22. }
    23. }
    24. }
    25. }
    26. }
    27.  
    28. [globalVar = GP:L=1]
    29. lib.lang_switch {
    30. 10 {
    31. special.value = 0
    32. 1.NO.stdWrap.cObject.value = // DEUTSCH
    33. 1.USERDEF1.stdWrap.typolink.additionalParams = &L=0
    34. }
    35. }
    36. [global]

    [url=http://www.typo3-lisardo.de/home/blog-post/2010/09/01/sprachmenue.html]Quelle: Sprachumschalter mit Fallback auf die Startseite[/url]

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

  • 1