Formencode в pyramid и pyramid_simplefrom: установить фиксированный языковой стандарт

#python #pyramid #formencode

#python #пирамида #formencode

Вопрос:

Я знаю, что могу запустить следующий код в оболочке python:

 import formencode
ne = formencode.validators.NotEmpty()
formencode.api.set_stdtranslation(languages=["it"])
try:
    ne.to_python("")
except formencode.api.Invalid, e:
    print str(e)
  

и получите распечатанный

Inserire un valore

Теперь, как мне получить тот же результат в моем приложении pyramid, используя pyramid_simpleform с Formencode?

Ответ №1:

Я только что нашел способ сделать это, но я не уверен, что это лучший… В любом случае, я смешал информацию из рецепта Mako i18n, документации simpleform и того, как это сделали Pylons (PylonsFormEncodeState внутри pylons.decorators), и я придумал следующее…

Я подписываюсь на событие NewRequest, подобное этому:

 config.add_subscriber("myproject.subscribers.add_localizer",
                      "pyramid.events.NewRequest")
  

а затем определить add_localizer :

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

    # Set FormEncode language for this request
    formencode_api.set_stdtranslation(languages=["it"]) # This should depend on the user's selection or whatever

    def multiple_gettext(value):
        # 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
  

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

1. @miniwark: Рад это слышать 🙂