Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/language.class.php
<?php
/**
* @version        $Id: language.class.php 1611 2014-07-06 10:21:29Z sannosi $
* @package        Elxis
* @subpackage    Language
* @copyright    Copyright (c) 2006-2014 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
elxisLanguage {

    private
$uri_lang = '';
    private
$deflang = 'en';
    private
$lang = 'en';
    private
$locale = array('en_GB.utf8', 'en_GB.UTF-8', 'en_GB', 'en', 'english', 'england');
    private
$ERROR_REPORT = 0;
    private
$feeders = array();
    private
$strings = array();
    private
$errormsg = '';
    private
$apc = 0;
    private
$ilangs = array(); //installed languages
   
private $sitelangs = array(); //languages available in frontend


    /*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct() {
       
$eURI = eFactory::getURI();
       
$elxis = eFactory::getElxis();

       
$this->uri_lang = $eURI->getUriLang();
       
$this->deflang = $elxis->getConfig('LANG');
       
$this->ERROR_REPORT = $elxis->getConfig('ERROR_REPORT');
       
$this->apc = $elxis->getConfig('APC');
       
$this->setLangs();
        if ((
$this->uri_lang == '') && file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.php')) {
           
$this->lang = $this->deflang;
        } elseif ((
$this->uri_lang != '') && file_exists(ELXIS_PATH.'/language/'.$this->uri_lang.'/'.$this->uri_lang.'.php')) {
            if (
defined('ELXIS_ADMIN')) {
               
$this->lang = $this->uri_lang;
            } else {
                if (
in_array($this->uri_lang, $this->sitelangs)) {
                   
$this->lang = $this->uri_lang;
                } else {
                   
$this->lang = $this->deflang;
                   
$url = $elxis->getConfig('URL').'/';
                   
$elxis->redirect($url);
                }
            }
        } else {
           
$this->lang = 'en';
        }

       
$this->feed(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.php', true);
       
$this->setLocale();
    }


   
/*********************/
    /* GET LANGUAGE INFO */
    /*********************/
   
public function getinfo($k) {
       
$lng = $this->lang;
        if (isset(
$this->ilangs[$lng][$k])) {
            return
$this->ilangs[$lng][$k];
        } else {
            if (
$this->ERROR_REPORT > 1) {
               
$this->errormsg = 'Could not get '.$k.' information for language '.$this->lang;
               
trigger_error($this->errormsg, E_USER_WARNING);
            }
            return
'';
        }
    }


   
/***************************************************************************************/
    /* GET ALL INFO FOR THE CURRENT LANGUAGE, A SPECIFIC LANGUAGE OR AN ARRAY OF LANGUAGES */
    /***************************************************************************************/
   
public function getallinfo($lng=null) {
       
$info = array();
        if (
is_null($lng)) {
           
$lng == $this->lang;
           
$info = $this->ilangs[$lng];
        } elseif (
is_string($lng)) {
            if ((
$lng == '') || ($lng == $this->lang)) {
               
$lng = $this->lang;
               
$info = $this->ilangs[$lng];
            } else if (isset(
$this->ilangs[$lng])) {
               
$info = $this->ilangs[$lng];
            } else {
                include(
ELXIS_PATH.'/includes/libraries/elxis/language/langdb.php');
                if (isset(
$langdb[$lng])) {
                   
$info = $langdb[$lng];
                   
$info['RTLSFX'] = ($info['DIR'] == 'rtl') ? '-rtl' : '';
                } else {
                    if (
$this->ERROR_REPORT > 2) {
                       
$this->errormsg = 'Language '.$lng.' does not exist in Elxis languages database.';
                       
trigger_error($this->errormsg, E_USER_NOTICE);
                    }
                }
            }
        } elseif (
is_array($lng)) {
           
$allexist = true;
            foreach (
$lng as $glossa) {
                if (isset(
$this->ilangs[$glossa])) {
                   
$info[$glossa] = $this->ilangs[$glossa];
                } else {
                   
$allexist = false;
                }
            }

            if (
$allexist) { return $info; }

            include(
ELXIS_PATH.'/includes/libraries/elxis/language/langdb.php');
            foreach (
$lng as $glossa) {
                if (isset(
$langdb[$glossa])) {
                   
$info[$glossa] = $langdb[$glossa];
                   
$info[$glossa]['RTLSFX'] = ($info[$glossa]['DIR'] == 'rtl') ? '-rtl' : '';
                } else {
                    if (
$this->ERROR_REPORT > 2) {
                       
$this->errormsg = 'Language '.$glossa.' does not exist in Elxis languages database.';
                       
trigger_error($this->errormsg, E_USER_NOTICE);
                    }
                }
            }
        } else {
            return array();
        }

        return
$info;
    }


   
/***********************************/
    /* GET CURRENT LANGUAGE IDENTIFIER */
    /***********************************/
   
public function currentLang() {
        return
$this->lang;
    }


   
/****************************************************************/
    /* GET URI LANGUAGE IDENTIFIER (EMPTY FOR THE DEFAULT LANGUAGE) */
    /****************************************************************/
   
public function uriLang() {
        return
$this->uri_lang;
    }


   
/*************************************/
    /* CHECK IF A LANGUAGE STRING EXISTS */
    /*************************************/
   
public function exist($k) {
        return isset(
$this->strings[$k]);
    }


   
/***********************/
    /* SET TRANSLITERATION */
    /***********************/
   
public function set($k, $value) {
       
$k = trim($k);
        if (
$k != '') {
           
$this->strings[$k] = $value;
            return
true;
        }
        return
false;
    }


   
/***********************/
    /* GET TRANSLITERATION */
    /***********************/
   
public function get($k) {
        if (isset(
$this->strings[$k])) {
            return
$this->strings[$k];
        } else {
            if (
$this->ERROR_REPORT > 2) {
               
$this->errormsg = 'Language string '.$k.' not found for language '.$this->lang;
               
trigger_error($this->errormsg, E_USER_NOTICE);
            }
            return
preg_replace('/\_/', ' ', ucfirst(strtolower($k)));
        }
    }


   
/********************************************************/
    /* GET TRANSLITERATION WITHOUT NOTICES (MOSTLY FOR XML) */
    /********************************************************/
   
public function silentGet($k, $uppercase=false) {
       
$v = ($uppercase === true) ? trim(strtoupper($k)) : trim($k);
        if ((
$v != '') && isset($this->strings[$v])) {
            return
$this->strings[$v];
        } else {
            return
$k;
        }
    }


   
/*****************************/
    /* MAGIC GET TRANSLITERATION */
    /*****************************/
   
public function __get($name) {
        return
$this->get($name);
    }


   
/*************************************/
    /* GET ALL EXISTING TRANSLITERATIONS */
    /*************************************/
   
public function getall() {
       
ksort($this->strings);
        return
$this->strings;
    }


   
/*****************************************/
    /* GET NUMBER OF LOADED LANGUAGE STRINGS */
    /*****************************************/
   
public function countStrings() {
        return
count($this->strings);
    }


   
/**********************/
    /* GET LOADED FEEDERS */
    /**********************/
   
public function getFeeders() {
        return
$this->feeders;
    }


   
/**************************/
    /* GET LAST ERROR MESSAGE */
    /**************************/
   
public function getError() {
        return
$this->errormsg;
    }


   
/****************************/
    /* RESET LAST ERROR MESSAGE */
    /****************************/
   
public function resetError() {
       
$this->errormsg = '';
    }


   
/**************************************/
    /* FEED LANGUAGE FROM ELXIS EXTENSION */
    /**************************************/
   
public function load($extension, $type='') {
        if (
$extension == '') { return false; }
        if (
$extension == 'exit') {
           
$ok = $this->loadExitLanguage();
            return
$ok;
        }
        if (
$type == '') { $type = $this->extensionType($extension); }
        if (
$type == '') {
           
$this->errormsg = 'Could not determine extension type for '.$extension;
            return
false;
        }

        switch (
$type) {
            case
'component':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/'.$extension.'/language/'.$this->lang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/'.$extension.'/language/'.$this->lang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/'.$extension.'/language/'.$this->deflang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/'.$extension.'/language/'.$this->deflang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/'.$extension.'/language/en.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/'.$extension.'/language/en.'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for component '.$extension;
                    return
false;
                }
            break;
            case
'module':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/modules/'.$extension.'/language/'.$this->lang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/modules/'.$extension.'/language/'.$this->lang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/modules/'.$extension.'/language/'.$this->deflang.'.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/modules/'.$extension.'/language/'.$this->deflang.'.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/modules/'.$extension.'/language/en.'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/modules/'.$extension.'/language/en.'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for module '.$extension;
                    return
false;
                }
            break;
            case
'plugin':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.plugin_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.plugin_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/language/'.$this->lang.'.plugin_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/language/'.$this->lang.'.plugin_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.plugin_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.plugin_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/language/'.$this->deflang.'.plugin_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/language/'.$this->deflang.'.plugin_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.plugin_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.plugin_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/language/en.plugin_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_content/plugins/'.$extension.'/language/en.plugin_'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for plugin '.$extension;
                    return
false;
                }
            break;
            case
'engine':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.engine_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.engine_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$extension.'/language/'.$this->lang.'.engine_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_search/engines/'.$extension.'/language/'.$this->lang.'.engine_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.engine_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.engine_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$extension.'/language/'.$this->deflang.'.engine_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_search/engines/'.$extension.'/language/'.$this->deflang.'.engine_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.engine_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.engine_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_search/engines/'.$extension.'/language/en.engine_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_search/engines/'.$extension.'/language/en.engine_'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for search engine '.$extension;
                    return
false;
                }
            break;
            case
'auth':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.auth_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.auth_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_user/auth/'.$extension.'/language/'.$this->lang.'.auth_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_user/auth/'.$extension.'/language/'.$this->lang.'.auth_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.auth_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.auth_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_user/auth/'.$extension.'/language/'.$this->deflang.'.auth_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_user/auth/'.$extension.'/language/'.$this->deflang.'.auth_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.auth_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.auth_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/components/com_user/auth/'.$extension.'/language/en.auth_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/components/com_user/auth/'.$extension.'/language/en.auth_'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for authentication method '.$extension;
                    return
false;
                }
            break;
            case
'template':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/templates/'.$extension.'/language/'.$this->lang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/templates/'.$extension.'/language/'.$this->lang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/templates/'.$extension.'/language/'.$this->deflang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/templates/'.$extension.'/language/'.$this->deflang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/templates/'.$extension.'/language/en.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/templates/'.$extension.'/language/en.tpl_'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for template '.$extension;
                    return
false;
                }
            break;
            case
'atemplate':
                if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/templates/admin/'.$extension.'/language/'.$this->lang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/templates/admin/'.$extension.'/language/'.$this->lang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/templates/admin/'.$extension.'/language/'.$this->deflang.'.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/templates/admin/'.$extension.'/language/'.$this->deflang.'.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/language/en/en.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/language/en/en.tpl_'.$extension.'.php';
                } elseif (
file_exists(ELXIS_PATH.'/templates/admin/'.$extension.'/language/en.tpl_'.$extension.'.php')) {
                   
$file = ELXIS_PATH.'/templates/admin/'.$extension.'/language/en.tpl_'.$extension.'.php';
                } else {
                   
$this->errormsg = 'Could not find a language file to load for administration template '.$extension;
                    return
false;
                }
            break;
            default:
               
$this->errormsg = 'Could not determine extension type for '.$extension.' and therefor load a language file for it.';
                return
false;
            break;
        }

       
$this->feed($file);
        return
true;
    }


   
/****************************/
    /* LOAD EXIT PAGES LANGUAGE */
    /****************************/
   
private function loadExitLanguage() {
        if (
file_exists(ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.exit.php')) {
           
$file = ELXIS_PATH.'/language/'.$this->lang.'/'.$this->lang.'.exit.php';
        } elseif (
file_exists(ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.exit.php')) {
           
$file = ELXIS_PATH.'/language/'.$this->deflang.'/'.$this->deflang.'.exit.php';
        } elseif (
file_exists(ELXIS_PATH.'/language/en/en.exit.php')) {
           
$file = ELXIS_PATH.'/language/en/en.exit.php';
        } else {
            return
false;
        }
       
$this->feed($file);
        return
true;
    }


   
/**********************************/
    /* FEED LANGUAGE FROM CUSTOM FILE */
    /**********************************/
   
public function loadFile($file) {
        if (
$file == '') { return false; }
        if (!
file_exists($file)) { $this->errormsg = 'File '.$file.' does not exist!'; return false; }
       
$this->feed($file);
        return
true;
    }


   
/***********************************************/
    /* LOCATE THE SOURCE FILE OF A LANGUAGE STRING */
    /***********************************************/
   
public function locate($string='') {
        if (
$string == '') { return ''; }
       
$file = '';
        if (
$this->feeders) {
            foreach (
$this->feeders as $feeder) {
                include(
$feeder);
                if (isset(
$_lang)) {
                    if (isset(
$_lang[$string])) {
                       
$file = $feeder;
                        break;
                    }
                    unset(
$_lang);
                }                
            }
        }
        if (
$file == '') { $this->errormsg = 'Could not locate '.$string.' source file.'; }
        return
$file;
    }


   
/*******************************************************/
    /* COMPARE 2 LANGUAGES FILES (USEFUL FOR TRANSLATIONS) */
    /*******************************************************/
   
public function compare($file1, $file2) {
        if (!
file_exists($file1)) { $this->errormsg = 'File '.$file1.' does not exist!'; return array(); }
        if (!
file_exists($file2)) { $this->errormsg = 'File '.$file2.' does not exist!'; return array(); }

       
$out = array();
        include(
$file1);
        if (isset(
$_lang)) {
            if (
is_array($_lang) && (count($_lang) > 0)) {
                foreach (
$_lang as $k => $v) { $out[$k] = array($v, ''); }
            }
            unset(
$_lang);
        }

        include(
$file2);
        if (isset(
$_lang)) {
            if (
is_array($_lang) && (count($_lang) > 0)) {
                foreach (
$_lang as $k => $v) {
                    if (isset(
$out[$k])) {
                       
$out[$k][1] = $v;
                    } else {
                       
$out[$k] = array('', $v);
                    }
                }
            }
            unset(
$_lang);
        }
        return
$out;
    }


   
/*******************************************************************/
    /* COMPARE EXTENSION OR SYSTEM LANGUAGES (USEFUL FOR TRANSLATIONS) */
    /*******************************************************************/
   
public function compareExtensions($lang1, $lang2, $extension='', $type='') {
        if ((
$lang1 == '') || (!file_exists(ELXIS_PATH.'/language/'.$lang1.'/'.$lang1.'.php'))) {
           
$this->errormsg = 'Invalid language '.$lang1.'!'; return array();
        }
        if ((
$lang2 == '') || (!file_exists(ELXIS_PATH.'/language/'.$lang2.'/'.$lang2.'.php'))) {
           
$this->errormsg = 'Invalid language '.$lang2.'!'; return array();
        }
        if (
$extension == '') {
           
$out = $this->compare(ELXIS_PATH.'/language/'.$lang1.'/'.$lang1.'.php', ELXIS_PATH.'/language/'.$lang2.'/'.$lang2.'.php');
            return
$out;
        }
        if (
$type == '') { $type = $this->extensionType($extension); }
        if (
$type == '') {
           
$this->errormsg = 'Could not determine the extension type!'; return array();
        }
        if (!
in_array($type, array('component', 'module'))) {
           
$this->errormsg = 'Only language files for components and modules can be compared!'; return array();
        }
       
       
$folder = $type.'s';

        if (
file_exists(ELXIS_PATH.'/language/'.$lang1.'/'.$lang1.'.'.$extension.'.php')) {
           
$file1 = ELXIS_PATH.'/language/'.$lang1.'/'.$lang1.'.'.$extension.'.php';
        } elseif (
file_exists(ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang1.'.'.$extension.'.php')) {
           
$file1 = ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang1.'.'.$extension.'.php';
        } elseif (
file_exists(ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang1.'.php')) {
           
$file1 = ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang1.'.php';
        } else {
           
$this->errormsg = 'Could not detect language file for language '.$lang1.'!'; return array();
        }
           
        if (
file_exists(ELXIS_PATH.'/language/'.$lang2.'/'.$lang2.'.'.$extension.'.php')) {
           
$file2 = ELXIS_PATH.'/language/'.$lang2.'/'.$lang2.'.'.$extension.'.php';
        } elseif (
file_exists(ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang2.'.'.$extension.'.php')) {
           
$file2 = ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang2.'.'.$extension.'.php';
        } elseif (
file_exists(ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang2.'.php')) {
           
$file2 = ELXIS_PATH.'/'.$folder.'/'.$extension.'/language/'.$lang2.'.php';
        } else {
           
$this->errormsg = 'Could not detect language file for language '.$lang2.'!'; return array();
        }

       
$out = $this->compare($file1, $file2);
        return
$out;
    }


   
/******************************/
    /* SWITCH LANGUAGE ON RUNTIME */
    /******************************/
   
public function switchLanguage($newlang) {
        if (
trim($newlang) == '') { return false; }
        if (
$newlang == $this->lang) { return true; }
        if (
count($this->feeders) == 0) { return true; }
        if (!
defined('ELXIS_ADMIN') && !in_array($newlang, $this->sitelangs)) { return false; }
        if (!
file_exists(ELXIS_PATH.'/language/'.$newlang.'/'.$newlang.'.php')) { return false; }
        foreach (
$this->feeders as $key => $feedfile) {
           
$newfile = str_replace('/'.$this->lang.'/', '/'.$newlang.'/', $feedfile);
           
$newfile = str_replace('/'.$this->lang.'.', '/'.$newlang.'.', $newfile);
            if (
file_exists($newfile)) {
               
$this->feed($newfile);
                unset(
$this->feeders[$key]);
            }
        }
       
$this->lang = $newlang;
        return
true;
    }


   
/********************************/
    /* FEED ME WITH A LANGUAGE FILE */
    /********************************/
   
private function feed($file, $uploc=false) {
        if (!
in_array($file, $this->feeders)) {
            include(
$file);
            if (isset(
$_lang) && is_array($_lang)) {
                foreach (
$_lang as $k => $v) { $this->strings[$k] = $v; } //overwrite is allowed!
           
} else {
               
$this->errormsg = 'Feed file '.$file.' does not contain language strings information.';
            }
            if (
$uploc) {
                if (isset(
$locale) && is_array($locale) && !empty($locale)) {
                   
$this->locale = $locale;
                } else {
                   
$this->errormsg = 'No locale information found on '.$file;
                }
            }
           
$this->feeders[] = $file;
        }
    }


   
/**********************************************/
    /* GET EXTENSION'S TYPE FROM EXTENSION'S NAME */
    /**********************************************/
   
private function extensionType($extension) {
       
$parts = preg_split('/\_/', $extension, 2, PREG_SPLIT_NO_EMPTY);
        switch (
$parts[0]) {
            case
'com': $type = 'component'; break;
            case
'mod': $type = 'module'; break;
           
//case 'plugin': $type = 'plugin'; break;
            //case 'tpl': $type = 'template'; break;
            //case 'auth': $type = 'auth'; break;
            //case 'engine': $type = 'engine'; break;
           
default: $type = ''; break;
        }
        return
$type;
    }


   
/***********************************/
    /* FILTER LANGUAGE NAME (NOT USED) */
    /***********************************/
   
private function filter($string) {
       
$s = preg_replace('/[^a-zA-Z\-\_]/', '', $string);
        return
$s;
    }


   
/********************************************/
    /* GATHER INSTALLED AND SITE LANGUAGES INFO */
    /********************************************/
   
private function setLangs() {
        if (
$this->apc) {
           
$ilangs = elxisAPC::fetch('ilangs', 'language');
           
$slangs = elxisAPC::fetch('sitelangs', 'language');
            if (
$ilangs && $slangs) {
               
$this->ilangs = $ilangs;
               
$this->sitelangs = $slangs;
                return;
            }
        }

       
$lngs = eFactory::getFiles()->listFolders('language/');
        if (!
$lngs) { trigger_error('No languages available!', E_USER_ERROR); }

        include(
ELXIS_PATH.'/includes/libraries/elxis/language/langdb.php');
        foreach (
$lngs as $lng) {
            if (isset(
$langdb[$lng])) {
               
$this->ilangs[$lng] = $langdb[$lng];
               
$this->ilangs[$lng]['RTLSFX'] = ($langdb[$lng]['DIR'] == 'rtl') ? '-rtl' : '';
            }
        }

        if (!
$this->ilangs) { trigger_error('No valid installed languages found!', E_USER_ERROR); }

       
$slangs = eFactory::getElxis()->getConfig('SITELANGS');
        if (
$slangs == '') {
           
$this->sitelangs = array_keys($this->ilangs);
        } else {
           
$this->sitelangs = explode(',',$slangs);
        }
        if (!
in_array($this->deflang, $this->sitelangs)) { $this->sitelangs[] = $this->deflang; }

        if (
$this->apc) {
           
elxisAPC::store('ilangs', 'language', $this->ilangs, 14400);
           
elxisAPC::store('sitelangs', 'language', $this->sitelangs, 14400);
        }
    }


   
/*******************************/
    /* GET ALL INSTALLED LANGUAGES */
    /*******************************/
   
public function getAllLangs($withinfo=false) {
        if (!
$withinfo) {
            return
array_keys($this->ilangs);
        }
        return
$this->ilangs;
    }


   
/*********************************/
    /* GET SITE (FRONTEND) LANGUAGES */
    /*********************************/
   
public function getSiteLangs($withinfo=false) {
        if (!
$withinfo) {
            return
$this->sitelangs;
        }

       
$arr = array();
        foreach (
$this->sitelangs as $lng) {
            if (isset(
$this->ilangs[$lng])) { $arr[$lng] = $this->ilangs[$lng]; }
        }
        return
$arr;
    }


   
/*************************/
    /* SET ENVIROMENT LOCALE */
    /*************************/
   
private function setLocale() {
        if (
strtoupper(substr(php_uname(), 0, 3)) == 'WIN') {
           
$loc = array ('en_GB.utf8', 'en_GB.utf-8', 'eng', 'english');
           
setlocale(LC_COLLATE, $loc);
           
setlocale(LC_CTYPE, $loc);
           
setlocale(LC_TIME, $loc);
            return;
        }

       
setlocale(LC_COLLATE, $this->locale);
       
setlocale(LC_CTYPE, $this->locale);
       
setlocale(LC_TIME, $this->locale);    
    }


   
/********************************************************/
    /* DETECT BROWSER LANGUAGE AND CONVERT IT TO ELXIS LANG */
    /********************************************************/
   
public function browserLang() {
        if (
defined('ELXIS_ADMIN')) {
           
$allowed_langs = $this->getAllLangs(false);
        } else {
           
$allowed_langs = $this->getSiteLangs(false);
        }
        if (!
is_array($allowed_langs) || (count($allowed_langs) == 0)) { $allowed_langs = array('en'); }
        if (!isset(
$_SERVER['HTTP_ACCEPT_LANGUAGE'])) { return $allowed_langs[0]; }
       
$acc_langs_str = trim($_SERVER['HTTP_ACCEPT_LANGUAGE']);
        if (
$acc_langs_str == '') { return $allowed_langs[0]; }
       
$langs = array();
       
$acc_langs = explode(',', trim($acc_langs_str));
        foreach (
$acc_langs as $acc_lang) {
            if (
preg_match('/(\*|[a-zA-Z0-9]{1,8}(?:-[a-zA-Z0-9]{1,8})*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?/', trim($acc_lang), $match)) {
               
$q = (!isset($match[2])) ? '1.0' : (string)floatval($match[2]);
               
$m = trim(strtolower($match[1]));
               
$n = strpos($m, '-');
                if (
$n !== false) { $m = substr($m, 0, $n); }
                if (!
in_array($m, $allowed_langs)) { continue; }
                if (!isset(
$langs[$q])) { $langs[$q] = array(); }
               
$langs[$q][] = $m;
            }
        }
        if (!
$langs) { return $allowed_langs[0]; }
       
krsort($langs);
       
$final_lang = $allowed_langs[0];
        foreach (
$langs as $k => $lngs) {
           
$final_lang = $lngs[0];
            break;
        }
        return
$final_lang;
    }

}

?>