Django翻译中是否存在更优的msgid分配方案?
Django翻译自定义msgid方案实现思路
一、自定义键作为msgid(传递双参数)
要实现_("默认文本", "自定义键")这种调用方式,需要自定义翻译函数并调整翻译提取规则:
自定义翻译函数
在项目中创建工具函数,优先使用自定义键执行翻译,未命中时返回默认文本:from django.utils.translation import gettext as _ def _k(default_msg, msgid): translated = _(msgid) # 翻译未生效时返回默认文本 return translated if translated != msgid else default_msg调整翻译提取规则
执行makemessages命令时,指定自定义函数的参数位置,让工具将第二个参数识别为msgid:django-admin makemessages -l zh_CN --keywords=_k:2生成的po文件会自动生成如下内容:
msgid "my_key" msgstr "Some Name"代码调用示例
variable_name = _k("Some Name", "my_key")
二、用变量名作为msgid
要实现将变量名作为msgid、字符串字面量作为默认msgstr,可通过以下两种方式实现:
方式1:手动传递变量名(简单易维护)
自定义接收变量名和默认文本的函数,提取时指定参数位置:
from django.utils.translation import gettext as _ def trans_var(var_name, default_msg): translated = _(var_name) return translated if translated != var_name else default_msg # 调用时手动传入变量名 variable_name = trans_var("variable_name", "Some Name")
执行提取命令时指定函数参数:
django-admin makemessages -l zh_CN --keywords=trans_var:1
生成的po文件内容:
msgid "variable_name" msgstr "Some Name"
方式2:静态分析自动提取(复杂度较高)
如果不想手动传递变量名,可以编写基于AST的脚本:
- 利用Python的
ast模块解析代码,识别var = _("text")形式的赋值语句 - 提取变量名
var和字符串text,生成对应的msgid和msgstr - 将提取结果写入po文件,或调用gettext工具完成后续处理
这种方式无需修改业务代码,但需要维护自定义提取脚本,适合大规模项目使用。
注意事项
- 自定义键作为msgid时,要保证键的唯一性,避免翻译冲突
- 使用变量名作为msgid时,变量名修改会导致翻译失效,需同步更新po文件
- 所有自定义函数都需要在
makemessages中指定,否则无法被翻译工具识别
内容的提问来源于stack exchange,提问作者Ahsan
相关产品推荐
相关产品推荐

