Найти - Пользователи
Полная версия: Pyramid - simpleform formencode i18n перевод ошибок валидаторов
Начало » Pyramid / Pylons / TurboGears » Pyramid - simpleform formencode i18n перевод ошибок валидаторов
1
Solaris
Есть приложение 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)'),
})
Solaris
Появилось решение на 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB