Gettext无法使setlocale()工作

时间:2012-02-08 14:04:43

标签: 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!") etc.

我可以看到本地化工作,因为该网站可以在斯洛伐克语中看到翻译。但是,$ lang变量中没有其他内容,该网站仅在斯洛伐克语中翻译或根本不翻译。

斯洛伐克意味着我在'sk'文件夹中的.po和.mo文件。我尝试将不同的语言放在'sk'文件夹中,它可以工作,我得到不同的翻译。但我不能让它采取不同的文件夹,如'en'或'cs'。忽略所有其他文件夹。我做错了什么?

P.S。 setlocale()返回false,我无法弄清楚为什么,但这可能会造成麻烦。

2 个答案:

答案 0 :(得分:1)

如果您的系统不支持该语言环境,

setlocale()将返回false。您可以通过检查locale -a的输出来查看系统支持的区域设置。通过lang get var传入的值必须与其中一个区域设置名称匹配。

正如Dan所说,sk可能是你的标准语言环境,即使setlocale返回false也会使用它。

答案 1 :(得分:0)

嗯,还有另一个讨厌的黑客:

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

所以,我正在使用域名来选择语言:

$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