2015-06-23 12 views
5

Sto utilizzando CodeIgniter per creare un'applicazione web multilingue. Ho inglese e altre lingue nella cartella /system/languages/ e ho creato un modello responsabile della modifica della lingua di lavoro in fase di esecuzione.La convalida del modulo ignora la lingua quando viene modificata durante l'esecuzione

Per impostazione predefinita CodeIgniter sta lavorando in francese come definito nella /application/config/config.php

$config['language'] = 'french';

In seguito, in base a un segmento URI il modello cambia la lingua di conseguenza, ad esempio semplificato muggito:

class multilang extends CI_Model { 
    public function __construct() { 
     parent::__construct(); 
     if ($this->uri->segment(1) == 'en') { 
      $this->config->set_item('language', 'english'); 
     } 
    } 
} 

Questo il modello è il primo modello elencato nelle impostazioni di caricamento automatico in /application/config/autoload.php e posso confermare che la lingua è effettivamente cambiata in modo dinamico chiamando:

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

Tuttavia il costruito in libreria di validazione dei form non prende in considerazione la lingua cambiato, invece mostra solo i messaggi di errore dal linguaggio hard coded nelle impostazioni del file /application/config/config.php in questo caso francese.

In un primo momento ho assunto questo perché la convalida del modulo è stata caricata prima del modello multilang. Per assicurarsi che il modello è stato caricato prima, ho modificato il costruttore validazione dei form per caricare il modello prima di ogni altra cosa in questo modo:

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

Questo fatto che il modello caricato prima della validazione dei form. Sfortunatamente ciò non è stato sufficiente e la convalida del modulo ignora ancora la lingua quando viene modificata durante l'esecuzione. Qualcuno sa perché questo succede?

Grazie.

risposta

4

Il problema era che stavo facendo richieste AJAX che non tenevano conto del segmento URI che conteneva l'abbreviazione della lingua, perché l'URI per le richieste AJAX non aveva bisogno del segmento della lingua in primo luogo, quindi sono totalmente dimenticato.

Pertanto ho utilizzato il cookie di sessione per memorizzare la lingua. Cambiare il costruttore multilang a:

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

Nota: La modifica al costruttore form_validation non era necessario.

Risposta fornita per riferimento futuro e per ricordare alle persone piccole cose che ci mancano. Era così ovvio, giusto! Bene, questo potrebbe aiutare il prossimo a dimenticare.

domanda di chiusura.

Problemi correlati