1. 前置准备:安装必要工具
在Debian或Ubuntu系统中,首先安装gettext(提供字符串提取、编译工具)和devscripts(包含Debian字符串管理辅助工具),确保具备多语言支持的基础能力。
sudo apt-get install gettext devscripts
2. 标记可翻译字符串:源代码中的gettext宏
在应用程序源代码中,使用gettext提供的宏(如_()、gettext())标记所有需要翻译的字符串。例如,在C语言中:
#include <libintl.h>
#define _(STRING) gettext(STRING) // 定义简化宏
int main() {
printf(_("Hello, World!\n")); // 标记需翻译的字符串
return 0;
}
这一步是多语言支持的核心前提,只有被宏标记的字符串才会被后续工具提取。
3. 提取字符串:生成POT模板文件
使用debian/strings命令(Debian专用工具)或xgettext(通用工具)从源代码中提取标记的字符串,生成.pot(Portable Object Template)文件。.pot文件是翻译的基础模板,包含所有待翻译的字符串及元数据(如上下文、注释)。
# Debian方式(推荐,适用于Debian软件包)
debian/strings mypackage > messages.pot
# 通用方式(适用于非Debian项目)
xgettext --language=C --keyword=_ --output=messages.pot ./src/
其中,mypackage是软件包名称,./src/是源代码目录。
4. 创建语言目录与PO文件
为每种目标语言创建对应的目录结构(遵循GNU gettext规范),并将.pot文件复制为.po(Portable Object)文件(未翻译的模板)。例如,支持简体中文(zh_CN):
mkdir -p debian/zh_CN/LC_MESSAGES # Debian软件包目录
mkdir -p locales/zh_CN/LC_MESSAGES # 通用项目目录
# 复制POT文件生成PO文件
cp messages.pot debian/zh_CN/LC_MESSAGES/debian.po # Debian方式
cp messages.pot locales/zh_CN/LC_MESSAGES/messages.po # 通用方式
目录结构需符合<语言代码>/<LC_MESSAGES>的规范,确保程序能正确加载翻译。
5. 编辑翻译文件:填充目标语言字符串
使用文本编辑器(如vim、nano)或专业翻译工具(如Poedit、Weblate)打开.po文件,为每个msgid(原始字符串)填写对应的msgstr(翻译后的字符串)。例如:
msgid "Hello, World!"
msgstr "你好,世界!" # 中文翻译
注意保留msgid和msgstr的格式,避免遗漏注释或上下文信息。
6. 编译PO文件为MO文件:二进制翻译文件
.po文件是文本格式,无法被程序直接加载,需使用msgfmt工具编译为.mo(Machine Object)二进制文件。例如:
# Debian方式
msgfmt -o debian/zh_CN/LC_MESSAGES/debian.mo debian/zh_CN/LC_MESSAGES/debian.po
# 通用方式
msgfmt -o locales/zh_CN/LC_MESSAGES/messages.mo locales/zh_CN/LC_MESSAGES/messages.po
.mo文件是程序运行时读取的最终翻译文件,编译后会压缩字符串数据以提高加载效率。
7. 集成翻译文件:配置程序加载路径
在应用程序代码中,通过setlocale、bindtextdomain、textdomain三个函数配置gettext加载翻译文件的路径。例如:
#include <locale.h>
#include <libintl.h>
#define _(STRING) gettext(STRING)
int main() {
setlocale(LC_ALL, ""); // 设置系统语言环境(如zh_CN.UTF-8)
bindtextdomain("myapp", "./locales"); // 指定翻译文件目录(通用项目)
// bindtextdomain("debian", "/usr/share/locale"); // Debian软件包的标准路径
textdomain("myapp"); // 设置默认域(与.po文件名一致)
printf(_("Hello, World!\n")); // 输出翻译后的字符串
return 0;
}
确保bindtextdomain的路径与.mo文件的存放位置一致(如通用项目的./locales或Debian软件包的/usr/share/locale)。
8. 测试与部署:验证多语言支持
export LANG=<语言代码>.UTF-8临时切换语言(如export LANG=zh_CN.UTF-8),或通过dpkg-reconfigure locales永久配置系统语言。.mo文件放入debian/<语言代码>/LC_MESSAGES/目录,使用dpkg-buildpackage构建软件包并分发。注意事项
.pot文件,更新所有.po文件并重新编译。.po和.mo文件纳入版本控制系统(如Git),便于协作翻译和历史追溯。