Komplette C ++ i18n gettext () „Hallo Welt“ -Beispiel
-
05-07-2019 - |
Frage
Ich bin für eine komplette i18n gettext()
Hallo Welt Beispiel. Ich habe begonnen, ein Skript basiert auf Ein Tutorial auf Native Language Support mit GNU gettext von G. Mohanty. Ich verwende Linux und G ++.
Code:
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
Das Programm kompiliert, wird der Text extrahiert, Spanisch-Datei erstellt, geändert und binäre erstellt aber hellogt zeigt noch Englisch. Die Spur zeigt keine Anzeichen von für es_MX im aktuellen Arbeitsverzeichnis suchen noch irgendwelche Hinweise auf LC_MESSAGES Verzeichnis.
Lösung 2
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
Hier ist eine Beschreibung der Dateien durch die oben erstellt:
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
Andere Tipps
Ihr Problem ist, dass hellogt.mo
an der falschen Stelle ist - Ihr Programm ist es nicht wirklich zu öffnen. Sie können dies sagen von strace
mit open
syscalls verfolgen:
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)
Sie können beeinflussen, wo gettext für Nachrichtenkataloge mit dem LOCPATH
Umgebungsvariable aussieht, aber wenn man es zu bewegen, wo gettext versucht, es von Ihrem Beispiel zu laden funktioniert:
mkdir -p es/LC_MESSAGES
cp hellogt.mo es/LC_MESSAGES
./hellogt
hola mundo
Hier ist eine Beschreibung von gettext von Fedora-Projekt. Es ist einfach zu folgen. Aber es ist in C
http://fedoraproject.org/wiki/How_to_do_I18N_through_gettext