我正在寻找一个工作的解决方案,以翻译队列电子邮件在laravel-5。遗憾的是,所有电子邮件都使用默认区域设置(在app.locale
下定义)。
让我们假设,我们有两封电子邮件在流水线中,一封发送给英文en
用户,另一封发送给日语jp
用户。
我应该将哪些数据传递给Mail
facade以转换 (localize) 队列电子邮件
// User model
$user = User:find(1)->first();
Mailer::queue($email, 'Party at Batman\'s cave (Batcave)', 'emails.party-invitation', [
...
'locale' => $user->getLocale(), // value: "jp", but does not work
'lang' => $user->getLocale(), // value: "jp", but does not work
'language' => $user->getLocale(), // value: "jp", but does not work
]);
发布于 2015-12-09 21:34:06
我一直在努力以一种更有效的方式完成这项工作。目前我把它设置成这样。希望这对将来解决这个问题的人有所帮助:
// Fetch the locale of the receiver.
$user = Auth::user();
$locale = $user->locale;
Mail::queue('emails.welcome.template', ['user' => $user, 'locale' => $locale], function($mail) use ($user, $locale) {
$mail->to($user->email);
$mail->subject(
trans(
'mails.subject_welcome',
[], null, $locale
)
);
});
并在您的模板中使用以下内容:
{{ trans('mails.welcome', ['name' => ucfirst($user['first_name'])], null, $locale) }}
注意::不要忘记重新启动队列
发布于 2017-10-17 19:25:16
如果您的电子邮件继承了内置的Illuminate\Mail\Mailable
类,您可以构建自己的Mailable类来处理翻译。
创建您自己的从Illuminate\Mail\SendQueuedMailable
继承的SendQueuedMailable
类。类构造函数将从配置中获取当前的app.location,并将其保存在一个属性中(因为laravel队列将其序列化)。在queue worker中,它将从config中取回属性,并将设置设置为当前环境。
<?php
namespace App\Mail;
use Illuminate\Contracts\Mail\Mailer as MailerContract;
use Illuminate\Contracts\Mail\Mailable as MailableContract;
use Illuminate\Mail\SendQueuedMailable as IlluminateSendQueuedMailable;
class SendQueuedMailable extends IlluminateSendQueuedMailable
{
protected $locale;
public function __construct(MailableContract $mailable)
{
parent::__construct($mailable);
$this->locale = config('app.locale');
}
public function handle(MailerContract $mailer)
{
config(['app.locale' => $this->locale]);
app('translator')->setLocale($this->locale);
parent::handle($mailer);
}
}
然后,创建您自己的从Illuminate\Mail\Mailable
继承的Mail
类
<?php
namespace App\Mail;
use Illuminate\Contracts\Queue\Factory as Queue;
use Illuminate\Mail\Mailable as IlluminateMailable;
class Mailable extends IlluminateMailable
{
public function queue(Queue $queue)
{
$connection = property_exists($this, 'connection') ? $this->connection : null;
$queueName = property_exists($this, 'queue') ? $this->queue : null;
return $queue->connection($connection)->pushOn(
$queueName ?: null, new SendQueuedMailable($this)
);
}
}
而且,瞧,所有从App\Mailable
类继承的排队邮件都将自动处理当前的语言环境。
发布于 2018-06-22 16:33:03
在Laravel 5.6中,语言环境函数添加到Mailable:$infoMail->语言环境(‘jp’);Mail::queue($infoMail);
https://stackoverflow.com/questions/28889148
复制相似问题