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



