CodeIgniter动态语言功能

时间:2015-08-08 15:06:18

标签: php codeigniter-3

我是Codeigniter,我需要用户使用动态语言。

我在标题中添加了下拉菜单,我希望允许用户在前端更改网站的语言。

我试图用一个控制器中的以下代码更改语言

if(jQuery("input:radio[name=type]").is(":checked")){
   // do stuff
}

但它没有改变它的语言

我还尝试在我的一个控制器中使用以下代码进行会话

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

并尝试在配置文件中访问此变量,但它也无效。

帮助我完成这项工作。

3 个答案:

答案 0 :(得分:4)

最后我获得成功制作多语言

按照以下步骤

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

我希望这会有所帮助。

答案 1 :(得分:0)

您是否尝试在控制器中添加此内容?

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

答案 2 :(得分: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,然后在每个控制器的构造函数上加载语言文件等

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

你已经完成了