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 :)
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