2015-06-23 13 views
5

Tôi đang sử dụng CodeIgniter để tạo ứng dụng web đa ngôn ngữ. Tôi có tiếng Anh và các ngôn ngữ khác theo thư mục /system/languages/ và tôi đã tạo một mô hình chịu trách nhiệm thay đổi ngôn ngữ làm việc trong thời gian chạy.Xác thực biểu mẫu bỏ qua ngôn ngữ khi được thay đổi trong thời gian chạy

Theo mặc định CodeIgniter đang làm việc tại Pháp theo quy định tại /application/config/config.php

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

Sau đó, theo một phân khúc URI mô hình thay đổi ngôn ngữ cho phù hợp, ví dụ đơn giản dưới đây:

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

này là mô hình đầu tiên được liệt kê trong cài đặt tải tự động trong /application/config/autoload.php và tôi có thể xác nhận rằng ngôn ngữ thực sự được thay đổi động bằng cách gọi:

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

Tuy nhiên việc xây dựng trong thư viện hình thức xác nhận không đưa vào tài khoản các ngôn ngữ đã thay đổi, thay vì chỉ cho thấy các thông báo lỗi từ ngôn ngữ cứng mã hoá trong các thiết lập nộp /application/config/config.php trong trường hợp này người Pháp.

Lúc đầu, tôi giả định điều này là do xác thực biểu mẫu đã được tải trước mẫu multilang. Để đảm bảo mô hình được tải trước, tôi đã sửa đổi hàm tạo hợp lệ biểu mẫu để tải mô hình trước bất cứ điều gì khác như thế này:

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

Điều này đảm bảo mô hình được tải trước khi xác thực biểu mẫu. Thật không may điều này là không đủ và xác nhận mẫu vẫn bỏ qua ngôn ngữ khi thay đổi trong thời gian chạy. Có ai biết tại sao điều này xảy ra không?

Cảm ơn bạn.

Trả lời

4

Vấn đề là tôi đã thực hiện các yêu cầu AJAX không tính đến phân đoạn URI chứa từ viết tắt của ngôn ngữ, vì URI cho các yêu cầu AJAX không cần phân đoạn ngôn ngữ ngay từ đầu, vì vậy tôi hoàn toàn quên nó đi.

Vì vậy, tôi đã sử dụng cookie phiên để lưu trữ ngôn ngữ. Thay đổi hàm tạo multilang thành:

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

Lưu ý: Thay đổi đối với hàm tạo form_validation không bắt buộc.

Trả lời được cung cấp để tham khảo trong tương lai và nhắc nhở mọi người về những điều nhỏ nhặt mà chúng tôi bỏ lỡ. Nó rất rõ ràng! Vâng điều này có thể giúp người tiếp theo quên.

Câu hỏi đóng.

Các vấn đề liên quan