首页  >  文章  >  后端开发  >  Wagtail 以编程方式创建页面翻译

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

Linda Hamilton
Linda Hamilton原创
2024-09-30 12:15:02484浏览

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 管理员用户,我们将其称为用户 One。
  • 创建主页实例
  • 附加主页作为新的根页面
  • 创建主页的日语翻译
  • 创建 BlogIndexPage 的实例
  • 使用示例帖子填充 BlogPage 并将其附加到 BlogIndexPage
  • 使用 include_subtree=True 翻译 BlogIndexPage

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

BlogIndexPage ==> BlogPage

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

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

但是查看 wagtail 的 simple_translationviews.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。所以当我们第二次调用translate_page时BlogIndexPage已经翻译了!

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

以上是Wagtail 以编程方式创建页面翻译的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn