Skip to main content

A content translation framework for django integrated automatically in the normal ORM. Removes the pain of having to think about translations in a django project.

Project description

Model translations made easy.

This project adds support for model translations in Django. It is designed to be unobtrusive, efficient and reliable. On the technical side, it uses an automatically created Translations Model to store translatable fields in arbitrary languages with a foreign key to the main model, enabling fast queries.

Started in 2011, hvad has grown mature and is now used on large scale applications.

Quick links:

Features

  • Simple - only 3 new queryset methods.

  • Natural - use Django ORM as usual, it just became language aware.

  • Fast - no additional queries for reads, just an inner join to an indexed key.

  • Complete - relationships, custom managers and querysets, proxy models, and abstract models.

  • Batteries included - translation-enabled forms and admin are provided.

  • Reliable - more than 300 test cases and counting. coverage build

  • Compatible - follows Django compatibility matrix.

Django-hvad also features support for Django REST framework 3.1 or newer, including translation-aware serializers.

Example Uses

Declaring a translatable Book model:

class Book(TranslatableModel):
    author = models.ForeignKey(Author)
    release = models.Date()

    translations = TranslatedFields(
        title = models.CharField(max_length=250)
    )

Thus, only the title will vary based on the language. Release date and author are shared among all languages. Let’s now create a Book instance:

# The recommended way:
book = Book.objects.language('en').create(
    author = Author.objects.get(name='Antoine de Saint Exupéry'),
    release = datetime.date(1943, 4, 6),
    title = "The Little Prince",
)

# Also works
book = Book(language_code='en')
book.author = Author.objects.get(name='Antoine de Saint Exupéry')
book.release = datetime.date(1943, 4, 6)
book.title = "The Little Prince"
book.save()

Providing some translations:

book.translate('fr')
book.title = "Le Petit Prince"
book.save()
book.translate('de')
book.title = "Der kleine Prinz"
book.save()

Every call to translate() creates a new translation from scratch and switches to that translation; save() only saves the latest translation. Let’s now perform some language-aware queries:

Book.objects.all()

Compatible by default: returns all objects, without any translated fields attached. Starting from v1.0, default behavior can be overriden to work like next query:

Book.objects.language().all()

Returns all objects as translated instances, but only the ones that are translated into the currect language. You can also specify which language to get, using e.g.:

Book.objects.language("en").all()

Usual queryset methods work like they always did: let’s get all books as translated instances, filtering on the title attribute, returning those that have Petit Prince in their French title, ordered by publication date (in their French edition):

Book.objects.language("fr").filter(title__contains='Petit Prince').order_by('release')

Other random examples:

# last German book published in year 1948
Book.objects.language("de").filter(release__year=1948).latest()

# other books from the same author as mybook. Cache author as well.
Book.objects.language().select_related('author').filter(author__books=mybook)

# books that have "Django" in their title, regardless of the language
Book.objects.language('all').filter(title__icontains='Django')

More examples in the quickstart guide.

Releases

Django-hvad uses the same release pattern as Django. The following versions are thus available:

  • Legacy branch 1.8, available through PyPI and git branch releases/1.8.x.

  • Stable branch 2.0, available through PyPI and git branch releases/2.0.x.

  • Development branch 2.1, available through git branch master.

Stable branches have minor bugfix releases as needed, with guaranteed compatibility. See the installation guide for details, or have a look at the release notes.

Thanks to

Jonas Obrist (https://github.com/ojii) for making django-nani and for helping me with this project.

Kristian Øllegaard (https://github.com/KristianOellegaard/) for django-hvad and trusting me to continue the development.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lotrek-django-hvad-2.0.5.tar.gz (108.8 kB view details)

Uploaded Source

Built Distribution

lotrek_django_hvad-2.0.5-py2.py3-none-any.whl (106.7 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file lotrek-django-hvad-2.0.5.tar.gz.

File metadata

  • Download URL: lotrek-django-hvad-2.0.5.tar.gz
  • Upload date:
  • Size: 108.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.3 readme-renderer/37.2 requests/2.28.1 requests-toolbelt/0.10.1 urllib3/1.26.12 tqdm/4.64.1 importlib-metadata/5.0.0 keyring/23.9.3 rfc3986/2.0.0 colorama/0.4.6 CPython/3.9.15

File hashes

Hashes for lotrek-django-hvad-2.0.5.tar.gz
Algorithm Hash digest
SHA256 660606741e7774cd8a3a4754e34e7aa61a553599ad3616569dd2834745162195
MD5 86b78e5b70261fc63f1c468101a0f3a3
BLAKE2b-256 e184f005b4e67c87e27c57802161a333d7e373b722d9b1d8c7083ae8b6cceaf8

See more details on using hashes here.

File details

Details for the file lotrek_django_hvad-2.0.5-py2.py3-none-any.whl.

File metadata

  • Download URL: lotrek_django_hvad-2.0.5-py2.py3-none-any.whl
  • Upload date:
  • Size: 106.7 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.3 readme-renderer/37.2 requests/2.28.1 requests-toolbelt/0.10.1 urllib3/1.26.12 tqdm/4.64.1 importlib-metadata/5.0.0 keyring/23.9.3 rfc3986/2.0.0 colorama/0.4.6 CPython/3.9.15

File hashes

Hashes for lotrek_django_hvad-2.0.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 71f184e78dae01c765bcda71a3e469f7edcaab7fe505a348158e9c9de5b1707d
MD5 51495153fc7141dbe2a00643a5d8873f
BLAKE2b-256 f53fbe3ef2d943ad277f6e24ced37a85c546462cf7798ba318f27b0b15a77cb4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page