我刚刚开始使用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)。它没有帮助。它仍然不会翻译。
答案 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”?请发布原始代码。