gettext
是一个用于国际化(i18n)和本地化(l10n)的工具集,旨在帮助开发者创建多语言支持的应用程序。它主要通过提供一系列工具和库来简化文本翻译过程。
gettext 工作流程
- 标记源代码:在源代码中用
_()
函数包装需要翻译的字符串。 - 提取字符串:使用
xgettext
提取所有标记的字符串到 POT (Portable Object Template) 文件。 - 翻译字符串:将 POT 文件转换为 PO (Portable Object) 文件,并进行翻译。
- 编译翻译:使用
msgfmt
将 PO 文件编译成二进制格式的 MO (Machine Object) 文件。 - 部署翻译:将生成的 MO 文件部署到适当的位置,以便应用程序加载。
基本语法
gettext [选项] [[文本域] 消息ID]
gettext [选项] -s [消息ID]...
选项
基本选项
-d
,--domain=文本域
从指定的文本域获取翻译消息-e
启用部分转义序列的扩展-E
为兼容性保留(被忽略)-h
,--help
显示帮助信息并退出-n
抑制末尾的换行符-V
,--version
显示版本信息并退出
特殊模式
-s
模拟echo
命令的行为(但会翻译参数中能在消息目录中找到的消息)
参数说明
[文本域] 消息ID
从指定文本域中获取与消息ID对应的翻译消息- 如果未提供文本域参数,则从环境变量
TEXTDOMAIN
中获取
环境变量
TEXTDOMAIN
指定默认的消息文本域(相当于-d
选项)TEXTDOMAINDIR
指定消息目录的搜索路径(当在常规目录中找不到消息目录时使用)
默认搜索路径
/usr/share/locale
使用示例
基本翻译
# 使用默认文本域翻译消息
gettext "Hello World"
# 指定文本域翻译
gettext -d myapp "Welcome message"
# 或等价的
gettext myapp "Welcome message"
模拟 echo 行为
# 会尝试翻译能翻译的部分
gettext -s "This is a test" "Another message"
在脚本中使用
#!/bin/bash
# 设置文本域
TEXTDOMAIN=myapp
TEXTDOMAINDIR=/usr/local/share/locale
# 使用gettext翻译
echo $(gettext "File not found")
抑制换行
gettext -n "Processing..."
注意事项
- 当使用
-s
选项时,行为类似于echo
命令,但会尝试翻译参数 - 消息目录通常位于
/usr/share/locale
或TEXTDOMAINDIR
指定的路径 - 实际开发中更常用
_()
宏(如_("message")
),这是gettext
的常用简写形式 - 完整的国际化流程通常包括:
- 用
gettext
标记源代码中的字符串 - 使用
xgettext
提取消息 - 创建翻译文件(.po)
- 编译为二进制格式(.mo)
- 用