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

如何正确配置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位,直接跳过匹配,所以提取不到任何条目。

可行配置方案

根据你的场景选对应写法即可:

  1. 推荐方案:升级xgettext到0.19及以上稳定版本
    新版本修复了这个解析歧义问题,直接用你原本写的参数就能正常提取:
    --keyword=LOCALIZE:1c,2
    
    提取结果会是正确的带上下文格式:
    #: test.c:1
    msgctxt "Context"
    msgid "Test"
    msgstr ""
    
  2. 旧版本兼容方案
    如果暂时没法升级xgettext,可以显式将复数参数位指向和单数msgid相同的序号,告诉xgettext没有独立的复数参数,写法如下:
    --keyword=LOCALIZE:1c,2,2
    
    这个写法在新旧版本都能正常工作,不会生成多余的msgid_plural字段。
  3. 后续如果需要支持复数形式
    如果你的LOCALIZE宏后续要扩展为LOCALIZE(上下文, 单数文案, 复数文案)的三参数形式,直接把配置改成如下即可正常提取复数条目:
    --keyword=LOCALIZE:1c,2,3
    

注意避坑

  • c标记必须紧跟在上下文对应的参数序号后,中间不能加空格,比如1 c,2的写法会直接解析失败。
  • 不要把c标记加在msgid或者plural对应的参数序号上,会导致参数识别错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:03:22