简介
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这种平台多人协助翻译,开源项目同样有在线翻译平台,可以参考一些大型开源项目的作法