2013-03-31 70 views
9

我是一個django的初學者。 (我剛剛完成了教程和本指南http://www.gettingstartedwithdjango.com以下),我想和多語種內容的網站,我想知道這是最好的做法,至少與型號:最佳實踐:Django多語言

  1. 使用不同的表(1每種語言)
  2. 只使用一個表,使用模型中的一個額外屬性的語言
  3. 我不知道

弗拉季是正確的,這一切都取決於被包含在表中的數據。所以一個例子:

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. 我可以有一個完整的書在一種語言,但只是在另一種語言的一些章節

所以我認爲,我必須保持一本書的一個實例ach語言,我至少有一本書的一章。

我希望它很清楚!再次感謝大家

+1

我認爲你正在尋找[國際化在Django](https://docs.djangoproject.com/en/1.4/topics/i18n/) – DMunoz

+0

一本關於最佳實踐的好書https:/ /django.2scoops.org/ – Jake

+0

我聽過很多關於這本書的書,我想明天我會買它,謝謝你的建議! – Jiloc

回答

6

對我來說,這一切都取決於表中的數據,沒有一個適合所有人的數據。

對於系統表(類別,字段選擇)我爲不同的語言做了一個表不同的列。舊的但很好的實現是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

根據您當前的模型,您所描述的三種可能性,你可以試試下面的翻譯模型信息:

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

然後在你的意見,你可以做這樣的事情:

# 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 
}) 

弗拉季斯拉夫在他的回答中提出,請查看當前可用的所有不同的django-多語言,作爲我在此描述的替代方法。

至於翻譯你的網站的靜態內容,這是非常簡單的。退房Django Internationalization

1

如果你不想手動管理每個模型,你可以嘗試類似django-linguo。它根據Meta類翻譯屬性和settings.py文件中的LANGUAGES設置爲您喜歡的字段創建翻譯。

我強烈建議查看一下Django的一些國際化軟件包,如django-rosettadjango-linguo。 Django-linguo幫助翻譯模型內容,而django-rosetta看起來像爲您的翻譯添加了管理界面。

我還沒有真正玩過django-rosetta,但它看起來也很有趣。希望這有助於:)

+0

我想我會檢查那些第三方庫,並在這裏給你一個報告。 – AmiNadimi