10

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

  1. 使用不同的表格(每种语言 1 个)
  2. 只使用一个表,在模型中为语言使用一个额外的属性
  3. 我不知道

Vladislav 是对的,这完全取决于表中包含的数据。举个例子:

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 回答 3

8

对我来说,这完全取决于表中包含的数据,没有一种适合所有人的尺寸。

对于系统表(类别、字段选择),我为不同的语言做一个表不同的列。旧的但很好的实现是 django-transmeta。

对于有很多行的表 - 包含通用信息的表和可翻译的表。通过这种方式,您可以即时添加语言 - 适用于您希望为用户提供多种语言选择的情况。显然我不确定这种方法有没有很好的实施。django-hvad 是一种实现,但它仍然是测试版,我个人不喜欢使用它。

在这里您可以找到有关可用插件的更多信息。

我可以建议以下型号。

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

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

于 2013-04-01T00:03:33.270 回答
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
})

正如 Vladislav 在他的回答中建议的那样,查看当前可用的所有不同的 django-multilingual 作为我在此处描述的替代方案。

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

于 2013-04-01T02:06:47.703 回答
1

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

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

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

于 2014-10-23T01:25:55.620 回答