如何正确配置xgettext的keyword选项生成msgctxt上下文行
xgettext提取msgctxt的正确配置方法
你的参数写法逻辑本身没错,提取失败是旧版本xgettext的参数解析歧义导致的,具体规则和解决方法如下:
- xgettext的
c标记作用是指定对应序号的参数为msgctxt上下文,标记规则是直接把c追加在上下文对应的参数序号后,后续紧跟的参数序号为单数msgid,如果有复数形式再追加复数msgid_plural的参数序号。 - 你之前用
--keyword=LOCALIZE:1,2能提取出复数条目,是因为无c标记时,xgettext默认把配置里的两个参数位按「单数msgid + 复数msgid」解析。 - 当你写
--keyword=LOCALIZE:1c,2时,0.19以前的旧版本xgettext不会自动把c标记的参数算成额外的上下文位,依然按总共有2个翻译相关参数位解析,就会认为你只传了上下文+复数msgid,缺失了单数msgid位,直接跳过匹配,所以提取不到任何条目。
可行配置方案
根据你的场景选对应写法即可:
- 推荐方案:升级xgettext到0.19及以上稳定版本
新版本修复了这个解析歧义问题,直接用你原本写的参数就能正常提取:
提取结果会是正确的带上下文格式:--keyword=LOCALIZE:1c,2#: test.c:1 msgctxt "Context" msgid "Test" msgstr "" - 旧版本兼容方案
如果暂时没法升级xgettext,可以显式将复数参数位指向和单数msgid相同的序号,告诉xgettext没有独立的复数参数,写法如下:
这个写法在新旧版本都能正常工作,不会生成多余的msgid_plural字段。--keyword=LOCALIZE:1c,2,2 - 后续如果需要支持复数形式
如果你的LOCALIZE宏后续要扩展为LOCALIZE(上下文, 单数文案, 复数文案)的三参数形式,直接把配置改成如下即可正常提取复数条目:--keyword=LOCALIZE:1c,2,3
注意避坑
c标记必须紧跟在上下文对应的参数序号后,中间不能加空格,比如1 c,2的写法会直接解析失败。- 不要把
c标记加在msgid或者plural对应的参数序号上,会导致参数识别错位。
内容的提问来源于stack exchange,提问作者Dvel
相关产品推荐
相关产品推荐

