尝试使用没有国家/地区代码的 gettext(“es”而不是“es_ES”)


Trying to use gettext without country code ('es' instead 'es_ES')

我的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 编辑的相同文件,只是通过目录>属性>语言(分别为 es 和 es_ES)进行区分

并将此代码转换为本地化.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');

此代码工作正常,"要翻译的字符串"显示正确。但是,如果我尝试使用通用的"es"代码:

$language = "es.UTF-8";

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

我可以强制获取文本使用 es 吗?UTF-8 文件?

作为一种解决方法,您始终可以使用localedef基于现有语言环境编译新的语言环境。要创建基于es_ES.UTF-8 es

 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_MXes_419(419是拉丁美洲的地理区域代码)进行es_US es_AR

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