Как смоделировать многоязычные объекты в Python с помощью webapp2

Я создаю многоязычное веб-приложение, используя Python и webapp2.

У меня есть объект Tag, который имеет переводы на несколько языков. По этой причине я создал следующие модели:

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)

Я хотел бы спросить, является ли это правильным способом выполнения такой задачи и как эта структура может использоваться вместе с WTForms для проверки и т.д.

Большое спасибо!

Ответ 1

Я думаю, что лучшая реализация может измениться в зависимости от вашей цели, и мой ответ здесь может не соответствовать вашим потребностям.

Для класса Language я бы предпочел не использовать datastore для этой цели. Я бы использовал babel.Locale для определения отображаемых имен.

Как сказал Тим в комментарии, я предпочитаю использовать код языка в качестве ключа сущности. Ниже приведен пример реализации Tag, предполагая, что каждому Tag нужен 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()

Когда новый тэг создается, я создам два объекта; a Slug с уникальной строкой urlsafe (slug) для этого тега в качестве ключа, а также объект Tag с кодом языка в качестве ключа и этим объектом Slug в качестве родительского элемента.

В этом примере есть свойство с именем available_translations, которое позволит вам вести переговоры с выбором языка пользователя и даже выполнять запрос, который будет возвращать Slugs с переводом на указанный язык (например, список Slugs с японским переводом).

Для проверки WTForm вы можете рассказать мне, как вы хотите проверить данные публикации? Я думаю, что вы сможете получить лучший ответ, если будете делиться своими подробными потребностями.