多语言快速上线:Wagtail 多语言内容管理完整清单
【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail
产品下周一要在德国和日本同时上线,站点内容却只有一份中文。编辑想在 Wagtail 里做出日语版首页,翻遍页面动作菜单也没找到"翻译"按钮。这不是按钮缺失:Wagtail 多语言内容管理靠的是一套明确的机制,从配置语言开始,按步骤走下来即可。
✅ 确认适用性:适合与不适合
Wagtail 走的是"每种语言一棵独立页面树"的路线,并非万金油。动手前先对照边界:
适合:
- 页面、Snippet 需要整体译成多种语言,且各语言版本独立发布、独立排期
- 不同语言由不同编辑维护,权限按语言隔离
- 前端 URL 需要 /en/、/ja/ 这类语言前缀
不适合:
- 只翻译模板和 JS 里的静态文案,那属于 Django i18n 的范畴
- 期望所有语言共享同一条数据库记录、做字段级翻译
- 依赖机器翻译 API 自动回填译文,Wagtail 核心不含此能力,需第三方扩展
🌐 弄清 Wagtail 翻译的三个核心概念
只需理解三件事,其余都是细节:
- Locale 语言:登记一个内容允许使用的语言代码。添加语言后 Wagtail 会为它新开一棵页面树,新语言树的首页与原首页是兄弟节点。
- translation_key 译文关联:translation_key 相同的页面互为翻译;locale 与 translation_key 组合唯一,保证同一语言下最多一份译文。
- 语言切换:Django 的 LocaleMiddleware 检测请求语言,i18n_patterns 给 URL 加前缀,Wagtail 把请求路由到对应语言树的首页;找不到就回退到默认语言。
这种结构在页面浏览器里直观可见:各语言内容各归其树,每页的草稿与发布状态互不牵连。
🛠️ 跑通一次完整翻译流程
按"配置语言 → 挂翻译 → 切换访问 → 上线前自检"四步走。
1. 配置语言
打开 i18n 开关并声明语言白名单:
# settings.py USE_I18N = True WAGTAIL_I18N_ENABLED = True WAGTAIL_CONTENT_LANGUAGES = LANGUAGES = [ ("zh", "Chinese"), ("ja", "Japanese"), ] INSTALLED_APPS = [ # ... "wagtail.locales", # 语言管理界面 "wagtail.contrib.simple_translation", # 翻译入口 ]迁移后到后台"设置 → 语言"里添加日语。列表的"Usage"一列会统计每种语言正在使用的内容数量。
2. 给页面挂上翻译
打开首页的编辑页,在动作菜单点"Translate to...",选日语。生成的是与中文版同内容的草稿副本,逐条改写后发布即可,两个版本互不影响。
3. 切换语言访问
前端 URL 要认识语言前缀,用 i18n_patterns 包住 Wagtail 路由:
# urls.py from django.conf.urls.i18n import i18n_patterns urlpatterns += i18n_patterns( path("search/", search_views.search, name="search"), path("", include(wagtail_urls)), prefix_default_language=False, # 默认语言不加前缀 )再把 LocaleMiddleware 加进 MIDDLEWARE,访问根路径就会按浏览器语言自动跳转。
4. 上线前自检
逐项确认:各语言首页是否已发布(未发布会回退默认语言);页面语言切换链接是否齐全(模板写法见官方文档示例);API 的?locale=过滤是否返回正确语言。
⚠️ 看三个典型坑
坑一:开启 i18n 后根路径打不开
- 现象:URL 包进 i18n_patterns 后,原有根地址全部 404。
- 原因:加了前缀后只有 /zh/、/ja/ 这类地址有效,根路径没有可路由的语言。
- 解法:启用 LocaleMiddleware 让根路径自动跳转;默认语言若想免前缀,传 prefix_default_language=False。
坑二:给存量 Snippet 开翻译时迁移报错
- 现象:有数据的 Snippet 加上 TranslatableMixin 后,makemigrations 报字段非空或唯一约束冲突。
- 原因:mixin 新增的 locale 与 translation_key 都是必填字段,存量记录没有值。
- 解法:先用 BootstrapTranslatableMixin 加无约束字段,跑数据迁移为每条记录补值,再换回 TranslatableMixin 加约束,四步流程见国际化文档。
坑三:语言记录删不掉
- 现象:后台删除某语言时报错被拦下。
- 原因:删除逻辑会检查该语言下是否还有页面或其他内容,以及它是不是最后一个语言。
- 解法:先看"Usage"列定位残留内容,迁移或删除后,该语言才可删。
🧭 找三个延伸方向
- 国际化官方文档:完整配置、语言切换模板与 API 过滤参考。
- simple_translation 模块:后台翻译复制入口,可整体替换为第三方翻译工作流。
- 发布说明:跟踪每个版本的多语言新特性与行为变化。
Wagtail 多语言的答案不是给每份内容加翻译字段,而是给每种语言种一棵独立页面树,翻译、权限、发布从此复用既有机制。深入配置与模板写法见docs/advanced_topics/i18n.md,版本动态见发布说明。
【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考