2012-12-26 8 views
10

Pythonとwebapp2を使用して多言語Webアプリケーションを構築します。webapp2を使用してPythonで多言語オブジェクトをモデル化する方法

私は、複数の言語に翻訳されたタグというオブジェクトを持っています。このような理由から、私は次のモデルを作成しました:

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、

と一緒に使用することができる方法あればお願いしたいと思います

ありがとうございます!

+2

WtFormsとJinja2はローカリゼーション(I18n)とBabelをサポートしています。これらのツールを勉強して、あなたのプロジェクトの目標に合っているかどうかを調べることをお勧めします。通常これが行く方法です。 – voscausa

+1

いくつかの質問 - タグを取得するたびに、特定のタグのすべての翻訳が必要なのでしょうか?テキストの大きさはどれくらいの大きさでしょうか?常にすべての翻訳を必要としない場合は、各翻訳をタグの子にしておくことをお勧めします。キーは言語であり、ユーザーの言語に応じてのみ翻訳を取得します。ただいくつかの考え;-) –

+0

@DimitrisMarkisは、答えを参照してくださいとコメントをしてください! –

答えて

5

あなたの目標に応じて最適な実装が変わると思います。私の答えはあなたのニーズを満たしていないかもしれません。

Languageクラスでは、むしろデータストアをこの目的で使用しません。表示名の決定にはbabel.Localeを使用します。

Timがコメントで述べたように、私はエンティティキーとして言語コードを使用する方が好きです。すべてのTagがurlsafeスラッグを必要とすると仮定して、Tagの実装の例を次に示します。

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

タグが新たに作成されると、2つのエンティティが作成されます。そのタグの固有のURLセーフストリング(slug)をキーとするエンティティと、言語コードをキーにしてSlugエンティティを親として持つTagエンティティを持つエンティティ。

この例では、available_translationsという名前のプロパティがあり、ユーザーの言語の選択肢とネゴシエートしたり、指定された言語のスラグを返すクエリを実行したりすることもできます(例: )。

WTForm検証の場合、投稿データの検証方法を教えてください。あなたの詳細なニーズを分かち合うなら、より良い答えを得ることができると思います。

+0

WTForm検証の可能性は何ですか? –

関連する問題