2013-03-31 71 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