2009-06-16 2 views
15

Sto cercando un esempio completo di i18n gettext() ciao mondo. Ho iniziato uno script basato su A tutorial on Native Language Support using GNU gettext di G. Mohanty. Sto usando Linux e G ++.Completo C++ i18n gettext() esempio "ciao mondo"

Codice:

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 

Il programma viene compilato, il testo viene estratto, viene creato un file spagnola, modificato e binario creato, ma hellogt mostra ancora inglese. La traccia non mostra alcuna prova di cercare nella directory di lavoro corrente per es_MX né alcun riferimento alla directory LC_MESSAGES.

risposta

11
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 

Ecco una descrizione dei file creati dal sopra:

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 
13

Il tuo problema è che hellogt.mo si trova nella posizione errata - il tuo programma non lo sta effettivamente aprendo. Si può dire questo utilizzando strace tracciare open chiamate di sistema:

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) 

È possibile influenzare in cui gettext cerca i cataloghi dei messaggi con la variabile di LOCPATH ambiente, ma se lo si sposta al punto in cui gettext sta tentando di caricarlo dal vostro esempio funziona:

mkdir -p es/LC_MESSAGES 
cp hellogt.mo es/LC_MESSAGES 
./hellogt 
hola mundo 
+0

Grazie. La traccia ha aiutato a identificare che il codice che avevo non stava guardando i file come mi aspettavo. –