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

为何在F字符串中使用gettext时Django会移除django.po翻译?

问题原因及解决办法

为什么翻译条目会被移除?

Django的makemessages工具靠静态代码分析扫描代码里的翻译标记(比如_("xxx"))来提取待翻译字符串。但F-string里的_("Variable")属于动态表达式,静态分析工具无法识别这是一个翻译标记——它只会把整个F-string当成普通字符串,看不到内部的_()调用。

当工具扫描完代码后,发现.po文件里的"Variable"条目找不到对应的静态翻译标记时,就会判定这个字符串已不再被使用,直接从.po文件中删除。

解决办法

试试这几种方式,让makemessages能正确识别翻译字符串:

  • 先把翻译字符串存到变量里再使用:
    把_("Variable")先赋值给变量,再放到F-string中,静态分析就能捕获到这个翻译标记:

    def bar(self, foo):
        var_label = _("Variable")
        return format_html(f'''{var_label}: {value1}<br />''')
    
  • 换用str.format()或字符串拼接:
    放弃F-string,改用静态分析能识别的格式化方式:

    def bar(self, foo):
        # 使用str.format()
        return format_html('{}: {}<br />'.format(_("Variable"), value1))
    

    或者直接字符串拼接:

    def bar(self, foo):
        return format_html(_("Variable") + ': ' + str(value1) + '<br />')
    
  • 额外添加静态翻译标记(不推荐但可用):
    若一定要用F-string,可以在代码里单独加一个无实际用途的静态翻译标记,确保makemessages能检测到:

    # 仅用于让makemessages识别的占位标记
    _("Variable")
    def bar(self, foo):
        return format_html(f'''{_("Variable")}: {value1}<br />''')
    

    这种方法不够简洁,更推荐前两种方案。

修改代码后重新执行python manage.py makemessages --all --symlinks,工具就能正确识别并保留"Variable"的翻译条目了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:07:26