为什么locale es_MX工作但不是es?

时间:2009-07-03 14:20:04

标签: c++ linux internationalization gettext

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

1 个答案:

答案 0 :(得分: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可用于简单的消息查找,但它几乎不能提供真正完成国际化应用程序所需的功能。