2012-02-08 61 views
3

我使用gettext本地化这样Gettext的不能得到的setlocale()工作

$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. 

我能看到的本地化工作,因为该网站可以看到翻译在斯洛伐克。然而,没有什么mather $ lang变量,该网站只翻译斯洛伐克或根本不翻译。

斯洛伐克语意思是我在'sk'文件夹中的任何.po和.mo文件。我曾尝试在“sk”文件夹中放入不同的语言,它的工作原理和我得到不同的翻译。但我不能让它采取不同的文件夹,如'EN'或'CS'。所有其他文件夹都被忽略。我究竟做错了什么?

P.S. setlocale()返回false,我不知道为什么,但这可能导致麻烦。

+1

你看看的http://www.php.net/manual/en/book.gettext.php中的评论? – iblue 2012-02-08 14:08:26

+0

好吧,我没有看到一个解决方案,我试着重命名文件夹和$ lang变量en_US,我仍然有'sk'翻译。 – 2012-02-08 14:23:17

+1

如果我必须猜测你的标准语言环境是sk,那就是它的用途,因为语言环境变化从未发生过。你指出你的setlocale调用返回false。你通过了什么? '$ lang'的内容是什么? – Dan 2012-02-08 14:33:56

回答

1

setlocale()如果您的系统不支持该语言环境,将返回false。您可以通过检查locale -a的输出来查看您的系统支持哪些语言环境。您通过lang get var传入的值必须与其中一个语言环境名称匹配。

正如丹说,SK可能是您的标准语言环境这就是为什么使用即使的setlocale返回false ..

0

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

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

所以,我通过使用域而不是选择语言:

$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