在本地化(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
模板文件。
还可以将 xgettext
与 msgmerge
、msgfmt
等 gettext 工具链结合使用,构建完整的自动化本地化工作流,延伸阅读:GNU gettext 自动化处理和操作 PO 文件命令行工具集用法详解。