Django Simple Multilingual Support for Models.
This is strongly based upon an original project by yazzgoth on Google code.
The original can be found at: http://code.google.com/p/django-multilingual-model/
When a property of a translation is set for the language currently selected in this thread, it will automatically yield the right value of that property for the current language. So for a book which has a tranlation in en, requesting book.title from within a template from a client of which the detected language is English, will simply yield the English translation of the book title.
models.py:
from multilingual_model.models import MultilingualModel, MultilingualTranslation class BookTranslation(MultilingualTranslation): class Meta: unique_together = ('parent', 'language_code') parent = models.ForeignKey('Book', related_name='translations') title = models.CharField(max_length=32) description = models.TextField() class Book(MultilingualModel): ISBN = models.IntegerField() >>> book = Book(ISBN="1234567890") >>> book.save() >>> book_en = BookTranslation(language_code='en') >>> book_en.title = "Django for Dummies" >>> book_en.description = "Django described in simple words." >>> book_en.parent = book >>> book_en.save() >>> book_pl = BookTranslation(language_code='pl') >>> book_pl.title = "Django dla Idiotow" >>> book_pl.description = "Django opisane w prostych slowach" >>> book_pl.parent = book >>> book_pl.save() >>> # now here comes the magic >>> book.title_en u'Django for Dummies' >>> book.description_pl u'Django opisane w prostych slowach'
admin.py:
from django.contrib import admin import models from multilingual_model.admin import TranslationInline class BookTranslationInline(TranslationInline): model = models.BookTranslation class BookAdmin(admin.ModelAdmin): list_display = ["ISBN"] inlines = [BookTranslationInline] admin.site.register(models.Book, BookAdmin)
In order to make translation of the __unicode__ function work, some magic is required. A helper method for this is included by default, allowing you to do the following:
def __unicode__(self): return self.unicode_wrapper('title', default='Unnamed')