GNU gettext のウィキペディアのエントリは、ロケールが単なる言語「fr」である例を示しています。一方、i18n gettext() の「hello world」の例には、言語と国の両方を含むロケール値 " es_MX
" があります。es_MX
" " の例を "es" だけを使用するように変更しましたが、予想されるスペイン語ではなく英語のテキストが生成されます。
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 --output-file hellogt_spanish.po --input hellogt.pot
sed --in-place hellogt_spanish.po --expression='/"hello, world!"/,/#: / s/""/"hola mundo"/'
mkdir --parents ./es.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./es.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po
LANG=es.utf8 ./hellogt
Controlling your locale with environment variablesによると:
GNU gettext だけが使用する環境変数 LANGUAGE ... 定義されている場合、LANGUAGE は LC_ALL、LC_MESSAGES、および LANG よりも優先されます。
LANGUAGE=es.utf8 ./hellogt
英語ではなく、予想されるスペイン語のテキストを生成します。
しかし、これは「LANG=es」が機能しない理由を説明していません。