CodeIgniter Dynamic Language Functionality

I am Codeigniter and I need a dynamic language for users.

I have added a drop-down list in the header and I want to allow users to change the language of the site in the frontend.

I tried to change the language using the code below in one controller

$this->config->set_item('language','spanish');

but his unchanging language does not work

I also tried to run a session with the code below in one of my controllers

$mylanguage = $this->session->set_userdata(array('my_language',$dynamiclang));

and tried to access this variable in the configuration file, but it also does not work.

Help me do this job.

+3
source share
3 answers

Finally, I got success to make several languages

follow these steps

MY_Lang.php file in folder application\core

MY_Lang.php
<?php  
(defined('BASEPATH')) OR exit('No direct script access allowed');

class MY_Lang extends CI_Lang
{
    function __construct() {

        global $URI, $CFG, $IN;

        $config =& $CFG->config;

        $index_page    = $config['index_page'];
        $lang_ignore   = $config['lang_ignore'];
        $default_abbr  = $config['language_abbr'];
        $lang_uri_abbr = $config['lang_uri_abbr'];
        #exit('my_lang');   
        #print_r($URI); 
        /*if($index_page=='es')
        {
            #$config['index_page'] = 'es';
            #$config['lang_uri_abbr'] = 'es';
            #$IN->set_cookie('user_lang', 'es', $config['sess_expiration']);
            #$URI->uri_string = str_replace('es','en',$URI->uri_string);
            }
        else{
            #$config['index_page'] = 'en';
            #$config['lang_uri_abbr'] = 'en';
            #$IN->set_cookie('user_lang', 'en', $config['sess_expiration']);
            }
        /* get the language abbreviation from uri */
       $uri_abbr = $URI->segment(1);
        #$uri_abbr='es';    
        /* adjust the uri string leading slash */
        #print $URI->uri_string;
        $URI->uri_string = preg_replace("|^\/?|", '/', $URI->uri_string);



        if ($lang_ignore) {

            if (isset($lang_uri_abbr[$uri_abbr])) {

                /* set the language_abbreviation cookie */
                $IN->set_cookie('user_lang', $uri_abbr, $config['sess_expiration']);

            } else {

                /* get the language_abbreviation from cookie */
                 $lang_abbr = $IN->cookie($config['cookie_prefix'].'user_lang');

            }

            if (strlen($uri_abbr) == 2) {

                /* reset the uri identifier */
                 $index_page .= empty($index_page) ? '' : '/';
              //  exit('654');
                /* remove the invalid abbreviation */
                $URI->uri_string = preg_replace("|^\/?$uri_abbr\/?|", '', $URI->uri_string);

                /* redirect */
                header('Location: '.$config['base_url'].$index_page.$URI->uri_string);
                exit;
            }

        } else {

            /* set the language abbreviation */
            $lang_abbr = $uri_abbr;
        }

        /* check validity against config array */
        if (isset($lang_uri_abbr[$lang_abbr])) {


           /* reset uri segments and uri string */
           //$URI->_reindex_segments(array_shift($URI->segments)); # this is commented becasue this is giving error : @$hok : 09/August/2015
           $URI->uri_string = preg_replace("|^\/?$lang_abbr|", '', $URI->uri_string);

           /* set config language values to match the user language */
           $config['language'] = $lang_uri_abbr[$lang_abbr];
           $config['language_abbr'] = $lang_abbr;


           /* if abbreviation is not ignored */
           if ( ! $lang_ignore) {

                   /* check and set the uri identifier */
                   $index_page .= empty($index_page) ? $lang_abbr : "/$lang_abbr";

                /* reset the index_page value */
                $config['index_page'] = $index_page;
           }

           /* set the language_abbreviation cookie */               
           $IN->set_cookie('user_lang', $lang_abbr, $config['sess_expiration']);

        } else {

            /* if abbreviation is not ignored */   
            if ( ! $lang_ignore) {                   

                   /* check and set the uri identifier to the default value */    
                $index_page .= empty($index_page) ? $default_abbr : "/$default_abbr";

                if (strlen($lang_abbr) == 2) {

                    /* remove invalid abbreviation */
                    $URI->uri_string = preg_replace("|^\/?$lang_abbr|", '', $URI->uri_string);
                }
                /*echo '<pre>';
                print_r($_SERVER);
                print_r($config['base_url'].$index_page.$URI->uri_string);
                exit;*/
                $q = $_SERVER['QUERY_STRING'];
                if($q)
                    $q = "/?".$q;
                /* redirect */
                header('Location: '.$config['base_url'].$index_page.$URI->uri_string.$q);
                exit;
            }

            /* set the language_abbreviation cookie */                
            $IN->set_cookie('user_lang', $default_abbr, $config['sess_expiration']);
        }

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

/* translate helper */
function t($line) {
    global $LANG;
//print_r($LANG);
//  exit;
    return ($t = $LANG->line($line)) ? $t : $line;
} 
function _t($line,$params=array()) {
    global $LANG;
    if($params){
        echo str_replace(array_keys($params),array_values($params),($t = $LANG->line($line)) ? $t : $line);
    }
    else
        echo ($t = $LANG->line($line)) ? $t : $line;
} ?>

and added below in config.php

$config['language'] = "english";

/* default language abbreviation */
$config['language_abbr'] = "en";

/* set available language abbreviations */
$config['lang_uri_abbr'] = array("en" => "english","es" => "spanish","ca" => "catalan");

/* hide the language segment (use cookie) */
$config['lang_ignore'] = TRUE;

route.php

$route['^en/(.+)$'] = "$1";
$route['^es/(.+)$'] = "$1";
$route['^ca/(.+)$'] = "$1";

$route['^(\w{2})$'] = $route['default_controller'];
$route['^(\w{2})/(.+)$'] = "$2";

,

language/catalan 
language/spanish 
language/english

, .

+4

?

$this->load->helper('language');

0

Load the current language into the cookie and load the language using the language value in the cookie Example, when the user selects the language, use the function below to set the current language to the cookie

   function language($lang = false) {
    if($this->input->get('lang')){ $lang = $this->input->get('lang'); } 
    $folder = 'application/language/';
    $languagefiles = scandir($folder);

    if(in_array($lang, $languagefiles)){
        $cookie = array(
            'name'   => 'lang',
            'value'  => $lang,
            'expire' => '31536000',
            'prefix' => 'my_',
            'secure' => false
        );

        $this->input->set_cookie($cookie);
    }

    $this->config->set_item('language', $lang);

    redirect($_SERVER["HTTP_REFERER"]);
}

Then in the constructor of your main user controller, or if you simply extend the CI_Controller, then load a language file on each controller constructor, etc.

   $this->lang->load('language_filename', get_cookie('my_lang'));

You finished

0
source

All Articles