Форум сайта python.su
Есть приложение Shootout, форкнуть его можно здесь https://github.com/Pylons/shootout
В нем используется pyramid_simpleform и formencode
Там есть форма регистрации
Не могу понять как локализировать ошибки валидаторов из formencode. Чтобы при отправке формы с незаполненным полем оно ругалось, скажем, на русском.
formencode.api.set_stdtranslation(domain=”FormEncode”, languages=)
не помогает или я его не туда вставляю. Он работает только когда библиотека используется отдельно от pyramid.
Варианты со State object наверное не то, что нужно, так как внутри formencode уже есть перевод этих строк и его нужно как-то активировать.
Есть конечно вариант явной перезаписи всех сообщений при определении схемы, но этот вариант кажется мне каким-то “неправильным”.
class EmailForm(formencode.Schema):
allow_extra_fields = True
filter_extra_fields = True
email = formencode.validators.Email(not_empty=True,
messages = {
'empty': _('Please enter an email address'),
'noAt': _('An email address must contain a single @'),
'badUsername': _('The username portion of the email address is
invalid (the portion before the @: %(username)s)'),
'socketError': _('An error occured when trying to connect to the
server: %(error)s'),
'badDomain': _('The domain portion of the email address is invalid
(the portion after the @: %(domain)s)'),
'domainDoesNotExist': _('The domain of the email address does not
exist (the portion after the @: %(domain)s)'),
})
Отредактировано (Сен. 25, 2011 01:29:34)
Офлайн
Появилось решение на stackoverflow
http://stackoverflow.com/questions/7766011/formencode-in-pyramid-and-pyramid-simplefrom-set-fixed-locale
Я его немного модифицировал, чтобы использовался текущий язык.
Регистрируем подписчика
config.add_subscriber("myproject.subscribers.add_localizer",
"pyramid.events.NewRequest")
from pyramid import i18n
from formencode import api as formencode_api
def add_localizer(event):
request = event.request
localizer = i18n.get_localizer(request)
if not hasattr(localizer, "old_translate"):
localizer.old_translate = localizer.translate # Backup the default method
request.localizer = localizer
request.translate = lambda x: localizer.translate(i18n.TranslationString(x))
formencode_api.set_stdtranslation(languages=[request.localizer.locale_name])
def multiple_gettext(value, domain=''):
# Try default translation first
t = localizer.old_translate(i18n.TranslationString(value))
if t == value:
# It looks like translation failed, let's try FormEncode
t = formencode_api._stdtrans(value)
return t
localizer.translate = multiple_gettext
Офлайн