PHP gettext 暂时无法更改语言
PHP gettext cant change language temporary
在我的项目中,我想向多语言收件人发送通知电子邮件。对于这种情况,gettext 已经设置好并且可以很好地用于网站。每个用户都有一个 locale 属性,包含他的语言设置。我的代码如下所示:
$users = [User, 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);
在我的项目中,我想向多语言收件人发送通知电子邮件。对于这种情况,gettext 已经设置好并且可以很好地用于网站。每个用户都有一个 locale 属性,包含他的语言设置。我的代码如下所示:
$users = [User, 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);