”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Wagtail 以编程方式创建页面翻译

Wagtail 以编程方式创建页面翻译

发布于2024-11-08
浏览:613

Wagtail programmatically create page translation

我找不到任何编程接口来创建页面翻译。所有逻辑似乎都在 wagtail.contrib.simple_translation.views.

的 SubmitTranslationView 中实现

因此,以编程方式访问这些内容的唯一方法是模拟访问视图的请求。我将其包装在一个名为translate_page() 的函数中。要翻译页面,我们可以将此函数调用为:-

page_ja = translate_page(user, page, "ja")

或者我们可以传递可选参数include_subtree:-

page_ja = translate_page(user, page, "ja", include_subtree=True)

且函数定义为:-

def translate_page(user, page, lang, include_subtree=False):
    locale, created = Locale.objects.get_or_create(language_code=lang)
    data = {"locales": [locale.id], "include_subtree": include_subtree}
    url = reverse(
        "simple_translation:submit_page_translation", kwargs={"page_id": page.id}
    )
    factory = RequestFactory()
    request = factory.post(url)
    request.POST = data
    request.user = user
    get_response = lambda request: None
    middleware = SessionMiddleware(get_response)
    middleware.process_request(request)
    request.session.save()
    messages = FallbackStorage(request)
    setattr(request, "_messages", messages)

    SubmitPageTranslationView.model = type(page)
    SubmitPageTranslationView.as_view()(request, page_id=page.pk)
    page_translated = page.get_translations()[0].specific
    return page_translated

我有另一个名为translate_snippet()的函数。唯一的区别只是提交的 url,没有 include_subtree 参数。

页面树陷阱

对于我们所有的网站,我们都有一个设置脚本,它将自动填充一些帖子及其翻译,以便开发人员可以立即开始工作,而不必手动创建示例页面。

我们的页面结构是这样的:-

HomePage ==> BlogIndexPage ==> BlogPage

安装脚本将执行以下操作:-

  • 创建root管理员用户,我们称之为用户一。
  • 创建主页实例
  • 附加主页作为新的根页面
  • 创建主页的日语翻译
  • 创建 BlogIndexPage 的实例
  • 使用示例帖子填充 BlogPage 并将其附加到 BlogIndexPage
  • 使用 include_subtree=True 翻译 BlogIndexPage

这一切都运行良好,直到我们设置页面结构为的新站点:-

BlogIndexPage ==> BlogPage

所以我们省略了主页(现在我认为这是一个坏主意,但让我们将其保存到另一个主题),因为这个网站主要是一个博客。运行设置脚本后我注意到的第一件事是没有创建博客文章的翻译,尽管我们在翻译 BlogIndexPage 时已经传递了 include_subtree。

我的第一个直觉反应是新的鹡鸰版本可能会发生一些变化。我们的大多数网站都是几年前创建的,仍然使用 wagtail 5,但对于这个新网站,我们将从 wagtail 6 开始,因为它是最新的。

但是查看 wagtail 的 simple_translation views.py 提交日志,代码最后一次更改是在三年前。我们可以看到wagtail 5和6的代码基本相同。

上面的translate_page函数的问题是它不检查任何错误。因为捕获错误意味着您必须解析请求的响应以获取某些错误字符串。但是跟踪代码流将我带到一个阶段,我可以看到代码没有执行,因为表单没有经过验证。

打印 form.errors 显示与无效区域设置相关的错误消息。这很奇怪,因为我们可以在上面的 translate_page 函数中看到我们正在创建语言环境(如果它尚不存在)。

并打印表单的 self.fields["locales"].choices 我可以在翻译根页面时第一次调用 translate_page() 时选择区域设置,但第二次调用时选择为空翻译 BlogIndexPage。

阅读表单的代码,区域设置字段的选择是在 __init__ 方法中动态设置的,其中已翻译的页面的区域设置将被删除。这可能是第二次调用中区域设置为空的原因。但页面还没有翻译!

让我们回顾一下过程:-

  • 创建博客索引页面
  • 将 BlogIndexPage 附加到根页面
  • 将根页面翻译为ja
  • 填充 BlogPage 并将其附加到 BlogIndexPage
  • 将 BlogIndexPage 翻译为 ja

经过几个小时的调试,这就是灯泡(?)出现的地方。在原始脚本中,我们首先将 HomePage 转换为 ja,然后将 BlogIndexPage 及其所有子项转换为 ja。但在这个新脚本中,根页面是 BlogIndexPage。因此,BlogIndexPage 在我们第二次调用 translate_page 时已经翻译了!

这就是区域设置选择变为空的原因。

版本声明 本文转载于:https://dev.to/k4ml/wagtail-programmatically-create-page-translation-2814?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3