在Debian中管理Strings(国际化字符串)的完整流程
Debian中管理Strings(如提取、翻译、编译国际化字符串)需依赖gettext(核心工具集)和devscripts(辅助脚本)工具包。通过以下命令安装:
sudo apt update && sudo apt install gettext devscripts
为了让工具识别需要翻译的文本内容,源代码中的字符串必须用gettext函数包裹(常用宏_()简化)。例如:
#include <libintl.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, ""); // 设置语言环境
bindtextdomain("myapp", "/usr/share/locale"); // 指定翻译文件路径
textdomain("myapp"); // 设置默认域
printf(_("Hello, World!\n")); // 标记为可翻译字符串
return 0;
}
关键点:_("string")中的string会被xgettext工具提取为待翻译内容。
使用xgettext从源代码中提取所有标记的字符串,生成.pot(Portable Object Template)文件(包含所有需要翻译的字符串及上下文)。命令示例:
xgettext --language=C --keyword=_ --output=myapp.pot myapp.c
--language=C:指定源代码语言(如C、Python等);--keyword=_:指定gettext宏(若使用gettext()而非_(),需调整);--output:输出的.pot文件名。.pot文件是模板,需为每种目标语言创建对应的.po(Portable Object)文件(包含原始字符串及翻译)。
fr_FR)的路径为debian/fr/LC_MESSAGES/:mkdir -p debian/fr/LC_MESSAGES/
msginit从.pot生成.po文件(需指定语言代码,如fr_FR):msginit --input=myapp.pot --locale=fr_FR --output=debian/fr/LC_MESSAGES/myapp.po
nano)或图形工具(如Poedit)编辑.po文件,填写msgstr字段(msgid是原始字符串,msgstr是翻译后的字符串)。例如:msgid "Hello, World!"
msgstr "Bonjour, le monde !"
程序运行时需要读取.mo(Machine Object)二进制文件,因此需将.po编译为.mo。使用msgfmt命令:
msgfmt --output-file=debian/fr/LC_MESSAGES/myapp.mo debian/fr/LC_MESSAGES/myapp.po
编译后的.mo文件需放置在程序指定的路径(如debian/fr/LC_MESSAGES/),程序会自动加载对应语言的翻译。
export命令临时切换语言(如法语):export LANG=fr_FR.UTF-8
Bonjour, le monde !)。当源代码中的字符串发生变化(如新增、修改),需同步更新.pot和.po文件:
xgettext生成新的.pot文件(会保留原有翻译):xgettext --language=C --keyword=_ --output=myapp.pot myapp.c
msgmerge将新.pot的内容合并到现有.po文件中(保留已有翻译,仅更新新增/修改的字符串):msgmerge --update debian/fr/LC_MESSAGES/myapp.po myapp.pot
msgfmt重新生成.mo文件。.pot、.po和.mo文件纳入版本控制系统(如Git),跟踪字符串变更历史,便于回滚或协作。.mo文件放置在/usr/share/locale/<语言代码>/LC_MESSAGES/或软件包指定的路径下;LANG、LC_ALL等环境变量是否设置正确;printf("Hello")),必须用gettext标记。