其实我也有同样的问题。我最终做的是查看默认的语言环境协商器是如何工作的——它在给定的请求对象上查找一个LOCALE属性。所以只需使用一个假人来创建定位器。如果你愿意,你也可以缓存这个值
def my_get_localizer(locale=None):
request = Request({})
request._LOCALE_ = locale
return get_localizer(request)
或者,加入 irc 频道 #pyramid @ freenode 并纠缠这些人,将 get_localizer 的功能拆分为 2 个单独的文档功能(get_localizer 和 get_localizer_for_locale_name)供我们享用;)
另外,请注意 Pyramid TranslationStrings 是惰性的,因此您可以根据需要翻译它们,例如
class MyModel(Base):
description = TranslationString("My model number ${number}")
...
def view(request):
m = MyModel()
localizer = get_localizer(request)
description = localizer.translate(m.description, mapping={'number': 1})
旁注:pylons 的 i18n 是我多年来打开的最糟糕的蠕虫罐头。set_lang, get_lang hack 真的很糟糕,而且很痛苦,因为我们需要用他们的母语向用户发送电子邮件,然后尝试恢复语言……此外,翻译请求之外的任何内容都是不可能的当时不存在作为翻译器或注册表的 pylons 程序。