<?php

class Language {

  	var $code;

  	var $languages = array();

  	var $data      = array();



  	function __construct(&$locator) {

		$this->config   =& $locator->get('config');

		$this->database =& $locator->get('database');

		$this->request  =& $locator->get('request');

		$this->session  =& $locator->get('session');

								

    	$results = $this->database->cache('language', "select * from language");



    	foreach ($results as $result) {

      		$this->languages[$result['code']] = array(

        		'language_id' => $result['language_id'],

        		'name'        => $result['name'],

        		'code'        => $result['code'],

				'directory'   => $result['directory'],

				'filename'    => $result['filename'],

      		);

    	}

 		

    	if (array_key_exists($this->session->get('language'), $this->languages)) {

      		$this->set($this->session->get('language'));

    	} elseif (array_key_exists($this->request->get('language', 'cookie'), $this->languages)) {

      		$this->set($this->request->get('language', 'cookie'));

    	} elseif ($browser = $this->detect()) {

	    	$this->set($browser);

	  	} else {

        	$this->set($this->config->get('config_language'));

		}

	

		$this->load($this->languages[$this->code]['filename']);

  	}

	

	function set($language) {

    	$this->code = $language;

		

    	if ((!$this->session->has('language')) || ($this->session->get('language') != $language)) {

      		$this->session->set('language', $language);

    	}



    	if ((!$this->request->get('language', 'cookie')) || ($this->request->get('language', 'cookie') != $language)) {	  

	  		setcookie('language', $language, time() + 3600 * 24 * 30, '/');

    	}

  	}

    

	function load($filename, $directory = DIR_LANGUAGE) {
		
		if ( (substr($filename,0,1)=='/') ){
			$file = $filename;
		}else{
    		$file = $directory . $this->languages[$this->code]['directory'] . '/' . $filename;   			
		}

    	if (file_exists($file)) {

	  		$_ = array();  

	  		include($file);	  

      		$this->data = array_merge($this->data, $_);

    	} else {

      		exit('Error: Language file ' . $file . ' not found!');
    	}

  	}  

  	function get($key) {

    	$args = func_get_args();

 

    	if (count($args) > 1) {

      		return vsprintf($this->get(array_shift($args)), $args);

    	} else {

      		return (isset($this->data[$key]) ? $this->data[$key] : $key);

    	}

  	}



  	function detect() {

    	if (@$_SERVER['HTTP_ACCEPT_LANGUAGE']) { 

      		$browser_languages = explode(',', @$_SERVER['HTTP_ACCEPT_LANGUAGE']);

	  

      		$languages = array(

        		'ar' => 'ar([-_][[:alpha:]]{2})?|arabic',

        		'bg' => 'bg|bulgarian',

        		'br' => 'pt[-_]br|brazilian portuguese',

        		'ca' => 'ca|catalan',

        		'cs' => 'cs|czech',

        		'da' => 'da|danish',

        		'de' => 'de([-_][[:alpha:]]{2})?|german',

        		'el' => 'el|greek',

       		 	'en' => 'en([-_][[:alpha:]]{2})?|english',

        		'es' => 'es([-_][[:alpha:]]{2})?|spanish',

        		'et' => 'et|estonian',

        		'fi' => 'fi|finnish',

        		'fr' => 'fr([-_][[:alpha:]]{2})?|french',

        		'gl' => 'gl|galician',

        		'he' => 'he|hebrew',

        		'hu' => 'hu|hungarian',

        		'id' => 'id|indonesian',

        		'it' => 'it|italian',

        		'ja' => 'ja|japanese',

        		'ko' => 'ko|korean',

       		 	'ka' => 'ka|georgian',

        		'lt' => 'lt|lithuanian',

        		'lv' => 'lv|latvian',

        		'nl' => 'nl([-_][[:alpha:]]{2})?|dutch',

        		'no' => 'no|norwegian',

        		'pl' => 'pl|polish',

        		'pt' => 'pt([-_][[:alpha:]]{2})?|portuguese',

        		'ro' => 'ro|romanian',

        		'ru' => 'ru|russian',

        		'sk' => 'sk|slovak',

        		'sr' => 'sr|serbian',

        		'sv' => 'sv|swedish',

        		'th' => 'th|thai',

        		'tr' => 'tr|turkish',

        		'uk' => 'uk|ukrainian',

        		'tw' => 'zh[-_]tw|chinese traditional',

        		'zh' => 'zh|chinese simplified'

      		);

 

      		foreach ($browser_languages as $browser_language) {

        		foreach ($languages as $key => $value) {

          			if (preg_match('/^(' . $value . ')(;q=[0-9]\\.[0-9])?$/i', $browser_language)) {

					    if (isset($this->languages[$key])) {

            			  return $key;

						}

          			}

        		}

      		}

    	}



    	return FALSE;

	}

    

  	function getId() {

    	return $this->languages[$this->code]['language_id'];

  	}

  

  	function getCode() {

    	return $this->code;

  	}  

}

?>

