Welcome Guest, Not a member yet? Register   Sign In
Language Class Bug!
#1

[eluser]Unknown[/eluser]
Hi,
I got a bug in Language class and need to be confirmed.

Short brief:
Code:
1. ./system/application/config/config.php
  $language = "indonesia"; # default indonesia
  
2. ./system/application/config/autoload.php
  $language = array('caption');
  
3. ./system/application/language/english/caption_lang.php
  $lang['caption_welcome'] = 'Welcome';
  
4. ./system/application/language/indonesia/caption_lang.php
  $lang['caption_welcome'] = 'Selamat datang';
  
5. ./system/application/controllers/welcome.php
  $this->load->library('config');
  $this->config->set_item('language','english');
  $this->lang->load('caption');
  
  echo  $this->lang->line('caption_welcome');

Expected Result:
Welcome

Actual Result:
Selamat datang

Fixes:
create a file Language.php into your ./system/application/library

Code:
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 4.3.2 or newer
*
* @package    CodeIgniter
* @author    ExpressionEngine Dev Team
* @copyright  Copyright (c) 2008 - 2009, EllisLab, Inc.
* @license    http://ellislab.com/codeigniter/user-guide/license.html
* @link    http://codeigniter.com
* @since    Version 1.0
* @filesource
*/

// ------------------------------------------------------------------------

/**
* Language Class
*
* @package    CodeIgniter
* @subpackage  Libraries
* @category  Language
* @author    ExpressionEngine Dev Team
* @link    http://ellislab.com/codeigniter/user-guide/libraries/language.html
*/
class CI_Language {

  var $language         = array();
  var $is_loaded        = array();
  var $current_language = '';
  var $mode             = 'Replacement';

  /**
   * Constructor
   *
   * @access  public
   */
  function CI_Language()
  {
    log_message('debug', "Replacement of Language Class Initialized");
  }

  // --------------------------------------------------------------------

  /**
   * Load a language file
   *
   * @access  public
   * @param  mixed  the name of the language file to be loaded. Can be an array
   * @param  string  the language (english, etc.)
   * @return  mixed
   */
  function load($langfile = '', $idiom = '', $return = FALSE)
  {
    $langfile = str_replace(EXT, '', str_replace('_lang.', '', $langfile)).'_lang'.EXT;

    if (in_array($langfile, $this->is_loaded, TRUE))
    {
      if($this->current_language == '' ||
         $this->current_language == $idiom){

        return;
      }
    }

    if ($idiom == '')
    {
      $CI =& get_instance();
      $deft_lang = $CI->config->item('language');
      $idiom = ($deft_lang == '') ? 'english' : $deft_lang;
    }else{

      if($this->current_language != $idiom){

        $this->is_loaded = array();
      }
    }

    $this->current_language = $idiom;

    // Determine where the language file is and load it
    if (file_exists(APPPATH.'language/'.$idiom.'/'.$langfile))
    {
      include(APPPATH.'language/'.$idiom.'/'.$langfile);
    }
    else
    {
      if (file_exists(BASEPATH.'language/'.$idiom.'/'.$langfile))
      {
        include(BASEPATH.'language/'.$idiom.'/'.$langfile);
      }
      else
      {
        show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile);
      }
    }

    if ( ! isset($lang))
    {
      log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
      return;
    }

    if ($return == TRUE)
    {
      return $lang;
    }

    $this->is_loaded[] = $langfile;
    $this->language = array_merge($this->language, $lang);
    unset($lang);

    log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
    return TRUE;
  }

  // --------------------------------------------------------------------

  /**
   * Fetch a single line of text from the language array
   *
   * @access  public
   * @param  string  $line   the language line
   * @return  string
   */
  function line($line = '')
  {
    $line = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line];
    return $line;
  }

}
// END Language Class

/* End of file Language.php */
/* Location: ./system/application/libraries/Language.php */

Comment: Language::is_loaded[] needs to be reset when new language is loaded.
Hope it helps.
#2

[eluser]WanWizard[/eluser]
Not really a bug, but more a missing feature...

The language library assumes that you set the language before you start processing (and loading language files), so you will never have a mixed language situation.

Instead of modifying the core library (which is never a good idea), extend the Language library and add a switch_language method:
Code:
class MY_Language extends CI_Language
{
    /**
     * Constructor
     *
     * @return void
     * @access public
     */
    function MY_Language()
    {
        // call the parent constructor
        parent::CI_Language();

        // Logs initialization message for debugging
        log_message('debug', 'MY Language Class Extension Initialized');
    }
    /**
     * switch languages, reload all loaded language files if needed
     *
     * @access    public
     * @param    string    the language (english, etc.)
     * @param    boolean    ignore errors or not
     * @return    void
     */
    function switch_language($idiom = '', $silent = FALSE)
    {
        // get the CI superglobal object pointer
        $CI =& get_instance();

        // do we know to which idiom to switch?
        if ($idiom == '')
        {
            // no, nothing to do here
            return;
        }
        else
        {
            // is it a switch?
            if ( $CI->config->config['language'] == $idiom )
            {
                // no, nothing to do here
                return;
            }
            else
            {
                // reset the loaded language files array
                $this->is_loaded[] = array();

                // switch the default language
                $this->CI->config->set_item( 'language',$idiom );
            }
        }
    }
}

The version I use doesn't only switch languages, it also reloads all already loaded language files, so you don't have to do that manually. Because ExiteCMS uses an language file system different from standard CI, I left that code out.
#3

[eluser]Unknown[/eluser]
Thanks @WanWizard, for the reply and confirmation that is not a bug but missing feature.

Actually i don't hack the core,
since the Language class is created and put into
./system/application/libraries/Language.php as a replacement
and not modify the one in ./system/libraries/Language.php, CMIIW.

Will use your code ;-) Thank you




Theme © iAndrew 2016 - Forum software by © MyBB