2012-12-09 23 views
5

Trong khi câu hỏi này có thể là similartomanyothers, tôi muốn xin ý kiến ​​/ đề xuất về phương pháp tốt nhất cho i18n specificaly trên FuelPHP.CSDL FuelPHP ORM cho i18n, ý kiến ​​/ góp ý

Vì vậy, đây là những gì tôi đã có cho đến nay:

Database schema # 1:

models (id, name_pt, name_es, name_en, description_pt, description_es, description_en) 

mẫu dữ liệu # 1:

(1, 'Modelo', 'Modelo', 'Model', 'Descrição do modelo', 'Descripción del modelo', 'Model description') 

Ưu :

  • thẳng và đơn giản
  • Một bảng mỗi mô hình
  • Không cần phải sử dụng THAM GIA
  • Sử dụng một phương pháp kỳ diệu để đơn giản hóa truy cập dữ liệu:

 

public function & __get($property) 
{ 
    if (array_key_exists($property, array('name', 'description'))) 
    { 
     $property = $property.'_'.Session::get('lang_code'); 
    } 

    return parent::__get($property); 
} 

này , tôi có thể thực hiện cuộc gọi:

$model->name; 
$model->description; 

thay vì:

$model->{'name_'.Session::get('lang_code')}; 
$model->{'description_'.Session::get('lang_code')}; 

Nhược điểm:

  • Có rất nhiều ngôn ngữ/lĩnh vực dịch có thể nhận được lộn xộn.
  • Thêm ngôn ngữ mới, ngụ ý thêm trường mới vào bảng
  • Phương pháp ảo chỉ hoạt động khi chúng tôi đã có đối tượng/đối tượng ORM.Để lấy một ví dụ ORM qua query builder lệnh của một lĩnh vực dịch nó vẫn đòi hỏi mã như:

 

Model_Model::query() 
    ->order_by('name_'.Session::get('lang_code')) 
    ->get(); 

Database schema # 2:

languages (id, code, name) 
models (id) 
i18n_models (id, model_id, language_id, name, description) 

mẫu dữ liệu # 2:

-- languages 
(1, 'pt', 'Português') 
(2, 'es', 'Español') 
(3, 'en', 'English') 

-- models 
(1) 

-- i18n_models 
(1, 1, 1, 'Modelo', 'Descrição do modelo') 
(2, 1, 2, 'Modelo', 'Descripción del modelo') 
(3, 1, 3, 'Model', 'Model description') 

Ưu điểm:

  • Better tổ chức dữ liệu
  • Thêm một ngôn ngữ mới là một snap
  • Giống như trong cách tiếp cận đầu tiên, chúng tôi cũng có thể có một truy cập dữ liệu trực tiếp sử dụng phương pháp set() để điền vào mảng $ _custom_data:

 

$i18n = Model_I18n_Model::query() 
    ->where('model_id', $model->id) 
    ->where('language_id', Session::get('lang_code')) 
    ->get_one(); 

$model->set(array(
    'name' => $i18n->name, 
    'description' => $i18n->description 
)); 

Nhược điểm:

  • phức tạp tăng
  • Lệnh JOIN hoặc một truy vấn thứ hai phải được sử dụng
  • Một bảng phụ cho mỗi mô hình là cần thiết schema

Cơ sở dữ liệu # 3:

Về các câu hỏi khác, tôi đã thấy mọi người đề xuất sử dụng bảng i18n trung tâm cho tất cả các bản dịch, sử dụng một hàng cho mỗi bản dịch mà một mô hình có.

Ưu điểm:

  • Độc bảng cho i18n chia sẻ giữa các mô hình
  • Thêm một ngôn ngữ mới nên dễ dàng như trong cách tiếp cận trước

Nhược điểm:

  • Khiếu nại exity tăng trong khi tìm nạp dữ liệu, yêu cầu JOIN cho mọi văn bản đã dịch mà một mô hình có
  • Chúng tôi có thể thử sử dụng EAV containers với phương pháp này, mặc dù sử dụng khóa/giá trị để lập bản đồ, nhưng trong trường hợp này, chúng tôi cũng phải sử dụng language_id để tìm bản dịch phù hợp.

Cá nhân, tôi thích cách tiếp cận thứ hai. Bạn thấy ưu điểm/nhược điểm nào khác? Có ai đã triển khai i18n theo cách khác trên FuePHP không?Chia sẻ ý tưởng của bạn :)

Trả lời

2

Điều tôi chỉ cần làm là thêm trường lang vào bảng.

Sau đó, tôi lọc trên sân rằng:

SELECT * FROM articles WHERE lang = 'en' 

Tôi thậm chí sử dụng nó trong CRUD cho phần quản trị mà người dùng có thể chuyển đổi ngôn ngữ, và họ nhìn thấy tất cả các mục cho rằng ngôn ngữ cụ thể.

Và một biên tập viên sẽ được tự động làm việc cho các nội dung bằng tiếng anh là trong.

INSERT INTO articles VALUES('My Title', 'My Article', 'en') 

Và chỉ đơn giản là có được 'en' từ người dùng hiện tại địa phương. (Tôi cho phép họ thay đổi trong các hình thức mặc dù để ghi đè lên nó).

+0

nhưng điều đó sẽ giúp bạn có một bài viết khác nhau cho mỗi lang, không phải là một ngôn ngữ khác nhau cho mỗi bài viết, tôi nghĩ rằng giải pháp của bạn là trái ngược với những gì anh ấy cố gắng đạt được (hoặc có vẻ như) – Qchmqs

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