2015-06-23 53 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構造函數的更改不是必需的。

答案提供給將來參考,並提醒人們我們想念的小事情。這是非常明顯的權利!那麼這可能會幫助下一個忘記的人。

閉幕問題。