2011-09-12 22 views
7

Szukam porady, jak obsługiwać tabele, które muszą mieć pola, które muszą być przetłumaczone na n języków. Przeczytałem, że najlepszym sposobem jest posiadanie jednego stołu bazowego, w którym znajdują się wszystkie pola, które nie są specyficzne dla danego języka, oraz jedna tabela zawierająca wszystkie pola z tłumaczeniami.Doctrine 2 - najlepsze praktyki dla i18n?

Przykład:

 

PRODUCT    PRODUCT_TRANSLATIONS 
+--------------+ +----------------------+ 
| id   | | id     | 
+--------------+ +----------------------+ 
| category_id | | product_id   | 
+--------------+ +----------------------+ 
| price  | | language_id   | 
+--------------+ +----------------------+ 
        | name     | 
        +----------------------+ 
        | description   | 
        +----------------------+ 

Więc będziemy mieli PRODUKT tabela bazowa, która przechowuje wszystkie dane meta oraz tabelę PRODUCT_TRANSLATIONS gdzie wszystkie dane są przechowywane, które muszą być tłumaczone na wiele języków. Tabela PRODUKT ma związek OneToany z tabelą PRODUCT_TRANSLATIONS.

Jaka byłaby doktryna - sposób radzenia sobie z takim scenariuszem? Jeśli zapytam o tabelę produktów, wszystkie tłumaczenia zostaną dołączone do tej tabeli. Ale przez większość czasu chcę mieć tylko jedno tłumaczenie dla danego identyfikatora produktu. Mogłabym użyć klasy repozytorium, aby napisać własne metody pobierania, aby ograniczyć zestaw wyników tylko do jednego języka, ale będę miał wiele tabel, które mają pola, które muszą być przetłumaczone. Założę się, że istnieje bardziej ogólne rozwiązanie tego problemu. Innym problemem jest to, że jeśli zapytam o jeden obiekt związany z innym obiektem, otrzymam wszystkie tłumaczenia dla tego drugiego obiektu.

Btw: Jestem świadomy możliwości rozszerzenia Translatable przez Gediminasa, ale nie podoba mi się to, że wszystkie tłumaczenia są przechowywane w jednej tabeli.

Poszukuję więc najlepszych praktyk w zakresie internacjonalizacji. Każda myśl na ten temat jest bardzo ceniona.

+0

Znaleziono rozwiązanie? Szukam tego samego. –

Odpowiedz

0

Rozszerzające się rozszerzenie zachowania, o którym wspomniałeś, to: powoduje, że zezwala na tłumaczenie obiektu na jedną klasę. Sprawdź pod-nagłówek "Translation entity" w sekcji przykładów zaawansowanych w translatable doc.

W skrócie: użyj adnotacji @Gedmo\TranslationEntity, aby określić konkretny element do przechowywania tłumaczeń. W ten sposób możesz podzielić obciążenie na wiele tabel.

+2

W zaawansowanych przykładach pod "Podmiotem tłumaczenia" widzę, że te pola są używane: {"locale", "objectClass", "foreign_key", "field"}. Zakładam, że użycie tego spowoduje wygenerowanie rekordu na przetłumaczone pole. Tak więc jeden przetłumaczony produkt spowoduje wiele rekordów w tabeli translacji. Czy możliwe jest posiadanie tylko jednego rekordu (ze wszystkimi przetłumaczonymi polami) w tabeli translacji dla jednego przetłumaczonego rekordu? – murze

0

Btw: Jestem świadomy tłumaczyć rozszerzeniem zachowań Giedymina ale nie podoba mi się fakt, że wszystkie tłumaczenia są przechowywane w jednej tabeli.

Uważam, że twoje podejście do tego problemu jest związane głównie z rozmiarem i rodzajem twojego projektu. Jeśli chcesz zaimplementować prosty CMS, możesz również użyć tablicy do zapisywania treści pól wielojęzycznych. Jednak takie podejście jest ograniczone.

/** 
* @var array 
* 
* @ORM\Column(name="title", type="array", nullable=true) 
*/ 
private $title; 

Jeśli zawartość Twojego systemu jest zupełnie inna z jednego języka na inny lub system potrzebuje trochę ciężkie zapytania i raporty oparte na tych obszarach językowych wielu to podejście wspomniałeś będzie dobrze.