# django-parlor Django model translations with even less nasty hacks. ## Installation ``` pip install django-parlor ``` ## Usage ```python from django.contrib import admin from django.db import models from parlor.admin import TranslatableAdmin from parlor.models import TranslatableModel class MyModel(TranslatableModel): ... class MyModelTranslation(models.Model): parent = MyModel.get_parent_field() language_code = MyModel.get_language_field() label = models.CharField(max_length=32) ... class Meta: unique_together = [('parent', 'language_code')] admin.site.register(MyModel, TranslatableAdmin) animal = MyModel.objects.create() animal.translations.create(language_code='en', label='Frog') animal.translations.create(language_code='de', label='Frosch') print(animal.label) ``` ## Status Right now this is more of a proof-of-concept. If people are interested in this library it could certainly be expanded. ## Relation to django-parler ### Standing on the Shoulders of Giants There are two popular libraries for model translation in Django: [django-modeltranslation](https://github.com/deschler/django-modeltranslation) and [django-parler](https://github.com/django-parler/django-parler). The former adds additional columns to the same table while the latter adds a new table for each translatable model. Both of these libraries use a lot of magic which makes them easy to use, but also leads to some hard-to-debug edge cases. There is also [django-translated-fields](https://github.com/matthiask/django-translated-fields), which uses the same basic approach as django-modeltranslation, but with much less magic (and much less lines of code). Here I try to do something similar for django-parler, which has been unmaintained for some time now. ### Migration If you want to migrate from django-parler to django-parlor, you need to replace all instances of `parler.TranslatedFields` by explicit translation models as described above. Note that the `parent` field is called `master` in django-parler. To keep using the same data, you will also need to set `Meta.db_table` to the name generated by django-parler (typically `myapp_mymodel_translation`). Finally you should run `manage.py makemigrations`. The generated migrations will only contain minor changes though. ### Conceptual differences - With django-parlor, the translation model must be created explicitly. - In the admin UI, django-parlor uses a stock inline instead of a custom tabbed interface. - django-parlor only provides basic attribute access while django-parler provides a lot more features.