试图使用没有国家代码的gettext('es'而不是'es_ES')

时间:2013-10-17 12:40:46

标签: php internationalization gettext php-gettext

我的php项目中有下一个文件:

libraries/locale/es_ES/LC_MESSAGES/messages.po
libraries/locale/es_ES/LC_MESSAGES/messages.mo
libraries/locale/es/LC_MESSAGES/messages.po
libraries/locale/es/LC_MESSAGES/messages.mo

两者都是使用PoEdit编辑的相同文件,区别在于Catalog-> Properties->语言(分别为es和es_ES)

将此代码转换为localization.php文件

$language = "es_ES.UTF-8";
putenv("LANG=$language");
setlocale(LC_ALL, $language);
bindtextdomain(STRING_DOMAIN, LOCALE_PATH);
textdomain(STRING_DOMAIN);

echo "Test translation: "._('string to translate');

此代码工作正常,正确显示'string to translate'。但是,如果我尝试使用通用的'es'代码:

$language = "es.UTF-8";

...字符串未翻译。似乎与我的ubuntu中安装的语言环境有关(es_ES.utf8存在但不是es.utf8)

我可以强制gettext使用es.UTF-8文件吗?

1 个答案:

答案 0 :(得分:2)

作为一种变通方法,您始终可以使用localedef根据现有区域设置编译新区域设置。要根据es创建es_ES.UTF-8

 localedef -i es_ES -f UTF-8 es.UTF8

但是这里有一些重要的问题,涵盖了简单加载翻译文件之外的区域。由于您的特定于语言环境的信息(如日期和时间格式,度量等)取决于已安装的区域设置,因此最好制定有关区域设置使用的计划。假设您使用es_ES表示西班牙语(西班牙),那么es是什么?它是用于特定的西班牙风味,如es_IC(加那利群岛)还是一些拉丁美洲风味?

这是一个澄清的例子;如果我想设计一个定制的语言环境,以涵盖各种西班牙语,我会这样做;首先,我添加了可以使用locale-gen轻松安装的语言环境:

  locale-gen es_ES.UTF-8 es_MX.UTF-8 es_AR.UTF-8

然后我希望es_US基于es_MXes_419(419是拉丁美洲的地理区域代码)基于es_AR

  localedef -i es_MX -f UTF-8 es_US.UTF-8
  localedef -i es_AR -f UTF-8 es_419.UTF-8