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

Posted

技术标签:

【中文标题】Codeigniter:如何使用数据库和用户会话数据构建多语言网站?【英文标题】:Codeigniter: how to build multilingual website using database and user session data? 【发布时间】:2011-12-04 10:41:32 【问题描述】:

我需要在使用 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->lang->load('my');要么,因为它说没有数据库对象。

那么,按照这个逻辑,是否有另一种更好的方法来更改语言而不弄乱 url?

【问题讨论】:

你为什么不在自动加载库部分像这样加载 db 和 session $autoload['libraries'] = array('database','session'); @shikhar:我已经这样做了。我认为无论如何它实际上会加载它们 好吧 .. 把它挂在钩子上怎么样!! the best way to make codeigniter website multi-language. calling from lang arrays depends on lang session? 的可能重复项 你建议我应该把什么放在一个钩子里? 【参考方案1】:

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

class MY_Controller extends CI_Controller

    function __construct()
    
        parent::__construct();
        $this->lang->load('my', $this->session->userdata('language'));
    

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

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

【讨论】:

以上是关于Codeigniter:如何使用数据库和用户会话数据构建多语言网站?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CodeIgniter (3.1.0) 创建会话

如何在codeigniter中关闭浏览器来销毁会话

如何在codeigniter中删除浏览器历史记录?

如何在codeigniter中使用会话表

手动设置会话过期时间-CodeIgniter

oracle 如何限定用户并发会话数