【问题标题】:Pyramid custom JSON renderer, translate TranslationStringPyramid 自定义 JSON 渲染器,翻译 TranslationString
【发布时间】:2020-01-02 14:18:28
【问题描述】:

在我的应用程序端点中返回带有已翻译字符串的 JSON 响应时遇到问题。

默认的金字塔渲染器是我的自定义 JSON 渲染器。一些响应的对象是TranslationStrings。我想让它们自动翻译。 现在我正在使用这个:Pyramid TranslationString not working on json renderer,但这对我来说不是一个理想的解决方案。我不想手动翻译所有回复。

对于翻译我使用TransationStringFactory:

_ = i18n.TranslationStringFactory('coma')

我已经有一些渲染器的适配器。所以我添加了一个新的 - TransationString 类:

def includeme(config):
    json_renderer = JSON()

    def date_adapter(obj, request):
        return obj.isoformat()

    def set_adapter(obj, request):
        return list(obj)

    def uuid_adapter(obj, request):
        return str(obj)

    def enum_adapter(obj, request):
        return obj.value

    def trans_string_adapter(obj, request):
        return request.localizer.translate(obj)

    json_renderer.add_adapter(TranslationString, trans_string_adapter)
    json_renderer.add_adapter(datetime.date, date_adapter)
    json_renderer.add_adapter(set, set_adapter)
    json_renderer.add_adapter(uuid.UUID, uuid_adapter)
    json_renderer.add_adapter(enum.Enum, enum_adapter)

    config.add_renderer('json', json_renderer)

这是我要返回的 JSON 对象的示例:

return {
    'label': _('Estimated net income'),
    'value': round(income_net, self.decimal_places),
    ...
}

为什么我的自定义 JSON 渲染器无法为 TranslationString 对象调用适配器?

【问题讨论】:

    标签: python json adapter pyramid cornice


    【解决方案1】:

    它没有被调用的原因是json.dumps 仅在类型不是 json-serializable 时才调用默认适配器。 TranslationStringstr 的子类,因此它是 json-serializable 并且不使用您的适配器。

    我认为,总的来说,这是TranslationString 及其工作原理的问题。它希望您始终通过定位器传递字符串,因此您应该尽快这样做,而不是等待出口。不幸的是,这基本上意味着将本地化程序传递到所有地方,或者使其作为线程本地可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 2017-11-24
      • 2013-09-25
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      相关资源
      最近更新 更多