Wikipedia entry for GNU gettext显示了一个示例,其中语言环境只是语言“fr”。鉴于i18n gettext() “hello world” example具有语言和国家/地区的区域设置值,“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”不起作用。
答案 0 :(得分:3)
LANG=es.utf8
。如果后者甚至受支持,请查看setlocale(3)
或xlocale(3)
等内容的本地系统文档。
/usr/share/locale
来执行生成的区域设置查找。我查看了MacBook上的语言环境目录,并且有一个名为es
的目录以及es_ES
。这可能是一个简单的系统配置问题。
如果您正在开发商业应用程序,我强烈建议使用ICU而不是gettext和标准库提供的区域设置。 Gettext可用于简单的消息查找,但它几乎不能提供真正完成国际化应用程序所需的功能。