使用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

