MY Language

Derek Jones edited this page Jul 5, 2012 · 9 revisions
Clone this wiki locally

Category:Libraries::Extended If you want to add your own methods, go ahead


class MY_Language extends CI_Language
{
    // sqllang variables
    var $_get = array();
    var $_set = array();
    var $_in = array();

    function MY_Language()
    {
        parent::CI_Language();
    }
    /**
    * Makes switching between languages easier
    *
    *  example : http://codeigniter.com/forums/viewreply/339962/
    */
    function switch_to($idiom)
    {
        $CI =& get_instance();
        if(is_string($idiom) && $idiom != $CI->config->item('language'))
        {
            $CI->config->set_item('language',$idiom);
            $loaded = $this->is_loaded;
            $this->is_loaded = array();

            foreach($loaded as $file)
            {
                $this->load(str_replace('_lang.php','',$file));    
            }
        }
    }
    /**
     *  sqllang
     *  sql like syntax to manipulate items from the language library 
     *
     */
     /*
      * select more than one line using the full line keys
      */
    function select($select,$prefix='')
    {

        if(is_string($select))
        {
            $temp = explode(',',$select);
            array_walk($temp, create_function('&$v,$k,$pre', '$v = $pre.$v;'),$prefix);
            $this->_get = $temp;
        }
        elseif(is_array($select))
        {
            array_walk($select, create_function('&$v,$k,$pre', '$v = $pre.$v;'),$prefix);
            $this->_get = $select;
        }
    }
    /*
     * select one or more lines using a part of the line key
     */
    function like($like,$side = 'after')
    {
        switch($side)
        {
            case 'before': $pattern = '/^'.$like.'/'; break;
            case 'after': $pattern = '/'.$like.'$/'; break;
            default: $pattern = '/'.$like.'/'; break;
        }
        $keys = array_keys($this->language);
        foreach($keys as $key)
        {
            if(preg_match($pattern,$key) && !in_array($key,$this->_get))
            {
                $this->_get[] = $key;
            }
        }
    }
    /*
     * select one line using the parameter or process select and/or like method
     *
     * examples (php5):
     *
     *  $this->lang->get('line');
     *  $this->lang->select('line1,line2')->get();
     *  $this->lang->select('1,2','line')->get();
     *  $this->lang->like('line')->get(); // gets line,line1,line2
     *  $this->lang->like('1','before')->get(); // gets line1
     *  $this->lang->select('line1','line2')->like('line')->get(); // gets line, line1,line2
     */
    function get($line=null)
    {
        // line key added to get method
        if(is_string($line))
        {
            return (! isset($this->language[$line])) ? FALSE : $this->language[$line];
        }
        // select or like method is used
        if(count($this->_get) > 0)
        {
            $temp = array();
            foreach($this->_get as $line)
            {
                $temp[$line] = (! isset($this->language[$line])) ? FALSE : $this->language[$line];
            }
                return $temp;
        }
        // if none of the possibilities are met
        return false;
    }
    /*
     * set a key-value pair or an array to replace placeholders with actual values
     */
     function set($set,$value=null)
     {
         if(is_string($set) && is_string($value))
         {
             $this->_set[$set] = $value;
         }
         if(is_array($set))
         {
             foreach($set as $key=>$val)
             {
                $this->_set[$key] = $val; 
             }

         }
     }
     /*
      * inserts line(s) using 2 parameters or uses the _set array
      *
      */
     function insert($insert,$value=null)
     {
        if(is_string($insert) && is_string($value))
        {
            if(!isset($this->language[$key]))
            {
                $this->language[$insert] = $value;
            }
        }
        if(count($this->_set) > 0)
        {
            foreach($this->_set as $key=>$val)
            {
                if(!isset($this->language[$key]))
                {
                    $this->language[$key] = $val;
                }
            }
        }
     }
     /*
      * update line when parameter is string else update lines set by select,like
      *
      * examples (php5):
      *
      * $this->lang->set('[0]','10')->update('line');
      *
      * $set = array('[0]'=>10,'[1]'=>'you');
      * $this->lang->set($set)->update('line');
      *
      * $this->lang->select('line1','line2')->set('[0]','10')->update();
      * $this->lang->like('line')->set('[0]','10')->update();
      */
     function update($line = null)
     {
         if(is_string($line) && count($this->_set) > 0)
         {
             foreach($this->_set as $key=> $val)
             {
                 $this->language[$line] = str_replace($key,$val,$this->language[$line]);
             }
             return true;
         }
         if(count($this->_get) > 0 && count($this->_set) > 0)
         {
             $i = 0;
             foreach($this->_get as $line)
             {
                 foreach($this->_set as $key2=> $val2)
                 {
                     if(is_array($val2))
                     {
                        $this->language[$line] = str_replace($key2,$val2[$i],$this->language[$line]);
                     }
                     else
                     {
                        $this->language[$line] = str_replace($key2,$val2,$this->language[$line]);
                     }
                 }
                 $i++;
             }
             return true;
         }
         return false;
     }
    /*
      *  add line keys for deletion
      *
      */
     function in($in)
     {
        if(is_string($in))
        {
            $this->_in = array_merge($this->_in,explode(',',$in));
        }
        elseif(is_array($in))
        {
            $this->_in = array_merge($this->_in,$in);
        }
     }
    /*
     * releases file lines or other added lines
     *
     * examples (php5):
     *
     * delete file lines :
     * $this->lang->delete('lang_file');
     * $this->lang->delete('lang_file','language');
     *
     * delete lines :
     * $this->lang->in('line1,line2')->delete();
     * $this->lang->delete('line1');
     */
    function delete($file=null,$idiom = '')
    {
        $langfile = $file.'_lang'.EXT;
        if ($idiom == '')
        {
            $CI =& get_instance();
            $deft_lang = $CI->config->item('language');
            $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
        }
        if(!is_file(APPPATH.'language/'.$idiom.'/'.$langfile))
        {
            if(is_string($file))
            {
                unset($this->language[$file]);
            }
            if(count($this->_in)>0)
            {
                foreach($this->_in as $key)
                {
                   unset($this->language[$key]); 
                }
            }
        }
        else
        {
            if(is_string($file) && in_array($langfile,$this->is_loaded))
            {

                include(APPPATH.'language/'.$idiom.'/'.$langfile);
                $keys = array_keys($lang);
                unset($lang);
                foreach($keys as $key)
                {
                    unset($this->language[$key]);
                }
                return true;
            }
        }
        return false;
    }

}