2012-12-26 6 views
10

Ich erstelle eine mehrsprachige Webanwendung mit Python und webapp2.So modellieren Sie mehrsprachige Objekte in Python mit webapp2

Ich habe ein Objekt namens Tag, das Übersetzungen in mehrere Sprachen hat. Aus diesem Grund habe ich die folgenden Modelle erstellt:

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) 

Ich möchte fragen, ob dies der richtige Weg ist, eine solche Aufgabe zu tun, und wie diese Struktur kann zusammen mit WTForms für die Validierung, etc. verwendet werden

Vielen Dank im Voraus!

+2

WtForms und Jinja2 unterstützen Lokalisierung (I18n) und Babel. Ich schlage vor, dass Sie diese Tools studieren und prüfen, ob sie zu Ihren Projektzielen passen. Normalerweise ist das der richtige Weg. – voscausa

+1

Einige Fragen - Möchten Sie wahrscheinlich jedes Mal, wenn Sie ein Tag erhalten, alle Übersetzungen für ein bestimmtes Tag wünschen? Wie groß könnte ein Stück Text sein? Wenn Sie nicht ständig alle Übersetzungen benötigen, ist es besser, wenn Sie jede Übersetzung als Kind des Tags speichern, wobei der Schlüssel die Sprache ist und nur eine bestimmte Übersetzung abhängig von der Sprache des Benutzers abgerufen wird. Nur ein paar Gedanken ;-) –

+0

@DimitrisMarkis bitte sehen Sie die Antwort und machen Sie Kommentare! –

Antwort

5

Ich denke, die beste Implementierung kann sich je nach Ihrem Ziel ändern und meine Antwort hier kann Ihre Bedürfnisse nicht erfüllen.

Für Klasse Language würde ich lieber nicht Datenspeicher für diesen Zweck verwenden. Ich würde babel.Locale zum Ermitteln der Anzeigenamen verwenden.

Wie Tim im Kommentar sagte, bevorzuge ich Sprachcode als Entitätsschlüssel. Hier ist ein Beispiel Tag Implementierung, vorausgesetzt, jede Tag benötigt eine urlsafe Slug.

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

Wenn ein Tag neu erstellt wird, werde ich zwei Einheiten schaffen; Eine Slug Entität mit einer eindeutigen urlsafe-Zeichenfolge (Slug) für dieses Tag als Schlüssel sowie eine Tag Entität mit dem Sprachencode als Schlüssel und dieser Slug Entität als übergeordnetes Element.

In diesem Beispiel gibt es eine Eigenschaft namens available_translations, mit der Sie mit den Sprachoptionen des Benutzers verhandeln und sogar eine Abfrage ausführen können, die Slugs mit einer Übersetzung für eine bestimmte Sprache zurückgibt (z. B. Slugs mit japanischer Übersetzung)).

Können Sie mir zur WTForm-Validierung sagen, wie Sie die Postdaten validieren möchten? Ich denke, dass Sie in der Lage sein werden, besser zu beantworten, wenn Sie Ihre detaillierten Bedürfnisse teilen.

+0

Was wären die Möglichkeiten für die WTForm-Validierung? –

Verwandte Themen