Come inizializzare un char * statico con gettetxt () utilizzando ambiente di sistema operativo locale?

StackOverflow https://stackoverflow.com/questions/1114792

Domanda

C'è un modo standard o comune in C ++ per gestire stringhe statiche che devono essere impostato dal gettext()?

Ecco un esempio utilizzando la risposta a completa C ++ i18n gettext () “ciao mondo” esempio come base solo cambiando il hello world letterale ad un char* hws statica e char* hw. Sembra che hws è sempre inizializzato al testo inglese di default prima che il locale è impostato dal ambiente di sistema operativo locale. Mentre hw è sempre impostato dopo il locale viene modificata in tal modo la produzione del testo in spagnolo.

cat >hellostaticgt.cxx <<EOF
// hellostaticgt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
char* hws = gettext("hello, world static!");
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("hellostaticgt", ".");
    textdomain( "hellostaticgt");
    char* hw = gettext("hello, world!");
    std::cout << hws << std::endl;
    std::cout << hw << std::endl;
}
EOF
g++ -o hellostaticgt hellostaticgt.cxx
xgettext --package-name hellostaticgt --package-version 1.0 --default-domain hellostaticgt --output hellostaticgt.pot hellostaticgt.cxx
msginit --no-translator --locale es_MX --output-file hellostaticgt_spanish.po --input hellostaticgt.pot
sed --in-place hellostaticgt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/'
mkdir --parents ./es_MX.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellostaticgt.mo hellostaticgt_spanish.po
LANGUAGE=es_MX.utf8 ./hellostaticgt
È stato utile?

Soluzione

È necessario dividere gettext utilizzo in due parti. In primo luogo, basta marcare la stringa con una macro, come ad esempio gettext_noop, in modo che si xgettext estrarlo. Poi, quando si fa riferimento alla variabile globale, si avvolge l'accesso con la vera chiamata gettext.

Casi particolari nel manuale di gettext .

NB. Il tuo HWS variabile non è una variabile statica (non "parola chiave statica"); si tratta di una variabile globale.

Altri suggerimenti

Questo è il codice dopo l'applicazione del risposta da Martin v Löwis :.

cat >hellostaticgt.cxx <<EOF
// hellostaticgt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
#define gettext_noop(S) S
const char* hws_eng = gettext_noop("hello, world static!");
int main (){
    setlocale(LC_ALL, "");
    bindtextdomain("hellostaticgt", ".");
    textdomain( "hellostaticgt");
    char* hw = gettext("hello, world!");
    std::cout << gettext(hws_eng) << std::endl;
    std::cout << hw << std::endl;
}
EOF
g++ -o hellostaticgt hellostaticgt.cxx
xgettext --package-name hellostaticgt --package-version 1.0 --default-domain hellostaticgt --output hellostaticgt.pot hellostaticgt.cxx
msginit --no-translator --locale es_MX --output-file hellostaticgt_spanish.po --input hellostaticgt.pot
sed --in-place hellostaticgt_spanish.po --expression='/"hello, world static!"/,/#: / s/""/"hola mundo static"/'
sed --in-place hellostaticgt_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/hellostaticgt.mo hellostaticgt_spanish.po
LANGUAGE=es_MX.utf8 ./hellostaticgt

Il risultato ha l'output desiderato e atteso:

hola mundo static
hola mundo
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top