/plugins/system/languagefilter/languagefilter.php
PHP | 635 lines | 468 code | 72 blank | 95 comment | 125 complexity | 935e66c1026da429b96adb2d2ca9fb97 MD5 | raw file
- <?php
- /**
- * @package Joomla.Plugin
- * @subpackage System.languagefilter
- *
- * @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
- * @license GNU General Public License version 2 or later; see LICENSE.txt
- */
- defined('_JEXEC') or die;
- JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
- /**
- * Joomla! Language Filter Plugin
- *
- * @package Joomla.Plugin
- * @subpackage System.languagefilter
- * @since 1.6
- */
- class PlgSystemLanguageFilter extends JPlugin
- {
- protected static $mode_sef;
- protected static $tag;
- protected static $sefs;
- protected static $lang_codes;
- protected static $default_lang;
- protected static $default_sef;
- protected static $cookie;
- private static $_user_lang_code;
- public function __construct(&$subject, $config)
- {
- parent::__construct($subject, $config);
- // Ensure that constructor is called one time
- self::$cookie = SID == '';
- if (!self::$default_lang)
- {
- $app = JFactory::getApplication();
- $router = $app->getRouter();
- if ($app->isSite())
- {
- // setup language data
- self::$mode_sef = ($router->getMode() == JROUTER_MODE_SEF) ? true : false;
- self::$sefs = JLanguageHelper::getLanguages('sef');
- self::$lang_codes = JLanguageHelper::getLanguages('lang_code');
- self::$default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB');
- self::$default_sef = self::$lang_codes[self::$default_lang]->sef;
- $user = JFactory::getUser();
- $levels = $user->getAuthorisedViewLevels();
- foreach (self::$sefs as $sef => &$language)
- {
- if (isset($language->access) && $language->access && !in_array($language->access, $levels))
- {
- unset(self::$sefs[$sef]);
- }
- }
- $app->setLanguageFilter(true);
- jimport('joomla.environment.uri');
- $uri = JURI::getInstance();
- if (self::$mode_sef)
- {
- // Get the route path from the request.
- $path = JString::substr($uri->toString(), JString::strlen($uri->base()));
- // Apache mod_rewrite is Off
- $path = JFactory::getConfig()->get('sef_rewrite') ? $path : JString::substr($path, 10);
- // Trim any spaces or slashes from the ends of the path and explode into segments.
- $path = JString::trim($path, '/ ');
- $parts = explode('/', $path);
- // The language segment is always at the beginning of the route path if it exists.
- $sef = $uri->getVar('lang');
- if (!empty($parts) && empty($sef))
- {
- $sef = reset($parts);
- }
- }
- else
- {
- $sef = $uri->getVar('lang');
- }
- if (isset(self::$sefs[$sef]))
- {
- $lang_code = self::$sefs[$sef]->lang_code;
- // Create a cookie
- $conf = JFactory::getConfig();
- $cookie_domain = $conf->get('config.cookie_domain', '');
- $cookie_path = $conf->get('config.cookie_path', '/');
- setcookie(JApplication::getHash('language'), $lang_code, $this->getLangCookieTime(), $cookie_path, $cookie_domain);
- $app->input->cookie->set(JApplication::getHash('language'), $lang_code);
- // set the request var
- $app->input->set('language', $lang_code);
- }
- }
- parent::__construct($subject, $config);
- // Detect browser feature
- if ($app->isSite())
- {
- $app->setDetectBrowser($this->params->get('detect_browser', '1') == '1');
- }
- }
- }
- public function onAfterInitialise()
- {
- $app = JFactory::getApplication();
- $app->item_associations = $this->params->get('item_associations', 0);
- if ($app->isSite())
- {
- self::$tag = JFactory::getLanguage()->getTag();
- $router = $app->getRouter();
- // attach build rules for language SEF
- $router->attachBuildRule(array($this, 'buildRule'));
- // attach parse rules for language SEF
- $router->attachParseRule(array($this, 'parseRule'));
- // Adding custom site name
- $languages = JLanguageHelper::getLanguages('lang_code');
- if (isset($languages[self::$tag]) && $languages[self::$tag]->sitename)
- {
- JFactory::getConfig()->set('sitename', $languages[self::$tag]->sitename);
- }
- }
- }
- public function buildRule(&$router, &$uri)
- {
- $sef = $uri->getVar('lang');
- if (empty($sef))
- {
- $sef = self::$lang_codes[self::$tag]->sef;
- }
- elseif (!isset(self::$sefs[$sef]))
- {
- $sef = self::$default_sef;
- }
- $Itemid = $uri->getVar('Itemid');
- if (!is_null($Itemid))
- {
- if ($item = JFactory::getApplication()->getMenu()->getItem($Itemid))
- {
- if ($item->home && $uri->getVar('option') != 'com_search')
- {
- $link = $item->link;
- $parts = JString::parse_url($link);
- if (isset ($parts['query']) && strpos($parts['query'], '&'))
- {
- $parts['query'] = str_replace('&', '&', $parts['query']);
- }
- parse_str($parts['query'], $vars);
- // test if the url contains same vars as in menu link
- $test = true;
- foreach ($uri->getQuery(true) as $key => $value)
- {
- if (!in_array($key, array('format', 'Itemid', 'lang')) && !(isset($vars[$key]) && $vars[$key] == $value))
- {
- $test = false;
- break;
- }
- }
- if ($test)
- {
- foreach ($vars as $key => $value)
- {
- $uri->delVar($key);
- }
- $uri->delVar('Itemid');
- }
- }
- }
- else
- {
- $uri->delVar('Itemid');
- }
- }
- if (self::$mode_sef)
- {
- $uri->delVar('lang');
- if (
- $this->params->get('remove_default_prefix', 0) == 0
- || $sef != self::$default_sef
- || $sef != self::$lang_codes[self::$tag]->sef
- || $this->params->get('detect_browser', 1) && JLanguageHelper::detectLanguage() != self::$tag && !self::$cookie
- )
- {
- $uri->setPath($uri->getPath().'/'.$sef.'/');
- }
- else
- {
- $uri->setPath($uri->getPath());
- }
- }
- else
- {
- $uri->setVar('lang', $sef);
- }
- }
- public function parseRule(&$router, &$uri)
- {
- $app = JFactory::getApplication();
- $array = array();
- $lang_code = $app->input->cookie->getString(JApplication::getHash('language'));
- // No cookie - let's try to detect browser language or use site default
- if (!$lang_code)
- {
- if ($this->params->get('detect_browser', 1))
- {
- $lang_code = JLanguageHelper::detectLanguage();
- }
- else
- {
- $lang_code = self::$default_lang;
- }
- }
- if (self::$mode_sef)
- {
- $path = $uri->getPath();
- $parts = explode('/', $path);
- $sef = $parts[0];
- // Redirect only if not in post
- if (!empty($lang_code) && ($app->input->getMethod() != "POST" || count($app->input->post) == 0))
- {
- if ($this->params->get('remove_default_prefix', 0) == 0)
- {
- // redirect if sef does not exists
- if (!isset(self::$sefs[$sef]))
- {
- // Use the current language sef or the default one
- $sef = isset(self::$lang_codes[$lang_code]) ? self::$lang_codes[$lang_code]->sef : self::$default_sef;
- $uri->setPath($sef . '/' . $path);
- if ($app->getCfg('sef_rewrite'))
- {
- $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));
- }
- else
- {
- $path = $uri->toString(array('path', 'query', 'fragment'));
- $app->redirect($uri->base().'index.php'.($path ? ('/' . $path) : ''));
- }
- }
- }
- else
- {
- // redirect if sef does not exists and language is not the default one
- if (!isset(self::$sefs[$sef]) && $lang_code != self::$default_lang)
- {
- $sef = isset(self::$lang_codes[$lang_code]) ? self::$lang_codes[$lang_code]->sef : self::$default_sef;
- $uri->setPath($sef . '/' . $path);
- if ($app->getCfg('sef_rewrite'))
- {
- $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));
- }
- else
- {
- $path = $uri->toString(array('path', 'query', 'fragment'));
- $app->redirect($uri->base().'index.php'.($path ? ('/' . $path) : ''));
- }
- }
- // redirect if sef is the default one
- elseif (isset(self::$sefs[$sef]) &&
- self::$default_lang == self::$sefs[$sef]->lang_code &&
- (!$this->params->get('detect_browser', 1) || JLanguageHelper::detectLanguage() == self::$tag || self::$cookie)
- )
- {
- array_shift($parts);
- $uri->setPath(implode('/', $parts));
- if ($app->getCfg('sef_rewrite'))
- {
- $app->redirect($uri->base().$uri->toString(array('path', 'query', 'fragment')));
- }
- else
- {
- $path = $uri->toString(array('path', 'query', 'fragment'));
- $app->redirect($uri->base().'index.php'.($path ? ('/' . $path) : ''));
- }
- }
- }
- }
- $lang_code = isset(self::$sefs[$sef]) ? self::$sefs[$sef]->lang_code : '';
- if ($lang_code && JLanguage::exists($lang_code))
- {
- array_shift($parts);
- $uri->setPath(implode('/', $parts));
- }
- }
- else
- {
- $sef = $uri->getVar('lang');
- if (!isset(self::$sefs[$sef]))
- {
- $sef = isset(self::$lang_codes[$lang_code]) ? self::$lang_codes[$lang_code]->sef : self::$default_sef;
- $uri->setVar('lang', $sef);
- if ($app->input->getMethod() != "POST" || count($app->input->post) == 0)
- {
- $app->redirect(JURI::base(true).'/index.php?'.$uri->getQuery());
- }
- }
- }
- $array = array('lang' => $sef);
- return $array;
- }
- /**
- * before store user method
- *
- * Method is called before user data is stored in the database
- *
- * @param array $user Holds the old user data.
- * @param boolean $isnew True if a new user is stored.
- * @param array $new Holds the new user data.
- *
- * @return void
- * @since 1.6
- */
- public function onUserBeforeSave($user, $isnew, $new)
- {
- if ($this->params->get('automatic_change', '1') == '1' && key_exists('params', $user))
- {
- $registry = new JRegistry;
- $registry->loadString($user['params']);
- self::$_user_lang_code = $registry->get('language');
- if (empty(self::$_user_lang_code))
- {
- self::$_user_lang_code = self::$default_lang;
- }
- }
- }
- /**
- * after store user method
- *
- * Method is called after user data is stored in the database
- *
- * @param array $user Holds the new user data.
- * @param boolean $isnew True if a new user is stored.
- * @param boolean $success True if user was succesfully stored in the database.
- * @param string $msg Message.
- *
- * @return void
- * @since 1.6
- */
- public function onUserAfterSave($user, $isnew, $success, $msg)
- {
- if ($this->params->get('automatic_change', '1') == '1' && key_exists('params', $user) && $success)
- {
- $registry = new JRegistry;
- $registry->loadString($user['params']);
- $lang_code = $registry->get('language');
- if (empty($lang_code))
- {
- $lang_code = self::$default_lang;
- }
- $app = JFactory::getApplication();
- if ($lang_code == self::$_user_lang_code || !isset(self::$lang_codes[$lang_code]))
- {
- if ($app->isSite())
- {
- $app->setUserState('com_users.edit.profile.redirect', null);
- }
- }
- else
- {
- if ($app->isSite())
- {
- $app->setUserState('com_users.edit.profile.redirect', 'index.php?Itemid='.$app->getMenu()->getDefault($lang_code)->id.'&lang='.$lang_codes[$lang_code]->sef);
- self::$tag = $lang_code;
- // Create a cookie
- $conf = JFactory::getConfig();
- $cookie_domain = $conf->get('config.cookie_domain', '');
- $cookie_path = $conf->get('config.cookie_path', '/');
- setcookie(JApplication::getHash('language'), $lang_code, $this->getLangCookieTime(), $cookie_path, $cookie_domain);
- }
- }
- }
- }
- /**
- * This method should handle any login logic and report back to the subject
- *
- * @param array $user Holds the user data
- * @param array $options Array holding options (remember, autoregister, group)
- *
- * @return boolean True on success
- * @since 1.5
- */
- public function onUserLogin($user, $options = array())
- {
- $app = JFactory::getApplication();
- $menu = $app->getMenu();
- if ($app->isSite() && $this->params->get('automatic_change', 1))
- {
- // Load associations
- $assoc = isset($app->item_associations) ? $app->item_associations : 0;
- if ($assoc)
- {
- $active = $menu->getActive();
- if ($active)
- {
- $associations = MenusHelper::getAssociations($active->id);
- }
- }
- $lang_code = $user['language'];
- if (empty($lang_code))
- {
- $lang_code = self::$default_lang;
- }
- if ($lang_code != self::$tag)
- {
- // Change language
- self::$tag = $lang_code;
- // Create a cookie
- $conf = JFactory::getConfig();
- $cookie_domain = $conf->get('config.cookie_domain', '');
- $cookie_path = $conf->get('config.cookie_path', '/');
- setcookie(JApplication::getHash('language'), $lang_code, $this->getLangCookieTime(), $cookie_path, $cookie_domain);
- // Change the language code
- JFactory::getLanguage()->setLanguage($lang_code);
- // Change the redirect (language have changed)
- if (isset($associations[$lang_code]) && $menu->getItem($associations[$lang_code]))
- {
- $itemid = $associations[$lang_code];
- $app->setUserState('users.login.form.return', 'index.php?&Itemid='.$itemid);
- }
- else
- {
- $itemid = isset($homes[$lang_code]) ? $homes[$lang_code]->id : $homes['*']->id;
- $app->setUserState('users.login.form.return', 'index.php?&Itemid='.$itemid);
- }
- }
- }
- }
- /**
- * This method adds alternate meta tags for associated menu items
- *
- * @return nothing
- * @since 1.7
- */
- public function onAfterDispatch()
- {
- $app = JFactory::getApplication();
- $doc = JFactory::getDocument();
- $menu = $app->getMenu();
- $server = JURI::getInstance()->toString(array('scheme', 'host', 'port'));
- $option = $app->input->get('option');
- $eName = JString::ucfirst(JString::str_ireplace('com_', '', $option));
- if ($app->isSite() && $this->params->get('alternate_meta') && $doc->getType() == 'html')
- {
- // Get active menu item
- $active = $menu->getActive();
- // load menu associations
- if ($active)
- {
- // Get menu item link
- if ($app->getCfg('sef'))
- {
- $active_link = JRoute::_('index.php?Itemid='.$active->id, false);
- }
- else
- {
- $active_link = JRoute::_($active->link.'&Itemid='.$active->id, false);
- }
- if ($active_link == JUri::base(true).'/')
- {
- $active_link .= 'index.php';
- }
- // Get current link
- $current_link = JURI::getInstance()->toString(array('path', 'query'));
- if ($current_link == JUri::base(true).'/')
- {
- $current_link .= 'index.php';
- }
- // Check the exact menu item's URL
- if ($active_link == $current_link)
- {
- $associations = MenusHelper::getAssociations($active->id);
- unset($associations[$active->language]);
- }
- }
- // load component associations
- $cName = JString::ucfirst($eName.'HelperAssociation');
- JLoader::register($cName, JPath::clean(JPATH_COMPONENT_SITE . '/helpers/association.php'));
- if (class_exists($cName) && is_callable(array($cName, 'getAssociations')))
- {
- $cassociations = call_user_func(array($cName, 'getAssociations'));
- $lang_code = $app->input->cookie->getString(JApplication::getHash('language'));
- // No cookie - let's try to detect browser language or use site default
- if (!$lang_code)
- {
- if ($this->params->get('detect_browser', 1)){
- $lang_code = JLanguageHelper::detectLanguage();
- } else {
- $lang_code = self::$default_lang;
- }
- }
- unset($cassociations[$lang_code]);
- }
- // handle the default associations
- if ((!empty($associations) || !empty($cassociations)) && $this->params->get('item_associations'))
- {
- foreach (JLanguageHelper::getLanguages() as $language)
- {
- if (!JLanguage::exists($language->lang_code))
- {
- continue;
- }
- if (isset($cassociations[$language->lang_code]))
- {
- $link = JRoute::_($cassociations[$language->lang_code].'&lang='.$language->sef);
- $doc->addHeadLink($server . $link, 'alternate', 'rel', array('hreflang' => $language->lang_code));
- }
- elseif (isset($associations[$language->lang_code]))
- {
- $item = $menu->getItem($associations[$language->lang_code]);
- if ($item)
- {
- if ($app->getCfg('sef'))
- {
- $link = JRoute::_('index.php?Itemid='.$item->id.'&lang='.$language->sef);
- }
- else
- {
- $link = JRoute::_($item->link.'&Itemid='.$item->id.'&lang='.$language->sef);
- }
- $doc->addHeadLink($server . $link, 'alternate', 'rel', array('hreflang' => $language->lang_code));
- }
- }
- }
- }
- // link to the home page of each language
- elseif ($active && $active->home)
- {
- foreach (JLanguageHelper::getLanguages() as $language)
- {
- if (!JLanguage::exists($language->lang_code))
- {
- continue;
- }
- $item = $menu->getDefault($language->lang_code);
- if ($item && $item->language != $active->language && $item->language != '*')
- {
- if ($app->getCfg('sef'))
- {
- $link = JRoute::_('index.php?Itemid='.$item->id.'&lang='.$language->sef);
- }
- else
- {
- $link = JRoute::_($item->link.'&Itemid='.$item->id.'&lang='.$language->sef);
- }
- $doc->addHeadLink($server . $link, 'alternate', 'rel', array('hreflang' => $language->lang_code));
- }
- }
- }
- }
- }
- /**
- * Getting the Language Cookie settings
- *
- * @return string The cookie time.
- *
- * @since 3.0.4
- */
- private function getLangCookieTime()
- {
- if ($this->params->get('lang_cookie', 1) == 1)
- {
- $lang_cookie = time() + 365 * 86400;
- }
- else
- {
- $lang_cookie = 0;
- }
- return $lang_cookie;
- }
- }