Skip to content

Internationalizing the Language class

Derek Jones edited this page Jul 5, 2012 · 4 revisions

I needed support for several languages in my application, so I modified the language class to support multiple languages, based on the "idiom". This is useful in case some of your users would like to view pages in other languages or you need to display several languages at the same time.

I have solved the following issues in the Language class:

  1. The ability to load languages based on their code, i.e. en-US, ru, etc..
  2. The ability to load files with same name, but in different folders. At present, if you try to load 2 files with the same name, which are in different folders, the second file will not be loaded. For example:

./en-US/warnings_lang.php ./ru/warnings_lang.php

As a result of loading these files, the ./ru/warnings_lang.php will not be loaded.

Usage:

  • To load a file, use the following syntax:

$this->lang->load('info','ru');


- To get a line from the loaded file:
```php
$this->lang->line('loading','ru');

You can also do the following:

$this->lang->line('loading','en-US');
$this->lang->line('loading','ru');

If you set your default language to "en-US" in the config.php file, then you can rewrite the above as:

$this->lang->line('loading');
$this->lang->line('loading','ru');

The modified Language.php file from CodeIgniter 1.5.4 distribution:

<?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        Rick Ellis
 * @copyright    Copyright (c) 2006, EllisLab, Inc.
 * @license        http://www.codeignitor.com/user_guide/license.html
 * @link        http://www.codeigniter.com
 * @since        Version 1.0
 * @filesource
 */

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

/**
 * Language Class
 *
 * @package        CodeIgniter
 * @subpackage    Libraries
 * @category    Language
 * @author        Rick Ellis
 * @link        http://www.codeigniter.com/user_guide/libraries/language.html
 */
class CI_Language {

    var $language    = array();
    var $is_loaded    = array();
    var $default_lang="";

    /**
     * Constructor
     *
     * @access    public
     */    
    function CI_Language()
    {

        log_message('debug', "Language Class Initialized");
    }

    function updateDefaultLanguage()
    {
        //Set the language from the config file
        $CI =&get;_instance();
        $deft_lang = $CI->config->item('language');
        if ($deft_lang == '')
            $this->default_lang='en-US';
        else
            $this->default_lang=$deft_lang;

        if (!isset($this->language[$this->default_lang]))
            $this->language[$this->default_lang]= array();

        if (!isset($this->is_loaded[$this->default_lang]))
            $this->is_loaded[$this->default_lang]= array();

        log_message('debug',"Default language set to:".$this->default_lang);
    }
    
    // --------------------------------------------------------------------
    
    /**
     * 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    void
     */
    function load($langfile = '', $idiom = '', $return = FALSE)
    {    
        $langfile = str_replace(EXT, '', str_replace('_lang.', '', $langfile)).'_lang'.EXT;

        $this->updateDefaultLanguage();

        //Set the idiom
        if ($idiom == '')
            $idiom=$this->default_lang;


        //Check if an array for this language exists
        if (!isset($this->language[$idiom]))
            $this->language[$idiom]=array();
        if (!isset($this->is_loaded[$idiom]))
            $this->is_loaded[$idiom]=array();

        
        if (in_array($langfile, $this->is_loaded[$idiom], TRUE))
        {
            return;
        }

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

        
        if ( ! isset($lang))
        {
            log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile);
            return;
        }
        
        if ($return == TRUE)
        {
            return $lang;
        }
        
        $this->is_loaded[$idiom][] = $langfile;
        $this->language[$idiom] = array_merge($this->language[$idiom], $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    the language line
     * @return    string
     */
    function line($line = '', $lang="")
    {
        if ($lang=="")
            $lang=$this->default_lang;

        return ($line == '' OR ! isset($this->language[$lang][$line])) ? FALSE : $this->language[$lang][$line];
    }

}
// END Language Class
?>

If you want to use "en-US" or "ru" or "en-GB", make sure that the folders inside the "language" folder are named respectively.

Clone this wiki locally