简介

GNU getttext是实现软件国际化的一套多语言工具,运行程序运行时根据不同的语言环境切换不同的程序语言,对应Qt的Linguist

获取库

使用vcpkg一键安装

翻译

程序代码

示例程序代码如下

 1#include <iostream>
 2#include <libintl.h>
 3
 4#define PACKAGE "test_gettext"
 5
 6int main()
 7{
 8    setlocale(LC_ALL,"");    //设置当前语言为系统默认值
 9    bindtextdomain(PACKAGE, "lang");    //设置翻译文件的路径
10    textdomain(PACKAGE);    //设置当前翻译文件的名称
11    std::cout << gettext("TEXT_HELLO") << std::endl;
12    return 0;
13}

经过上述设置后翻译文件应当放在程序目录的lang/<Locale>/LC_MESSAGES/test_gettext.mo

其中Locale后续配置时会提到

生成模板

1xgettext --package-name test_gettext --package-version 1.0 --default-domain test_gettext test_gettext.cpp -o test_gettext.pot --from-code=UTF-8

生成模板文件test_gettext.pot

 1# SOME DESCRIPTIVE TITLE.
 2# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 3# This file is distributed under the same license as the test_gettext package.
 4# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 5#
 6#, fuzzy
 7msgid ""
 8msgstr ""
 9"Project-Id-Version: test_gettext 1.0\n"
10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2020-08-14 14:24+0800\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
15"Language: \n"
16"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=CHARSET\n"
18"Content-Transfer-Encoding: 8bit\n"
19
20#: test_gettext.cpp:11
21msgid "TEXT_HELLO"
22msgstr ""

生成翻译文本

1msginit --no-translator --locale zh_CN -o test_gettext.po -i test_gettext.pot

生成文件test_gettext.po

 1# Chinese translations for test_gettext package.
 2# Copyright (C) 2020 THE test_gettext'S COPYRIGHT HOLDER
 3# This file is distributed under the same license as the test_gettext package.
 4# Automatically generated, 2020.
 5#
 6msgid ""
 7msgstr ""
 8"Project-Id-Version: test_gettext 1.0\n"
 9"Report-Msgid-Bugs-To: \n"
10"POT-Creation-Date: 2020-08-14 14:30+0800\n"
11"PO-Revision-Date: 2020-08-14 14:30+0800\n"
12"Last-Translator: Automatically generated\n"
13"Language-Team: none\n"
14"Language: zh_CN\n"
15"MIME-Version: 1.0\n"
16"Content-Type: text/plain; charset=ASCII\n"
17"Content-Transfer-Encoding: 8bit\n"
18
19#: test_gettext.cpp:11
20msgid "TEXT_HELLO"
21msgstr ""

把ASCII换成UTF-8,加上翻译你好,世界

zh_CN参数决定了该翻译应该放在lang/zh_CN/LC_MESSAGES/test_gettext.mo目录下被读到

生成翻译文件

1msgfmt --check --verbose -o test_gettext.mo test_gettext.po

最终就能得到test_gettext.mo

运行

指定环境变量LANG

1set LANG=zh_CN.UTF-8
2.\test_gettext.exe

另外

网上有一些po文件编辑器,在翻译时可以显示对应代码的位置方便对应起来,稍微大一点的内部项目可以采用像Weblate这种平台多人协助翻译,开源项目同样有在线翻译平台,可以参考一些大型开源项目的作法