C++多语言——libintl库的使用

下面是一个 使用 GNU intl(libintl)库 实现 C++ 项目多语言支持(中英文) 的完整示例,包括:

  1. 源代码

  2. .po 翻译文件

  3. 编译和运行步骤


✅ 1. 示例 C++ 源代码 main.cpp

#include <iostream>
#include <locale.h>
#include <libintl.h>

#define _(STRING) gettext(STRING)

int main() {
    // 设置程序使用的语言环境
    setlocale(LC_ALL, "");

    // 设置翻译文件的目录
    bindtextdomain("myapp", "./locale");
    textdomain("myapp");

    // 打印可翻译字符串
    std::cout << _("Hello, world!") << std::endl;
    std::cout << _("How are you?") << std::endl;

    return 0;
}

✅ 2. 生成 .pot.po.mo 文件

2.1 提取翻译模板 .pot

xgettext --language=C++ --keyword=_ -o messages.pot main.cpp

2.2 创建中文翻译文件 zh_CN.po

msginit --input=messages.pot --locale=zh_CN.UTF-8 --output=zh_CN.po

编辑 zh_CN.po

msgid "Hello, world!"
msgstr "你好,世界!"

msgid "How are you?"
msgstr "你好吗?"

2.3 编译 .po.mo

mkdir -p locale/zh_CN/LC_MESSAGES
msgfmt zh_CN.po -o locale/zh_CN/LC_MESSAGES/myapp.mo

✅ 3. 编译程序

Linux / MSYS2:

g++ main.cpp -o myapp -lintl

✅ 4. 设置语言并运行

Linux 或类 Unix:

LANG=zh_CN.UTF-8 ./myapp

输出:

你好,世界!
你好吗?

如你设置的是 LANG=en_US.UTF-8 或未提供翻译,则显示默认英文。


📝 小贴士

  • myapp 是你的 域名(domain name),必须与 .mo 文件名一致

  • ./locale/zh_CN/LC_MESSAGES/myapp.mo 是固定路径结构

  • Windows 环境下使用 MSYS2 或 mingw 编译时同样支持 libintl

posted @ 2025-05-12 17:36  江海余生  阅读(13)  评论(0)    收藏  举报