2015-08-08 115 views
3

我是Codeigniter,我需要用户的动态语言。CodeIgniter动态语言功能

我在标题处添加了下拉菜单,我想让用户在前端更改网站语言。

我想在一个控制器下面的代码更改语言

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

,但它不工作的不改变语言

我也试图与我的控制器的一个以会话使用下面的代码

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

并尝试访问此配置文件中的变量,但它也不起作用。

帮我做这个工作。

回答

3

最后我得到的成功,使多国语言下面

按照步骤

MY_Lang.php文件夹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; 
} ?> 

,并在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 

我希望这会有所帮助。

0

你有没有尝试在你的控制器中添加这个?

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

+0

嘿@Gemmi,这个帮手已经包含在autoload.php中,所以不需要添加。 –

0

负载在cookie中的当前语言和在cookie 实施例使用的语言值加载语言文件,每当用户选择了语言使用下面的函数来的当前语言设置到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"]); 
} 

然后在您的主要自定义控制器的构造函数或如果你只是延长是CI_Controller然后在每个控制器的构造函数加载语言文件(S)和像

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

你完成了