Esquema de base de datos FuelPHP ORM para i18n, opiniones / sugerencias

Si bien esta pregunta podría sersimilar a muchos otrosQuisiera pedir opiniones / sugerencias sobre el mejor enfoque para i18n específicamente en FuelPHP.

Entonces, esto es lo que tengo hasta ahora:

Esquema de base de datos # 1:

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

Datos de muestra # 1:

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

Pros:

Recto y sencilloUna mesa por modelo.No es necesario usar JOINUso de un método mágico para simplificar el acceso a los datos:

 

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

    return parent::__get($property);
}

De esta manera, soy capaz de hacer la llamada:

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

en lugar de:

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

Contras:

Tener muchos idiomas / campos traducidos puede causar problemas.Agregar un nuevo idioma, implica agregar nuevos campos a la tablaEl método mágico solo funciona cuando ya tenemos una instancia / objeto ORM. Para obtener una instancia ORM a través de laconsultor de construcción ordenado por un campo traducido todavía se requiere un código como:

 

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

Esquema de base de datos # 2:

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

Datos de muestra # 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')

Pros:

Mejor organización de datos.Añadir un nuevo idioma es muy sencilloAl igual que en el primer enfoque, también podemos tener un acceso directo a los datos utilizando elconjunto() método para rellenar la matriz $ _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
));

Contras:

Aumenta la complejidadUna ÚNICA o una segunda consulta debe ser usadaSe requiere una mesa extra para cada modelo.

Esquema de base de datos # 3:

En otras preguntas, he visto a personas sugerir el uso de una tabla i18n central para todas las traducciones, usando una fila para cada traducción que tenga un modelo.

Pros:

Mesa única para i18n compartida entre modelos.Agregar un nuevo idioma debería ser fácil como en el enfoque anterior

Contras:

La complejidad aumenta mientras se obtienen datos, lo que requiere una ÚNICA para cada texto traducido que tiene un modeloPodríamos intentar usarContenedores de EAV con este enfoque, aunque utiliza una clave / valor para el mapeo, pero en este caso en particular, también tenemos que usar el language_id para obtener la traducción adecuada.

Personalmente, prefiero el segundo enfoque. ¿Qué otras ventajas / desventajas ves? ¿Alguien ha implementado i18n de una manera diferente en FuePHP? Comparte tus ideas :)

Respuestas a la pregunta(1)

Su respuesta a la pregunta