对于国际化,意见/建议FuelPHP ORM数据库模式(FuelPHP ORM database s

2019-08-03 17:21发布

虽然这个问题可能是类似于 对 很多 人 ,我想问的意见/建议,对国际化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实例/对象的工作。 要通过获取的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')

优点:

  • 较好的数据组织
  • 添加一个新的语言是一个单元
  • 像第一种方法,我们还可以使用有直接访问数据集()方法来填充$ _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:

在其他问题,我见过的人建议使用中央国际化表的所有翻译,使用一排的每个翻译模型。

优点:

  • 对于国际化单表款之间共享
  • 添加新语言应该很容易在前面的方法

缺点:

  • 复杂性增加,而获取的数据,需要对每个翻译后的文本模式有一个JOIN
  • 我们可以尝试使用EAV容器用这种方法,虽然使用了映射键/值,但在这种情况下,特别是我们还必须使用LANGUAGE_ID获取正确的翻译。

本人来说,我更喜欢第二种方法。 其他什么优点/缺点,你看到了什么? 有没有人实现的国际化在FuePHP以不同的方式? 分享您的想法:)

Answer 1:

我只是做的是增加一个lang在表中的字段。

然后,我对字段进行筛选:

SELECT * FROM articles WHERE lang = 'en'

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

和一个编辑器会自动工作在他的语言的内容。

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

而简单地从用户的当前地方得到“恩”。 (我这样做让他们在形式改变,虽然将其覆盖)。



文章来源: FuelPHP ORM database schema for i18n, opinions/suggestions