Pyramid和pyramid_simpleform中的Formencode:设置固定区域设置

3 投票
1 回答
745 浏览
提问于 2025-04-17 04:18

我知道我可以在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 个回答

4

我刚找到了一种方法来实现这个功能,但不确定这是不是最好的方法……总之,我结合了来自Mako国际化食谱simpleform文档和Pylons的做法(在pylons.decorators里面的PylonsFormEncodeState),得出了以下内容……

我这样订阅了一个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

撰写回答