You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django命令结合DeepL自动翻译Wagtail多页面?(v5.2+1.7)

基于Wagtail-localize + DeepL实现批量页面翻译的解决方案

针对Wagtail 5.2和wagtail-localize 1.7版本,你可以通过自定义翻译后端+Django管理命令的方式实现批量页面翻译,以下是具体实现步骤:

1. 准备工作

首先安装DeepL的Python SDK:

pip install deepl

在项目settings中配置DeepL API密钥(建议从环境变量读取):

DEEPL_API_KEY = os.environ.get("DEEPL_API_KEY")

2. 自定义DeepL翻译后端

wagtail-localize允许通过自定义后端接入第三方翻译服务,创建yourapp/wagtail_localize_backends.py文件:

from deepl import Translator
from django.conf import settings
from wagtail_localize.translate import BaseTranslationBackend

class DeepLTranslationBackend(BaseTranslationBackend):
    def translate(self, source_locale, target_locale, segments, **kwargs):
        # 初始化DeepL翻译器
        translator = Translator(settings.DEEPL_API_KEY)
        
        # 处理语言代码映射(Wagtail格式转DeepL格式)
        source_lang = source_locale.language_code.replace("-", "_").upper()
        target_lang = target_locale.language_code.replace("-", "_").upper()
        
        # 提取待翻译文本
        source_texts = [segment["text"] for segment in segments]
        
        # 调用DeepL接口翻译
        translations = translator.translate_text(
            source_texts,
            source_lang=source_lang,
            target_lang=target_lang
        )
        
        # 返回符合wagtail-localize要求的结果格式
        return [
            {
                "text": translation.text,
                "meta": {},
                "segment_id": segments[i]["segment_id"]
            }
            for i, translation in enumerate(translations)
        ]

然后在settings中配置该后端为默认翻译服务:

WAGTAIL_LOCALIZE_TRANSLATION_BACKENDS = {
    "default": {
        "CLASS": "yourapp.wagtail_localize_backends.DeepLTranslationBackend",
    }
}

3. 编写批量翻译的Django命令

创建yourapp/management/commands/translate_all_pages.py命令文件:

from django.core.management.base import BaseCommand
from wagtail.models import Page, Locale
from wagtail_localize.models import Translation, Source

class Command(BaseCommand):
    help = "批量翻译所有页面到指定目标语言"

    def add_arguments(self, parser):
        parser.add_argument("--source-locale", required=True, help="源语言代码(如en-us)")
        parser.add_argument("--target-locales", required=True, nargs="+", help="目标语言代码列表(如fr es)")

    def handle(self, *args, **options):
        source_locale = Locale.objects.get(language_code=options["source_locale"])
        target_locales = [Locale.objects.get(language_code=code) for code in options["target_locales"]]
        
        # 获取所有源语言下的已发布页面(可根据需求修改过滤条件)
        pages = Page.objects.filter(locale=source_locale).live().specific()
        
        for page in pages:
            self.stdout.write(f"正在处理页面: {page.title} (ID: {page.id})")
            
            # 创建或获取页面的翻译源记录
            source, _ = Source.objects.get_or_create(
                content_type=page.content_type,
                object_id=page.id,
                locale=source_locale
            )
            
            for target_locale in target_locales:
                # 跳过已存在的翻译
                if Translation.objects.filter(source=source, target_locale=target_locale).exists():
                    self.stdout.write(f"  已存在{target_locale}翻译,跳过")
                    continue
                
                # 创建翻译任务并触发翻译
                translation = Translation.objects.create(
                    source=source,
                    target_locale=target_locale,
                    state="new"
                )
                translation.translate()
                
                # 保存翻译后的页面
                translated_page = translation.get_target_instance()
                translated_page.save()
                
                self.stdout.write(f"  成功翻译到{target_locale}")
        
        self.stdout.write(self.style.SUCCESS("所有翻译任务执行完成"))

4. 执行批量翻译

运行以下命令开始批量翻译(替换为你的源语言和目标语言代码):

python manage.py translate_all_pages --source-locale en-us --target-locales fr es

注意事项

  • 语言代码映射:部分语言的Wagtail代码与DeepL代码可能存在差异,需参考DeepL官方文档调整映射逻辑。
  • API限流:DeepL免费版有调用次数限制,批量翻译时可在命令中添加延迟(如time.sleep(1))避免触发限流。
  • 字段兼容性:wagtail-localize会自动拆分富文本、StreamField等复杂字段为文本段,但部分特殊字段可能需要额外处理。
  • 测试先行:建议先选取少量页面测试翻译效果,确认无误后再执行批量操作。

内容的提问来源于stack exchange,提问作者Theophile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:09:59