我使用CodeIgniter构建多语言Web应用程序。我在/system/languages/
文件夹下有英语和其他语言,并且我已经创建了一个模型,负责在运行时更改工作语言。
默认情况下,CodeIgniter使用/application/config/config.php
$config['language'] = 'french';
稍后,根据URI段,模型会相应地更改语言,简化示例如下:
class multilang extends CI_Model {
public function __construct() {
parent::__construct();
if ($this->uri->segment(1) == 'en') {
$this->config->set_item('language', 'english');
}
}
}
此模型是/application/config/autoload.php
中自动加载设置下列出的第一个模型,我可以通过调用确认语言确实已动态更改:
echo $this->config->item('language');
但是内置表单验证库没有考虑更改的语言,而只显示来自设置文件/application/config/config.php
中硬编码的语言的错误消息,在本例中为法语。
起初我认为这是因为表单验证是在multilang
模型之前加载的。为了确保首先加载模型,我修改了表单验证构造函数以在之前的任何其他内容之前加载模型:
public function __construct($rules = array())
{
$this->CI =& get_instance();
$this->CI->load->model('multilang');
// normal code after....
}
这确保在表单验证之前加载模型。不幸的是,这还不够,在运行时更改时,表单验证仍然会忽略语言。谁知道为什么会这样?
谢谢。
答案 0 :(得分:4)
问题是我正在做AJAX请求而没有考虑包含语言缩写的URI段,因为AJAX请求的URI首先不需要语言段,所以我完全忘了它。
因此我使用会话cookie来存储语言。将multilang构造函数更改为:
class multilang extends CI_Model {
public function __construct() {
parent::__construct();
# store lang between session
$data = $this->session->all_userdata();
if (isset($data['language'])) {
$lang = $data['language'];
# if lang was changed between sessions
if ($this->uri->segment(1) == 'fr'){
$lang = 'french';
} else if ($this->uri->segment(1) == 'en'){
$lang = 'english';
}
# if lang was changed using one of the lang abbreviations
# overule session setting
if ($this->uri->segment(1) == 'en') {
$lang = 'english';
} else if ($this->uri->segment(1) == 'fr') {
$lang = 'french';
}
$this->config->set_item('language', $lang);
$this->session->set_userdata('language', $lang);
} else {
if ($this->uri->segment(1) == 'en') {
$this->config->set_item('language', 'english');
$this->session->set_userdata('language', 'english');
} else if ($this->uri->segment(1) == 'fr') {
$this->config->set_item('language', 'french');
$this->session->set_userdata('language', 'french');
}
}
}
}
注意:不需要更改form_validation构造函数。
答案提供给将来参考,并提醒人们我们想念的小事。这是显而易见的!那么这可能有助于下一个忘记的人。
结束问题。