GNU gettext 的维基百科条目显示了一个示例,其中语言环境只是语言“fr”。而 SO 中的“i18n gettext() “hello world”示例”具有语言和国家/地区的区域设置值“ es_MX”。
我已经修改了“ es_MX”示例以仅使用语言“es”。这包括制作“es”而不是“'es_MX'”消息目录,并在环境变量 LANG 设置为“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++ -ohellogt hellogt.cxx
xgettext -d hellogt -o hellogt.pot hellogt.cxx
msginit --no-translator -l es -o hellogt_spanish.po -i hellogt.pot
sed --in-place hellogt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/'
sed --in-place hellogt_spanish.po --expression='s/PACKAGE VERSION/hellogt 1.0/'
mkdir -p ./es.utf8/LC_MESSAGES
msgfmt -c -v -o ./es.utf8/LC_MESSAGES/hellogt.mo hellogt_spanish.po
LANG=es.utf8 ./hellogt
Run Code Online (Sandbox Code Playgroud)
环境变量 LANGUAGE,仅由 GNU gettext 使用...如果定义,LANGUAGE 优先于 LC_ALL、LC_MESSAGES 和 LANG。
LANGUAGE=es.utf8 ./hellogt
Run Code Online (Sandbox Code Playgroud)
产生预期的西班牙语文本而不是英语。
但这并不能解释为什么“LANG=es”不起作用。
您使用的区域设置必须在系统中生成。用于locale -a查看所有生成的区域设置。语言环境源文件必须存在于 下
/usr/share/i18n/locales/,并且据我所知,所有文件的类型均为“language_COUNTRY”。如果确实必须使用“es”语言环境,则可以准备必要的文件,可以修改/etc/locale.gen为包含“es”并运行 locale-gen 来生成它。否则,请使用带有国家/地区的“es”区域设置。
从Zac Thompson到GNU gettext 实用程序第 2.3节通过环境变量设置语言环境的链接中的LANGUAGE 变量小节:
\n\n\n\n\n在 LANGUAGE 环境变量中,但不在其他环境变量中,\xe2\x80\x98ll_CC\xe2\x80\x99 组合可以缩写为 \xe2\x80\x98ll\xe2\x80\x99 来表示语言的主要方言。例如,\xe2\x80\x98de\xe2\x80\x99 相当于 \xe2\x80\x98de_DE\xe2\x80\x99(德国所说的德语),而 \xe2\x80\x98pt\xe2\x80\在这种情况下,x99 到 \xe2\x80\x98pt_PT\xe2\x80\x99 (葡萄牙语)。
\n
指出“es”是仅LANGUAGE但不LANG支持的缩写。