问题描述
在我的项目中,我想向多语言收件人发送通知电子邮件。对于这种情况,已经设置了gettext并可以在网站上正常工作。每个用户都有一个语言环境属性,其中包含他的语言设置。我的代码如下:
$users = [User,User,User];
foreach($users as $user) {
$userLocale = $user->getLocale(); // e.g. en_US,de_DE
putenv("LC_ALL=".$userLocale);
setlocale(LC_ALL,$userLocale);
$content = _("Hello there");
$user->sendNotificationMail($content);
}
该代码将忽略刚设置的语言,并将字符串始终转换为其默认语言循环中设置的第一种语言。 (在这种情况下为德语)
但是当我对putenv("LC_ALL=en_US");
进行硬编码时,它可以工作。
我在这里想念什么?
编辑:
似乎PHP无法根据需要多次切换语言。 第一次切换成功,但随后的切换似乎失败,或者gettext没有考虑到更改。
我的测试代码:
$payload = "";
putenv("LANG=en_US");
setlocale(LC_ALL,"en_US");
$payload .= _("Add")." - ".getenv("LANG");
putenv("LANG=it_IT");
setlocale(LC_ALL,"it_IT");
$payload .= _("Add")." - ".getenv("LANG");
putenv("LANG=de_DE");
setlocale(LC_ALL,"de_DE");
$payload .= _("Add")." - ".getenv("LANG");
//output: Add - en_USAdd - it_ITAdd - de_DE
//moving de_DE to the top
//output: hinzufügen - de_DEhinzufügen - en_UShinzufügen - it_IT
wtf正在进行吗?
我也尝试删除$payload
的第一个变量设置。然后所有随后的gettext调用将使用设置的第二种语言。
解决方法
尝试将语言代码作为参数发送到sendNotificationMail()中,并在将竞争内容发送给客户端之前在该方法内设置$ userLocale
,似乎您必须每次都设置文本域。
putenv("LANG=".$locale);
setlocale(LC_ALL,$locale);
textdomain($domain);