2012-12-26 59 views
10

Tôi xây dựng một ứng dụng web đa ngôn ngữ bằng Python và webapp2.Cách tạo mô hình các đối tượng đa ngôn ngữ bằng Python sử dụng webapp2

Tôi có một đối tượng được gọi là Thẻ, có bản dịch sang nhiều ngôn ngữ. Vì lý do này, tôi đã tạo ra các mô hình sau:

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) 

Tôi muốn hỏi nếu điều này là cách chính xác để làm nhiệm vụ như vậy, và làm thế nào cấu trúc này có thể được sử dụng cùng với WTForms để xác nhận vv

Cảm ơn rất nhiều trước!

+2

WtForms và Jinja2 hỗ trợ bản địa hóa (I18n) và Babel. Tôi khuyên bạn nên nghiên cứu những công cụ đó và xem chúng có phù hợp với mục tiêu dự án của bạn hay không. Thông thường đây là con đường để đi. – voscausa

+1

Một số câu hỏi - Bạn có muốn muốn tất cả các bản dịch cho một thẻ nhất định mỗi khi bạn nhận được một thẻ không? Làm thế nào lớn có thể một đoạn văn bản được? Nếu bạn không cần tất cả các bản dịch mọi lúc, bạn có thể tốt hơn việc giữ mỗi bản dịch là con của thẻ, với khóa là ngôn ngữ, và sau đó chỉ tìm nạp một bản dịch đã cho tùy thuộc vào ngôn ngữ của người dùng. Chỉ cần một số suy nghĩ ;-) –

+0

@DimitrisMarkis vui lòng xem câu trả lời và đưa ra bất kỳ bình luận nào! –

Trả lời

5

Tôi nghĩ triển khai tốt nhất có thể thay đổi tùy thuộc vào mục tiêu của bạn và câu trả lời của tôi ở đây có thể không đáp ứng được nhu cầu của bạn.

Đối với lớp Language, tôi không muốn sử dụng kho dữ liệu cho mục đích này. Tôi sẽ sử dụng babel.Locale để xác định tên hiển thị.

Như Tim đã nói trong nhận xét, tôi thích sử dụng mã ngôn ngữ làm khóa thực thể hơn. Dưới đây là ví dụ về việc triển khai thực hiện Tag, giả sử mỗi Tag cần một con sên 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() 

Khi thẻ mới được tạo, tôi sẽ tạo hai thực thể; một thực thể Slug với một chuỗi urlsafe duy nhất (slug) cho thẻ đó làm khóa, cũng như một thực thể Tag với mã ngôn ngữ là khóa và thực thể Slug này làm tổ chức của nó.

Trong ví dụ này, có thuộc tính có tên available_translations, cho phép bạn thương lượng với lựa chọn ngôn ngữ của người dùng và thậm chí thực hiện truy vấn sẽ trả về Sên với bản dịch cho ngôn ngữ được chỉ định (ví dụ:).

Để xác thực WTForm, bạn có thể cho tôi biết cách bạn muốn xác thực dữ liệu bài đăng không? Tôi nghĩ bạn sẽ có thể nhận được câu trả lời tốt hơn nếu bạn chia sẻ nhu cầu chi tiết của mình.

+0

Những khả năng nào có thể là để xác thực WTForm? –

Các vấn đề liên quan