Skip to content
toukmanov edited this page May 14, 2015 · 21 revisions

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

Работа с API

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', # поддержка текущего пользователя
)

token

Translationexchange API token

monkeypatch

Override django.utils.translation functions Все функции: activate, gettext, ngettext, ugettext и т.п. идут через tml

cache

Name of django cache backend. Ответ API кэшируется стандартными средствами Django

snapshot

Путь к снэпшоту (файлу tar.gz или папке) Система сама определяет файл это или папка. Если передан данный параметр переводы берутся из снепшота, кроме случаев, когда выключено кэширование явно (Translator.current().turn_off_cache()) или косвенно (включен подстрочный перевод)

Шаблоны

{% load tml %}
{% tr with name=user.name %}Hello {name}{% endtr %}

blocktrans

Стандартный тег 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 синтаксису

Unittests

python django/demo/manage.py test django_tml --settings test_settings
# 
. django/demo/unittests.sh

source

Можно явно указать 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',
)

Inline переводы

Тексты могут переводится сразу на сайте, для этого достаточно включить режим перевод:

from django_tml import inline_translations
inline_translations.turn_on() # включить
inline_translations.turn_off() # выключить

Внимание! Включение inline переводов отключает использование кэша, как динамического (заданного через cache), так и статического (snapshot)

cookie

Чтобы включить переводы для конкретного пользователя нужно подключить 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 %} код не генерируется по соображениям совместимости

Viewing user в Django

Переводы могут отличаться в зависимости от пола текущего пользователя. Текущий пользователя является объектом класса 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

Можно создать собственную 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