Как инициализировать статический символ * с помощью gettetxt () с использованием локальной операционной системы? - PullRequest
1 голос
/ 12 июля 2009

Есть ли в C ++ стандартный или распространенный способ обработки статических строк, которые должны быть установлены gettext()?

Вот пример, использующий ответ на Завершите C ++ i18n gettext () «hello world», например, в качестве основы, просто заменив литерал hello world на статические char* hws и char* hw. Похоже, hws инициализируется английским текстом по умолчанию, прежде чем локаль устанавливается из среда локальной операционной системы. В то время как hw устанавливается после изменения языкового стандарта, создается текст на испанском языке.

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

Ответы [ 2 ]

1 голос
/ 12 июля 2009

Вам нужно разделить использование gettext на две части. Во-первых, вы просто помечаете строку макросом, например gettext_noop, чтобы xgettext извлек ее. Затем, когда вы обращаетесь к глобальной переменной, вы оборачиваете доступ истинным вызовом gettext.

См. Особые случаи в руководстве по gettext.

N.B. Ваша переменная hws не является статической переменной (нет «статического ключевого слова»); это глобальная переменная.

0 голосов
/ 12 июля 2009

Это код после применения ответа от Мартина против Лёвиса :

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

Результат имеет желаемый и ожидаемый результат:

hola mundo static
hola mundo
...