2

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”不起作用。

4

1 回答 1

3

嗯...这听起来像一个平台问题。我在 Mac OSX 下做了完全相同的事情并得到了预期的结果。我怀疑你的 linux 版本不喜欢LANG=es.utf8. 检查您的本地系统文档,例如setlocale(3),或者xlocale(3)是否支持后者。

IIRC,仅包含作为 ISO-639 语言代码的主要标识符的区域设置标识符附加了主要语言国家的 ISO-3166 国家代码。然后通过查找来执行生成的语言环境查找/usr/share/locale。我查看了 MacBook 上的语言环境目录,其中有一个es名为es_ES. 这可能是一个简单的系统配置问题。

如果您正在开发商业应用程序,我强烈建议您使用ICU而不是 gettext 和标准库提供的语言环境。Gettext 将适用于简单的消息查找,但它几乎不能提供您真正执行完全国际化应用程序所需的内容。

于 2009-07-03T14:55:06.743 回答