Index: t3lib/config_default.php =================================================================== --- t3lib/config_default.php (Revision 5563) +++ t3lib/config_default.php (Arbeitskopie) @@ -224,7 +224,7 @@ 'fileDenyPattern' => FILE_DENY_PATTERN_DEFAULT , // A perl-compatible regular expression (without delimiters!) that - if it matches a filename - will deny the file upload/rename or whatever in the webspace. For security reasons, files with multiple extensions have to be denied on an Apache environment with mod_alias, if the filename contains a valid php handler in an arbitary position. Also, ".htaccess" files have to be denied. Matching is done case-insensitive. Default value is stored in constant FILE_DENY_PATTERN_DEFAULT 'interfaces' => 'backend', // This determines which interface options is available in the login prompt and in which order (All options: ",backend,backend_old,frontend") 'useOnContextMenuHandler' => 1, // Boolean. If set, the context menus (clickmenus) in the backend are activated on right-click - although this is not a XHTML attribute! - 'loginLabels' => 'Username|Password|Interface|Log In|Log Out|Backend,Front End,Traditional Backend|Administration Login on ###SITENAME###|(Note: Cookies and JavaScript must be enabled!)|Important Messages:|Your login attempt did not succeed. Make sure to spell your username and password correctly, including upper/lowercase characters.', // Language labels of the login prompt. + 'loginLabels' => 'Username|Password|Interface|Log In|Log Out|Backend,Front End,Traditional Backend|Administration Login on ###SITENAME###|(Note: Cookies and JavaScript must be enabled!)|Important Messages:|Your login attempt did not succeed. Make sure to spell your username and password correctly, including upper/lowercase characters.', // Language labels of the login prompt., not used properly anymore, as the login screen is translateable now, see EXT:lang/locallang_login.xml for the used labels 'loginNews' => array(), // In this array you can define news-items for the login screen. To this array, add arrays with assoc keys 'date', 'header', 'content' (HTML content) and for those appropriate value pairs 'loginNewsTitle' => '', // Define alternative header message for the LoginNews. If this var is empty, the default header "Important messages:" is displayed. 'XLLfile' => Array(), // For extension/overriding of the arrays in 'locallang' files in the backend. See 'Inside TYPO3' for more information. Index: typo3/index.php =================================================================== --- typo3/index.php (Revision 5563) +++ typo3/index.php (Arbeitskopie) @@ -60,8 +60,8 @@ define('TYPO3_PROCEED_IF_NO_USER', 1); -require ('init.php'); -require ('template.php'); +require('init.php'); +require('template.php'); @@ -97,7 +97,7 @@ // Internal, static: var $redirectToURL; // Set to the redirect URL of the form (may be redirect_url or "backend.php") - var $L_vars; // Set to the labels used for the login screen. + var $L_vars; // Set to the labels used for the login screen. Deprecated, as the login labels are now translatable via $LANG and EXT:lang/locallang_login.xml // Internal, dynamic: var $content; // Content accumulation @@ -119,7 +119,7 @@ * @return void */ function init() { - // We need a PHP session session for most login levels + // We need a PHP session session for most login levels session_start(); $this->redirect_url = t3lib_div::_GP('redirect_url'); @@ -145,17 +145,27 @@ $this->loginSecurityLevel = $GLOBALS['TYPO3_CONF_VARS']['BE']['loginSecurityLevel']; } - // Getting login labels - $this->L_vars = explode('|', $GLOBALS['TYPO3_CONF_VARS']['BE']['loginLabels']); + // getting the login labels from the lang object, if there is a different available, + // we need to set the language object first as well + list($preferredBrowserLanguage) = explode(',', t3lib_div::getIndpEnv('HTTP_ACCEPT_LANGUAGE')); + $preferredBrowserLanguage = substr($preferredBrowserLanguage, 0, 2); + if (!$BE_USER->user['uid'] && $GLOBALS['LANG']->lang == 'default' && strlen($preferredBrowserLanguage) > 0 && $preferredBrowserLanguage != 'en') { + $GLOBALS['LANG']->init($preferredBrowserLanguage); + } + $GLOBALS['LANG']->includeLLFile('EXT:lang/locallang_login.xml'); + // for backwards-compatibility, see if there is a change in the old labels (and then we need to merge them) + $this->mergeOldLoginLabels(); + // Setting the redirect URL to "backend.php" if no alternative input is given - $this->redirectToURL = $this->redirect_url ? $this->redirect_url : 'backend.php'; + $this->redirectToURL = ($this->redirect_url ? $this->redirect_url : 'backend.php'); + // Do a logout if the command is set if ($this->L == 'OUT' && is_object($GLOBALS['BE_USER'])) { $GLOBALS['BE_USER']->logoff(); if ($this->redirect_url) { - header('Location: '.t3lib_div::locationHeaderUrl($this->redirect_url)); + t3lib_div::redirect($this->redirect_url); } exit; } @@ -184,9 +194,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']) { $TBE_TEMPLATE->form = $this->startForm(); @@ -235,33 +242,24 @@ function makeLoginForm() { $content = t3lib_parsehtml::getSubpart($GLOBALS['TBE_TEMPLATE']->moduleTemplate, '###LOGIN_FORM###'); $markers = array( - 'HEADLINE' => $this->L_vars[6], - 'LABEL_USERNAME' => $this->L_vars[0], - 'LABEL_PASSWORD' => $this->L_vars[1], - 'VALUE_USERNAME' => $this->u, - 'VALUE_PASSWORD' => $this->p, - 'VALUE_SUBMIT' => $this->L_vars[3], - 'INFO' => $this->L_vars[7], + 'VALUE_USERNAME' => htmlspecialchars($this->u), + 'VALUE_PASSWORD' => htmlspecialchars($this->p), + 'VALUE_SUBMIT' => $GLOBALS['LANG']->getLL('labels.submitLogin', true), ); - // show an error message if the login command was successful already + // show an error message if the login command was successful already, otherwise remove the subpart if (!$this->commandLI) { $content = t3lib_parsehtml::substituteSubpart($content, '###LOGIN_ERROR###', ''); } else { - $markers['ERROR_MESSAGE'] = $this->L_vars[9]; + $markers['ERROR_MESSAGE'] = $GLOBALS['LANG']->getLL('error.login', true); } - // HSC all output - foreach ($markers as &$marker) { - $marker = htmlspecialchars($marker); - } - // remove the interface selector markers if it's not available if (!($this->interfaceSelector && !$this->loginRefresh)) { $content = t3lib_parsehtml::substituteSubpart($content, '###INTERFACE_SELECTOR###', ''); } else { - $markers['LABEL_INTERFACE'] = htmlspecialchars($this->L_vars[2]); + $markers['LABEL_INTERFACE'] = $GLOBALS['LANG']->getLL('labels.interface', true); $markers['VALUE_INTERFACE'] = $this->interfaceSelector_jump; } @@ -278,23 +276,16 @@ function makeLogoutForm() { $content = t3lib_parsehtml::getSubpart($GLOBALS['TBE_TEMPLATE']->moduleTemplate, '###LOGOUT_FORM###'); $markers = array( - 'HEADLINE' => $this->L_vars[6], - 'LABEL_USERNAME' => $this->L_vars[0], - 'VALUE_USERNAME' => $GLOBALS['BE_USER']->user['username'], - 'VALUE_SUBMIT' => $this->L_vars[4], - 'INFO' => $this->L_vars[7], + 'LABEL_USERNAME' => $GLOBALS['LANG']->getLL('labels.username', true), + 'VALUE_USERNAME' => htmlspecialchars($GLOBALS['BE_USER']->user['username']), + 'VALUE_SUBMIT' => $GLOBALS['LANG']->getLL('labels.submitLogout', true), ); - // HSC all output - foreach ($markers as &$marker) { - $marker = htmlspecialchars($marker); - } - // remove the interface selector markers if it's not available if (!$this->interfaceSelector_jump) { $content = t3lib_parsehtml::substituteSubpart($content, '###INTERFACE_SELECTOR###', ''); } else { - $markers['LABEL_INTERFACE'] = htmlspecialchars($this->L_vars[2]); + $markers['LABEL_INTERFACE'] = $GLOBALS['LANG']->getLL('labels.interface', true); $markers['VALUE_INTERFACE'] = $this->interfaceSelector_jump; } @@ -318,12 +309,25 @@ } $markers = array( - 'LOGO' => $logo, - 'LOGINBOX_IMAGE' => $this->makeLoginBoxImage(), - 'FORM' => $content, - 'NEWS' => $this->makeLoginNews(), - 'COPYRIGHT' => $this->makeCopyrightNotice(), - 'CSS_ERRORCLASS' => ($this->commandLI ? ' class="error"' : ''), + 'LOGO' => $logo, + 'LOGINBOX_IMAGE' => $this->makeLoginBoxImage(), + 'FORM' => $content, + 'NEWS' => $this->makeLoginNews(), + 'COPYRIGHT' => $this->makeCopyrightNotice(), + 'CSS_ERRORCLASS' => ($this->commandLI ? ' class="error"' : ''), + + // the labels will be replaced later on, thus the other parts above + // can use these markers as well and it will be replaced + 'HEADLINE' => $GLOBALS['LANG']->getLL('headline', true), + 'INFO' => $GLOBALS['LANG']->getLL('info.jscookies', true), + 'ERROR_JAVASCRIPT' => $GLOBALS['LANG']->getLL('error.javascript', true), + 'ERROR_COOKIES' => $GLOBALS['LANG']->getLL('error.cookies', true), + 'LABEL_DONATELINK' => $GLOBALS['LANG']->getLL('labels.donate', true), + 'LABEL_USERNAME' => $GLOBALS['LANG']->getLL('labels.username', true), + 'LABEL_PASSWORD' => $GLOBALS['LANG']->getLL('labels.password', true), + + // global variables will now be replaced (at last) + 'SITENAME' => $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] ); return t3lib_parsehtml::substituteMarkerArray($mainContent, $markers, '###|###'); } @@ -413,7 +417,7 @@ if (count($parts)>1) { // Only if more than one interface is defined will we show the selector: // Initialize: - $tempLabels=explode(',', $this->L_vars[5]); + $tempLabels = t3lib_div::trimExplode(',', $GLOBALS['LANG']->getLL('availableInterfaces')); $labels=array(); $labels['backend'] = $tempLabels[0]; @@ -550,7 +554,7 @@ $newsContent .= '
'.trim($newsItem['content']).'
'; } - $title = $GLOBALS['TYPO3_CONF_VARS']['BE']['loginNewsTitle'] ? htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['BE']['loginNewsTitle']) : htmlspecialchars($this->L_vars[8]); + $title = ($GLOBALS['TYPO3_CONF_VARS']['BE']['loginNewsTitle'] ? htmlspecialchars($GLOBALS['TYPO3_CONF_VARS']['BE']['loginNewsTitle']) : $GLOBALS['LANG']->getLL('newsheadline', true)); // Wrap $newsContent = ' @@ -656,6 +660,52 @@ return $JSCode; } + + + /** + * Checks if the value in $GLOBALS['TYPO3_CONF_VARS']['BE']['loginLabels'] is different + * than the default login labels (which are now deprecated) + * If so, this means that the installation has custom labels. Thus, we want to keep this + * and override the labels in $LOCAL_LANG with the + * + * This method keeps backwards compatibility, if you modified your + * labels with the TYPO3_CONF_VARS variable before, we recommend that you use + * the override of the LLfile itself to modify the labels + * + * @return void + */ + protected function mergeOldLoginLabels() { + // Getting login labels + $oldLoginLabels = trim($GLOBALS['TYPO3_CONF_VARS']['BE']['loginLabels']); + // not used anymore + $this->L_vars = explode('|', $oldLoginLabels); + // this list is taken from t3lib/config_default.php so it can be checked against + // the one in the localconf.php to see if there were any custom modifications made + // for this installation. If so, we need to merge the changes + $defaultOldLabels = 'Username|Password|Interface|Log In|Log Out|Backend,Front End,Traditional Backend|Administration Login on ###SITENAME###|(Note: Cookies and JavaScript must be enabled!)|Important Messages:|Your login attempt did not succeed. Make sure to spell your username and password correctly, including upper/lowercase characters.'; + if (strlen($oldLoginLabels) > 0 && $oldLoginLabels != $defaultOldLoginLabels) { + $oldLoginLabelArray = $this->L_vars; + $overrideLabelKeys = array( + 'labels.username' => $oldLoginLabelArray[0], + 'labels.password' => $oldLoginLabelArray[1], + 'labels.interface' => $oldLoginLabelArray[2], + 'labels.submitLogin' => $oldLoginLabelArray[3], + 'labels.submitLogout' => $oldLoginLabelArray[4], + 'availableInterfaces' => $oldLoginLabelArray[5], + 'headline' => $oldLoginLabelArray[6], + 'info.jscookies' => $oldLoginLabelArray[7], + 'newsheadline' => $oldLoginLabelArray[8], + 'error.login' => $oldLoginLabelArray[9], + ); + if (!is_array($GLOBALS['LOCAL_LANG'][$GLOBALS['LANG']->lang])) { + $GLOBALS['LOCAL_LANG'][$GLOBALS['LANG']->lang] = array(); + } + // now override the labels from the LOCAL_LANG with the TYPO3_CONF_VARS + foreach ($overrideLabelKeys as $labelKey => $label) { + $GLOBALS['LOCAL_LANG'][$GLOBALS['LANG']->lang][$labelKey] = $GLOBALS['LOCAL_LANG']['default'][$labelKey] = $label; + } + } + } } Index: typo3/sysext/lang/locallang_login.xml =================================================================== --- typo3/sysext/lang/locallang_login.xml (Revision 0) +++ typo3/sysext/lang/locallang_login.xml (Revision 0) @@ -0,0 +1,23 @@ + + + + Labels for the Login screen + module + + + + + + + + + + + + + + + + + + \ No newline at end of file