如何用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
相关产品推荐
相关产品推荐

