#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))
.