2015-06-23 52 views
5

我使用CodeIgniter构建多语言Web应用程序。我有/system/languages/文件夹下的英文和其他语言,并且我创建了一个负责在运行时更改工作语言的模型。表单验证在运行时更改时忽略语言

默认笨在法国工作作为/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.... 
} 

这确信表单验证之前加载模型。不幸的是,这还不够,表单验证在运行时更改时仍会忽略语言。任何人都知道这是为什么发生?

谢谢。

回答

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'); 
      } 
     } 
    } 
} 

注意:对form_validation构造函数的更改不是必需的。

答案提供给将来参考,并提醒人们我们想念的小事情。这是非常明显的权利!那么这可能会帮助下一个忘记的人。

闭幕问题。