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?分享你的想法:)
但這會讓你爲每個朗讀一篇不同的文章,而不是每篇文章的朗讀,我認爲你的解決方案與他試圖達到的目標相反(或者看起來如此) – Qchmqs