为何在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
相关产品推荐
相关产品推荐

