Codeigniter:如何使用数据库和用户会话数据构建多语言网站?

时间:2011-10-10 11:10:54

标签: session codeigniter multilingual

我需要实现一种在使用Codeigniter开发的网站中切换语言的方法。我知道Codeigniter有一个库来管理语言文件,这正是我想要使用的。但是因为我还需要能够修改翻译的文本,我将翻译存储在数据库中,并且我用查询生成Codeigniter语言文件,这样:

<?php
$LANGCI =& get_instance();

$lang_query = $LANGCI->db->where('lang', 'italian')->get('my_lang');

foreach ($lang_query->result() as $language_data) {

$lang[$language_data->index] = $language_data->translation;
}

这实际上有效,所以当我打电话时:

<?=$this->lang->line('label_about_us')?>

它以配置文件中指定的语言显示。

现在我想更改单击链接的语言。所以我在里面用这个函数创建了一个“语言”控制器:

public function set_language($lang)
{
    $this->session->set_userdata('language', $lang);
    $this->config->set_item('language', $lang);
    redirect('');
}

它可以正常更改会话数据和配置文件。问题是我在控制器中加载语言,这样:

$this->lang->load('my');

它只检索配置文件中指定的语言,而不考虑我用我的函数设置的语言。 所以,经过一段时间我发现它我可以这样加载语言:

    $this->lang->load('my', $this->session->userdata('language'));

它有效。问题是我不能把这一行放在自动加载文件中。实际上,我不能把$ this-&gt; lang-&gt; load('my');要么,因为它说没有数据库对象。

那么,遵循这个逻辑,还有另一种更好的方法来改变语言而不会弄乱网址吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试扩展控制器类。

class MY_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->lang->load('my', $this->session->userdata('language'));
    }
}

然后,而不是从您的控制器扩展CI_Controller类扩展自定制类。通过这种方式,您可以确保每次实例化控制器时都会加载您的语言。

有关详细信息,请参阅用户指南Creating Core Classes