gettext()仅翻译en_US

时间:2019-05-24 09:21:10

标签: php windows xampp gettext

我刚刚开始使用gettext(),但遇到了一个奇怪的问题。我有以下代码:

// $language = ["en_US", "en_US.UTF-8", "en-US", "en-US.UTF-8"];
// $language = ["tr_TR", "tr-TR", "tr", "tr_TR.UTF-8", "tr-TR.UTF-8", "tr.UTF-8"];
$language = ["nl_NL", "nl_NL.UTF-8", "nl-NL", "nl-NL.UTF-8"];

putenv("LANG=" . $language[0]);
$locale = setlocale(LC_ALL, $language);

$domain = "messages";
bindtextdomain($domain, "locales"); 
bind_textdomain_codeset($domain, "UTF-8");
textdomain($domain);

if (!defined("LC_MESSAGES")) {
    echo "<p>LC_MESSAGES is NOT defined.</p>";
}

if (!function_exists("gettext")) {
    echo "<p>gettext() does not exist.</p>";
}

echo "<p>" . $locale . "</p>";
echo "<p>" . _("title") . "</p>";
echo "<p>" . _("content") . "</p>";

这不适用于localhost(XAMPP 7.3.5),或者仅与en_US一起使用(翻译)。我得到的输出是:

LC_MESSAGES is NOT defined.

nl_NL

_TITLE_

_CONTENT_

虽然它应该将en转换为nl,但我得到en -> en。在远程服务器(DirectAdmin)上可以正常工作,并且我没有收到LC_MESSAGES错误:

nl_NL

titel

inhoud

此问题可能特定于XAMPP,我认为这很重要。我应该能够在本地主机上使用/更改语言。如何解决这个问题?我注意到服务器之间的唯一区别是LC_MESSAGES没有在本地主机(XAMPP)上定义。在setlocale()页面上,有一条语句说:

  

LC_MESSAGES用于系统响应(如果PHP是使用libintl编译的,则可用)

这可能是原因吗?我需要重新编译PHP吗?

如果没有解决方法,我可以使用一种解决方法吗?我的意思是,我已经拥有所需的po / mo文件。我知道他们所在的目录。我知道请求的语言环境。我只需要一个解析器即可从文件中获取翻译。

所有文件都可以在this repository上找到。
远程服务器output(将来可能会删除页面/链接)。


更新

我一直在寻找解决此问题的方法,因此我正在检查其他Q / As。在其中之一中,建议我必须安装要使用的语言。因此,我下载/安装了语言(tr,nl)。它没有帮助。它仍然不会翻译。

screenshot of language settings

1 个答案:

答案 0 :(得分:0)

诸如nl_NL之类的语言环境标识符未标准化,因此您的Windows系统可能使用其他名称。尝试输出setlocale(LC_ALL, 0)的返回值,以了解所使用的格式。

您还应该阅读文档:https://www.php.net/manual/en/function.setlocale.php

您会发现:

  

在Windows上,setlocale(LC_ALL,'')从系统的区域/语言设置(可通过“控制面板”访问)中设置区域设置名称。

因此,在对setlocale(LC_ALL, 0)进行测试调用之前,应确保已选择荷兰语。

有关支持的语言环境类别,您可以在文档中找到:

  

LC_MESSAGES用于系统响应(如果PHP是使用libintl编译的,则可用)

因此,常量LC_MESSAGES可能没有为您的PHP版本定义。

但是...我不是PHP程序员,但是您的示例代码看起来不正确。怎么不能定义字符串文字如“ LC_MESSAGES”?请发布原始代码。