Ich habe ein Language File dessen Inhalt ich mit folgender Funktion auslese:
echo $GLOBALS['TSFE']->sL('LLL:<filepfad>:<arraykey>');
Die Funktion ist Teil der Typo3 Klasse "tslib_fe"
Alles bestens -- solange es sich nicht um UTF-8 Zeichen handelt - die werden nämlich als ANSI-Doppelzeichen ausgegeben.
Woran kann das liegen? Das Language File ist UTF-8.
Danke für die Hife!
Gerfried
Bin etwas weiter...
Mein Problem bezieht sich auf die Sprache Tschechisch. Die Sprache ist im TS wie folgt konfiguriert:
[globalVar = GP:L = 8]
config.sys_language_uid = 8
config.language = cz
config.locale_all = cz_CZ
[global]
So! Nun gibt es in der Datei class.t3lib_cs.php ein Array namens $charSetArray, das folgende Zuordnung zeigt: 'cz' => 'windows-1250'
In der gleichen Datei wird nun in "function conv()" mein UTF-8 Input gnadenlos mittels iconv function von 'windows-1250' in 'UTF-8' umgewandelt. Nachdem meine Datei aber nicht 'windows-1250' ist, kommt nur noch Schrott am Ende raus.
Nachdem es sich bei meinem Input um ein Language File mit unterschiedlichsten Sprachen handelt, muß ich UTF-8 verwenden. Die Charset Konvertierung ist hier also fehl am Platz.
Bis dato habe ich keine Möglichkeit gefunden, dies über TS config abzuschalten.
Evtl. sollte ich die "config.language = cz" aus dem TS entfernen, aber diese Information wird in meinen Scripts verarbeitet - somit ist das nicht so einfach... wenn ich "function conv()" auskommentiere werden zwar die Texte aus dem Language File korrekt angezeigt, aber die Texte aus der DB passen nicht mehr (die wurden vermutlich auf Grund jener Ländereinstellung von Typo3 'windows-1250'-codiert in die DB gespeichert).
Vorläufiger Workaround (Verzweiflungstat):
In Datei typo3/sysext/cms/class.tslib_fe.php in "function sL($input)"
das "$this->csConv" entfernt - somit werden language Dateien nicht mehr
umcodiert.
Ich wäre wirklich für jede Hilfe sehr dankbar...
Gerfried
Hallo Gertfried,
hast Du bereits eine Lösung oder arbeitest Du immer noch mit dem Workaround?
Gruss Falco
Hallo Leute,
ich stehe auch gerade vor dem selben Problem. Ich benutze Mailformplus welche auch mittels der genannten sL Methode die Labels aus der Sprachdatei holt bzw. modifiziert. Da ich unter anderem auch russisch verwende, muß die Sprachdatei auch UTF-8 kodiert sein. Gibt es schon eine offizielle Lösung (bzw. einen ofiziellen Bug im Bugtracker) für dieses Problem. Ich habe leider noch nichts gefunden.
Gruß,
Tobias
EDIT: Der Thread ist schon älter, ich weiß. Problem besteht aber immer noch :-)
Ich arbeite noch mit dem Workaround - bin damit relativ zufrieden...
Nach einem Update von Typo3 auf 4.2.6 war alles wieder beim alten...
Meiner Meinung nach ist das von Typo3 nicht ganz zu Ende gedacht.
Hier ein Update meiner Lösung:
Datei /t3lib/class.t3lib_div.php öffnen und in function readLLPHPfile(...) folgende Änderungen durchführen:
1.) die Variable $sourceCharset mit "utf-8" überschreiben, wenn forceCharset utf-8 gesetzt ist.
2.) In der Schleife für die CS Konvertierung der Default-Sprache die betreffende Zeile auskommentieren. (Hier wird nämlich von T3 angenommen, dass die Defaultsprache IMMER Englisch ist.)
Die Funktion sieht in 4.2.6 dann so aus:
function readLLPHPfile($fileRef, $langKey, $charset='') {
if (is_object($GLOBALS['LANG'])) {
$csConvObj = &$GLOBALS['LANG']->csConvObj;
} elseif (is_object($GLOBALS['TSFE'])) {
$csConvObj = &$GLOBALS['TSFE']->csConvObj;
} else {
$csConvObj = t3lib_div::makeInstance('t3lib_cs');
}
if (@is_file($fileRef) && $langKey) {
// Set charsets:
$sourceCharset = $csConvObj->parse_charset($csConvObj->charSetArray[$langKey] ? $csConvObj->charSetArray[$langKey] : 'iso-8859-1');
if ($charset) {
$targetCharset = $csConvObj->parse_charset($charset);
} elseif ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset']) {
// when forceCharset is set, we store ALL labels in this charset!!!
$targetCharset = $csConvObj->parse_charset($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset']);
if($targetCharset=='utf-8') $sourceCharset = 'utf-8';
} else {
$targetCharset = $csConvObj->parse_charset($csConvObj->charSetArray[$langKey] ? $csConvObj->charSetArray[$langKey] : 'iso-8859-1');
}
// Cache file name:
$hashSource = substr($fileRef,strlen(PATH_site)).'|'.date('d-m-Y H:i:s',filemtime($fileRef)).'|version=2.3';
$cacheFileName = PATH_site.'typo3temp/llxml/'.
substr(basename($fileRef),10,15).
'_'.t3lib_div::shortMD5($hashSource).'.'.$langKey.'.'.$targetCharset.'.cache';
// Check if cache file exists...
if (!@is_file($cacheFileName)) { // ... if it doesn't, create content and write it:
// Get PHP data
include($fileRef);
if (!is_array($LOCAL_LANG)) {
$fileName = substr($fileRef, strlen(PATH_site));
die('\'' . $fileName . '\' is no TYPO3 language file)!');
}
// converting the default language (English)
// this needs to be done for a few accented loan words and extension names
if (is_array($LOCAL_LANG['default']) && $targetCharset != 'iso-8859-1') {
foreach ($LOCAL_LANG['default'] as &$labelValue) {
//$labelValue = $csConvObj->conv($labelValue, 'iso-8859-1', $targetCharset);
}
}
if ($langKey!='default' && is_array($LOCAL_LANG[$langKey]) && $sourceCharset!=$targetCharset) {
foreach ($LOCAL_LANG[$langKey] as &$labelValue) {
$labelValue = $csConvObj->conv($labelValue, $sourceCharset, $targetCharset);
}
}
// Cache the content now:
$serContent = array('origFile'=>$hashSource, 'LOCAL_LANG'=>array('default'=>$LOCAL_LANG['default'], $langKey=>$LOCAL_LANG[$langKey]));
$res = t3lib_div::writeFileToTypo3tempDir($cacheFileName, serialize($serContent));
if ($res) die('ERROR: '.$res);
} else {
//echo("cache from: " . $cacheFileName);
// Get content from cache:
$serContent = unserialize(t3lib_div::getUrl($cacheFileName));
$LOCAL_LANG = $serContent['LOCAL_LANG'];
}
return $LOCAL_LANG;
}
}