Django models translation on fly 🛸️
Этот проект был инициирован, продвигался и сопровождался winePad GmbH. Разработка полностью основана на идеях, опыте и финансировании winePad GmbH (winePad.at).
Предпосылки и цели этого проекта описаны тут
Приложение для перевода динамического содержимого существующих моделей Django на произвольное количество языков
- без необходимости изменения исходных классов моделей
- без необходимости перезапуска сервера
- без изменения схемы использования переводимых полей
- готов к работе сразу после установки и указании в INSTALLED_APPS
- полностью интегрирован в админку Django.
pip install django-tof
python manage.py migrate tof
# settings.py
...
INSTALLED_APPS = [
...
'tof',
...
]
Не забудьте сделать при необходимости python manage.py collectstatic
- В самом простом варианте использования django-tof позволяет хранить перевод на текущий язык. Для этого не требуется особых настроек достаточно добавить это поле в админке в модель "Translatable fields". В этом случае если текущий язык en то значение сохраненное в моделе будет выводится только если текущий язык en.
- Если нужно поддерживать некоторое количество языков и вносить их одновременно то для удобства можно воспользоваться
TofAdmin
. Использованиеclass CustomModelAdmin(TofAdmin)
приведет к тому что переводимые поля (добавленные в "Translatable fields") будут иметь возможность указать конкретный язык. При этом есть возможность некоторые поля оставить в предыдущем виде указав их вTofAdmin
атрибутonly_current_lang = ('description', )
.
- Также можно использовать инлайн формы представления переводов. Для этого в админ классе (обязательно унаследованного от "TofAdmin") указать
inlines = (TranslationTabularInline, )
илиinlines = (TranslationStackedInline, )
В этом случае для избежания двоякости значений переводимое поле будет скрыто классом "TofAdmin" автоматически.
Ни чем не отличается от стандартного, но имеется возможность получить специфичный перевод.
from django.utils.translation import activate
activate('en')
book = Book.objects.first()
book.title # => Title en
book.title.de # => Title de
Значение для этих переменных можно указать в вашем settings.py
DEFAULT_LANGUAGE: по умолчанию "en" - Дефолтный язык заглушка, используется если не найдено ни каких других переводов.
FALLBACK_LANGUAGES: по умолчанию {SITE_ID: ('en', 'de', 'ru'), 'fr': ('nl', ),}
- Определяет порядок перебора языков для поиска перевода если перевода на искомом
языке нет. Ключом может быть SITE_ID, None или язык.
Порядок обработки такой, если не найден перевод на текущий/запрашиваемый язык то сначала проверяем по ключу языка если есть ищем переводы по указанным языкам если нет то берем по ключу SITE_ID.
Для примера
- если текущий язык "fr" то порядок поиска переводов будет следующим "fr" -> "nl" -> DEFAULT_LANGUAGE -> затем если есть оригинальное значение которое было до объявления этого поля переводимым.
- если текущий язык "en" то порядок поиска переводов будет следующим "en" -> "de" -> "ru" -> DEFAULT_LANGUAGE -> затем если есть оригинальное значение которое было до объявления этого поля переводимым.
DEFAULT_FILTER_LANGUAGE: по умолчанию "current" - Указывает в каких переводах искать/фильтровать значения. может быть в следующих видах __all__
, current
, ['en', 'de']
, {'en', ('en', 'de', 'ru')}
current
- если присвоено это значения то фильтрация происходит только по переводу на текущий язык. Это значение по умолчанию.__all__
- если присвоено это значения то фильтрация происходит по всем переводам.['en', 'de']
- если присвоено это значения то фильтрация происходит по переводам указанных языков.{'en', ('en', 'de', 'ru')}
- - если присвоено это значения то фильтрация происходит по переводам языков полученных по ключу текущего языка.
CHANGE_DEFAULT_MANAGER: по умолчанию "True" - Изменять ли дефолтный менеджер в моделе. Если True то стандартный менеджер переносится в атрибут класса "objects_origin", а "objects" становится менеджером унаследованным от стандартного с добавлением функционала распознающего переводимые поля и учитывающий настройки из DEFAULT_FILTER_LANGUAGE.
- Python (>=3.6)
- Django (>=2.2)
- Форкнуть этот проект
- Склонировать репозиторий
- Создать свою ветку
- Перейти в директорию
example_project
- Вы можете использовать pyenv для выбора версии python
pyenv local 3.8.0
- Мы используем poetry
- Запустить:
poetry env use python
для использования вашей версии python. - Запустить:
poetry install
для установки всех зависимостей. - Запустить:
poetry shell
для активации виртуального окружения. - Запустить:
python manage.py runserver
для запуска сервера разработчика