Index: t3lib/class.t3lib_befunc.php =================================================================== --- t3lib/class.t3lib_befunc.php (Revision 105) +++ t3lib/class.t3lib_befunc.php (Revision 110) @@ -807,6 +807,59 @@ return $sysLanguages; } + + /** + * + * Note: doesn't respect the q=-rating by now. Should perhaps be implemented + * + * @param boolean Include lang-variants as en-us or de-de? + * @return array All languages accepted by the user's browser, in order in which they appear in _SERVER[HTTP_ACCEPT_LANGUAGES] + */ + function getBrowserAcceptLanguages($includeSubLanguages = false) { + $langs_tmp = t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE'); + $tmp_arr = t3lib_div::trimExplode(',', $langs_tmp, true); + + $langs = array(); + foreach ($tmp_arr as $langstring) { + if (strpos($langstring, ';') > 0) { + $lang = substr($langstring, 0, strpos($langstring, ';')); + } else { + $lang = $langstring; + } + + if (strlen($lang) > 0) { + if (!$includeSubLanguages && substr_count($lang, '-') > 0) { + $lang = substr($lang, 0, 2); + } + if (!in_array($lang, $langs)) { + $langs[] = $lang; + } + } + } + + return $langs; + } + + /** + * Returns the available backend-languages (checks for the language-keys in typo3conf/l10n/ + * + * @return array The available languages + */ + function getAvailableBELanguages() { + global $LANG; + + $lang = array(); + + $theLanguages = t3lib_div::trimExplode('|',TYPO3_languages); + foreach($theLanguages as $val) { + if ($val != 'default' && !@is_dir(PATH_typo3conf.'l10n/'.$val)) { + continue; + } + + $lang[$val] = $LANG->sL('LLL:EXT:setup/mod/locallang.xml:lang_'.$val); + } + return $lang; + } /** * Returns a page record (of page with $id) with an extra field "_thePath" set to the record path IF the WHERE clause, $perms_clause, selects the record. Thus is works as an access check that returns a page record if access was granted, otherwise not. Index: t3lib/class.t3lib_div.php =================================================================== --- t3lib/class.t3lib_div.php (Revision 105) +++ t3lib/class.t3lib_div.php (Revision 110) @@ -1474,6 +1474,21 @@ function uniqueArray($valueArray) { return array_unique($valueArray); } + + /** + * Returns the key of a value in a given array. + * + * @param array Array containing the values + * @param string Value to search for and if found return its key. + * @return string/int The key of the value in the array + */ + function getArrayKeyForValue($array,$cmpValue) { + foreach ($array as $k=>$v) { + if ($v == $cmpValue) { + return $k; + } + } + } /** * Removes the value $cmpValue from the $array if found there. Returns the modified array Index: typo3/index.php =================================================================== --- typo3/index.php (Revision 105) +++ typo3/index.php (Revision 110) @@ -290,35 +283,46 @@ * @return string HTML output */ function makeLoginForm() { + global $LANG, $LOCAL_LANG, $TYPO3_CONF_VARS; + // output the language-selector-menu + $lang = t3lib_BEfunc::getAvailableBELanguages(); + asort($lang); + + $content .= '
'; + Index: typo3/template.php =================================================================== --- typo3/template.php (Revision 105) +++ typo3/template.php (Revision 110) @@ -2112,7 +2112,14 @@ // ****************************************************** require_once(PATH_typo3.'sysext/lang/lang.php'); $LANG = t3lib_div::makeInstance('language'); -$LANG->init($BE_USER->uc['lang']); +if ($BE_USER->uid) { + $LANG->init($BE_USER->uc['lang']); +} elseif (t3lib_div::_GP('lang') != '' && strpos(TYPO3_languages, t3lib_div::_GP('lang')) !== false) { + $LANG->init(t3lib_div::_GP('lang')); +} else { + $langs = t3lib_BEfunc::getBrowserAcceptLanguages(); + $LANG->init($langs); +} Index: typo3/sysext/lang/lang.php =================================================================== --- typo3/sysext/lang/lang.php (Revision 105) +++ typo3/sysext/lang/lang.php (Revision 110) @@ -136,6 +136,10 @@ * @return void */ function init($lang,$altPath='') { + + if (!is_array($lang)) { + $lang = array($lang); + } // Initialize the conversion object: $this->csConvObj = t3lib_div::makeInstance('t3lib_cs'); @@ -146,12 +150,21 @@ // Finding the requested language in this list based on the $lang key being inputted to this function. $ls = explode('|',$this->langSplit); - while(list($i,$v)=each($ls)) { - if ($v==$lang) { // Language is found. Configure it: - $this->langSplitIndex=$i; // The index of the language as found in the TYPO3_languages list - $this->lang = $lang; // The current language key + foreach ($lang as $l) { + if ($l == 'en') { + $l = 'default'; + } + // if this language is not available, proceed with the next + if ($l != 'default' && !@is_dir(PATH_typo3conf.'l10n/'.$l)) { + continue; + } + + if (in_array($l, $ls)) { // Language is found. Configure it: + $this->langSplitIndex=t3lib_div::getArrayKeyForValue($ls, $l); // The index of the language as found in the TYPO3_languages list + $this->lang = $l; // The current language key if ($this->helpUrlArray[$this->lang]) $this->typo3_help_url=$this->helpUrlArray[$this->lang]; // The help URL if different from the default. if ($this->charSetArray[$this->lang]) $this->charSet=$this->charSetArray[$this->lang]; // The charset if different from the default. + break; } }