-
Notifications
You must be signed in to change notification settings - Fork 0
Django
http://tml.budutam.ru - demo
sudo pip install virtualenv
# create virtualenv:
virtualenv --no-site-packages tmldemo
# activate:
. tmldemo/bin/activate
# install deps:
pip install -r django/demo/requirements.txt
python django/demo/manage.py migrate # tml не нужна БД, но демо использует авторизацию
# run webserver 127.0.0.1:5000
. django/demo/runserver.sh
from tmp_django import activate, tr
activate(locale)
tr(label, data)
Язык может быть выбран в ф-и activate Выбор перевода идет следующим образом:
- Если есть перевод для текущего языка- используем его
- Если нет- ищем для языка приложения по-умолчанию
- Если совсем ничего- выводим label
TML = {
'token': 'API token value',
'monkeypatch': True,
'cache': 'cache_backend'
'snapshot': BASE_DIR + '/path/to/snapshot.tar.gz'
}
TML_DATA_PREPROCESSORS = (
'tml.tools.list.preprocess_lists', # форматировать списки
)
TML_ENV_GENERATORS = (
'tml.tools.viewing_user.get_viewing_user', # поддержка текущего пользователя
)
Translationexchange API token
Override django.utils.translation functions Все функции: activate, gettext, ngettext, ugettext и т.п. идут через tml
Name of django cache backend. Ответ API кэшируется стандартными средствами Django
Путь к снэпшоту (файлу tar.gz или папке)
Система сама определяет файл это или папка.
Если передан данный параметр переводы берутся из снепшота, кроме случаев, когда выключено кэширование явно (Translator.current().turn_off_cache()
) или косвенно (включен подстрочный перевод)
{% load tml %}
{% tr with name=user.name %}Hello {name}{% endtr %}
Стандартный тег blocktans внутри себе содержит выражения с переменным в синтаксисе django шаблонов:
{% blocktrans %}Hello {{name}}{% endblock %}
Строка для перевода и сам перевод имеет вид нативного форматирования python:
Hello %(name)s -> Привет %(name)s
Ф-я ugettext и т.п. преобразует синтаксис tml ответа в синтаксис python:
Hello {name} -> Привет %(name)s
Для токенов | и || берется последняя опция. Падежи игнорируются.
После подгузки {% tml %} {% blocktrans %} переопределяется.
- Заменяем токены {{name}} на {name} - ищем перевод
- Если нет ищем перевод в виде python %(name)s
- В полученном результате заменяем %(name)s -> {name}
- Форматируем результат при помощи tml движка.
Это дает возможность загрузить существкующие переводы asis и они будут работать из коробки. Постепенно можно приводить их к tml синтаксису
python django/demo/manage.py test django_tml --settings test_settings
#
. django/demo/unittests.sh
Можно явно указать source в коде:
from django_tml import use_source
use_source('my_source_name')
Либо указать в настройка middleware django_tml.middleware.SetSourceToViewMiddleware, тогда каждой view функции будет сопоставлен source == ее полному имени: my_module.views.news_list
MIDDLEWARE_CLASSES = (
#...
'django_tml.middleware.SetSourceToViewMiddleware',
)
Тексты могут переводится сразу на сайте, для этого достаточно включить режим перевод:
from django_tml import inline_translations
inline_translations.turn_on() # включить
inline_translations.turn_off() # выключить
Внимание! Включение inline переводов отключает использование кэша, как динамического (заданного через cache), так и статического (snapshot)
Чтобы включить переводы для конкретного пользователя нужно подключить InlineTranslationsMiddleware
MIDDLEWARE_CLASSES = (
'django_tml.inline_translations.middleware.InlineTranslationsMiddleware'
)
И включить переводы для сессии:
def inline_mode(request):
if request.POST.get('inline_mode', False):
inline_translations.turn_on_for_session()
else:
inline_translations.turn_off_for_session()
return redirect('/')
### Шаблоны
Подключить код для работы можно с помощью шаблонных тегов:
{% load tml_inline %}
<html>
<head>
{% tml_inline_header %}
</head>
<body>
{% tml_inline_footer %}
</body>
</html>
Или:
{% load tml_inline %}
{% activate_tml_inline %}
Важно: вызывайте {% tml_inline_footer %} и {% activate_tml_inline %} в конце страницы (без этого тоже будет работать, но если вы используете вложенные source, помните, что они передаются в библиотеку
Все переводы выводимые с помощью {% tr %}{% endtr %} оборачиваются в дополнительный html для указания клиентскому скрипту перевода. Можно отключить это для конкретных переводов при помощи атрибута nowrap:
<input placeholder="{% tr nowrap %}Your email{% endtr %}"/>
Для {% trans %} и {% blocktrans %} код не генерируется по соображениям совместимости
Переводы могут отличаться в зависимости от пола текущего пользователя. Текущий пользователя является объектом класса tml.Gender
и может быть назначен явно:
from tml.tools.viewing_user import reset_viewing_user, set_viewing_user
user = Gender(gender, name) # gender может быть male|female|other
set_viewing_user(user)
tr('{viewing_user|mr, ms, mr or ms}') # mr
Так как у пользователя в django нет поля отвечающего за пол, мы считаем что у всех пол other
Можно создать собственную middleware для определения текущего пользователя, ее можно унаследовать от django_tml.utils.ViewingUserMiddleware
, класс должен содержать метод build_gender(self, user)
возвращающий объект Gender для пользователя
https://github.com/translationexchange/tml-python/blob/develop/django/demo/tml_django_demo/auth.py