2012-12-09 7 views
5

Während diese Frage könnte sein similartomanyothers, ich möchte specificaly für i18n auf FuelPHP für Meinungen/Anregungen zu den besten Ansatz fragen.FuelPHP ORM Datenbankschema für i18n, Meinungen/Anregungen

So, hier ist das, was ich habe, so weit:

Datenbankschema # 1:

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

Beispieldaten # 1:

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

Pros :

  • Gerade und einfache
  • Eine Tabelle pro Modell
  • Keine Notwendigkeit, JOIN verwenden
  • Verwendung eines magischen Methode Datenzugriff zu vereinfachen:

 

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

    return parent::__get($property); 
} 

Diese So, ich kann anrufen:

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

statt:

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

Nachteile:

  • Mit vielen Sprachen/übersetzt Felder könnte chaotisch.
  • Das Hinzufügen einer neuen Sprache bedeutet das Hinzufügen neuer Felder zur Tabelle
  • Die magische Methode funktioniert nur, wenn wir bereits eine ORM-Instanz/Objekt haben.eine ORM-Instanz durch die query builder durch ein übersetztes Feld bestellt holen es nach wie vor ist erforderlich Code wie:

 

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

Datenbankschema # 2:

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

Beispieldaten # 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') 

Vorteile:

  • Bessere Datenorganisation
  • eine neue Sprache ist, können wir auch einen direkten Datenzugriff über die set() ein Snap
  • Wie im ersten Ansatz Hinzufügen Methode bevölkern die $ _custom_data Array:

 

$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 
)); 

Nachteile:

  • Komplexität erhöht
  • A JOIN oder eine zweite Abfrage muss
  • Eine zusätzliche Tabelle für jedes Modell benötigt wird

Datenbankschema verwendet werden # 3:

Bei anderen Fragen habe ich Leute gesehen, die die Verwendung einer zentralen i18n-Tabelle für alle Übersetzungen vorschlagen, wobei eine Zeile für jede Übersetzung eines Modells verwendet wird.

Pro:

  • Einzeltisch für i18n zwischen Modellen gemeinsam
  • eine neue Sprache hinzufügen sollte

Cons wie im vorherigen Ansatz einfach sein:

  • Komp Exität erhöht sich beim Abrufen von Daten, erfordert ein JOIN für jeden übersetzten Text ein Modell
  • Wir könnten versuchen, EAV containers mit diesem Ansatz verwenden, obwohl das einen Schlüssel/Wert für die Zuordnung verwendet, aber in diesem Fall müssen wir auch verwenden language_id um die richtige Übersetzung zu erhalten.

Persönlich bevorzuge ich den zweiten Ansatz. Welche anderen Vorteile/Nachteile sehen Sie? Hat jemand i18n anders auf FuepHP implementiert?Teilen Sie Ihre Ideen :)

Antwort

2

Was ich einfach tun, ist ein lang Feld in der Tabelle hinzufügen.

ich auf diesem Gebiet filtern Dann:

SELECT * FROM articles WHERE lang = 'en' 

ich es auch für die Admin-Abschnitte in CRUD verwenden, in denen der Benutzer Sprachen wechseln können, und sie sehen alle Einträge für die jeweilige Sprache.

Und wird ein Editor automatisch arbeitet für Inhalte in der Sprache, die er in ist.

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

Und einfach bekommen ‚en‘ von den Benutzern aktuellen lokalen. (Ich erlaube ihnen jedoch, in Formen zu wechseln, um sie außer Kraft zu setzen).

+0

aber das würde dir einen anderen Artikel für jede Sprache bringen, nicht eine andere Sprache für jeden Artikel, ich denke deine Lösung ist das Gegenteil dessen, was er versucht hat zu erreichen (oder so scheint es) – Qchmqs