[1334]gettext安装及使用

64 阅读3分钟

@[toc]

gettext安装

下载 gettext for Windows

访问官方下载页面:

下载并解压

下载最新版本的 gettext0.21-xxx.zip,解压到某个目录,比如: C:\Program Files\gettext

添加到系统环境变量

  1. 按 Win + S 搜索 "环境变量"
  2. 选择 "编辑系统环境变量"
  3. 点击 "环境变量"
  4. 在 "系统变量" 中找到 Path,点击 "编辑"
  5. 点击 "新建",添加 gettext 的 bin 目录路径:
C:\Program Files\gettext\bin
  1. 点击 "确定" 保存所有更改

验证安装

安装完成后,验证 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)的工具,主要用于管理软件中的文本翻译。

  1. 项目结构

    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
    
    
  2. 标记可翻译字符串

    在源代码中,使用 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!"));
    
  3. 提取翻译字符串

    使用 xgettext 工具从源码中提取标记的字符串,生成 .pot(Portable Object Template)文件。这个文件包含了所有需要翻译的原始字符串。

    xgettext -o po/myapp.pot src/main.c
    

    .pot 是翻译的模板文件。接下来我们要用它来生成翻译目标文件。

  4. 创建翻译文件

    为每种目标语言创建一个 .po 文件:

    msginit -i po/myapp.pot -o po/zh_CN.po -l zh_CN.UTF-8 --no-translator
    
  5. 翻译字符串

    使用文本编辑器或专用的翻译工具(如 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 "你好,世界!"
    
  6. 编译翻译文件

    使用 msgfmt 将 .po 文件编译为机器可读的 .mo 文件。

    msgfmt -o locale/zh_CN/LC_MESSAGES/myapp.mo po/zh_CN.po
    
  7. 编译程序

    gcc -o myapp -I/opt/gettext/include -L/opt/gettext/lib -lintl src/main.c
    
  8. 运行

    $ LC_MESSAGES="en_US.UTF-8" ./myapp
    Hello, World!
    $ LC_MESSAGES="zh_CN.UTF-8" ./myapp
    你好,世界!