Как правило, любой современный сайт хранит информацию в базе данных. Для перевода статического текста в шаблонах и сообщениях, Django использует gettext, извлекая нужный перевод из заранее подготовленного po файла.
Для перевода информации в базе данных, используемую Django, вы можете или заранее задать структуру, предусматривающую нужную языки, или воспользоваться приложением modeltranslation, которая позволяет перевести нужные поля модели, не меняя саму модель и структуру базы данных.
Подробно про перевод шаблонов и создание файлов перевода —http://itman.in/django-translation/. В данной статье описан вариант перевода моделей с помощью django-modeltranslation.
Установка django-modeltranslation
Для установки modeltranslation выполните команду
pip install django-modeltranslation
Добавьте приложение в раздел INSTALLED_APPS файла settings.py:
INSTALLED_APPS = ( ... 'modeltranslation', )
Также добавьте в settings.py список языков, переводы на которые будут доступны и язык по-умолчанию
# список доступных языков LANGUAGES = ( ('ru', 'Russian'), ('uk', 'Ukrainian'), ) MODELTRANSLATION_DEFAULT_LANGUAGE = 'ru'
Создайте файл с описанием перевода для ваших моделей
В каталоге приложения, которое вы собираетесь перевести, создайте файл translation.py:
# -*- coding: utf-8 -*- from modeltranslation.translator import translator, TranslationOptions from pages.models import Page class PageTranslationOptions(TranslationOptions): """ Класс настроек интернационализации полей модели Page. """ fields = ('title', 'seo_description', 'content', ) translator.register(Page, PageTranslationOptions)
В данном случае мы сообщаем modeltranslation, что нужно для модели Page создать дополнительные поля для перевода title, seo_description и content.
После регистрации модели для перевода нужно обновить базу данных — чтобы она включала поля с выбранными языками. Это можно сделать удалив базу и выполнив
./manage.py syncdb или воспользоваться south для миграции базы с данными
Зарегистрируйте в админке переведенную модель
В файле admin.py нужно зарегистрировать новый класс, унаследованный от TranslationAdmin.
Это можно выглядеть так:
from django.contrib import admin from modeltranslation.admin import TranslationAdmin from pages.models import Page class PageAdmin(TranslationAdmin): pass admin.site.register(Page, PageAdmin)
При этом в админке поля для всех языков будут выведены на одной странице. Чтобы улучшить вид админки и упростить работу с переводами, можно использовать класс TabbedTranslationAdmin вместо TranslationAdmin.
Он подключит необходимые CSS и Javascript файлы, чтобы создать закладки-переключели для языков.
Клас!