我找不到任何编程接口来创建页面翻译。所有逻辑似乎都在 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
安装脚本将执行以下操作:-
这一切都运行良好,直到我们设置页面结构为的新站点:-
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__ 方法中动态设置的,其中已翻译的页面的区域设置将被删除。这可能是第二次调用中区域设置为空的原因。但该页面尚未翻译!
让我们回顾一下过程:-
经过几个小时的调试,这就是灯泡(?)出现的地方。在原始脚本中,我们首先将 HomePage 转换为 ja,然后将 BlogIndexPage 及其所有子项转换为 ja。但在这个新脚本中,根页面是 BlogIndexPage。所以当我们第二次调用translate_page时BlogIndexPage已经翻译了!
这就是区域设置选择变为空的原因。
以上是Wagtail 以编程方式创建页面翻译的详细内容。更多信息请关注PHP中文网其他相关文章!