1<?php 2/** 3 * @package Joomla.Site 4 * @subpackage mod_languages 5 * 6 * @copyright Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved. 7 * @license GNU General Public License version 2 or later; see LICENSE.txt 8 */ 9 10defined('_JEXEC') or die; 11 12JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php'); 13 14/** 15 * Helper for mod_languages 16 * 17 * @since 1.6 18 */ 19abstract class ModLanguagesHelper 20{ 21 /** 22 * Gets a list of available languages 23 * 24 * @param \Joomla\Registry\Registry &$params module params 25 * 26 * @return array 27 */ 28 public static function getList(&$params) 29 { 30 $user = JFactory::getUser(); 31 $lang = JFactory::getLanguage(); 32 $languages = JLanguageHelper::getLanguages(); 33 $app = JFactory::getApplication(); 34 $menu = $app->getMenu(); 35 $active = $menu->getActive(); 36 37 // Get menu home items 38 $homes = array(); 39 $homes['*'] = $menu->getDefault('*'); 40 41 foreach ($languages as $item) 42 { 43 $default = $menu->getDefault($item->lang_code); 44 45 if ($default && $default->language === $item->lang_code) 46 { 47 $homes[$item->lang_code] = $default; 48 } 49 } 50 51 // Load associations 52 $assoc = JLanguageAssociations::isEnabled(); 53 54 if ($assoc) 55 { 56 if ($active) 57 { 58 $associations = MenusHelper::getAssociations($active->id); 59 } 60 61 // Load component associations 62 $option = $app->input->get('option'); 63 $class = ucfirst(str_replace('com_', '', $option)) . 'HelperAssociation'; 64 \JLoader::register($class, JPATH_SITE . '/components/' . $option . '/helpers/association.php'); 65 66 if (class_exists($class) && is_callable(array($class, 'getAssociations'))) 67 { 68 $cassociations = call_user_func(array($class, 'getAssociations')); 69 } 70 } 71 72 $levels = $user->getAuthorisedViewLevels(); 73 $sitelangs = JLanguageHelper::getInstalledLanguages(0); 74 $multilang = JLanguageMultilang::isEnabled(); 75 76 // Filter allowed languages 77 foreach ($languages as $i => &$language) 78 { 79 // Do not display language without frontend UI 80 if (!array_key_exists($language->lang_code, $sitelangs)) 81 { 82 unset($languages[$i]); 83 } 84 // Do not display language without specific home menu 85 elseif (!isset($homes[$language->lang_code])) 86 { 87 unset($languages[$i]); 88 } 89 // Do not display language without authorized access level 90 elseif (isset($language->access) && $language->access && !in_array($language->access, $levels)) 91 { 92 unset($languages[$i]); 93 } 94 else 95 { 96 $language->active = ($language->lang_code === $lang->getTag()); 97 98 // Fetch language rtl 99 // If loaded language get from current JLanguage metadata 100 if ($language->active) 101 { 102 $language->rtl = $lang->isRtl(); 103 } 104 // If not loaded language fetch metadata directly for performance 105 else 106 { 107 $languageMetadata = JLanguageHelper::getMetadata($language->lang_code); 108 $language->rtl = $languageMetadata['rtl']; 109 } 110 111 if ($multilang) 112 { 113 if (isset($cassociations[$language->lang_code])) 114 { 115 $language->link = JRoute::_($cassociations[$language->lang_code] . '&lang=' . $language->sef); 116 } 117 elseif (isset($associations[$language->lang_code]) && $menu->getItem($associations[$language->lang_code])) 118 { 119 $itemid = $associations[$language->lang_code]; 120 $language->link = JRoute::_('index.php?lang=' . $language->sef . '&Itemid=' . $itemid); 121 } 122 elseif ($active && $active->language == '*') 123 { 124 $language->link = JRoute::_('index.php?lang=' . $language->sef . '&Itemid=' . $active->id); 125 } 126 else 127 { 128 if ($language->active) 129 { 130 $language->link = JUri::getInstance()->toString(array('path', 'query')); 131 } 132 else 133 { 134 $itemid = isset($homes[$language->lang_code]) ? $homes[$language->lang_code]->id : $homes['*']->id; 135 $language->link = JRoute::_('index.php?lang=' . $language->sef . '&Itemid=' . $itemid); 136 } 137 } 138 } 139 else 140 { 141 $language->link = JRoute::_('&Itemid=' . $homes['*']->id); 142 } 143 } 144 } 145 146 return $languages; 147 } 148} 149