function shSetJfLanguage($requestlang) { if (empty($requestlang)) { return; } // get instance of JoomFishManager to obtain active language list and config values $jfm =& JoomFishManager::getInstance(); $activeLanguages = $jfm->getActiveLanguages(); // get the name of the language file for joomla $jfLang = TableJFLanguage::createByShortcode($requestlang, true); // set Joomfish stuff // Get the global configuration object global $mainframe; $registry =& JFactory::getConfig(); $params = $registry->getValue("jfrouter.params"); $enableCookie = empty($params) ? 1 : $params->get('enableCookie', 1); if ($enableCookie) { setcookie("lang", "", time() - 1800, "/"); setcookie("jfcookie", "", time() - 1800, "/"); setcookie("jfcookie[lang]", $jfLang->shortcode, time() + 24 * 3600, '/'); } $GLOBALS['iso_client_lang'] = $jfLang->shortcode; $GLOBALS['mosConfig_lang'] = $jfLang->code; $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); // Force factory static instance to be updated if necessary $lang =& JFactory::getLanguage(); if ($jfLang->code != $lang->getTag()) { $lang = JFactory::_createLanguage(); } $lang16 =& shjlang16Helper::getLanguage(); if ($jfLang->code != $lang16->getTag()) { $lang16 = Jlanguage16::createLanguage(); } // overwrite with the valued from $jfLang $params = new JParameter($jfLang->params); $paramarray = $params->toArray(); foreach ($paramarray as $key => $val) { $registry->setValue("config." . $key, $val); if (defined("_JLEGACY")) { $name = 'mosConfig_' . $key; $GLOBALS[$name] = $val; } } // set our own data $GLOBALS['shMosConfig_lang'] = $lang->get('backwardlang', 'english'); $GLOBALS['shMosConfig_locale'] = $jfLang->code; $GLOBALS['shMosConfig_shortcode'] = $jfLang->shortcode; }
function _parseSefRoute(&$uri) { $vars = array(); _log('_parseSefRoute, parsing _uri ' . $uri->_uri); _log('_parseSefRoute, parsing _host ' . $uri->_host); _log('_parseSefRoute, parsing _path ' . $uri->_path); include JPATH_ROOT . DS . 'components' . DS . 'com_sh404sef' . DS . 'sh404sef.inc.php'; if (shIsMultilingual() == 'joomfish') { $currentLangShortCode = $GLOBALS['shMosConfig_shortcode']; $conf =& JFactory::getConfig(); $configDefaultLanguage = $conf->getValue('config.language'); $tmp = explode('-', str_replace('_', '-', $configDefaultLanguage)); $defaultLangShortCode = $tmp[0]; } else { $currentLang = ''; } $jMenu = null; $shMenu = null; // set active menu if changed if (!empty($vars['Itemid'])) { $newItemid = intval($vars['Itemid']); if (!empty($newItemid)) { $jMenu =& JSite::getMenu(); $jMenu->setActive($newItemid); $shMenu =& shRouter::shGetMenu(); $shMenu->setActive($newItemid); } } //Set the variables $this->setVars($vars); // set language again, as Joomfish may have set it according to user cookie if (shIsMultilingual() == 'joomfish' && !empty($vars['lang']) && $vars['lang'] != $currentLangShortCode) { JRequest::setVar('lang', $vars['lang']); // we also need to fix the main menu, as joomfish has set it to the wrong language if (empty($shMenu) || empty($shMenu)) { $jMenu =& JSite::getMenu(); $shMenu =& shRouter::shGetMenu(); } $sefLang = TableJFLanguage::createByShortcode($vars['lang'], false); $jMenu->_items = shGetJFMenu($sefLang->code, false, $jMenu->_items); $shMenu->_items = shGetJFMenu($sefLang->code, false, $shMenu->_items); // and finally we can set new joomfish language shSetJfLanguage($vars['lang']); } // last fix is to remove the home flag if other than default language if (shIsMultilingual() == 'joomfish' && !empty($vars['lang']) && $vars['lang'] != $defaultLangShortCode) { if (empty($shMenu) || empty($shMenu)) { $jMenu =& JSite::getMenu(); $shMenu =& shRouter::shGetMenu(); } $jDefaultItem =& $jMenu->getDefault(); $jDefaultItem->home = 0; $shDefaultItem =& $shMenu->getDefault(); $shDefaultItem->home = 0; } // and finally we can set new joomfish language if (shIsMultilingual() == 'joomfish' && !empty($vars['lang']) && $vars['lang'] != $currentLangShortCode) { shSetJfLanguage($vars['lang']); } // real last fix is to fix the $uri object, which Joomfish broke as it intended the path to be // parsed by Joomla router, not ours if (shIsMultilingual() == 'joomfish') { $myUri =& JURI::getInstance(); // fix the path if (!empty($sefConfig->shRewriteMode)) { $rewriteBit = JString::rtrim($sefConfig->shRewriteStrings[$sefConfig->shRewriteMode], '/'); } else { $rewriteBit = ''; } $path = rtrim($shPageInfo->base, '/') . $rewriteBit . $shPageInfo->shCurrentPagePath; $myUri->setPath($path); // remove the lang query that JF added to $uri $myUri->delVar('lang'); } return $vars; }
function _discoverJFLanguage() { static $discovered; if (isset($discovered) && $discovered) { return; } $discovered = true; $registry = JFactory::getConfig(); // Find language without loading strings $locale = $registry->getValue('config.language'); // Attention - we need to access the site default values // #12943 explains that a user might overwrite the orignial settings based on his own profile $langparams = JComponentHelper::getParams('com_languages'); $defLanguage = $langparams->get("site"); $registry->setValue("config.defaultlang", isset($defLanguage) && $defLanguage != '' ? $defLanguage : $locale); // get params from registry in case function called statically $params = $registry->getValue("jfrouter.params"); $determitLanguage = $params->get('determitLanguage', 1); $newVisitorAction = $params->get('newVisitorAction', 'browser'); $use302redirect = $params->get('use302redirect', 0); $enableCookie = $params->get('enableCookie', 1); // get instance of JoomFishManager to obtain active language list and config values $jfm = JoomFishManager::getInstance(); $client_lang = ''; $lang_known = false; $jfcookie = JRequest::getVar('jfcookie', null, "COOKIE"); if (isset($jfcookie["lang"]) && $jfcookie["lang"] != "") { $client_lang = $jfcookie["lang"]; $lang_known = true; } $uri = JURI::getInstance(); if ($requestlang = JRequest::getVar('lang', null, "REQUEST")) { if ($requestlang != '') { $client_lang = $requestlang; $lang_known = true; } } // no language choosen - Test plugin e.g. IP lookup tool if (!$lang_known) { // setup Joomfish pluginds $dispatcher = JDispatcher::getInstance(); $iplang = ""; JPluginHelper::importPlugin('joomfish'); $dispatcher->trigger('onDiscoverLanguage', array(&$iplang)); if ($iplang != "") { $client_lang = $iplang; $lang_known = true; } } if (!$lang_known && $determitLanguage && key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER) && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { switch ($newVisitorAction) { // usesing the first defined Joom!Fish language case 'joomfish': $activeLanguages = $jfm->getActiveLanguages(); reset($activeLanguages); $first = key($activeLanguages); $client_lang = $activeLanguages[$first]->getLanguageCode(); break; case 'site': // We accept that this default locale might be overwritten by user settings! $jfLang = TableJFLanguage::createByJoomla($locale); $client_lang = $jfLang->getLanguageCode(); break; // no language chooses - assume from browser configuration // no language chooses - assume from browser configuration case 'browser': default: // language negotiation by Kochin Chang, June 16, 2004 // retrieve active languages from database $active_iso = array(); $active_isocountry = array(); $active_code = array(); $activeLanguages = $jfm->getActiveLanguages(); if (count($activeLanguages) == 0) { return; } foreach ($activeLanguages as $alang) { $active_iso[] = $alang->iso; if (preg_match('/[_-]/i', $alang->iso)) { $isocountry = preg_split('[_-]', $alang->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; } } break; } } // get the name of the language file for joomla $jfLang = TableJFLanguage::createByShortcode($client_lang, false); if ($jfLang === null && $client_lang != "") { $jfLang = TableJFLanguage::createByISO($client_lang, false); } else { if ($jfLang === null) { $jfLang = TableJFLanguage::createByJoomla($locale); } } if (!$lang_known && $use302redirect) { // using a 302 redirect means that we do not change the language on the fly the first time, but with a clean reload of the page $href = "index.php"; $hrefVars = ''; $queryString = JRequest::getVar('QUERY_STRING', null, "SERVER"); if (!empty($queryString)) { $vars = explode("&", $queryString); if (count($vars) > 0 && $queryString) { foreach ($vars as $var) { if (preg_match('/=/i', $var)) { list($key, $value) = explode("=", $var); if ($key != "lang") { if ($hrefVars != "") { $hrefVars .= "&"; } // ignore mosmsg to ensure it is visible in frontend if ($key != 'mosmsg') { $hrefVars .= "{$key}={$value}"; } } } } } } // Add the existing variables if ($hrefVars != "") { $href .= '?' . $hrefVars; } if ($jfLang->getLanguageCode() != null) { $ulang = 'lang=' . $jfLang->getLanguageCode(); } else { // it's important that we add at least the basic parameter - as of the sef is adding the actual otherwise! $ulang = 'lang='; } // if there are other vars we need to add a & otherwiese ? if ($hrefVars == '') { $href .= '?' . $ulang; } else { $href .= '&' . $ulang; } $registry->setValue("config.multilingual_support", true); global $mainframe; $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); $href = JRoute::_($href, false); header('HTTP/1.1 303 See Other'); header("Location: " . $href); exit; } if (isset($jfLang) && $jfLang->code != "" && ($jfLang->active || $jfm->getCfg("frontEndPreview"))) { $locale = $jfLang->code; } else { $jfLang = TableJFLanguage::createByJoomla($locale); if (!$jfLang->active) { ?> <div style="background-color: #c00; color: #fff"> <p style="font-size: 1.5em; font-weight: bold; padding: 10px 0px 10px 0px; text-align: center; font-family: Arial, Helvetica, sans-serif;"> Joom!Fish config error: Default language is inactive!<br /> <br /> Please check configuration, try to use first active language</p> </div> <?php $activeLanguages = $jfm->getActiveLanguages(); if (count($activeLanguages) > 0) { $jfLang = $activeLanguages[0]; $locale = $jfLang->code; } else { // No active language defined - using system default is only alternative! } } $client_lang = $jfLang->shortcode != '' ? $jfLang->shortcode : $jfLang->iso; } // TODO set the cookie domain so that it works for all subdomains if ($enableCookie) { setcookie("lang", "", time() - 1800, "/"); setcookie("jfcookie", "", time() - 1800, "/"); setcookie("jfcookie[lang]", $client_lang, time() + 24 * 3600, '/'); } if (defined("_JLEGACY")) { $GLOBALS['iso_client_lang'] = $client_lang; $GLOBALS['mosConfig_lang'] = $jfLang->code; } $registry->setValue("config.multilingual_support", true); global $mainframe; $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); // Force factory static instance to be updated if necessary $lang =& JFactory::getLanguage(); if ($jfLang->code != $lang->getTag()) { // Must not assign by reference in order to overwrite the existing reference to the static instance of the language $lang = JFactory::_createLanguage(); $lang->setDefault($jfLang->code); $lang->_metadata = array(); $lang->_metadata['tag'] = $jfLang->code; $lang->_metadata['rtl'] = false; } // no need to set locale for this ISO code its done by JLanguage // overwrite with the valued from $jfLang $jfparams = JComponentHelper::getParams("com_joomfish"); $overwriteGlobalConfig = $jfparams->get('overwriteGlobalConfig', 0); if ($overwriteGlobalConfig) { // We should overwrite additional global variables based on the language parameter configuration $params = new JParameter($jfLang->params); $paramarray = $params->toArray(); foreach ($paramarray as $key => $val) { if (trim($val) !== '') { $registry->setValue("config." . $key, $val); } if (defined("_JLEGACY")) { $name = 'mosConfig_' . $key; $GLOBALS[$name] = $val; } } } }
function _createHRef2($currenturl, $href, $code) { // Treat change of language specially because of problems if menu alias is translated $registry = JFactory::getConfig(); $language = $registry->getValue("joomfish.language", null); if ($language != null) { $jfLang = $language->getLanguageCode(); } else { $jfLang = null; } if (!is_null($code) && $code != $jfLang) { $registry = JFactory::getConfig(); $sefLang = TableJFLanguage::createByShortcode($code, false); $registry->setValue("joomfish.sef_lang", $sefLang->code); // Should really do this with classes and clones - this is a proof of concept $menu = JSite::getMenu(); $menu->_items = JFModuleHTML::getJFMenu($sefLang->code, false, $menu->_items); $url = JFModuleHTML::_route($href, $sefLang); $menu->_items = JFModuleHTML::getJFMenu($language->code, true); $registry->setValue("joomfish.sef_lang", false); /* $menu = JSite::getMenu(true); if (version_compare(phpversion(), '5.0') >= 0) { $keepmenu = clone($menu); } else { $keepmenu = $menu; } $menu = new JMenuSite(); $url = JRoute::_( $href ); $registry->setValue("joomfish.sef_lang", false); $menu = $keepmenu; return $url; */ } else { $url = JFModuleHTML::_route($href, $language); } return $url; }