我需要实现一种在使用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');要么,因为它说没有数据库对象。
那么,遵循这个逻辑,还有另一种更好的方法来改变语言而不会弄乱网址吗?
答案 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。