2012-12-09 122 views
5

FuelPHP ORM的數據庫模式雖然這個問題可能是similartomanyothers,我想問的意見/建議,對國際化specificaly上FuelPHP最好的辦法。的國際化,意見/建議

所以,這裏是我到目前爲止有:

數據庫模式#1:

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

樣品數據#1:

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

優點:

  • 直和簡單
  • 其中每個模型
  • 沒有必要使用JOIN
  • 使用一個神奇的方法來簡化數據訪問表:

 

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

    return parent::__get($property); 
} 

這方式,我可以打電話:

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

代替:

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

缺點:

  • 有很多的語言/翻譯領域可能會導致混亂。
  • 添加新語言意味着在表中添加新字段
  • 魔術方法只適用於已經有ORM實例/對象的情況。

 

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

數據庫模式#2:

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

樣本數據通過翻譯的領域,它仍然需要類似的代碼下令query builder獲取的ORM實例#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') 

優點:

  • 更好的數據組織
  • 添加一種新的語言是一個單元
  • 像第一種方法,我們還可以有一個直接的數據訪問使用set()方法填充$ _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 
)); 

缺點:

  • 複雜性的增加
  • JOIN或第二查詢必須使用
  • 需要對每個模型的一個額外的表

數據庫模式#3:

在其他問題上,我看到有人建議在所有翻譯中使用中央i18n表格,對於模型的每種翻譯使用一行。

優點:

    • 的國際化單錶款之間
    • 添加新語言應該很容易在之前的做法

    缺點共享

  • Compl在獲取數據時exity增加,需要爲每個已翻譯文本加入一個模型
  • 我們可以嘗試使用EAV containers這種方法,儘管它使用鍵/值進行映射,但在這種情況下,我們還必須使用language_id獲取正確的翻譯。

個人意見,我更喜歡第二種方法。你還看到了什麼其他的優點/缺點?有沒有人在FuePHP上以不同的方式實現i18n?分享你的想法:)

回答

2

我只是在表中添加一個lang字段。

然後我對字段進行篩選:

SELECT * FROM articles WHERE lang = 'en' 

我甚至用它在CRUD的管理部分,用戶可以切換語言,他們看到該特定語言的所有條目。

而且編輯器會自動工作在他的語言的內容。

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

,簡單地從用戶的當前地方得到「恩」。 (我確實允許他們改變形式,但重寫它)。

+0

但這會讓你爲每個朗讀一篇不同的文章,而不是每篇文章的朗讀,我認爲你的解決方案與他試圖達到的目標相反(或者看起來如此) – Qchmqs