2012-12-09 9 views
5

Chociaż to pytanie może być similartomanyothers, chciałbym prosić o opinie/sugestie na temat najlepszego podejścia do i18n specificaly na FuelPHP.FuelPHP ORM schematu bazy danych dla i18n, opinie/sugestie

Tak, o to, co mam do tej pory:

Database schematu nr 1:

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

próbki danych # 1:

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

Zalety :

  • Proste i prosty
  • Jedna tabela na modelu
  • Nie trzeba używać JOIN
  • użycie magicznego sposobu na uproszczenie dostępu do danych:

 

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

    return parent::__get($property); 
} 

ten sposób, mogę zadzwonić:

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

zamiast:

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

Wady:

  • Posiadające wiele języków/przetłumaczone pola może się bałagan.
  • Dodanie nowego języka oznacza dodanie nowych pól do tabeli
  • Metoda magiczna działa tylko wtedy, gdy mamy już instancję ORM/obiekt.Aby pobrać instancję ORM przez query builder zlecenie przetłumaczoną dziedzinie to nadal wymagany kod jak:

 

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

schematu bazy danych # 2:

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

próbki danych Nr 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') 

Plusy:

  • Lepsze dane organizacja
  • Dodanie nowego języka jest bardzo prosta
  • Podobnie jak w pierwszym podejściu, możemy również mieć bezpośredni dostęp do danych za pomocą metody do set() Wypełnij tablicę $ _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 
)); 

Wady:

  • złożoność zwiększa
  • JOIN lub drugie zapytanie należy stosować
  • wymagany jest dodatkowy stół dla każdego modelu schematu

Database # 3:

W przypadku innych pytań widziałem ludzi sugerujących użycie centralnej tabeli i18n dla wszystkich tłumaczeń, używając wiersza dla każdego tłumaczenia, jaki ma model.

Plusy:

  • pojedyncze stół dla i18n współdzielone pomiędzy modelami
  • Dodanie nowego języka powinny być proste, jak w poprzednim podejściu

Wady:

  • Compl zwiększa się wartość przy pobieraniu danych, wymagając JOIN dla każdego przetłumaczonego tekstu; model ma
  • Możemy spróbować użyć metody EAV containers z tym podejściem, chociaż używa to klucza/wartości do odwzorowania, ale w tym przypadku w szczególności musimy również użyć language_id, aby pobrać poprawne tłumaczenie.

Osobisty, wolę drugie podejście. Jakie inne zalety/wady widzisz? Czy ktoś wprowadził i18n w inny sposób na FuePHP?Podziel się pomysłami :)

Odpowiedz

2

Po prostu dodaję pole lang do tabeli.

Potem filtrować na tym polu:

SELECT * FROM articles WHERE lang = 'en' 

I nawet używać go w CRUD dla sekcji administratora, w którym użytkownik może przełączać języki, i widzą wszystkie wpisy dla tego konkretnego języka.

A redaktor zostanie automatycznie pracuje dla treści w języku, którego się znajduje.

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

i po prostu się „PL” z użytkownikami lokalnymi. (Pozwalam im na zmianę w formularzach, ale nadpisuję je).

+0

ale to przyniosłoby ci inny artykuł dla każdego języka, a nie inny język dla każdego artykułu, myślę, że twoje rozwiązanie jest przeciwieństwem tego, co próbował osiągnąć (a przynajmniej tak się wydaje) – Qchmqs

Powiązane problemy