Перекладаємо моделі в Django за допомогою django-modeltranslation

Під час роботи над одним із проектів мені знадобилась підтримка декількох мов, в якості інструменту було вибрано django-modeltranslation, через легкість до інтеграції в існуючий код.

Процес встановлення

Встановлюємо пакунок:

pip install django-modeltranslation

Підключаємо його у список встановлених:

INSTALLED_APPS = (
    ......
    'modeltranslation',
    ......
)

Прописуємо налаштування додатку в settings.py

MODELTRANSLATION_DEFAULT_LANGUAGE = 'uk' # Мова для перекладу за замовчуванням

# Ця лямда-функція необхідна для того, щоб Django міг перекладати verbose_name
# в моделях використовуючи для цього вбудоване рішення на базі i18n
gettext = lambda s: s

# Всі мови на які можливо буде перекласти контент
LANGUAGES = (
    ('uk', gettext('Ukrainian')),
    ('ru', gettext('Russian')),
    ('en', gettext('English')),
)

MODELTRANSLATION_FALLBACK_LANGUAGES = ('uk', 'ru') # Альтернативні(запасні) переклади

# Відлагоджування для production повинно бути вимкнене, але для розробки допоможе
MODELTRANSLATION_DEBUG = True

Тепер для прикладу приведу частину моделі з додатку (в моєму випадку це blog):

class Post(models.Model):
    """
    Default post model
    """
    title = models.CharField(
        verbose_name=u"Назва",
        max_length=100,
        blank=True,
        null=True,
        default=u"Untitled",
    )
    text = models.TextField(
        verbose_name=u"Текст",
        blank=True,
        null=True,
    )
    preview_text = models.TextField(
        verbose_name=u"Текст попереднього перегляду",
        blank=True,
        null=True,
    )
    .......

Тепер реєструємо нашу модель для перекладу для цього створюємо файл blog/translation.py

from modeltranslation.translator import translator, TranslationOptions
from blog.models import Post


class PostTranslationOptions(TranslationOptions):
    # Вказуємо поля які потребують перекладу
    fields = ('title', 'text', 'preview_text',)


translator.register(Post, PostTranslationOptions)

І підключаємо модель в адмінку:

# Фіксимо баг, про який буде йти мова далі:
import blog.translation
from modeltranslation.admin import TranslationAdmin
from django.contrib import admin
from blog.models import Post


class PostAdmin(TranslationAdmin):
    pass


admin.site.register(Post, PostAdmin)

Для того щоб додати наші поля перекладу в базу виконуємо:

python manage.py sync_translation_fields

Граблі

Зробивши все як написано в документації я отримав помилку:

modeltranslation.translator.NotRegistered: The model "ModelName" is not registered for translation

Швидкий Googl'інг дав зрозуміти, що я не перший стикнувся з цією проблемою. Рішення було доволі простим імпортувати translation.pyбезспосередньо в admin.py:

import blog.translation

Результат

djnago-modeltranslation

comments powered by Disqus