我是django的初学者。 (我刚刚完成了教程并遵循本指南http://www.gettingstartedwithdjango.com)我想创建一个包含多语言内容的网站,我知道哪种是最佳做法,至少对于模型而言:
弗拉迪斯拉夫是对的,这完全取决于该表所包含的数据。举个例子:
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)
的可能性:
所以我认为我必须为每种语言保留一本书的实例,我至少有一本书。
我希望很清楚!再次感谢大家
答案 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-related和prefetch-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-rosetta和django-linguo。 Django-linguo帮助翻译模型内容,而django-rosetta看起来为您的翻译添加了管理界面。
我还没有真正玩过django-rosetta,但它看起来也很有趣。希望这会有所帮助:)