Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 25, 2011 01:19:36

Solaris
От:
Зарегистрирован: 2011-06-02
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - simpleform formencode i18n перевод ошибок валидаторов

Есть приложение 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)

Офлайн

#2 Ноя. 8, 2011 15:26:15

Solaris
От:
Зарегистрирован: 2011-06-02
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Pyramid - simpleform formencode i18n перевод ошибок валидаторов

Появилось решение на 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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version