joomla-platform / libraries / joomla / language / helper.php

<?php
/**
 * @package     Joomla.Platform
 * @subpackage  Language
 *
 * @copyright   Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_PLATFORM') or die;

/**
 * @package     Joomla.Platform
 * @subpackage  Language
 * @static
 * @since   11.1
 */
class JLanguageHelper
{
    /**
     * Builds a list of the system languages which can be used in a select option
     *
     * @param   string  Client key for the area
     * @param   string  Base path to use
     * @param   array   An array of arrays (text, value, selected)
     * 
     * @return  array   List of system languages
     * @since   11.1
     */
    public static function createLanguageList($actualLanguage, $basePath = JPATH_BASE, $caching = false, $installed = false)
    {
        $list = array ();

        // cache activation
        $langs = JLanguage::getKnownLanguages($basePath);
        if ($installed)
        {
            $db = JFactory::getDBO();
            $query = $db->getQuery(true);
            $query->select('element');
            $query->from('#__extensions');
            $query->where('type='.$db->quote('language'));
            $query->where('state=0');
            $query->where('enabled=1');
            $query->where('client_id='.($basePath==JPATH_ADMINISTRATOR?1:0));
            $db->setQuery($query);
            $installed_languages = $db->loadObjectList('element');
        }

        foreach ($langs as $lang => $metadata)
        {
            if (!$installed || array_key_exists($lang, $installed_languages))
            {
                $option = array ();

                $option['text'] = $metadata['name'];
                $option['value'] = $lang;
                if ($lang == $actualLanguage) {
                    $option['selected'] = 'selected="selected"';
                }
                $list[] = $option;
            }
        }

        return $list;
    }

    /**
     * Tries to detect the language.
     *
     * @return  string locale or null if not found
     * @since   11.1
     */
    public static function detectLanguage()
    {
        if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
        {
            $browserLangs   = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
            $systemLangs    = self::getLanguages();
            foreach ($browserLangs as $browserLang)
            {
                // Slice out the part before ; on first step, the part before - on second, place into array
                $browserLang = substr($browserLang, 0, strcspn($browserLang, ';'));
                $primary_browserLang = substr($browserLang, 0, 2);
                foreach($systemLangs as $systemLang)
                {
                    // Take off 3 letters iso code languages as they can't match browsers' languages and default them to en
                    $Jinstall_lang = $systemLang->lang_code;

                    if (strlen($Jinstall_lang) < 6)
                    {
                        if (strtolower($browserLang) == strtolower(substr($systemLang->lang_code, 0, strlen($browserLang)))) {
                            return $systemLang->lang_code;
                        }
                        else if ($primary_browserLang == substr($systemLang->lang_code, 0, 2)) {
                            $primaryDetectedLang = $systemLang->lang_code;
                        }
                    }
                }

                if (isset($primaryDetectedLang)) {
                    return $primaryDetectedLang;
                }
            }
        }

        return null;
    }

    /**
     * Get available languages
     *
     * @param   string array key
     * 
     * @return  array of published languages
     * @since   11.1
     */
    public static function getLanguages($key='default')
    {
        static $languages;

        if (empty($languages)) {
            // Installation uses available languages
            if (JFactory::getApplication()->getClientId() == 2) {
                $languages[$key] = array();
                $knownLangs = JLanguage::getKnownLanguages(JPATH_BASE);
                foreach($knownLangs as $metadata)
                {
                    // take off 3 letters iso code languages as they can't match browsers' languages and default them to en
                    $languages[$key][] = new JObject(array('lang_code' => $metadata['tag']));
                }
            }
            else {
                $cache = JFactory::getCache('com_languages', '');
                if (!$languages = $cache->get('languages')) {
                    $db     = JFactory::getDBO();
                    $query  = $db->getQuery(true);
                    $query->select('*')->from('#__languages')->where('published=1');
                    $db->setQuery($query);

                    $languages['default']   = $db->loadObjectList();
                    $languages['sef']       = array();
                    $languages['lang_code'] = array();

                    if (isset($languages['default'][0])) {
                        foreach($languages['default'] as $lang) {
                            $languages['sef'][$lang->sef]               = $lang;
                            $languages['lang_code'][$lang->lang_code]   = $lang;
                        }
                    }

                    $cache->store($languages, 'languages');
                }
            }
        }
        return $languages[$key];
    }
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.