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

使用django-modeltranslation时Choice字段翻译不生效问题求助

Django ModelTranslation 中 Choice 字段翻译失效问题

我在使用django-modeltranslation时遇到了Choice字段的翻译问题,具体场景如下:

模型定义

IntervalChoices 选项类

class IntervalChoices(models.TextChoices):
    DAY = DATE_INTERVALS.DAY, _("Day")
    WEEK = DATE_INTERVALS.WEEK, _("Week")
    MONTH = DATE_INTERVALS.MONTH, _("Month")
    YEAR = DATE_INTERVALS.YEAR, _("Year")

Plan 模型

class Plan(SoftDeleteBasedMixin):
    INTERVALS = IntervalChoices
    interval = models.CharField(
      choices=INTERVALS.choices,
      max_length=12,
      default=INTERVALS.MONTH,
      help_text="The frequency with which a subscription should be billed.",
    )

已做操作

  • 通过django-modeltranslation在Django Admin中直接编辑label和description字段,翻译功能正常。
  • 已在Choice选项名称中使用gettextlazy,并在django.po文件中配置了葡萄牙语翻译:

#:plan.py:44 msgid "Day" msgstr "Dia"
#:plan.py:45 msgid "Week" msgstr "Semana"
#:plan.py:46 msgid "Month" msgstr "Mês"
#:plan.py:47 msgid "Year" msgstr "Ano"

  • translation.py配置如下:
from billing.models.plan import Plan
from modeltranslation.translator import TranslationOptions, register


@register(Plan)
class PlanTranslationOptions(TranslationOptions):
    fields = ("label", "description")

问题

将站点或Admin切换为葡萄牙语时,interval字段的选项仍显示英文,无法触发翻译。

解决步骤

  • 确认gettext导入正确性:确保定义IntervalChoices时导入的是gettext_lazy而非普通gettext,正确导入代码:

    from django.utils.translation import gettext_lazy as _
    
  • 编译翻译文件:修改.po文件后必须编译为.mo文件才能生效,执行命令:

    django-admin compilemessages
    
  • 验证Admin语言切换上下文:Django Admin的语言基于用户会话,需在Admin右上角用户菜单的「Change language」中选择葡萄牙语,而非仅修改全局语言设置。

  • 检查常量干扰:确保DATE_INTERVALS中的常量值(如DATE_INTERVALS.DAY)为字符串类型(例如"day"),且不会与翻译键逻辑冲突。

  • 无需注册Choice字段到modeltranslation:modeltranslation负责动态可编辑字段的翻译,Choice选项属于静态翻译,由Django原生gettext系统处理,不需要在TranslationOptions的fields中添加interval。

内容的提问来源于stack exchange,提问作者Paulo Roberto Filho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:29:58