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) @@ -97,7 +97,6 @@ // Internal, static: var $redirectToURL; // Set to the redirect URL of the form (may be redirect_url or "alt_main.php") - var $L_vars; // Set to the labels used for the login screen. // Internal, dynamic: var $content; // Content accumulation @@ -137,9 +136,6 @@ $this->loginSecurityLevel = $TYPO3_CONF_VARS['BE']['loginSecurityLevel']; } - // Getting login labels: - $this->L_vars = explode('|',$TYPO3_CONF_VARS['BE']['loginLabels']); - // Setting the redirect URL to "alt_main.php" if no alternative input is given: $this->redirectToURL = $this->redirect_url ? $this->redirect_url : 'alt_main.php'; @@ -188,9 +184,6 @@ // Initialize interface selectors: $this->makeInterfaceSelectorBox(); - // Replace an optional marker in the "Administration Login" label - $this->L_vars[6] = str_replace("###SITENAME###",$TYPO3_CONF_VARS['SYS']['sitename'],$this->L_vars[6]); - // Creating form based on whether there is a login or not: if (!$BE_USER->user['uid']) { @@ -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 .= '
'; + // There must be no white-spaces outside of the tags (needed for buggy IE) $content.= ' - + '.($this->commandLI ? ' - + ' : '').' - + - + '.($this->interfaceSelector && !$this->loginRefresh ? ' - + ' : '' ).' - + - +

'.htmlspecialchars($this->L_vars[6]).'

'.htmlspecialchars(sprintf($LANG->sL('LLL:EXT:lang/locallang_core.php:loginscreen.headline'), $TYPO3_CONF_VARS['SYS']['sitename'])).'

'.htmlspecialchars($this->L_vars[9]).'

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:loginscreen.noteLoginUnsuccessful')).'

'.htmlspecialchars($this->L_vars[0]).':

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:labels.username')).':

'.htmlspecialchars($this->L_vars[1]).':

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:labels.password')).':

'.htmlspecialchars($this->L_vars[2]).':

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:labels.interface')).':

'.$this->interfaceSelector.'

'.htmlspecialchars($this->L_vars[7]).'

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:loginscreen.noteCookies')).'

'; @@ -333,7 +337,7 @@ * @return string HTML output */ function makeLogoutForm() { - global $BE_USER; + global $BE_USER, $TYPO3_CONF_VARS, $LANG; $content.=' @@ -344,23 +348,23 @@ - + - + '.($this->interfaceSelector_jump ? ' - + ' : '' ).' - + - +

'.htmlspecialchars($this->L_vars[6]).'

'.htmlspecialchars(sprintf($LANG->sL('LLL:EXT:lang/locallang_core.php:loginscreen.headline'), $TYPO3_CONF_VARS['SYS']['sitename'])).'

'.htmlspecialchars($this->L_vars[0]).':

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.username')).':

'.htmlspecialchars($BE_USER->user['username']).'

'.htmlspecialchars($this->L_vars[2]).':

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:labels.interface')).':

'.$this->interfaceSelector_jump.'

'.htmlspecialchars($this->L_vars[7]).'

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.php:loginscreen.noteCookies')).'

'; @@ -491,7 +495,7 @@ * @return void */ function makeInterfaceSelectorBox() { - global $TYPO3_CONF_VARS; + global $TYPO3_CONF_VARS,$LANG; // Reset variables: $this->interfaceSelector = ''; @@ -504,10 +508,8 @@ if (count($parts)>1) { // Only if more than one interface is defined will we show the selector: // Initialize: - $tempLabels=explode(',',$this->L_vars[5]); - $labels=array(); - $labels['backend']=$tempLabels[0]; - $labels['frontend']=$tempLabels[1]; + $labels['backend']=$LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.interfaces.backend'); + $labels['frontend']=$LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.interfaces.frontend'); $jumpScript=array(); $jumpScript['backend']='alt_main.php'; @@ -545,6 +547,7 @@ * @return string Text/Image (HTML) for copyright notice. */ function makeCopyrightNotice() { + global $LANG; // Get values from TYPO3_CONF_VARS: $loginCopyrightWarrantyProvider = strip_tags(trim($GLOBALS['TYPO3_CONF_VARS']['SYS']['loginCopyrightWarrantyProvider'])); @@ -552,21 +555,20 @@ // Make warranty note: if (strlen($loginCopyrightWarrantyProvider)>=2 && strlen($loginCopyrightWarrantyURL)>=10) { - $warrantyNote='Warranty is supplied by '.htmlspecialchars($loginCopyrightWarrantyProvider).'; click for details.'; + $warrantyNote=sprintf($LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.warrantyProvidedBy'), htmlspecialchars($loginCopyrightWarrantyProvider)).'; '.$LANG->sL('LLL:EXT:lang/locallang_core.xml:labels.clickfordetails').'.'; } else { - $warrantyNote='TYPO3 comes with ABSOLUTELY NO WARRANTY; click for details.'; + $warrantyNote=$LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.warranty').'; '.$LANG->sL('LLL:EXT:lang/locallang_core.xml:labels.clickfordetails').'.'; } - // Compile full copyright notice: + // Compile full copyright notice: $copyrightNotice = ''. 'TYPO3 logo'. - 'TYPO3 CMS'.($GLOBALS['TYPO3_CONF_VARS']['SYS']['loginCopyrightShowVersion']?' ver. '.htmlspecialchars($GLOBALS['TYPO_VERSION']):''). - '. '. - 'Copyright © '.TYPO3_copyright_year.' Kasper Skårhøj. Extensions are copyright of their respective owners. '. - 'Go to http://typo3.com/ for details. '. + 'TYPO3 CMS'.($GLOBALS['TYPO3_CONF_VARS']['SYS']['loginCopyrightShowVersion']?' ver. '.htmlspecialchars($GLOBALS['TYPO_VERSION']):'').'. Copyright © '.TYPO3_copyright_year.' Kasper Skårhøj. '. + sprintf($LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.copyrightExtensions'), 'http://typo3.com/').' '. $warrantyNote.' '. - 'This is free software, and you are welcome to redistribute it under certain conditions; click for details. '. - 'Obstructing the appearance of this notice is prohibited by law.'; + $LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.freeSoftware').'; '. + ''.$LANG->sL('LLL:EXT:lang/locallang_core.xml:labels.clickfordetails').'. '. + $LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.obstructingNotice').'.'; // Return notice: return $copyrightNotice; @@ -626,6 +628,7 @@ * @credits Idea by Jan-Hendrik Heuing */ function makeLoginNews() { + global $LANG; // Reset output variable: $newsContent= ''; @@ -655,7 +658,7 @@ Login screen news: -->
-

'.htmlspecialchars($this->L_vars[8]).'

+

'.htmlspecialchars($LANG->sL('LLL:EXT:lang/locallang_core.xml:loginscreen.newsHeadline')).':

'.$newsContent.'
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/locallang_core.xml =================================================================== --- typo3/sysext/lang/locallang_core.xml (Revision 105) +++ typo3/sysext/lang/locallang_core.xml (Revision 110) @@ -87,6 +87,10 @@ + + + + @@ -150,7 +154,8 @@ - + + @@ -184,6 +189,21 @@ + + + + + + + + + + + - + + + + + \ Kein Zeilenvorschub am Ende der Datei 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; } }