PHP的gettext不能改变语言临时

问题描述

在我的项目中,我想向多语言收件人发送通知电子邮件。对于这种情况,已经设置了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);