虽然这个问题可能是similar to many others,但我想就FuelYP上针对i18n的最佳方法提出意见/建议。< / p>
所以,这是我到目前为止所做的:
数据库架构#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')
优点:
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')};
缺点:
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)
示例数据#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')
优点:
$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
));
缺点:
数据库架构#3:
在其他问题上,我看到有人建议在所有翻译中使用中央i18n表,为模型的每个翻译使用一行。
优点:
缺点:
Personaly,我更喜欢第二种方法。您看到了哪些其他优点/缺点?有没有人在FuePHP上以不同的方式实现i18n?分享您的想法:)
答案 0 :(得分:2)
我只是在表格中添加lang
字段。
然后我在那个字段上过滤:
SELECT * FROM articles WHERE lang = 'en'
我甚至在CRUD中使用它来管理用户可以切换语言的部分,并且他们会看到该特定语言的所有条目。
编辑将自动使用他所在语言的内容。
INSERT INTO articles VALUES('My Title', 'My Article', 'en')
只需从用户当前本地获取'en'即可。 (我允许他们改变形式,但要覆盖它)。