2013-03-31 25 views
9

私はdjangoの初心者です。 (私はチュートリアルを完了し、このガイドhttp://www.gettingstartedwithdjango.com次)私は多言語コンテンツを持つサイトを作りたい、と私はベストプラクティスである知っているだろう、少なくともモデルと:ベストプラクティス:Django多言語

  1. 使用異なるテーブル(1用各言語)
  2. 使用ただ一つのテーブルには、私が

ウラジスラフは右である見当がつかない言語

  • のモデルに余分な属性を使用して、それはすべての表が含まれているデータに依存します。ですから、例えば:

    class Book(models.Model): 
        created_at = models.DateTimeField(auto_now_add=True, editable=False) 
        name = models.CharField(max_length=255, unique=True) 
        plot = models.TextField() 
        slug = models.SlugField(max_length=255, blank=True, default='') 
    
    class Chapter(models.Model): 
        book = models.ForeignKey(Book) 
        chapter = models.SmallIntegerField() 
        title = models.CharField(max_length=255, blank=True) 
        pages = models.SmallIntegerField() 
        pub_date = models.DateTimeField(auto_now_add=True) 
    

    可能性:

    1. は私が
    2. は、私はちょうど1つの言語で完全な本を持っていることがすべての言語に
    3. 私は完全な本を持っていることがあり、完全な本を持っていること1つの言語でしかないが、別の言語の章がある

    だから私はe私はその本の少なくとも1つの章を持っています。

    明らかに希望です!お返事ありがとうございました

  • +1

    私はあなたが[Djangoで国際化]を探していると思います(https://docs.djangoproject.com/en/1.4/topics/i18n/) – DMunoz

    +0

    ベストプラクティスhttps:/ /django.2scoops.org/ – Jake

    +0

    私はその本について多くのことを聞いたことがあります。私は明日、それを買うつもりだと思います。 – Jiloc

    答えて

    6

    私にとっては、テーブルに含まれているデータに依存しています。サイズに合ったサイズはありません。

    システムテーブル(カテゴリ、フィールドの選択肢)については、言語ごとに異なる表を1つ作成します。古い実装ではdjango-transmetaです。

    多くの行があるテーブル(共通情報を持つテーブルと変換可能なテーブル)。このように、言語をすぐに追加することができます。ユーザーに大きな言語選択肢を提供したい場合に適しています。明らかに、私はこのアプローチの良い実装があるかどうかはわかりません。 django-hvadは実装されていますが、まだベータ版であり、私は個人的にはそれを使用したくありません。

    Here利用可能なプラグインの詳細については、こちらをご覧ください。

    私は以下のモデルを提案できます。この場合

    class Book(models.Model): 
        """Model for common book info""" 
        created_at = models.DateTimeField(auto_now_add=True, editable=False) 
        #Other common fields 
    
    
    class BookTranslation(models.Model): 
        """Model for translatable book info""" 
        book = models.ForeignKey(Book, related_name="translations") 
        language = models.CharField(max_length=2) 
        name = models.CharField(max_length=255, unique=True) 
        slug = models.SlugField(max_length=255, blank=True, default='') 
        plot = models.TextField() 
        created_at = models.DateTimeField(auto_now_add=True, editable=False) 
    
    
    class Chapter(models.Model): 
        """Model for common chapter info""" 
        pub_date = models.DateTimeField(auto_now_add=True) 
        pages = models.SmallIntegerField() 
    
        #I'll suggest such relation so you can get the chapters from book 
        #and book translation objects 
        #related_name='+' means no related_name 
        #You need to specify it when you have 2 FK to same model 
        book = models.ForeignKey(Book, related_name='+') 
        book_translation = models.ForeignKey(Book, related_name='chapters') 
    
    
    class ChapterTranslation(models.Model): 
        """Model for translatable chapter info""" 
        chapter = models.ForeignKey(Chapter, related_name="translations") 
        language = models.CharField(max_length=2) 
        title = models.CharField(max_length=255, blank=True) 
    

    あなたが、構造で動作するように快適になりますので、上に抽象化を構築する必要がありますいずれにせよselect-relatedprefetch-related

    に慣れることは良いです。

    +0

    助けてくれてありがとう、私はもう少し私は少し具体的に説明したことを助けることができることを願っています! – Jiloc

    +0

    編集した答えでモデルの提案を見つけることができます。 –

    3

    あなたの現在のモデルとあなたが説明した3つの可能性に基づいて、あなたのモデル情報を変換するために、次の試みることができる:

    # Get user language, default 'en' 
    lang = request.session.get('django_language', 'en') 
    
    book = Book.objects.get(...) 
    book_translation = book.translations.filter(language__exact=lang)[0] 
    
    return render_to_response(..., 
    { 
        'book': book_translation 
    }) 
    

    class Book(models.Model): 
        language = models.CharField(max_length=2) 
        created_at = models.DateTimeField(auto_now_add=True, editable=False) 
        name = models.CharField(max_length=255, unique=True) 
        plot = models.TextField() 
        slug = models.SlugField(max_length=255, blank=True, default='') 
    
    class BookTranslation(models.Model): 
        book = models.ForeignKey(Book, related_name="translations") 
        language = models.CharField(max_length=2) 
        created_at = models.DateTimeField(auto_now_add=True, editable=False) 
        name = models.CharField(max_length=255, unique=True) 
        plot = models.TextField() 
        slug = models.SlugField(max_length=255, blank=True, default='') 
    
    class Chapter(models.Model): 
        book = models.ForeignKey(Book) 
        language = models.CharField(max_length=2) 
        chapter = models.SmallIntegerField() 
        title = models.CharField(max_length=255, blank=True) 
        pages = models.SmallIntegerField() 
        pub_date = models.DateTimeField(auto_now_add=True) 
    
    class ChapterTranslation(models.Model): 
        chapter = models.ForeignKey(Chapter, related_name="translations") 
        title = models.CharField(max_length=255, blank=True) 
        pages = models.SmallIntegerField() 
    

    を次に、あなたの意見では、あなたがこのような何かを行うことができます

    Vladislavが彼の答えで提案したように、私がここで説明したものの代わりに、現在利用可能なさまざまなジャンゴ語 - 多言語のすべてをチェックしてください。

    ウェブサイトの静的コンテンツの翻訳に関しては、それはかなり簡単です。 Django Internationalizationをチェックしてください。

    1

    手動で各モデルを管理したくない場合は、django-linguoのようなものを試すことができます。 Meta class translate属性とsettings.pyファイルのLANGUAGES設定に基づいて、好きなフィールドの翻訳を作成します。

    django-rosettadjango-linguoのようなDjango用の国際化パッケージのいくつかをチェックすることを強くお勧めします。 Django-linguoはモデルコンテンツの翻訳に役立ちますが、django-rosettaは翻訳の管理インターフェースを追加するようです。

    私はまだdjango-rosettaで遊んだことはありませんが、面白そうです。これが役に立ちますようお願いいたします:)

    +0

    私はそれらのサードパーティの図書館をチェックして、あなたのためにここに報告をすると思います。 – AmiNadimi