<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lösung von Typo3 Problemen! &#187; Sprachen</title>
	<atom:link href="http://www.typo3-problem.com/tag/sprachen/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.typo3-problem.com</link>
	<description>Typoscript, Typo3 selber oder PHP, hier werden verschiedenste Probleme gelöst!</description>
	<lastBuildDate>Fri, 17 Dec 2010 13:56:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dem Benutzer (und den Suchmachinen) zeigen wo es lang geht</title>
		<link>http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/</link>
		<comments>http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 18:01:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[301 redirects]]></category>
		<category><![CDATA[INT_USER]]></category>
		<category><![CDATA[Lösung]]></category>
		<category><![CDATA[Sprachen]]></category>
		<category><![CDATA[Suchmaninen]]></category>
		<category><![CDATA[Typoscript]]></category>

		<guid isPermaLink="false">http://www.typo3-problem.com/?p=10</guid>
		<description><![CDATA[Es gibt in Typo3 viele Möglichkeiten das Template und die gesamte Seite zu erweitern und anzupassen. Es gibt Extensions, Typoscript und dann die Möglichkeit, Funktionen einer Klasse aus einer PHP-Datei direkt aus dem Typoscript auszuführen, durch das USER oder INT_USER Objekt. Mit diesen konnte ich nun eine mehrsprachige Typo3-Seite erfolgreich erweitern. Das Ziel war, die [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt in Typo3 viele Möglichkeiten das Template und die gesamte Seite zu erweitern und anzupassen. Es gibt Extensions, Typoscript und dann die Möglichkeit, Funktionen einer Klasse aus einer PHP-Datei direkt aus dem Typoscript auszuführen, durch das USER oder INT_USER Objekt. Mit diesen konnte ich nun eine mehrsprachige Typo3-Seite erfolgreich erweitern. Das Ziel war, die Spracheinstellung vom Browser zu lesen und den Benutzer auf die entsprechende Sprache der Seite weiter zu leiten. Dies soll aber nur passieren, wenn der Benutzer auf der Root-Seite landet. Um also eine entsprechende PHP-Klasse im Template einzubinden benutzt man folgendes Typoscript im Template-Setup:</p>
<blockquote><p>// Zunächst die PHP-Datei laden<br />
includeLibs.lang_redirect = fileadmin/libs/lang_redirect.php</p>
<p>// Dann die userFunction ausführen, dies geschieht im PAGE-Objekt<br />
seite.1 = USER_INT<br />
seite.1.userFunc = user_301redirect-&gt;user_main</p></blockquote>
<p>Dann fehlt natürlich nur noch die entsprechende lang_redirect.php Datei. Diese beinhaltet eine Funktion, die die Sprache des Browsers überprüft und eine Funktion, die die überprüft, ob der Zugriff auf die Seite durch einen Robot geschieht. Aus Gründen der Suchmachinenoptimierung wende ich diese Methode bei Robots nicht an, sondern geb direkt die Seite aus die angefragt wurde. Im Folgenden meine PHP-Datei.</p>
<blockquote><p>class user_301redirect {</p>
<p>var $correctDomain = &#8216;www.domain.com&#8217;; // default domain<br />
var $languages = array(&#8216;en&#8217;,'de&#8217;); // L=0 =&gt; en, L=1 =&gt; de (Attention: the first is default if no defined language could be read!)<br />
var $languageForRobots = &#8216;de&#8217;; // language for visiting robot<br />
var $index2html = 0; // domain.de/page/index.html =&gt; domain.de/page.html redirect<br />
var $debugmode = 0; // enable or disable debugmode (redirect or only print of the new url)</p>
<p>// Main function for 301 redirect of old or wrong URIs<br />
function user_main($content=&#8221;, $conf=array()) {<br />
// config<br />
$newurl = &#8221;;<br />
if (($_SERVER['SCRIPT_URL'] == &#8221; || $_SERVER['SCRIPT_URL'] == &#8216;/&#8217;) &amp;&amp; strpos($_SERVER['HTTP_REFERER'],&#8217;http://&#8217;.$this-&gt;correctDomain) !== 0 &amp;&amp; $this-&gt;checkRobot == &#8221;) { // only if no manual domain like www.conject.com/index.php?id=3</p>
<p>$newurl = $this-&gt;lang_getfrombrowser($this-&gt;languages, $this-&gt;languages[0], null, false, $this-&gt;languageForRobots); // add correct domain (with language variable</p>
<p>if (!empty($newurl)) { // only if set<br />
// redirect to new domain via 301<br />
header(&#8216;HTTP/1.1 302 Found&#8217;);<br />
header(&#8216;Location: http://&#8217;.$this-&gt;correctDomain.&#8217;/&#8217;.$newurl);<br />
header(&#8216;Connection: close&#8217;);<br />
exit();<br />
}</p>
<p>}</p>
<p>return false; // always return nothing</p>
<p>}</p>
<p>// Function lang_getfrombrowser() gets the language variable<br />
function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true, $lang_robot = &#8216;de&#8217;) {</p>
<p>//if ($this-&gt;checkRobot() == false) { // no robot is visiting</p>
<p>// use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if no lang variable<br />
if ($lang_variable === null) {<br />
$lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];<br />
}</p>
<p>// are there any information<br />
if (empty($lang_variable)) {<br />
// NO? =&gt; use default lang<br />
return $default_language;<br />
}</p>
<p>// Split header<br />
$accepted_languages = preg_split(&#8216;/,\s*/&#8217;, $lang_variable);</p>
<p>// Default values<br />
$current_lang = &#8221;;<br />
$current_q = 0;</p>
<p>// One loop for every lang<br />
foreach ($accepted_languages as $accepted_language) {<br />
// Get all infos about lang<br />
$res = preg_match (&#8216;/^([a-z]{1,8}(?:-[a-z]{1,8})*)&#8217;.'(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i&#8217;, $accepted_language, $matches);</p>
<p>// Sytax correct<br />
if (!$res) {<br />
// No &#8211; so ignore<br />
continue;<br />
}</p>
<p>// Sprachcode holen und dann sofort in die Einzelteile trennen<br />
$lang_code = explode (&#8216;-&#8217;, $matches[1]);</p>
<p>// Wurde eine Qualität mitgegeben?<br />
if (isset($matches[2])) {<br />
// die Qualität benutzen<br />
$lang_quality = (float)$matches[2];<br />
} else {<br />
// Kompabilitätsmodus: Qualität 1 annehmen<br />
$lang_quality = 1.0;<br />
}</p>
<p>// Bis der Sprachcode leer ist&#8230;<br />
while (count ($lang_code)) {<br />
// mal sehen, ob der Sprachcode angeboten wird<br />
if (in_array (strtolower (join (&#8216;-&#8217;, $lang_code)), $allowed_languages)) {<br />
// Check quality<br />
if ($lang_quality &gt; $current_q) {<br />
// use this lang<br />
$l = strtolower(join (&#8216;-&#8217;, $lang_code));<br />
if ($l == $default_language)<br />
$current_lang = &#8221;;<br />
else<br />
$current_lang = $l;<br />
$current_q = $lang_quality;<br />
// Stop while loop<br />
break;<br />
}<br />
}</p>
<p>// Don&#8217;t minimalize language if in strict mode<br />
if ($strict_mode) {<br />
// stop while loop<br />
break;<br />
}</p>
<p>// deactivate right part of the language code<br />
array_pop ($lang_code);<br />
}<br />
}</p>
<p>//} else { // if robot is visiting<br />
//        $current_lang = $lang_robot; // robot language<br />
//}</p>
<p>return $current_lang;<br />
}</p>
<p>// Function checkRobot() checks if visiter is a robot<br />
function checkRobot() {<br />
$trackUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']);</p>
<p>if (stristr($trackUserAgent ,&#8221;archiver&#8221;)) $trackrobot = &#8220;Alexa&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;exabot&#8221;)) $trackrobot = &#8220;Exalead&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;fast&#8221;)) $trackrobot = &#8220;Fast&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;firefly&#8221;)) $trackrobot = &#8220;Fireball&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;googlebot&#8221;)) $trackrobot = &#8220;Google&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;msnbot&#8221;)) $trackrobot = &#8220;MSN&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;architextspider&#8221;)) $trackrobot = &#8220;Excite&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;scooter&#8221;)) $trackrobot = &#8220;Altavista&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;lycos_spider&#8221;)) $trackrobot = &#8220;Lycos&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;slurp&#8221;)) $trackrobot = &#8220;Yahoo&#8221;;</p>
<p>/* Own entries */<br />
if (stristr($trackUserAgent ,&#8221;nagios&#8221;)) $trackrobot = &#8220;Nagios&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;robot&#8221;)) $trackrobot = &#8220;Robot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;crawl&#8221;)) $trackrobot = &#8220;Crawler&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;gigabot&#8221;)) $trackrobot = &#8220;GigaBot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;echo!&#8221;)) $trackrobot = &#8220;EchO!&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;baiduspider&#8221;)) $trackrobot = &#8220;BaiDuSpider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;askjeeves&#8221;)) $trackrobot = &#8220;AskJeeves&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;turnitin&#8221;)) $trackrobot = &#8220;Turn It In&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;speedyspider&#8221;)) $trackrobot = &#8220;Speedy Spider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;bot/&#8221;)) $trackrobot = &#8220;Bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;bot-&#8221;)) $trackrobot = &#8220;Bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;psbot&#8221;)) $trackrobot = &#8220;PS Bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;thepythonrobot&#8221;)) $trackrobot = &#8220;The Python Robot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;voila&#8221;)) $trackrobot = &#8220;Voila&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;bspider&#8221;)) $trackrobot = &#8220;BSpider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;surveybot&#8221;)) $trackrobot = &#8220;SurveyBot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;grub.org&#8221;)) $trackrobot = &#8220;Grub.org&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;alexa&#8221;)) $trackrobot = &#8220;Alexa&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;arks&#8221;)) $trackrobot = &#8220;Arks&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;spider&#8221;)) $trackrobot = &#8220;Spider&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;yandex&#8221;)) $trackrobot = &#8220;Yandex bot&#8221;;<br />
if (stristr($trackUserAgent ,&#8221;holmes&#8221;)) $trackrobot = &#8220;Holmes&#8221;;<br />
/* Own entries end */</p>
<p>if ($trackrobot != &#8220;&#8221;) {<br />
return $trackrobot;<br />
} else {<br />
return &#8221;;<br />
}<br />
}</p>
<p>}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.typo3-problem.com/2009/07/17/dem-benutzer-und-den-suchmachinen-zeigen-wo-es-lang-geht/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Die Lösung mit den Sprachen &#8211; Typo3 und Mehrsprachigkeit</title>
		<link>http://www.typo3-problem.com/2009/07/12/die-losung-mit-den-sprachen-typo3-und-mehrsprachigkeit/</link>
		<comments>http://www.typo3-problem.com/2009/07/12/die-losung-mit-den-sprachen-typo3-und-mehrsprachigkeit/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 14:26:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Sprachen]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Lösung]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[typo3]]></category>
		<category><![CDATA[Typoscript]]></category>

		<guid isPermaLink="false">http://www.typo3-problem.com/?p=3</guid>
		<description><![CDATA[Man könnte denken, dass mehrere Sprachen in Typo3 einfach zu verwenden sind. Es ist ja schon vorgesorgt wurden und prinzipiell auch alles vorhanden um Sprechen in Typo3 zu verwenden. Aber es bedarf noch einiger Anpassungen, bevor alle Verlinkungen richtig gesetzt sind und die Seiten richtig angezeigt werden. Hier mal ein kleines Tutorial zu all den [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4" class="wp-caption alignright" style="width: 220px"><img class="size-full wp-image-4" title="Neuen Datensatz anlegen" src="http://www.typo3-problem.com/wp-content/uploads/2009/07/newrecord.jpg" alt="Neuen Datensatz anlegen" width="210" height="192" /><p class="wp-caption-text">Neuen Datensatz anlegen</p></div>
<p>Man könnte denken, dass mehrere Sprachen in Typo3 einfach zu verwenden sind. Es ist ja schon vorgesorgt wurden und prinzipiell auch alles vorhanden um Sprechen in Typo3 zu verwenden. Aber es bedarf noch einiger Anpassungen, bevor alle Verlinkungen richtig gesetzt sind und die Seiten richtig angezeigt werden. Hier mal ein kleines Tutorial zu all den Sachen die man beachten muss, wenn man Typo3 auf Mehrsprachigkeit trimmen will!</p>
<p>Zunächst sollte man auf der ROOT-Seite eine neue Sprache im Listen-Modul anlegen. Das sollte alles sehr einfach funktionieren und erklärt sich auch fast von selbst. Wenn der Schritt getan ist, folgt die ganze Konfiguration. Die in Typo3 natürlich über Typoscript geregelt wird. Im Template arbeitet man hier für am besten mit einer Weiche und ein paar temporären Variablen. Man erstellt also eine temporäre Variable und weißt dieser einen Standartwert für die Default-Sprache zu. In der Weiche, die nur bei einer bestimmten Sprache aufgerufen wird, ersetzt man dann die Werte in der temporären Variablen. Somit ist sichergestellt, das in der Variable auch nur das drinsteht, was für die Sprache relevant ist. Diese Variable wird dann im weiteren Typoscript der eigentlichen Variable übergeben. Hier ein Beispiel:</p>
<blockquote><p>#temporäre Variablen<br />
temp.langParam = TEXT<br />
temp.langName = TEXT</p>
<p>#Hauptsprache<br />
config {<br />
sys_language_uid = 0<br />
language = en<br />
locale_all = en_US<br />
}<br />
temp.langParam.value = &amp;L=0<br />
temp.langName.value = englisch</p>
<p>#2. Sprache<br />
#Die &#8220;1&#8243; muss mit der ID der zusatz Sprache übereinstimmen<br />
[globalVar = GP:L = 2]<br />
config {<br />
sys_language_uid = 2<br />
language = de<br />
locale_all = de_DE<br />
}<br />
temp.langParam.value = &amp;L=2<br />
temp.langName.value = deutsch<br />
[GLOBAL]</p></blockquote>
<p>Hier wird nun also in die temporären Variablen langParam und langName ein Sprachen abhängiger Wert übergeben den man später dann weiter verwenden kann. config.sys_language_uid ist im übrigen auch sehr wichtig, da dieser Wert den anderen Objekten von Typo3 (z.B. tt_content und page) mitteilt, welche Sprache sie laden müssen.</p>
<p>Um nun ein Menu zur Auswahl der Sprache zu erzeugen, muss man wieder eine temporäre Variable einfügen. Diese Variable legt man so an, dass sie gleich in das Template an einer Markerstelle eingefügt werden kann. Folgendes Typoscript benutze ich dafür.</p>
<blockquote><p>temp.langlink = COA<br />
temp.langlink {<br />
10 = TEXT<br />
10.value = &lt;img src=&#8221;fileadmin/templates/kite/img/flag_de.png&#8221; alt=&#8221;deutsch&#8221; /&gt;<br />
10.typolink.parameter.data = page:uid<br />
10.typolink.additionalParams = &amp;L=1<br />
10.typolink.ATagParams = lang=de xml:lang=de</p>
<p>20 = TEXT<br />
20.value = &lt;img src=&#8221;fileadmin/templates/kite/img/flag_eng.png&#8221; alt=&#8221;english&#8221; /&gt;<br />
20.typolink.parameter.data = page:uid<br />
20.typolink.additionalParams = &amp;L=0<br />
20.typolink.ATagParams = lang=en xml:lang=en<br />
}</p></blockquote>
<p>Durch das COA das für die Variable temp.langLink benutzt wird, können mehrere TEXT Objekte zugewiesen werden. Ich benutze in dem Fall Grafiken um auf die Sprachen zu verlinken. Diese Grafiken werden per  .value an das TEXT Objekt übergebe, um den Link zu erzeugen, benutze ich die typolink Funktion. Als Parameter übergeb ich die UID der aufgerufenen Seite (page:uid) und als adiditionalParams sag ich durch &amp;L=1 die Sprache in der die Seite angezeigt werden soll. Dabei muss die Zahl mit der UID der in Typo3 angelegten Sprache übereinstimmen. So ist sichergestellt, dass bei klick die selbe Seite aufgerufen wird, nur in der entsprechenden Sprache.</p>
<p>Weitere Tips mit der Typo3 Mehrsprachigkeit werde ich hier noch veröffentlich. Das reicht erstmal als Einleitung <img src='http://www.typo3-problem.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.typo3-problem.com/2009/07/12/die-losung-mit-den-sprachen-typo3-und-mehrsprachigkeit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

