【问题标题】:Codeigniter session language - default languageCodeigniter 会话语言 - 默认语言
【发布时间】:2014-01-26 16:23:37
【问题描述】:

这是website

我正在使用此脚本在网站上使用 2 种语言(user_agents.php 文件):

<?php
class MY_Controller extends CI_Controller {
     public function __construct(){
        parent::__construct();
        parse_str($_SERVER['QUERY_STRING'], $_GET);

        if(!$this->session->userdata('lang') && !isset($_GET['lang']) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
            $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
            $this->session->set_userdata('lang' , $lang);
        }else{
            if(isset($_GET['lang'])){
                if($_GET['lang'] == 'es' || $_GET['lang'] == 'ca'){
                    $this->session->set_userdata('lang' , $_GET['lang']);
                }else{
                    $this->session->set_userdata('lang' , 'ca');
                }
            }
        }
        $this->lang->load('site', $this->session->userdata('lang'));

    }
}

我有两个问题

  1. 如果您在主页上并将其更改为“Catala”语言,它会更改 URL,但如果您单击任何菜单项,它会将您带到页面但没有 ?lang=ca... 它只是以西班牙语打开该部分,这是默认语言。所以基本上看来会话语言不起作用,因为在您进入任何部分后它都没有通过。

  2. 第二个问题是,如果您的浏览器主要语言是英语,则网站以该语言打开(显示没有加载取决于 spanishcatala 语言的菜单图像),而不是默认打开已设置为这在config.php 文件上:

    $config['language'] = '西班牙语';

谁能帮我解决这两个问题?

config.php

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;

【问题讨论】:

  • 无法加载请求的语言文件:language/ja/site_lang.php
  • /lanjuage/ja ?你在哪里看到的?我没有加载任何“ja”语言:S
  • 我从您网站上的错误中复制并粘贴了它。
  • 错误依然存在。看起来你可能在某个地方有错字。
  • 我认为它默认从浏览器接受的语言中加载语言,对我来说,它试图加载language/fr/site_lang.php,因为我的浏览器设置为 fr-CA。 @codek,我认为您应该首先查看设置的语言。HTTP_ACCEPT_LANGUAGE 是否由您的应用程序管理,因为它可能会像我和 Kenzo 一样失败。

标签: php codeigniter


【解决方案1】:

您的会话库是否正常工作?你可以通过设置会话值然后打印它来检查吗?我已经检查了你的网站。当提供lang GET 变量时,它会按预期工作,因为主页上的图像具有正确的prefix(en,es,ca),但如果未提供它,则假定默认的en_ 前缀。我建议您打开错误报告或检查错误日志。

我建议您执行以下操作来启用并检查会话是否正常工作。

转到/application/config/autoload.php,找到以$autoload['libraries']开头的行,看看会话是否自动加载。它看起来像这样

$autoload['libraries'] = array('database','session');

然后在您的核心控制器 (MY_Controller) 中检查以下内容:

$this->session->set_userdata('test','Hello World');
echo $this->session->userdata('test'); exit();

如果打印了Hello World,那么我们可以说会话正在运行。请让我知道您对此的回应。 [与客户聊天后更新]

解决方案:本机会话库似乎无法正常工作。页面刷新时会话丢失。所以我从here 添加了native PHP session 库,问题就解决了。

【讨论】:

  • autoload.php 我有:$autoload['libraries'] = array('session');。我通过粘贴您的代码进行了检查,并打印了Hello World,所以会话正在工作......
  • 是的,我把代码放在了在线版本中。拜托,你能删除链接吗,因为它会到达谷歌...谢谢!
  • 对不起,我刚试过,发现它有效并已删除。我刚刚又添加了一遍。重新加载网站
  • K.我已经看过了。你能在没有退出的情况下回显$this-&gt;session-&gt;userdata('lang')
  • 但它没有回应任何事情。试试echo "Heloo". $this-&gt;session-&gt;userdata('lang'),这样我就可以从源头识别它
【解决方案2】:

在 Chrome 中查看网站时,不会显示图像。我的语言环境是 en,它看起来好像正确匹配语言环境,显然没有与语言环境匹配的图像。

也许问题可能与从浏览器返回的语言环境有关?如果您使用的是 Android 设备,您可以在 Chrome 中启用 remote debugging 以更好地了解正在发送的语言环境。

【讨论】:

    【解决方案3】:

    我认为在配置中设置语言可能会有用,试试这个:

    <?php
    class MY_Controller extends CI_Controller {
        public function __construct(){
            parent::__construct();
            parse_str($_SERVER['QUERY_STRING'], $_GET);
    
            if(!$this->session->userdata('lang') && !isset($_GET['lang']) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
                $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);                
            }else{
                if(isset($_GET['lang'])){
                    if($_GET['lang'] == 'es' || $_GET['lang'] == 'ca'){
                        $lang = $_GET['lang'];
                    }else{
                        $lang = 'ca';
                    }
                }
            }
    
            $this->session->set_userdata('lang' , $lang);
            $this->config->set_item('language', $lang);
            $this->lang->load('site', $this->session->userdata('lang'));
    
        }
    }
    

    【讨论】:

    • 我把它改成了这个,但我看不出有什么不同,仍然是同样的问题。谢谢!
    • @codek 会话库是否在您的自动加载中自动加载? (我认为是的,否则它会崩溃)。您可以发布位于 application/config/config.php 的会话的配置吗?它应该以$config['sess_cookie_name'] = 'ci_session'; 或类似的东西开头
    • @codek 另一点,您的 MY_Controller 是否由您的控制器正确加载(继承)?您的 config.php 是否包含 $config['subclass_prefix'] = 'MY_';
    • 用 config.php 的会话更新了问题。我的config.php 确实包含以下内容:$config['subclass_prefix'] = 'MY_';
    【解决方案4】:

    您是否正在自动加载会话库?如果答案是否定的,那么您必须先加载它,然后才能对其进行任何操作。

    $this->load->library('session');
    

    所以试试

    class MY_Controller extends CI_Controller {
        public function __construct(){
            parent::__construct();
    
            $this->load->library('session'); // Loading the session library
    
            parse_str($_SERVER['QUERY_STRING'], $_GET);
    
            if(!$this->session->userdata('lang') && !isset($_GET['lang']) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
                $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
                $this->session->set_userdata('lang' , $lang);
            }else{
                if(isset($_GET['lang'])){
                    if($_GET['lang'] == 'es' || $_GET['lang'] == 'ca'){
                        $this->session->set_userdata('lang' , $_GET['lang']);
                    }else{
                        $this->session->set_userdata('lang' , 'ca');
                    }
                }
            }
            $this->lang->load('site', $this->session->userdata('lang'));
    
        }
    }
    

    【讨论】:

    • 已更改。我看不出有什么区别……还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多