在运行时更改时,表单验证会忽略语言

Fáb*_*nes 5 multilingual codeigniter

我正在使用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');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此模型是自动加载设置下列出的第一个模型/application/config/autoload.php,我可以通过调用以下方式确认语言确实已动态更改:

echo $this->config->item('language');

但是,内置表单验证库不考虑更改的语言,而只显示来自设置文件/application/config/config.php中硬编码的语言的错误消息,在本例中为French.

起初我假设这是因为表单验证是在multilang模型之前加载的.为了确保首先加载模型,我修改了表单验证构造函数以在之前的任何其他内容之前加载模型:

public function __construct($rules = array())
{
    $this->CI =& get_instance();
    $this->CI->load->model('multilang');
    // normal code after....
}
Run Code Online (Sandbox Code Playgroud)

这确保在表单验证之前加载模型.不幸的是,这还不够,表单验证在运行时更改时仍会忽略语言.谁知道为什么会这样?

谢谢.

Fáb*_*nes 4

问题是我在执行 AJAX 请求时没有考虑包含语言缩写的 URI 段,因为 AJAX 请求的 URI 一开始就不需要语言段,所以我完全忘记了它。

因此我使用会话cookie来存储语言。将多语言构造函数更改为:

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');
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:不需要更改 form_validation 构造函数。

提供答案供将来参考,并提醒人们我们错过的小事情。太明显了!好吧,这可能会对下一个忘记的人有所帮助。

结束语。