<?php 
 
 
namespace PHPtricks\Logaty; 
 
 
use PHPtricks\Logaty\Helpers\Config; 
use PHPtricks\Logaty\Helpers\Detect; 
use PHPtricks\Logaty\Helpers\Link; 
use PHPtricks\Logaty\Helpers\Switcher; 
use PHPtricks\Logaty\Translate\Translator; 
 
class App 
{ 
    public function __construct() 
    { 
        $this->config = new Config(); 
        $this->link = new Link($this); 
        $this->detect = new Detect(); 
        $this->trans = new Translator($this); 
        $this->switcher = new Switcher($this); 
    } 
 
    /** 
     * to use object as function 
     * @param $string 
     * @param string $lang 
     * @return string 
     * 
     * @uses logaty(STRING, LANG-CODE); 
     */ 
    public function __invoke($string, $lang = '') 
    { 
        return $this->_x($string, $lang); 
    } 
 
 
    /** 
     * if we call a method like a property 
     * we need to call a method correctly 
     * @param $property 
     * @return mixed|null 
     */ 
    public function __get($property) 
    { 
        if(method_exists($this, $property)) 
        { 
            if($property == 'default') 
                return $this->defaultLang(); 
             
            return $this->$property(); 
        } 
                 
        return null; 
    } 
 
 
    /** 
     * get root directory for our Library 
     * @return string 
     */ 
    public function rootDir() 
    { 
        return dirname(__DIR__) . DIRECTORY_SEPARATOR; 
    } 
 
    /** 
     * get config value from config files 
     * @param string $path 
     * @return mixed|Config|null 
     * 
     * @uses   logaty()->config(file-name.config-name); // return value for key 
     * @uses   logaty()->config(); // return all configurations 
     */ 
    public function config($path = '') 
    { 
        return ( 
        $path ? 
            $this->config->get($path) : 
            $this->config->get() 
        ); 
    } 
 
    /** 
     * get config value from Config/options.php file. 
     * @param $optionName 
     * @return string|null 
     * 
     * @uses logaty()->options(option-name); 
     */ 
    public function options($optionName) 
    { 
        $option = $this->config("options.{$optionName}"); 
        return (!is_array($option) ? $option : null); 
    } 
 
    /** 
     * get all enabled languages OR check if specified language is enabled 
     * @param string $lang 
     * @return string|bool 
     * 
     * @uses logaty()->enabled(); return (array) all enabled languages 
     * @uses logaty()->enabled(language-code); 
     *      return (bool) true if language enabled false if not 
     */ 
    public function enabled($lang = '') 
    { 
        $enabledLanguages = $this->config('enabled'); 
 
        return ( 
        !$lang ? 
            $enabledLanguages : 
            in_array($lang, $enabledLanguages) 
        ); 
    } 
 
    /** 
     * get flags 
     * @param string $lang 
     * @return string|array|null 
     * 
     * @uses logaty()->flag(); // return (array) all flags 
     *       logaty()->flag(language-Code); // return flag for -language-Code- language 
     *       return null if language code is undefined 
     */ 
    public function flag($lang = '') 
    { 
        $flags = $this->config("flag"); 
 
        return ($lang ? @$flags[$lang] : $flags); 
    } 
 
    /** 
     * get language direction (RTL, LTR) 
     * @param string $lang 
     * @return string|array|null 
     * 
     * @uses logaty()->direction(); // return (array) all directions 
     *       logaty()->direction(language-Code); // return direction for -language-Code- language 
     *       return null if language code is undefined 
     */ 
    public function direction($lang = '') 
    { 
        $directions = $this->config("direction"); 
 
        return ($lang ? @$directions[$lang] : $directions); 
    } 
 
    /** 
     * get language Name in English 
     * @param string $lang 
     * @return string|array|null 
     * 
     * @uses logaty()->name(); // return (array) all languages name 
     *       logaty()->name(language-Code); // return name for -language-Code- language 
     *       return null if language code is undefined 
     */ 
    public function name($lang = '') 
    { 
        $names = $this->config("name.english"); 
 
        return ($lang ? @$names[$lang] : $names); 
    } 
 
    /** 
     * get language Name in Natural Language 
     * @param string $lang 
     * @return string|array|null 
     * 
     * @uses logaty()->nameN(); // return (array) all languages name 
     *       logaty()->nameN(language-Code); // return name for -language-Code- language 
     *       return null if language code is undefined 
     */ 
    public function nameN($lang = '') 
    { 
        $names = $this->config("name.natural"); 
 
        return ($lang ? @$names[$lang] : $names); 
    } 
 
    /** 
     * Get Path 
     * @param $path 
     * @return mixed 
     */ 
    public function path($path) 
    { 
        return $this->config('paths')[$path]; 
    } 
 
    /** 
     * return default Language 
     */ 
    public function defaultLang() 
    { 
        return $this->options('default_lang'); 
    } 
 
    public function current() 
    { 
        $parameter = $this->options('lang_key'); 
        if (isset($_GET[$parameter])) 
        { 
            if ($this->enabled(strtolower($_GET[$parameter]))) 
            { 
                return strtolower($_GET[$parameter]); 
            } 
        } 
 
        return $this->defaultLang(); 
    } 
 
    /** 
     * generate link 
     * @param string $url 
     * @param string $lang 
     * @return string 
     */ 
    public function link($url = '', $lang = '') 
    { 
        return $this->link->create($url, $lang); 
    } 
 
    /** 
     * get translation 
     * @param $string 
     * @param string $lang 
     */ 
    public function _x($string, $lang = '') 
    { 
        return $this->trans->getTranslate($string, $lang); 
    } 
 
    /** 
     * print translation direct 
     * @param $string 
     * @param string $lang 
     */ 
    public function __($string, $lang = '') 
    { 
        echo $this->_x($string, $lang); 
    } 
 
    public function detect($type = '') 
    { 
        $detectedLanguage = null; 
        $detect = $this->detect; 
        if (!$type) 
        { 
            if ( 
                $this->options('detect_browser_lang') 
                && 
                $this->options('detect_country_lang') 
            ) 
            { 
                $detectedLanguage['browser'] = $detect->browser(); 
                $detectedLanguage['country'] = $detect->country(); 
            } else if ($this->options('detect_browser_lang')) 
            { 
                $detectedLanguage = $detect->browser(); 
            } else if ($this->options('detect_country_lang')) 
            { 
                $detectedLanguage = $detect->country(); 
            } 
        } elseif ($type == "browser") 
        { 
            if ($this->options('detect_browser_lang')) 
                $detectedLanguage = $detect->browser(); 
        } elseif ($type == "country") 
        { 
            if ($this->options('detect_country_lang')) 
                $detectedLanguage = $detect->country(); 
        } 
 
        return $detectedLanguage; 
    } 
 
    /*public function trans() 
    { 
        return $this->trans; 
    }*/ 
}
 
 |