Что делает T.lazy в web2py?

#internationalization #web2py

#интернационализация #web2py

Вопрос:

Я изучаю web2py. Я прочитал пример открытого исходного кода. В одном приложении (storpy) программист T.lazy неоднократно использует файл моделей db.py , подобный этому:

 ...
Field('comment', 'text'),
Field('cover', 'upload', autodelete=True))

T.lazy = False
db.dvds.title.requires = [IS_NOT_EMPTY(error_message=T('Missing data')   '!'), IS_NOT_IN_DB(db, 'dvds.title', error_message=T('Already in the database')   '!')]
...
T.lazy = True
  

Почему программист устанавливает T.lazy сначала в False , а затем в True ?

Ответ №1:

По умолчанию T() является ленивым — когда вы вызываете его, он фактически не выполняет перевод, а вместо этого возвращает объект lazyT, который не переводится, пока не будет сериализован в представлении. Если вы установите T.lazy=False , это приведет к немедленному переводу, поэтому вызов T('some string') вернет фактически переведенную строку вместо объекта lazyT.

Обратите внимание, начиная с предстоящего выпуска, вместо того, чтобы переключаться T.lazy на False и True , вы сможете сделать T('some string', lazy=False) принудительный немедленный перевод для одного вызова. Другие способы принудительного немедленного перевода — это str(T('some string')) или T('some string').xml() str() сериализует объект lazyT (и .xml() просто вызывает str() ).

Комментарии:

1. Спасибо за четкое объяснение. Еще один вопрос: почему существует необходимость в немедленном переводе?

2. Например, иногда форматы даты, такие как ‘%Y /% m /% d’, переводятся, но их необходимо передать внутренним функциям, таким как date.strftime(T('%Y/%m/%d', lazy=False)) .