-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Конфигурация приложения
-
token
(string): API token -
locale
(string): selected locale (ru, en, etc.), если не задано- используется язык по-умолчанию -
application_id
(int): API application id, если не задано- получаем приложение по-умолчанию -
source
(string): название источника (если None- переводы выдергиваются из API по одному) -
client
(Client): custom API client (для заглушек, логирования или кэша) -
snapshot_path
(string): путь к снепшоту (файлу tar.gz или папке)
configure(my_token, 'ru')
configure(my_token, 'ru', preload = True, client = MyCustomAPIClient)
Перевести строку
-
label
(string): tranlation label -
data
(dict): user data -
description
(string): tranlation description -
options
(dict): options options: safe (boolean default False) - if False escape html special symbols
print tr('{actor} give you {count} apples', {'actor':{'name':'John','gender':'male'},'count':10}, 'Apple giving')
print tr('I want print {html}', {'html':'<b>Html</b><i>code</i>'}, options = {'safe':True})
Отправить пропущенные ключи на сервер
Ф-я возвращающая контекст: сочетание язык/клиент/источник, позволяет работать с несколькими контекстами одновременно:
from tml import get_context, TranslationIsNotExists
ru = get_context(token, locale = 'ru')
en = get_context(token, locale = 'en')
ru_snapshot = get_context(locale = 'ru', snapshot_path = '/path/to/snapshot.tar.gz')
print ru.tr('Hello world')
print en.tr('Hello world')
ru.submit_missed()
# Есть низкоуровневые ф-и для работы с переводами:
try:
# Берем русский перевод
t = ru_snapshot.fetch(label, description)
except TranslationIsNotExists:
# not translated:
try:
# Ищем английский перевод:
t = en_snapshot.fetch(label, description)
except TranslationIsNotExists:
# Используем label для перевода:
t = en_snapshot.fallback(label, description)
# Выводим перевод:
print ru_snapshot.render(t, data, options)
Demo web server + unittests
sudo pip install virtualenv
# create virtualenv:
virtualenv --no-site-packages tmldemo
# activate:
. tmldemo/bin/activate
# install deps:
pip install -r demo/requirements.txt
# run webserver 127.0.0.1:5000
./demo.sh
# run unittests:
./unittests.sh
Можно переводить тексты в тестовом режиме на http://127.0.0.1:5000 Демо работает на http://tml.budutam.ru Поддерживаются:
- {name}
- {name|жетон}
- {name||pyped}}
- {name::case}
Для получения переводов используется словарь: объект наследующий классу AbstactDictionary
-
__init__(fallback)
- в конструктор мы передаем ф-ю обработчик, которая вызывается если перевод не найден (по умолчанию мы возвращаем label ключа в качестве перевода) -
fetch(key)
- получить перевод (Translation) для ключа, если перевода нет- кинуть исключение -
translate(key)
- получить перевод, если его нет- вызвать fallback
Поддерживаются словари:
- tml.dictionary.tranlations.Dictionary - получать переводы по API по одному (используется по-умолчанию)
- tml.dictionary.source.SourceDictionary - загружать все переводы для источника (если перевод для источника не привязан, возвращаем fallback перевод), в деструкторе на сервер отправляются missed_keys и сбрасывается кэш (если missed_keys есть) словарь используется, если задан source
- tml.dictionary.language.LanguageDictionary- загружать все переводы для языка (не используется)
-
Если для перевода в массиве data передается элемент наследующий классу
tml.tools.Renderable
перед выводом в шаблон перевода этот объект заменяется на результат выполнения методаrender(context)
, куда передается контекст выполнения (объект содержащий язык и ф-ю для перевода) Можно передавать объекты, генерирующие составные переводы (напримерtml.tools.list.List
выводит список с форматированием и разделителем) -
В св-ве data_preprocessors объекта Context, хранится массив ф-й для предобработки данных, каждая переменная перед выводом проходит через эту цепочку (
tml.tools.list.preprocess_lists
- форматирует простые списки). В django используется св-во TML_DATA_PREPROCESSORS в settings -
В св-ве env_generators находятся генераторы данных по умолчанию, если data не содержит записи с некоторым ключем вызывается генератор (например
tml.tools.viewing_user.get_viewing_user
- пропихивает текущего пользователя). В django используется св-во TML_ENV_GENERATORS в settings
Класс List позволяет выводить форматированные списки:
from tml.tools.list import List
tr('Hello {users}', {'users':List(['Вася','Петя','Коля')}) # Вася, Петя, Коля
- items - список
- limit - кол-во выодимых элементов
List(range(100), limit = 3) # 1, 2, 3
- separator - разделитель (по умолчанию ,)
- last_separator - разделитель последнего эл-та (по умолчанию ,) переводится перед выводом
List(users, last_separator = 'or') # Вася, Петя или Коля
- tpl - ф-я шаблон для вывода элемента
from tml.tools.template import Template
List(users, tpl = upper) # ВАСЯ, ПЕТЯ, КОЛЯ
# поддерживаются стандартные ф-и: падежи, pipes, токены
# $0 - текущий элемент
List(users, tpl = Template('{$0::dat}')) # Васе, Пете, Коле
В переводах работа с текущим пользователем идет через переменную viewing_user, пользователь может быть задан программно Пользователь является объектом класса tml.Gender, пол по-умолчанию не определен
from tml.tools.viewing_user import reset_viewing_user, set_viewing_user
from tml.rules.contexts.gender import Gender
set_viewing_user(Gender.male('John'))
tr('{viewing_user|mr, ms, mr or ms}') # mr