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:如何使用数据库和用户会话数据构建多语言网站?的主要内容,如果未能解决你的问题,请参考以下文章