Complete C++ i18n gettext() "hello world" example
Your problem is that hellogt.mo
is in the wrong location - your program isn't actually opening it. You can tell this by using strace
to trace open
syscalls:
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)
You can affect where gettext looks for message catalogs with the LOCPATH
environment variable, but if you move it to where gettext is attempting to load it from your example works:
mkdir -p es/LC_MESSAGEScp 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;}EOFg++ -o hellogt hellogt.cxxxgettext --package-name hellogt --package-version 1.2 --default-domain hellogt --output hellogt.pot hellogt.cxxmsginit --no-translator --locale es_MX --output-file hellogt_spanish.po --input hellogt.potsed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#: / s/""/"hola mundo"/'mkdir --parents ./es_MX.utf8/LC_MESSAGESmsgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.poLANGUAGE=es_MX.utf8 ./hellogt
Here is a description of the files created by the above:
hellogt.cxx C++ source filehellogt Executable imagehellogt.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
Here is a description of gettext from Fedora Project. It is simple to follow. But it is in C.
http://fedoraproject.org/wiki/How_to_do_I18N_through_gettext