完整的C ++ i18n gettext()“hello world”的例子

我正在寻找一个完整的i18n gettext()你好世界的例子。 我已经根据G. Mohanty的使用GNU gettext的“ 母语支持教程”开始了一个脚本。 我正在使用Linux和G ++。

码:

 cat >hellogt.cxx <<EOF // hellogt.cxx #include <libintl.h> #include <locale.h> #include <iostream> #include <cstdlib> int main (){ char* cwd = getenv("PWD"); std::cout << "getenv(PWD): " << (cwd?cwd:"NULL") << std::endl; char* l = getenv("LANG"); std::cout << "getenv(LANG): " << (l?l:"NULL") << std::endl; char* s = setlocale(LC_ALL, ""); std::cout << "setlocale(): " << (s?s:"NULL") << std::endl; std::cout << "bindtextdomain(): " << bindtextdomain("hellogt", cwd) << std::endl; std::cout << "textdomain(): " << textdomain( "hellogt") << std::endl; std::cout << gettext("hello, world!") << std::endl; } EOF g++ -ohellogt hellogt.cxx xgettext -d hellogt -o hellogt.pot hellogt.cxx msginit --no-translator -l es_MX -o hellogt_spanish.po -i hellogt.pot sed --in-place hellogt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/' sed --in-place hellogt_spanish.po --expression='s/PACKAGE VERSION/hellogt 1.0/' mkdir -p ./es_MX/LC_MESSAGES msgfmt -c -v -o ./es_MX/LC_MESSAGES/hellogt.mo hellogt_spanish.po export LANG=es_MX ls -l $PWD/es_MX/LC_MESSAGES/hellogt.mo ./hellogt strace -e trace=open ./hellogt 

程序编译,文本提取,西class牙文件创build,修改和二进制创build,但hellogt仍然显示英文。 跟踪显示没有证据显示es_MX的当前工作目录,也没有任何对LC_MESSAGES目录的引用。

你的问题是, hellogt.mo是在错误的位置 – 你的程序实际上并没有打开它。 你可以通过使用strace来跟踪open系统调用:

 strace -e trace=open ./hellogt ... open("/tmp/.//es_MX/LC_MESSAGES/hellogt.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/tmp/.//es/LC_MESSAGES/hellogt.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 

您可以通过LOCPATH环境变量影响gettext查找消息目录的LOCPATH ,但是如果将其移至gettext尝试从示例工作中加载的位置:

 mkdir -p es/LC_MESSAGES cp hellogt.mo es/LC_MESSAGES ./hellogt hola mundo 
 cat >hellogt.cxx <<EOF // hellogt.cxx #include <libintl.h> #include <locale.h> #include <iostream> int main (){ setlocale(LC_ALL, ""); bindtextdomain("hellogt", "."); textdomain( "hellogt"); std::cout << gettext("hello, world!") << std::endl; } EOF g++ -o hellogt hellogt.cxx xgettext --package-name hellogt --package-version 1.2 --default-domain hellogt --output hellogt.pot hellogt.cxx msginit --no-translator --locale es_MX --output-file hellogt_spanish.po --input hellogt.pot sed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#: / s/""/"hola mundo"/' mkdir --parents ./es_MX.utf8/LC_MESSAGES msgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po LANGUAGE=es_MX.utf8 ./hellogt 

以下是对上述创建的文件的描述:

 hellogt.cxx C++ source file hellogt Executable image hellogt.pot Extracted text from C++ source file (portable object template) hellogt_spanish.po Modified text for Spanish with translations added (using sed) es_MX.utf8/ LC_MESSAGES/ hellogt.mo Binary translated text for Spanish used at run-time 

这里是从Fedora项目的gettext的描述。 这很容易遵循。 但它在C.

http://fedoraproject.org/wiki/How_to_do_I18N_through_gettext