适用于i18n的FuelPHP ORM数据库架构,意见/建议

时间:2012-12-09 00:57:32

标签: database orm internationalization fuelphp

虽然这个问题可能是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')

优点:

  • 直接而简单
  • 每个型号一张表
  • 无需使用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实例/对象时才有效。要通过翻译字段排序的query builder获取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)

示例数据#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表,为模型的每个翻译使用一行。

优点:

  • 模型之间共享的i18n单表
  • 添加新语言应该像上一种方法一样简单

缺点:

  • 在获取数据时复杂性增加,需要为模型具有的每个翻译文本加入
  • 我们可以尝试使用EAV containers这种方法,虽然它使用键/值进行映射,但在这种情况下,我们还必须使用language_id来获取正确的翻译。

Personaly,我更喜欢第二种方法。您看到了哪些其他优点/缺点?有没有人在FuePHP上以不同的方式实现i18n?分享您的想法:)

1 个答案:

答案 0 :(得分:2)

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

然后我在那个字段上过滤:

SELECT * FROM articles WHERE lang = 'en'

我甚至在CRUD中使用它来管理用户可以切换语言的部分,并且他们会看到该特定语言的所有条目。

编辑将自动使用他所在语言的内容。

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

只需从用户当前本地获取'en'即可。 (我允许他们改变形式,但要覆盖它)。