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

Django模型ForeignKey字段翻译失效问题排查

问题

我尝试对Django模型字段进行国际化翻译,模型代码如下:

class CompletedWork(models.Model):
period = models.ForeignKey(directory.Period,
                           on_delete=models.SET('deleted date'),
                           verbose_name=_("Period"),
                           )
worker = models.ForeignKey(
    settings.AUTH_USER_MODEL,
    on_delete=models.SET('deleted worker'),
    related_name='worker_do',
    verbose_name=_('Worker'),
    default=settings.AUTH_USER_MODEL
)
work_done = models.ForeignKey(directory.WorksType,
                              on_delete=models.SET('deleted works type'),
                              verbose_name=_('Work done')
                              )
work_scope = models.FloatField(_("Work scope"), blank=True, null=True)
work_notes = models.CharField(_("Comments"), max_length=70, blank=True, null=True, )
record_author = models.ForeignKey(
    settings.AUTH_USER_MODEL,
    on_delete=models.SET('deleted user'),
    related_name='record_author', auto_created=True,
)
record_date = models.DateTimeField(auto_now=True)
checked_by_head = models.BooleanField(default=False)
active = models.BooleanField(default=True)

我的locale翻译文件内容如下:

msgid "Add record"
msgstr "Додати запис"

msgid "Period"
msgstr "Період"

msgid "Worker"
msgstr "Працівник"

msgid "Work done"
msgstr "Виконана робота"

msgid "Work scope"
msgstr "Обсяг роботи"

实际显示中,period、work_scope、work_notes字段翻译正常,但worker和work_done字段未被翻译。根据Django官方文档,ForeignKey可通过verbose_name参数结合_()标记为可翻译,但我的场景中该方式未生效,请问原因是什么?

可能的原因及解决方法
  • 翻译字符串未被正确提取:
    确认是否重新运行makemessages命令。如果是手动在.po文件中添加的Worker和Work done条目,而非通过python manage.py makemessages -l uk(替换为你的目标语言代码)自动提取,可能存在上下文匹配问题。重新执行提取命令,确保字符串被正确收录到.po文件中。
  • 关联模型的verbose_name优先级覆盖:
    Django的ForeignKey在admin等界面展示时,会优先使用关联模型自身的verbose_name,而非当前字段的verbose_name。比如settings.AUTH_USER_MODEL对应的User模型若设置了verbose_name,admin会显示关联模型的名称而非当前字段的翻译。
    解决方式:要么给关联模型的verbose_name添加翻译,要么在ModelAdmin中显式指定字段标签:
    from django.contrib import admin
    from .models import CompletedWork
    
    class CompletedWorkAdmin(admin.ModelAdmin):
        fields = ('period', 'worker', 'work_done', ...)
        labels = {
            'worker': _('Worker'),
            'work_done': _('Work done'),
        }
    admin.site.register(CompletedWork, CompletedWorkAdmin)
    
  • 翻译文件未编译:
    检查是否执行了python manage.py compilemessages命令,将.po文件编译为Django可识别的.mo文件。未编译的话,新添加的翻译不会生效。
  • 字符串上下文冲突:
    若相同的msgid在其他场景下被标记了上下文(比如使用pgettext),会导致普通_()标记的翻译不生效。检查.po文件中是否存在带msgctxt的同名条目,确保当前字段的翻译没有被上下文覆盖。
  • 引号格式不一致:
    模型中_('Worker')用单引号,_("Period")用双引号,虽然Python语法允许,但部分情况下可能影响翻译提取。统一引号格式后重新执行makemessages,尝试解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:41:11