예제 #1
0
 function _determineLanguage($getLang = null, $redir = false, $useMainLang = false)
 {
     // set the language for JoomFish
     if (SEFTools::JoomFishInstalled()) {
         $sefConfig =& SEFConfig::getConfig();
         $registry =& JFactory::getConfig();
         // Check if the Jfrouter is enabled
         $jfrouterEnabled = JPluginHelper::isEnabled('system', 'jfrouter');
         // save the default language of the site if needed
         if (!$jfrouterEnabled) {
             $locale = $registry->getValue('config.language');
             $GLOBALS['mosConfig_defaultLang'] = $locale;
             $registry->setValue("config.defaultlang", $locale);
         }
         // get instance of JoomFishManager to obtain active language list and config values
         $jfm =& JoomFishManager::getInstance();
         // Get language from request
         if (!empty($getLang)) {
             $lang = $getLang;
         }
         // Try to get language code from JF cookie
         if ($sefConfig->jfLangCookie) {
             $jfCookie = JRequest::getVar('jfcookie', null, 'COOKIE');
             if (isset($jfCookie['lang'])) {
                 $cookieCode = $jfCookie['lang'];
             }
         }
         // Try to find language from browser settings
         if ($sefConfig->jfBrowserLang && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
             $active_iso = array();
             $active_isocountry = array();
             $active_code = array();
             $activeLanguages = $jfm->getActiveLanguages();
             if (count($activeLanguages) > 0) {
                 foreach ($activeLanguages as $alang) {
                     $active_iso[] = $alang->iso;
                     if (preg_match('/[_-]/i', $alang->iso)) {
                         $iso = str_replace('_', '-', $alang->iso);
                         $isocountry = explode('-', $iso);
                         $active_isocountry[] = $isocountry[0];
                     }
                     $active_code[] = $alang->shortcode;
                 }
                 // figure out which language to use - browser languages are based on ISO codes
                 $browserLang = explode(',', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
                 foreach ($browserLang as $blang) {
                     if (in_array($blang, $active_iso)) {
                         $client_lang = $blang;
                         break;
                     }
                     $shortLang = substr($blang, 0, 2);
                     if (in_array($shortLang, $active_isocountry)) {
                         $client_lang = $shortLang;
                         break;
                     }
                     // compare with code
                     if (in_array($shortLang, $active_code)) {
                         $client_lang = $shortLang;
                         break;
                     }
                 }
                 if (!empty($client_lang)) {
                     if (strlen($client_lang) == 2) {
                         $browserCode = SEFTools::getLangLongCode($client_lang);
                     } else {
                         $browserCode = $client_lang;
                     }
                 }
             }
         }
         if (!$jfrouterEnabled && $redir && $sefConfig->langPlacement != _COM_SEF_LANG_DOMAIN && (isset($cookieCode) || isset($browserCode)) && $sefConfig->mainLanguage != '0') {
             if (isset($cookieCode)) {
                 $sc = SEFTools::getLangCode($cookieCode);
             } else {
                 $sc = SEFTools::getLangCode($browserCode);
             }
             // Check the referer to see if we should redirect
             $shouldRedir = false;
             if (isset($_SERVER['HTTP_REFERER'])) {
                 $refUri = new JURI($_SERVER['HTTP_REFERER']);
                 $uri = JURI::getInstance();
                 $refHost = $refUri->getHost();
                 $host = $uri->getHost();
                 if ($refHost != $host) {
                     $shouldRedir = true;
                 }
             } else {
                 $shouldRedir = true;
             }
             if ($shouldRedir) {
                 if (!empty($lang) && $sc != $lang || empty($lang) && $sc != $sefConfig->mainLanguage) {
                     // Redirect to correct site
                     $mainframe =& JFactory::getApplication();
                     $href = JRoute::_('index.php?lang=' . $sc, false);
                     $mainframe->redirect($href);
                     exit;
                 }
             }
         }
         // Check if language is selected
         if (empty($lang) && !$jfrouterEnabled) {
             // If route and query string are empty, use the main language
             // note: removed  && $redir  - it was not possible to switch language to main language
             // on other page than homepage (let's see if it causes any other problem)
             // note: added $useMainLang - now it should work for both the VM checkout and using
             // main language with component's own router
             if ($useMainLang && (empty($code) || !JLanguage::exists($code))) {
                 if ($sefConfig->mainLanguage != '0') {
                     $code = SEFTools::GetLangLongCode($sefConfig->mainLanguage);
                 }
             }
             // Try to get language code from JF cookie
             if (empty($code) || !JLanguage::exists($code)) {
                 if (isset($cookieCode)) {
                     $code = $cookieCode;
                 }
             }
             // Try to get language from browser if needed
             if (empty($code) || !JLanguage::exists($code)) {
                 if (isset($browserCode)) {
                     $code = $browserCode;
                 }
             }
             // Get language from configuration if needed
             if (empty($code) || !JLanguage::exists($code)) {
                 if ($sefConfig->mainLanguage != '0') {
                     $code = SEFTools::GetLangLongCode($sefConfig->mainLanguage);
                 }
             }
             // Get default language if needed
             if (empty($code) || !JLanguage::exists($code)) {
                 $code = $registry->getValue('config.language');
             }
         }
         // get language long code if needed
         if (empty($code)) {
             if (empty($lang)) {
                 return;
             }
             $code = SEFTools::getLangLongCode($lang);
         }
         if (!empty($code)) {
             $jfrparams = $registry->getValue('jfrouter.params');
             // set the site language
             $resetLang = false;
             if ($code != SEFTools::getLangLongCode()) {
                 if (!$jfrouterEnabled || $jfrouterEnabled && $jfrparams->get('sefordomain', 'sefprefix') == 'sefprefix') {
                     $language =& JFactory::getLanguage();
                     $language->setLanguage($code);
                     $language->load();
                     // set the backward compatible language
                     $backLang = $language->getBackwardLang();
                     $GLOBALS['mosConfig_lang'] = $backLang;
                     $registry->setValue("config.lang", $backLang);
                     $resetLang = true;
                 }
             }
             // set joomfish language if needed
             if ($resetLang || !$jfrouterEnabled) {
                 $jfLang = TableJFLanguage::createByJoomla($code);
                 $registry->setValue("joomfish.language", $jfLang);
                 // set some more variables
                 $mainframe =& JFactory::getApplication();
                 $registry->setValue("config.multilingual_support", true);
                 $mainframe->setUserState('application.lang', $jfLang->code);
                 $registry->setValue("config.jflang", $jfLang->code);
                 $registry->setValue("config.lang_site", $jfLang->code);
                 $registry->setValue("config.language", $jfLang->code);
                 $registry->setValue("joomfish.language", $jfLang);
                 // overwrite global config with values from $jfLang if set to in JoomFish
                 $jfparams = JComponentHelper::getParams("com_joomfish");
                 $overwriteGlobalConfig = $jfparams->get('overwriteGlobalConfig', 0);
                 if ($overwriteGlobalConfig) {
                     // We should overwrite additional global variables based on the language parameter configuration
                     $langParams = new JParameter($jfLang->params);
                     $paramarray = $langParams->toArray();
                     foreach ($paramarray as $key => $val) {
                         $registry->setValue("config." . $key, $val);
                         if (defined("_JLEGACY")) {
                             $name = 'mosConfig_' . $key;
                             $GLOBALS[$name] = $val;
                         }
                     }
                 }
                 // set the cookie with language
                 if (!$jfrouterEnabled && $sefConfig->jfLangCookie || $jfrouterEnabled && $jfrparams->get('enableCookie', 1)) {
                     setcookie("lang", "", time() - 1800, "/");
                     setcookie("jfcookie", "", time() - 1800, "/");
                     setcookie("jfcookie[lang]", $code, time() + 24 * 3600, '/');
                 }
             }
         }
     }
 }