@[toc]
gettext安装
下载 gettext for Windows
访问官方下载页面:
下载并解压
下载最新版本的 gettext0.21-xxx.zip,解压到某个目录,比如:
C:\Program Files\gettext
添加到系统环境变量
- 按
Win + S搜索 "环境变量" - 选择 "编辑系统环境变量"
- 点击 "环境变量"
- 在 "系统变量" 中找到
Path,点击 "编辑" - 点击 "新建",添加 gettext 的 bin 目录路径:
C:\Program Files\gettext\bin
- 点击 "确定" 保存所有更改
验证安装
安装完成后,验证 gettext 是否正常工作:
# 打开命令提示符或 PowerShell
xgettext --version
msgfmt --version
msgmerge --version
应该显示类似这样的版本信息:
xgettext (GNU gettext-tools) 0.21
Copyright (C) 1995-2020 Free Software Foundation, Inc.
在 Python 项目中使用
- 创建测试文件 test.py
# test.py
def main():
# 这些是需要翻译的字符串
print(_("Hello World"))
print(_("Welcome to the application"))
print(_("File not found"))
if __name__ == "__main__":
main()
- 提取可翻译字符串
# 使用 xgettext 提取字符串
xgettext -L Python -o messages.pot test.py
# 查看生成的 .pot 文件
type messages.pot
- 生成的 messages.pot 文件内容
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-01-15 10:30+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: test.py:4
msgid "Hello World"
msgstr ""
#: test.py:5
msgid "Welcome to the application"
msgstr ""
#: test.py:6
msgid "File not found"
msgstr ""
- 创建翻译文件
# 创建中文翻译文件
msginit -i messages.pot -o zh_CN.po -l zh_CN
# 编辑 zh_CN.po 文件,添加翻译
notepad zh_CN.po
- 编辑后的 zh_CN.po 文件
msgid "Hello World"
msgstr "你好世界"
msgid "Welcome to the application"
msgstr "欢迎使用本应用"
msgid "File not found"
msgstr "文件未找到"
- 编译翻译文件
# 编译 .po 文件为 .mo 文件
msgfmt zh_CN.po -o zh_CN.mo
使用 gettext 实现多语言支持
gettext 是一个用于国际化(i18n)和本地化(l10n)的工具,主要用于管理软件中的文本翻译。
-
项目结构:
myapp ├── src │ └── main.c ├── po │ ├── myapp.pot # 翻译模板 │ ├── en_US.po # 翻译文件 │ ├── zh_CN.po # 翻译文件 │ └── LINGUAS # 支持语言文件 └── locale # 存储翻译产物 ├── en_US │ └── LC_MESSAGES │ └── myapp.mo └── zh_CN └── LC_MESSAGES └── myapp.mo -
标记可翻译字符串:
在源代码中,使用
gettext函数标记需要翻译的字符串:src/main.c:#include <libintl.h> #include <locale.h> #include <stdio.h> int main() { setlocale(LC_ALL, ""); // 设置语言环境(使用环境变量) bindtextdomain("myapp", "./locale"); // 绑定消息域 textdomain("myapp"); // 设置消息域 printf(gettext("Hello, World!")); }在实际使用时不要包含非 ASCII 注释
或者,使用缩写形式
_(通常需要定义宏):printf(_("Hello, World!")); -
提取翻译字符串:
使用
xgettext工具从源码中提取标记的字符串,生成.pot(Portable Object Template)文件。这个文件包含了所有需要翻译的原始字符串。xgettext -o po/myapp.pot src/main.c.pot是翻译的模板文件。接下来我们要用它来生成翻译目标文件。 -
创建翻译文件:
为每种目标语言创建一个
.po文件:msginit -i po/myapp.pot -o po/zh_CN.po -l zh_CN.UTF-8 --no-translator -
翻译字符串:
使用文本编辑器或专用的翻译工具(如 Poedit)打开
.po文件,填写每个原始字符串的翻译。# Chinese translations for PACKAGE package. # Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2025. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-05-16 23:50+0800\n" "PO-Revision-Date: 2025-05-16 23:50+0800\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: zh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" #: main.c:9 #, c-format msgid "Hello, World!" msgstr "你好,世界!" -
编译翻译文件:
使用
msgfmt将.po文件编译为机器可读的.mo文件。msgfmt -o locale/zh_CN/LC_MESSAGES/myapp.mo po/zh_CN.po -
编译程序:
gcc -o myapp -I/opt/gettext/include -L/opt/gettext/lib -lintl src/main.c -
运行:
$ LC_MESSAGES="en_US.UTF-8" ./myapp Hello, World! $ LC_MESSAGES="zh_CN.UTF-8" ./myapp 你好,世界!