Typo3 - Mehrsprachige Seiten

Aus Wikizone
Wechseln zu: Navigation, Suche

Siehe auch: Typo3 - Standardeinstellungen

Kurzanleitung

  • HTML-Template: Marker einbinden
  • TypoScript: Marker mit Sprachskript füllen (PHP-Objekt)
  • Dateien: Notwendige Dateien hochspielen (Skript und Grafiken)
  • CSS anpassen damit Flaggen schön aussehen
  • Backend: Sprache anlegen (Weltkugel)
  • Evt. Spracheinstellungen im TypoScript (das meiste im vorgefertigten Template)

Hinweis: alles im Baukasten (Common - Ordner) ToDo


2 Konzepte

Um Mehrsprachigkeit zu realisieren gibt es zwei Ansätze:

  1. Multitree - Mehrere Navigationsbäume (für jede Sprache einen). In den Navigationsbäumen müssen die Templates entsprechend Variiert werden.
  2. One Tree Fits All - Mehrsprachigkeit mit den Typo3 Bordmitteln (der moderne Ansatz). Hierbei können im System mehrere Sprachen angelegt werden. Jede Sprache hat nachher in der Seitenansicht eine eigene Spalte. So hat man eine gute Übersicht welche Inhaltselemente bereits übersetzt sind.

Welcher Ansatz ist der Richtige ?

Kommt drauf an. Wer soll damit klar kommen? Wieviele Seiten sind es? Werden alle Seiten übersetzt?

TypoScript Anpassungen

Damit das System merkt in welcher Sprache es sich z.Zt. befindet wird der URL ein Parameter mitgegeben. Allgemein ist der Parameter L vereinbart. Das sollte auch eingehalten werden weil einige Extensions nur mit L als Variable arbeiten.

Damit das ganze funktioniert müssen Anpassungen mit TypoScript gemacht werden.

Am besten ein Zusätzliches Basis Template anlegen. Für eine deutsch-englische Seite kann das Setup z.B. so aussehen:

### Parameter L definieren 0 soll die default Sprache (deutsch) sein ###
config.linkVars = L
config.sys_language_uid = 0
config.language = de
config.locale_all = de_DE
#config.sys_language_mode = content_fallback;0
config.sys_language_mode = strict
config.sys_language_overlay = hideNonTranslated
 
 # Testen ob die Englische Seite gewünscht wird. In einem CASE Konstrukt wird dazu geprüft
 # ob die globale Variable L=1 ist
 [globalVar = GP:L = 1]
    config.sys_language_uid = 1
    config.language = en
    config.locale_all = english
 [global]

Erläuterung:

Im ersten Teil wird die globale Variable L definiert und dann Deutsch als default-Sprache festgelegt und mit L=0 gleichgesetzt. Danach wird getestet ob der Parameter L mit dem Wert 1 übergeben wird. Ist das der Fall wird die Systemsprache auf englisch gesetzt. Das führt später auch dazu, daß die Inhalte aus der Englischen Spalte ausgegeben werden.

Jetzt fehlt noch ein Auswahlmenü mit dem sich die Sprache auf der Webseite auswählen läßt.

Sprachauswahlmenü programmieren

In der Subpart definition (workOnSubparts) des Haupttemplates binden wir ein PHP-Skript ein, dass dafür sorgt, daß an der Stelle des Markers (hier LANGUAGE) das Menü eingebunden wird und das bei Klicks auf einen Link immer die richtige Nummer für die Sprache an die URL angehängt wird.

TypoScript:

  #multilanguage-flags
  marks.LANGUAGE=TEXT
  marks.LANGUAGE= 
  marks.LANGUAGE=PHP_SCRIPT
  marks.LANGUAGE.file=fileadmin/scripts/languageMenu_d-e.php

php-Skript:

<?php
/**
* languageMenu_d-e.php basiert auf example_languageMenu.php 
*
* @author	Kasper Skårhøj <kasper@typo3.com>
* @modified by Stephan Schlegel www.geo-bit.de
*/
// First, select all pages_language_overlay records on the current page. Each represents a possibility for a language.
$query = "SELECT * FROM pages_language_overlay WHERE pid=".$GLOBALS["TSFE"]->id.$GLOBALS["TSFE"]->sys_page->enableFields("pages_language_overlay")." GROUP BY sys_language_uid";
$res = mysql(TYPO3_db,$query);
$langArr=array();
while($row=mysql_fetch_assoc($res))	{
$langArr[$row["sys_language_uid"]]=$row["title"];
}

// Little red arrow, which is inserted to the left of the flag-icon if the 
// TSFE->sys_language_uid equals the language uid (notice that 0=deutsch, 1=englisch  
// is SPECIFIC to this database, because these numbers refer to uid's of the table sys_language)
$pointer = '<img src="fileadmin/scripts/pointer.gif" width="7" height="10" align=middle>';
// Set each icon. If the language is the current, red arrow is printed to the left. 
// If the language is NOT found (represented by a pages_language_overlay record on this page), the icon is dimmed.
$flags = array();
$flags[] = ($GLOBALS["TSFE"]->sys_language_uid==0?$pointer:"").'<a href="index.php?id='.$GLOBALS["TSFE"]->id.'&L=0" target=_top><img src="media/uploads/flag_de.gif" alt="deutsch" width="21" height="13" hspace=5 border="0"></a>';
$flags[] = ($GLOBALS["TSFE"]->sys_language_uid==1?$pointer:"").'<a href="index.php?id='.$GLOBALS["TSFE"]->id.'&L=1" target=_top><img src="media/uploads/flag_uk'.($langArr[1]?"":"_d").'.gif" alt="english" width="21" height="13" hspace=5 border="0"></a>';

// Make the little menu. Notice, the menu does ONLY transfer the page-id and the "L" variable (which is also SPECIFIC for this website because "L" has been used in the extension template used to control the language setup)
$content = ''.implode("",$flags).'';
?>

Rootline für mehrere Sprachen einrichten

temp.rootline = HMENU
temp.rootline.special = rootline
temp.rootline.special.range = 0|-1
temp.rootline.wrap = Sie sind hier:
temp.rootline.1 = TMENU
temp.rootline.1 {
   target = _top
   NO.linkWrap = || /
}
# evt. bestimte Seiten ausblenden...
temp.rootline.excludeUidList =

# Sprache mit der ID 3
[globalVar = GP:L = 3]
   temp.rootline.wrap = You are here:
[global]

# Sprache mit der ID 4
[globalVar = GP:L = 4]
   temp.rootline.wrap = bla bla:
[global]

# Sprache mit der ID X (X = beliebige zahl)
[globalVar = GP:L = X]
   temp.rootline.wrap = hierher haben sie sich verirrt:
[global]

Ein Beispiel für ein vollständiges (zweisprachiges) TypoScript

### Spracheinstellungen ###
config.linkVars = L
config.sys_language_mode = content_fallback;0

[globalVar = GP:L = 0]
config.sys_language_uid = 0
config.language = de
config.locale_all = de_DE

# Link to top
#content.linkToTop >
tt_content.stdWrap.innerWrap2 = |<br><div align="right"><A href="#top"><font color="#AB3C4B" face="Arial, Helvetica, sans-serif" size="1"><B>nach oben</b></font></a></div>

#Suchfunktion
tt_content.search{
   20.layout.10.value = Suchergebnis: ###RANGELOW###-###RANGEHIGH### von ###TOTAL###
   20.noResultObj.10.value = Keine Treffer.
   20.next.value=nächste
   20.prev.value=vorherige
   30.dataArray.10.label = Suche nach:
   30.dataArray.20.label = Suche in:
   30.dataArray.20.valueArray.10.label = Überschriften und Schlüsselworten
   30.dataArray.20.valueArray.20.label = Seiteninhalten
   30.dataArray.40.value = Suche starten
}

[global]

# English language, sys_language.uid = 1
[globalVar = GP:L = 1]
config.sys_language_uid = 1
config.language = en
config.locale_all = english

#  Link to top
#content.linkToTop >
tt_content.stdWrap.innerWrap2 = <br><div align="right"><A href="#top"><font color="#AB3C4B" face="Arial, Helvetica, sans-serif" size="1"><B>to top</b></font></a></div>

#Suchfunktion - englisch
tt_content.search{
   20.layout.10.value = Suchergebnis: ###RANGELOW###-###RANGEHIGH### von ###TOTAL###
   20.noResultObj.10.value = No hits.
   20.next.value=next
   20.prev.value=previous
   30.dataArray.10.label = Searchwords:
   30.dataArray.20.label = Search in:
   30.dataArray.20.valueArray.10.label = Headlines & Keywords
   30.dataArray.20.valueArray.20.label = Content
   30.dataArray.40.value = Start search
}
[global]

Schritt für Schritt Anleitung

  • Mindestens eine weitere Sprache anlegen (Listenansicht - Weltkugel)
  • TypoScript Sprachvariable und Template anpassen:
  • Benötigte Skripte und Bilder(Flaggen) Uploaden
    z.B. mulitlan_d-e.php, flag_uk.gif...
  • Marker im TypoScript Template anlegen:z.B.
### Multilanguage-Navi ###
  marks.LANGUAGE=PHP_SCRIPT
  marks.LANGUAGE.file=fileadmin/scripts/languageMenu_e-d.php
  • Marker im HTML-Template einbauen. Am besten in divs damit man es per CSS gestalten kann
###LANGUAGE###

Probleme bei mehrsprachigen Seiten

Lösungen bei verschiedenen Problemen mit mehrsprachigen Seiten gibt es hier:

Typo3 - Probleme mit mehrsprachigen Seiten lösen

Skriptsammlung

php-Sprachskript

<?php
/**
* languageMenu_d-e.php basiert auf example_languageMenu.php 
*
* @author	Kasper Skårhøj <kasper@typo3.com>
* @modified by Stephan Schlegel www.geo-bit.de
*/
// First, select all pages_language_overlay records on the current page. 
// Each represents a possibility for a language.
$query = "SELECT * FROM pages_language_overlay WHERE pid=".$GLOBALS["TSFE"]->id.$GLOBALS["TSFE"]->sys_page->enableFields("pages_language_overlay")." GROUP BY sys_language_uid";
$res = mysql(TYPO3_db,$query);
$langArr=array();
while($row=mysql_fetch_assoc($res))	{
$langArr[$row["sys_language_uid"]]=$row["title"];
}

// Little red arrow, which is inserted to the left of the flag-icon if the 
// TSFE->sys_language_uid equals the language uid (notice that 0=deutsch, 1=englisch  
// is SPECIFIC to this database, because these numbers refer to uid's of the table sys_language)
//$pointer = '<img src="fileadmin/scripts/pointer.gif" width="7" height="10" align=middle>';
$pointer = "";
// Set each icon. If the language is the current, red arrow is printed to the left. 
// If the language is NOT found (represented by a pages_language_overlay record on this page), the icon is dimmed.
$flags = array();
$flags[] = '<li><a href="index.php?id='.$GLOBALS["TSFE"]->id.'&L=0" target=_top><span class="flag"><img src="fileadmin/template/images/flag_de.gif" alt="deutsch" title="deutsch" border="0"></span></a></li>';
$flags[] = '<li><a href="index.php?id='.$GLOBALS["TSFE"]->id.'&L=1" target=_top><span class="flag"><img src="fileadmin/template/images/flag_uk'.($langArr[1]?"":"_d").'.gif" alt="english" title="english" border="0"><span></a></li>';

// Make the little menu. Notice, the menu does ONLY transfer the page-id and the "L" variable (which is also SPECIFIC for this website because "L" has been used in the extension template used to control the language setup)
$content = '<ul>'.implode("",$flags).'</ul>';
?>


TypoScript multilanguage Extension

ext_multilang_d-e.tmpl

Setup:

### Spracheinstellungen ###
config.linkVars = L
config.sys_language_mode = content_fallback;0

### ohne Sprachauswahl ###

# Standardsprache deutsch wird festgelegt 
config.sys_language_uid = 0
config.language = de
config.locale_all = de_DE

# CSS
page.stylesheet = fileadmin/template/css/main.css

### DEUTSCH ###
[globalVar = GP:L = 0]
config.sys_language_uid = 0
config.language = de
config.locale_all = de_DE

# CSS
#page.stylesheet = fileadmin/template/main.css

# Link to top
#content.linkToTop >
tt_content.stdWrap.innerWrap2 = |<br><div class="toTop"><a href="#top">nach oben</a></div>
[global]

### ENGLISCH ###
[globalVar = GP:L = 1]
config.sys_language_uid = 1
config.language = en
config.locale_all = english

# CSS
#page.stylesheet = fileadmin/template/main_en.css

# Link to top
#content.linkToTop >
tt_content.stdWrap.innerWrap2 = <br><div class="toTop"><a href="#top">to top</a></div>

#...

[global]

Übersetzung nur Anzeigen wenn sie vorhanden ist

Typo3 - Stuttgart Mailing List (Juli 2006)

> >Hallo ihr alle,
> >
> >ich habe eine typo3 3.7.1 installation und möchte eine übersetzung nur dann anzeigen, wenn diese vorhanden ist.
> >Wenn sie nicht vorhanden ist soll der gesamte menüpunkt rausfliegen.
> >
> >Der untenstehende code sollte funktionieren - tut es aber nicht...
> >Weis da jemand bescheid?
> >...meine langwierige recherchen haben leider auch nichts ergeben ;-((
> >
> >config.linkVars = L
> >config.sys_language_uid = 0
> >config.language = de
> >config.sys_language_mode = strict
> >config.sys_language_overlay = hideNonTranslated
> >
> >lg niko
> >  
> >


Hallo Niko,

vielleicht hilft dir dies weiter:

http://www.datenwolken.de/index.php?id=221

und ein Beispiel hier

http://forum.typo3.fr/index.php?showtopic=4236

 // User defined
 USERDEF1 = 1
 USERDEF1.doNotLinkIt = 1
 USERDEF1.linkWrap = <li class="disabled">|</li>
 USERDEF1.stdWrap.override = EN || FR || DE
 }

li.disabled dann im stylesheet ausblenden ...

Grüße Ines

_______________________________________________ TYPO3-stuttgart mailing list TYPO3-stuttgart@lists.netfielders.de http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-stuttgart

Datum und Zeit

Oft ist es schwierig herauszufinden wo gerade die Ausgabe von Zeit und Datum konfiguriert wird.

Wenn eine der Extensions ts_language_de oder ts_language_xx installiert ist wird dort der Standard einer andeen Extension (z.B. tt_news) überschrieben. Diese Einstellung kann wieder im eigenen TS überschrieben werden.

Im Template Analyser kann man die Reihenfolge gut sehen.

Beispiel zur Konfiguration:

Examples: Your site is a "one-language-site" and you configured the site-language as default language of TYPO3. If you have a ts_language_xx extension installed, to set some country specific settings for other extensions, I suggest to copy the part which refers to tt_news in your main template or an ext template which is included. Here an example for german settings:

# set the TYPO3 language to german
config.language = de
# set the PHP locale to german
config.locale_all = de_DE

# tt_news date & time formats
plugin.tt_news {
  archiveTitleCObject {
    10.strftime = %B - %Y
  }
  getRelatedCObject {
      20.strftime = %d.%m.%Y %H:%M
  }
  displaySingle {
    date_stdWrap.strftime= %d.%m.%y
    time_stdWrap.strftime= %H:%M
  }
  displayLatest {
    date_stdWrap.strftime= %d.%m.%y
    time_stdWrap.strftime= %H:%M
  }
  displayList {
    date_stdWrap.strftime= %A %d. %B %Y
    time_stdWrap.strftime= %d.%m.%y %H:%M
  }
}

Hint: If the locale_all setting "de_DE" don't work on your WAMP installation, try to set it to "german". There are some differences in the handling of the php-locale on windows and linux.

If your site is a multilanguage site like the "one-tree-fits-all-languages" example from the "testsite" package (see: http://typo3.org/documentation/tips-tricks/multi-language-sites-in-typo3/ ) you can add the country specific settings to the language condition in your TS-setup:

# Setting up the language variable "L" to be passed along with links
config.linkVars = L

# German language, sys_language.uid = 2
[globalVar = GP:L = 2]
config.sys_language_uid = 2
config.language = de
config.locale_all = de_DE

# set german date & time formats
plugin.tt_news {
  archiveTitleCObject {
    10.strftime = %B - %Y
  }
  getRelatedCObject {
      20.strftime = %d.%m.%Y %H:%M
  }
  displaySingle {
    date_stdWrap.strftime= %d.%m.%y
    time_stdWrap.strftime= %H:%M
    age_stdWrap.age =  Minuten | Stunden | Tage | Jahre
  }
  displayLatest {
    date_stdWrap.strftime= %d.%m.%y
    time_stdWrap.strftime= %H:%M
  }
  displayList {
    date_stdWrap.strftime= %A %d. %B %Y
    time_stdWrap.strftime= %d.%m.%y %H:%M
  }
}
[global]

# Danish language, sys_language.uid = 1
[globalVar = GP:L = 1]
config.sys_language_uid = 1
config.language = dk
config.locale_all = danish

# set danish date & time formats
plugin.tt_news {
  # sorry, don't know the danish date & time settings ;-)
}
[global]