Php Gettext可以';无法使setlocale()正常工作

Php Gettext可以';无法使setlocale()正常工作,php,localization,gettext,Php,Localization,Gettext,我像这样使用gettext本地化 $lang = $_GET['lang']; echo $lang; putenv("LANG=$lang"); setlocale(LC_ALL, $lang); bindtextdomain("messages", realpath("../locale")); bind_textdomain_codeset("messages", "utf-8"); textdomain("messages"); ... echo _("Welcome!"

我像这样使用gettext本地化

$lang = $_GET['lang'];
echo $lang;
putenv("LANG=$lang"); 
setlocale(LC_ALL, $lang); 
bindtextdomain("messages", realpath("../locale")); 
bind_textdomain_codeset("messages", "utf-8"); 
textdomain("messages"); 

... 

echo _("Welcome!") etc.
我可以看到本地化的工作,因为该网站可以看到翻译成斯洛伐克语。但是,不知道$lang变量中包含什么,该站点只翻译成斯洛伐克语,或者根本不翻译

斯洛伐克语的意思是“sk”文件夹中的.po和.mo文件。我试着把不同的语言放在“sk”文件夹中,效果很好,我得到了不同的翻译。但我无法使用不同的文件夹,如“en”或“cs”。将忽略所有其他文件夹。我做错了什么

p.S.setlocale()返回false,我不知道为什么,但这可能是造成问题的原因。

setlocale()
如果您的系统不支持该区域设置,则将返回false。通过检查
locale-a
的输出,可以看到系统支持哪些语言环境。通过lang get变量传入的值必须与这些语言环境名称之一匹配


正如Dan所说,sk可能是您的标准语言环境,这就是为什么即使setlocale返回false也会使用它的原因。

好吧,还有另一个讨厌的攻击:

在我的系统上只安装了en_DK.utf-8,我无法安装任何其他LAGS

因此,我通过使用域来选择语言:

$lang = "en";
putenv("LANG=en_DK.utf8"); 
setlocale(LC_ALL, "en_DK.utf8");
bindtextdomain($lang, realpath("./locale")); 
bind_textdomain_codeset($lang, "utf-8"); 
textdomain($lang);
.mo文件的文件位置如下所示:

./locale/en_DK.utf-8/LC_MESSAGES/en.mo

你看了中的注释了吗?我看了,但没有看到解决方案,我尝试将文件夹和$lang变量重命名为en_US,我仍然得到了“sk”翻译。如果我不得不猜测你的标准语言环境是sk,这就是它使用的,因为语言环境从未发生变化。指出setlocale调用返回false。你在传递什么?
$lang
的内容是什么?我试过“cs”、“en”、“en_-US”、“en_-US.utf8”。所有具有此类名称的文件夹都存在。