diff --git a/libraries/cms/application/site.php b/libraries/cms/application/site.php index e35db34af8024..b4685f4f990c8 100644 --- a/libraries/cms/application/site.php +++ b/libraries/cms/application/site.php @@ -140,20 +140,8 @@ public function dispatch($component = null) switch ($document->getType()) { case 'html': - // Get language - $lang_code = $this->getLanguage()->getTag(); - $languages = JLanguageHelper::getLanguages('lang_code'); - // Set metadata - if (isset($languages[$lang_code]) && $languages[$lang_code]->metakey) - { - $document->setMetaData('keywords', $languages[$lang_code]->metakey); - } - else - { - $document->setMetaData('keywords', $this->get('MetaKeys')); - } - + $document->setMetaData('keywords', $this->get('MetaKeys')); $document->setMetaData('rights', $this->get('MetaRights')); if ($router->getMode() == JROUTER_MODE_SEF) @@ -322,24 +310,9 @@ public function getParams($option = null) $menus = $this->getMenu(); $menu = $menus->getActive(); - // Get language - $lang_code = $this->getLanguage()->getTag(); - $languages = JLanguageHelper::getLanguages('lang_code'); - + // Get site name. $title = $this->get('sitename'); - if (isset($languages[$lang_code]) && $languages[$lang_code]->metadesc) - { - $description = $languages[$lang_code]->metadesc; - } - else - { - $description = $this->get('MetaDesc'); - } - - $rights = $this->get('MetaRights'); - $robots = $this->get('robots'); - // Retrieve com_menu global settings $temp = clone JComponentHelper::getParams('com_menus'); @@ -362,9 +335,9 @@ public function getParams($option = null) } $params[$hash]->def('page_title', $title); - $params[$hash]->def('page_description', $description); - $params[$hash]->def('page_rights', $rights); - $params[$hash]->def('robots', $robots); + $params[$hash]->def('page_description', $this->get('MetaDesc')); + $params[$hash]->def('page_rights', $this->get('MetaRights')); + $params[$hash]->def('robots', $this->get('robots')); } return $params[$hash]; diff --git a/libraries/joomla/language/helper.php b/libraries/joomla/language/helper.php index c2968186fda5d..877a40c5039e6 100644 --- a/libraries/joomla/language/helper.php +++ b/libraries/joomla/language/helper.php @@ -378,6 +378,28 @@ public static function getContentLanguages($checkPublished = true, $checkInstall $languages = array_values(array_intersect_key(ArrayHelper::pivot($languages, 'lang_code'), static::getInstalledLanguages(0))); } + // If there is no installed content language fallback to english. + if ($languages === array()) + { + $language = new stdClass; + $language->lang_id = 1; + $language->asset_id = 0; + $language->lang_code = 'en-GB'; + $language->title = 'English (en-GB)'; + $language->title_native = 'English (United Kingdom)'; + $language->sef = 'en'; + $language->image = 'en_gb'; + $language->description = ''; + $language->metakey = ''; + $language->metadesc = ''; + $language->sitename = ''; + $language->published = 1; + $language->access = 1; + $language->ordering = 1; + + $languages = array($language); + } + // Order the list, if needed. if ($orderField !== null && $orderDirection !== null) { diff --git a/modules/mod_languages/helper.php b/modules/mod_languages/helper.php index 303195e4dabd5..bc0a68449fcf9 100644 --- a/modules/mod_languages/helper.php +++ b/modules/mod_languages/helper.php @@ -32,7 +32,7 @@ public static function getList(&$params) { $user = JFactory::getUser(); $lang = JFactory::getLanguage(); - $languages = JLanguageHelper::getLanguages(); + $languages = JLanguageHelper::getContentLanguages(true, true, 'lang_code', 'ordering', 'ASC'); $app = JFactory::getApplication(); $menu = $app->getMenu(); $active = $menu->getActive(); @@ -72,19 +72,13 @@ public static function getList(&$params) } $levels = $user->getAuthorisedViewLevels(); - $sitelangs = JLanguageHelper::getInstalledLanguages(0); $multilang = JLanguageMultilang::isEnabled(); // Filter allowed languages foreach ($languages as $i => &$language) { - // Do not display language without frontend UI - if (!array_key_exists($language->lang_code, $sitelangs)) - { - unset($languages[$i]); - } // Do not display language without specific home menu - elseif (!isset($homes[$language->lang_code])) + if (!isset($homes[$language->lang_code])) { unset($languages[$i]); } diff --git a/plugins/system/languagefilter/languagefilter.php b/plugins/system/languagefilter/languagefilter.php index dc6bfc9f463f4..7337347c034a3 100644 --- a/plugins/system/languagefilter/languagefilter.php +++ b/plugins/system/languagefilter/languagefilter.php @@ -95,8 +95,8 @@ public function __construct(&$subject, $config) { // Setup language data. $this->mode_sef = $this->app->get('sef', 0); - $this->sefs = JLanguageHelper::getLanguages('sef'); - $this->lang_codes = JLanguageHelper::getLanguages('lang_code'); + $this->sefs = JLanguageHelper::getContentLanguages(true, true, 'sef'); + $this->lang_codes = JLanguageHelper::getContentLanguages(true, true, 'lang_code'); $this->default_lang = JComponentHelper::getParams('com_languages')->get('site', 'en-GB'); $levels = JFactory::getUser()->getAuthorisedViewLevels(); @@ -105,8 +105,7 @@ public function __construct(&$subject, $config) { // @todo: In Joomla 2.5.4 and earlier access wasn't set. Non modified Content Languages got 0 as access value // we also check if frontend language exists and is enabled - if (($language->access && !in_array($language->access, $levels)) - || (!array_key_exists($language->lang_code, JLanguageHelper::getInstalledLanguages(0)))) + if ($language->access && !in_array($language->access, $levels)) { unset($this->lang_codes[$language->lang_code], $this->sefs[$language->sef]); } @@ -703,109 +702,128 @@ public function onAfterDispatch() { $doc = JFactory::getDocument(); - if ($this->app->isClient('site') && $this->params->get('alternate_meta', 1) && $doc->getType() === 'html') + if ($this->app->isClient('site') && $doc->getType() === 'html') { - $languages = $this->lang_codes; - $homes = JLanguageMultilang::getSiteHomePages(); - $menu = $this->app->getMenu(); - $active = $menu->getActive(); - $levels = JFactory::getUser()->getAuthorisedViewLevels(); - $remove_default_prefix = $this->params->get('remove_default_prefix', 0); - $server = JUri::getInstance()->toString(array('scheme', 'host', 'port')); - $is_home = false; - $currentInternalUrl = 'index.php?' . http_build_query($this->app->getRouter()->getVars()); - - if ($active) + // Set content language description and meta keys. + if (isset($this->lang_codes[$this->current_lang])) { - $active_link = JRoute::_($active->link . '&Itemid=' . $active->id); - $current_link = JRoute::_($currentInternalUrl); - - // Load menu associations - if ($active_link == $current_link) + // Add content language meta desc. + if ($this->lang_codes[$this->current_lang]->metadesc) { - $associations = MenusHelper::getAssociations($active->id); + $doc->setDescription($this->lang_codes[$this->current_lang]->metadesc); } - // Check if we are on the home page - $is_home = ($active->home - && ($active_link == $current_link || $active_link == $current_link . 'index.php' || $active_link . '/' == $current_link)); - } - - // Load component associations. - $option = $this->app->input->get('option'); - $cName = StringHelper::ucfirst(StringHelper::str_ireplace('com_', '', $option)) . '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')); + // Add content language meta keys. + if ($this->lang_codes[$this->current_lang]->metakey) + { + $doc->setMetaData('keywords', $this->lang_codes[$this->current_lang]->metakey); + } } - // For each language... - foreach ($languages as $i => &$language) + // Set alternate meta tags if needed. + if ($this->params->get('alternate_meta', 1)) { - switch (true) + $languages = $this->lang_codes; + $homes = JLanguageMultilang::getSiteHomePages(); + $menu = $this->app->getMenu(); + $active = $menu->getActive(); + $levels = JFactory::getUser()->getAuthorisedViewLevels(); + $remove_default_prefix = $this->params->get('remove_default_prefix', 0); + $server = JUri::getInstance()->toString(array('scheme', 'host', 'port')); + $is_home = false; + $currentInternalUrl = 'index.php?' . http_build_query($this->app->getRouter()->getVars()); + + if ($active) { - // Language without frontend UI || Language without specific home menu || Language without authorized access level - case (!array_key_exists($i, JLanguageHelper::getInstalledLanguages(0))): - case (!isset($homes[$i])): - case (isset($language->access) && $language->access && !in_array($language->access, $levels)): - unset($languages[$i]); - break; - - // Home page - case ($is_home): - $language->link = JRoute::_('index.php?lang=' . $language->sef . '&Itemid=' . $homes[$i]->id); - break; - - // Current language link - case ($i == $this->current_lang): - $language->link = JRoute::_($currentInternalUrl); - break; - - // Component association - case (isset($cassociations[$i])): - $language->link = JRoute::_($cassociations[$i] . '&lang=' . $language->sef); - break; - - // Menu items association - // Heads up! "$item = $menu" here below is an assignment, *NOT* comparison - case (isset($associations[$i]) && ($item = $menu->getItem($associations[$i]))): - - $language->link = JRoute::_('index.php?Itemid=' . $item->id . '&lang=' . $language->sef); - break; - - // Too bad... - default: - unset($languages[$i]); + $active_link = JRoute::_($active->link . '&Itemid=' . $active->id); + $current_link = JRoute::_($currentInternalUrl); + + // Load menu associations + if ($active_link == $current_link) + { + $associations = MenusHelper::getAssociations($active->id); + } + + // Check if we are on the home page + $is_home = ($active->home + && ($active_link == $current_link || $active_link == $current_link . 'index.php' || $active_link . '/' == $current_link)); } - } - // If there are at least 2 of them, add the rel="alternate" links to the - if (count($languages) > 1) - { - // Remove the sef from the default language if "Remove URL Language Code" is on - if (isset($languages[$this->default_lang]) && $remove_default_prefix) + // Load component associations. + $option = $this->app->input->get('option'); + $cName = StringHelper::ucfirst(StringHelper::str_ireplace('com_', '', $option)) . 'HelperAssociation'; + JLoader::register($cName, JPath::clean(JPATH_COMPONENT_SITE . '/helpers/association.php')); + + if (class_exists($cName) && is_callable(array($cName, 'getAssociations'))) { - $languages[$this->default_lang]->link - = preg_replace('|/' . $languages[$this->default_lang]->sef . '/|', '/', $languages[$this->default_lang]->link, 1); + $cassociations = call_user_func(array($cName, 'getAssociations')); } + // For each language... foreach ($languages as $i => &$language) { - $doc->addHeadLink($server . $language->link, 'alternate', 'rel', array('hreflang' => $i)); + switch (true) + { + // Language without frontend UI || Language without specific home menu || Language without authorized access level + case (!isset($homes[$i])): + case (isset($language->access) && $language->access && !in_array($language->access, $levels)): + unset($languages[$i]); + break; + + // Home page + case ($is_home): + $language->link = JRoute::_('index.php?lang=' . $language->sef . '&Itemid=' . $homes[$i]->id); + break; + + // Current language link + case ($i == $this->current_lang): + $language->link = JRoute::_($currentInternalUrl); + break; + + // Component association + case (isset($cassociations[$i])): + $language->link = JRoute::_($cassociations[$i] . '&lang=' . $language->sef); + break; + + // Menu items association + // Heads up! "$item = $menu" here below is an assignment, *NOT* comparison + case (isset($associations[$i]) && ($item = $menu->getItem($associations[$i]))): + + $language->link = JRoute::_('index.php?Itemid=' . $item->id . '&lang=' . $language->sef); + break; + + // Too bad... + default: + unset($languages[$i]); + } } - // Add x-default language tag - if ($this->params->get('xdefault', 1)) + // If there are at least 2 of them, add the rel="alternate" links to the + if (count($languages) > 1) { - $xdefault_language = $this->params->get('xdefault_language', $this->default_lang); - $xdefault_language = ($xdefault_language === 'default') ? $this->default_lang : $xdefault_language; + // Remove the sef from the default language if "Remove URL Language Code" is on + if (isset($languages[$this->default_lang]) && $remove_default_prefix) + { + $languages[$this->default_lang]->link + = preg_replace('|/' . $languages[$this->default_lang]->sef . '/|', '/', $languages[$this->default_lang]->link, 1); + } - if (isset($languages[$xdefault_language])) + foreach ($languages as $i => &$language) { - // Use a custom tag because addHeadLink is limited to one URI per tag - $doc->addCustomTag(''); + $doc->addHeadLink($server . $language->link, 'alternate', 'rel', array('hreflang' => $i)); + } + + // Add x-default language tag + if ($this->params->get('xdefault', 1)) + { + $xdefault_language = $this->params->get('xdefault_language', $this->default_lang); + $xdefault_language = ($xdefault_language === 'default') ? $this->default_lang : $xdefault_language; + + if (isset($languages[$xdefault_language])) + { + // Use a custom tag because addHeadLink is limited to one URI per tag + $doc->addCustomTag(''); + } } } }