GNU gettext 的 Wikipedia 条目显示了一个示例,其中语言环境只是语言“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:
环境变量 LANGUAGE,仅由 GNU gettext 使用...如果定义,LANGUAGE 优先于 LC_ALL、LC_MESSAGES 和 LANG。
LANGUAGE=es.utf8 ./hellogt
生成预期的西班牙语文本而不是英语。
但这并不能解释为什么“LANG=es”不起作用。