Django模板中翻译无法识别上下文变量及对象属性问题
我在Django模板里用翻译功能,硬编码字符串的翻译正常,但用{% translate %}标签翻译上下文里传递的对象属性文本时,makemessages命令完全识别不到这些内容。
我的视图上下文结构如下:
context = { 'object_list': <QuerySet[ <SiteDataKeyValue: some random text>, <SiteDataKeyValue: Some other random text>, <SiteDataKeyValue: and some more random text>, ], }
不用翻译时,访问对象属性完全正常:
<h1>访问对象值的正常写法:</h1> {% for object in object_list %} <p>{{ object.value }} </p> {% endfor %}
按照Django的翻译文档,我尝试用{% translate %}标签改写:
<h1>尝试用translate标签翻译:</h1> {% for object in object_list %} <p>{% translate object.value %} </p> {% endfor %}
但运行manage.py makemessages -l -i .venv后,Django根本识别不了{% translate object.value %},也没有任何错误提示。后来我用with标签把属性存成变量,结果还是一样:
{% for object in object_list %} {% with value=object.value %} <p>{% translate value %} </p> {% endwith %} {% endfor %}
更新:我还试了用过滤器的写法,不管是{{ value|trans }}还是{{ value|translate }},makemessages依然识别不到这些文本。
到底哪里出错了?求解决办法。
问题原因
Django的makemessages工具只能扫描硬编码的静态字符串,无法识别从变量/对象属性动态获取的内容——因为这些值是运行时才会生成的,工具在扫描模板时根本拿不到具体的文本内容。
解决方案
针对这种动态内容的翻译,你可以从以下几个方向处理:
模型层实现多语言支持
如果这些object.value是存储在数据库中的内容,建议直接在模型层处理多语言:要么保存数据时就存入对应语言的版本,要么使用django-modeltranslation这类第三方库,给模型字段添加多语言支持。手动添加翻译条目
如果你能确定这些动态文本的固定取值,可以直接在项目的.po翻译文件里手动添加对应的翻译条目,比如:msgid "some random text" msgstr "对应的中文翻译内容"添加完成后运行
manage.py compilemessages,模板里的{% translate object.value %}就能正常匹配到翻译内容了。使用
blocktranslate配合变量插值
虽然makemessages还是无法自动抓取变量值,但可以用blocktranslate的变量语法确保运行时正确替换内容:{% for object in object_list %} {% blocktranslate %} {{ object.value }} {% endblocktranslate %} {% endfor %}不过这种方式依然需要你手动在
.po文件里添加对应的msgid条目。
关键提醒
makemessages的设计逻辑就是扫描代码和模板里写死的静态字符串,动态生成的内容它是没办法自动识别的——这不是你的写法错误,是工具的固有局限。
内容的提问来源于stack exchange,提问作者Vahid

