xgettext 用法详解:自动提取i18n可翻译字符串生成pot模板文件的强大工具

文章目录

在本地化(i18n)开发中,提取源代码中的可翻译字符串是第一步,而 xgettext 正是处理这项任务的利器。它是 GNU gettext 工具链中的一部分,专门用于从源文件中提取文本字符串,生成 .pot 模板文件,供后续的翻译工作使用。

本文将深入解析 xgettext 的常用选项与实战用法,助你快速掌握这一工具。

一、基本用法:提取字符串

xgettext main.c -o messages.pot

这条命令的含义很简单:

  • main.c:要处理的源文件。
  • -o messages.pot:输出 .pot 文件,默认文件名为 messages.po,可通过 -d 更改默认域名。

如果你有多个源文件:

xgettext file1.c file2.c -o messages.pot

或者使用文件列表:

xgettext -f filelist.txt -o messages.pot

其中 filelist.txt 是一个包含文件路径的纯文本文件,每行一个。

二、控制输出路径和文件名

  • -d NAME:设置默认域名,输出文件将命名为 NAME.po
  • -o FILE:直接指定输出文件名。
  • -p DIR:将输出文件写入指定目录。

示例:

xgettext -d app -p locale -o app.po main.c

三、语言识别与编码设置

默认情况下,xgettext 根据文件扩展名推测语言。但你可以明确指定语言类型:

xgettext -L Python script.py

支持的语言非常广泛,包括 C、C++、Python、Java、Shell、Rust、PHP 等。

如果你使用的是 UTF-8 编码(推荐),可使用:

xgettext --from-code=UTF-8

四、关键词自定义

默认 xgettext 会寻找 _() 这样的函数调用。如果你定义了其他标记函数(如 gettext()tr() 等),需使用 -k 进行指定:

xgettext -kgettext -ktr -k_ main.c

要禁用默认关键词 _(),可使用:

xgettext -k -kgettext

也可以为关键字设置参数位置,例如:

xgettext --flag=gettext:1:format

五、注释提取

开发者可通过注释为翻译者提供上下文。xgettext 支持提取特定前缀的注释:

// TRANSLATORS: This is a special warning
printf(_("Danger ahead!"));

提取命令:

xgettext -cTRANSLATORS main.c

如果不指定 TAG,则提取所有注释块:

xgettext -c main.c

六、合并、排除与格式校验

  • -j:将提取结果追加到已有 .po 文件中(适合增量更新)。
  • -x existing.po:排除已翻译的字符串,避免重复。
  • --check=ellipsis-unicode 等:对输出内容进行格式校验(适合 CI 流程中使用)。

七、输出格式控制

  • --no-wrap:不自动换行。
  • -w 120:设置最大行宽(默认 80)。
  • --no-location:不添加源文件位置注释。
  • --strict:输出符合 Uniforum 规范的 .po 文件。
  • --properties-output:生成 Java .properties 格式输出。
  • --stringtable-output:生成 NeXTstep .strings 格式输出。

示例(生成 .properties):

xgettext -L Java --properties-output -o messages.properties MyClass.java

八、其他实用选项

  • --color=always|auto|never:开启或禁用彩色输出。
  • --style=style.css:配合 --color 使用自定义 CSS。
  • -e / -E:控制是否使用 C 转义符。
  • --force-po:即使没有提取到任何字符串也生成 .po 文件。

九、显示帮助和版本

xgettext --help
xgettext --version

总结

xgettext 是开发本地化流程中的关键工具,熟练掌握它能显著提升 i18n 效率。无论你使用哪种编程语言,只需规范地书写带标记的字符串,结合灵活的命令行参数配置,便可快速构建出适合翻译的 .pot 模板文件。

还可以将 xgettextmsgmergemsgfmt 等 gettext 工具链结合使用,构建完整的自动化本地化工作流,延伸阅读:GNU gettext 自动化处理和操作 PO 文件命令行工具集用法详解


也可以看看