最佳实践:Django多语言

时间:2013-03-31 23:18:42

标签: django django-models multilingual

我是django的初学者。 (我刚刚完成了教程并遵循本指南http://www.gettingstartedwithdjango.com)我想创建一个包含多语言内容的网站,我知道哪种是最佳做法,至少对于模型而言:

  1. 使用不同的表格(每种语言1张)
  2. 仅使用一个表,在模型中使用语言的额外属性
  3. 我不知道
  4. 弗拉迪斯拉夫是对的,这完全取决于该表所包含的数据。举个例子:

    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. 我可能只有一种语言的完整书籍
    3. 我可能有一本完整的一种语言书,但只有一些用另一种语言的章节
    4. 所以我认为我必须为每种语言保留一本书的实例,我至少有一本书。

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

3 个答案:

答案 0 :(得分: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

是件好事

在任何情况下,您都需要在顶部构建抽象,以便使用该结构。

答案 1 :(得分: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-multilingual,作为我在此描述的替代方案。

至于翻译您的网站静态内容,这非常简单。查看Django Internationalization

答案 2 :(得分:1)

如果您不想手动管理每个模型,可以尝试像django-linguo这样的东西。它根据您的Meta类翻译属性和settings.py文件中的LANGUAGES设置为您喜欢的字段创建翻译。

我强烈建议您查看一些可用于Django的国际化软件包,例如django-rosettadjango-linguo。 Django-linguo帮助翻译模型内容,而django-rosetta看起来为您的翻译添加了管理界面。

我还没有真正玩过django-rosetta,但它看起来也很有趣。希望这会有所帮助:)