2012-12-26 17 views
10

Buduję wielojęzyczną aplikację internetową za pomocą Pythona i webapp2.Jak modelować obiekty wielojęzyczne w Pythonie za pomocą webapp2

Mam obiekt o nazwie Tag, który ma tłumaczenia na wiele języków. Z tego powodu, stworzyliśmy następujące modele:

class Language(ndb.Model): 
    code = ndb.StringProperty() 
    name = ndb.StringProperty(indexed=False) 


class MultilingualText(ndb.Model): 
    language = ndb.KeyProperty(kind=Language) 
    text = ndb.TextProperty(indexed=False) 


class Tag(ndb.Model): 
    translations = ndb.StructuredProperty(MultilingualText, repeated=True, indexed=False) 

Chciałbym zapytać, czy jest to prawidłowy sposób zrobić takie zadanie, a jak ta struktura może być stosowany wraz z WTForms walidacji itd

Bardzo dziękuję z góry!

+2

Lokalizacja wsparcia wtForms i Jinja2 (I18n) i Babel. Proponuję zapoznać się z tymi narzędziami i sprawdzić, czy pasują do twoich celów projektu. Zwykle jest to droga do zrobienia. – voscausa

+1

Kilka pytań - Czy za każdym razem, gdy otrzymasz znacznik, prawdopodobnie będziesz potrzebować wszystkich tłumaczeń danego tagu? Jak duży może być fragment tekstu? Jeśli nie potrzebujesz wszystkich tłumaczeń przez cały czas, lepiej byłoby, gdyby każde tłumaczenie było podrzędne dla znacznika, a kluczem był język, a następnie pobieranie tylko danego tłumaczenia w zależności od języka użytkownika. Tylko niektóre przemyślenia ;-) –

+0

@DimitrisMarkis zobacz odpowiedź i poczytaj komentarze! –

Odpowiedz

5

Myślę, że najlepsze wdrożenie może się zmienić w zależności od celu, a moja odpowiedź tutaj może nie spełnić Twoich potrzeb.

Dla klasy Language wolałbym nie używać datastore do tego celu. Chciałbym użyć babel.Locale do określenia nazw wyświetlanych.

Jak powiedział Tim w komentarzu, wolę używać kodu języka jako klucza jednostki. Oto przykład implementacji Tag, zakładając, że każdy numer Tag potrzebuje urlsafe.

def get_urlsafe_slug_from_tag(tag_text): 
    # ... 
    # ... 

class Slug(ndb.Model): 
    # use urlsafe slug as the key_name 
    # You can optionally use the property bellow. 
    available_translations = ndb.StringProperty(repeated=True) 

class Tag(ndb.Model): 
    # use language code as the key_name 
    text = ndb.TextProperty() 

Po utworzeniu nowego tagu utworzę dwie jednostki; encja Slug z unikatowym łańcuchem (slug) urlsafe dla tego znacznika jako kluczem, a także z jednostką Tag z kodem języka jako kluczem i tym jednostką Slug jako jej nadrzędną.

W tym przykładzie istnieje właściwość o nazwie available_translations, która pozwoli Ci negocjować z użytkownikami wybór języka, a nawet wykonać zapytanie, które zwróci Slugs z tłumaczeniem dla określonego języka (np. List Slugs z japońskim tłumaczeniem).

Aby uzyskać walidację WTForm, czy możesz mi powiedzieć, jak chcesz sprawdzić dane dotyczące postów? Myślę, że będziesz w stanie uzyskać lepszą odpowiedź, jeśli podzielisz się swoimi szczegółowymi potrzebami.

+0

Jakie są możliwości walidacji WTForm? –

Powiązane problemy