如何更改从控制器发送的电子邮件中的语言环境 - laravel 5.4
how change locale in email being sent from controller - laravel 5.4
我用这段代码成功发送了电子邮件:
\App::setLocale('pl');
Mail::send('emails.new_'.$itemtype, ['object' => $object, 'email' => $email_recipee], function ($m) use ( $email_recipee, $object, $itemtype) {
$m->to($email_recipee, 'Title')->subject(' Subject of email');
//
});
但是电子邮件被翻译成 en
,应用程序的默认语言。
我的问题
如何 Laravel 发送带有仅为特定电子邮件声明的区域设置的电子邮件(每个收件人设置不同的语言)。
我尝试了什么:
\App::setLocale('pl');
就在 Mail
命令之前
在 __construct()
:
中全局设置我在控制器中的工作中间件
$this->middleware('setLocale'); // sets the locale to the recipee locale
脏 (?) 解决方案
现在我只在电子邮件视图中添加一行:
{{ \App::setLocale($lead->client->lang)}}
有什么更好的方法吗?
谢谢。
您可以使用 Mailable class
Docs
在构造函数中 __construct(User $user)
您可以键入提示用户,并从那里设置语言环境:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;
class Welcome extends Mailable
{
use Queueable, SerializesModels;
protected $user;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(User $lead)
{
\App::setLocale($lead->client->lang);
$this->user = $lead;
$this->subject = trans('welcome_title');
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.welcome')->with('user', $this->user);
}
}
更新:因为Laravel 5.7你可以使用localize mailables:
Mail::to($request->user())->locale('es')->send(
new OrderShipped($order)
);
在Laravel 5.7之前:
您提出的建议应该可行。只需在发送邮件之前更改语言环境。但是,您应该确保重置语言环境:
$temp = \App::getLocale();
\App::setLocale($user->language);
\Mail::to($user)->send(new OrderShipped($order));
\App::setLocale($temp);
由于这有点臃肿,您可以将其简化为
\App\Mail\SendMail::to($user, '\App\Mail\OrderShipped', [$order]);
如果您创建以下 SendMail
class:
<?php
namespace App\Mail;
use App\User;
class SendMail
{
/**
* Send Mail to correct emailadress and set correct language
* @param User $user
* @param String $classname
* @param Array $data
* @return void
*/
public static function to(User $user, String $class, Array $params)
{
$temp = \App::getLocale();
\App::setLocale($user->lang);
$reflection_class = new \ReflectionClass($class);
$mailclass = $reflection_class->newInstanceArgs($params);
\Mail::to($user)->send($mailclass);
\App::setLocale($temp);
}
}
也许了解您也可以在没有 setLocale
的情况下获取您的语言内容也很有用。例如 __('birthday_parole', [], 'pl')
将尝试为您提供波兰语版本,尽管设置为 setLocale
。
对于使用 Laravel 6.* 并查看此 post 的任何人,最近情况似乎发生了变化。
现在,您可以在控制器本身中定义语言环境,只需将 ->locale()
添加到邮件即可。
例如:
Mail::to($request->user())->locale('es')->send(
new OrderShipped($order)
);
更多信息,请参阅official documentation。
编码愉快!
TL;DR: 只需在 Mailable
的对象中设置一个 $locale
字段 class:
class ResetPassword extends Mailable
{
// ...
/**
* Create a new message instance.
*/
public function __construct(User $user, string $token)
{
$this->user = $user;
$this->token = $token;
/*
* Set locale of mail to User's locale
*/
$this->locale = $this->user->locale; // <-- of course adapt this line to YOUR User model :]
}
长话短说:
有一个特质Localizable
。它声明了一个方法 withLocale
,该方法在指定的语言环境中调用给定函数“enveloped”。 “封装”是指:记住当前语言环境、设置新语言环境、调用函数、恢复记忆的语言环境。
可以在 \Illuminate\Mail\Mailable::send
:
中找到用法示例
public function send(MailerContract $mailer)
{
return $this->withLocale($this->locale, function () use ($mailer) {
Container::getInstance()->call([$this, 'build']);
return $mailer->send($this->buildView(), $this->buildViewData(), function ($message) {
$this->buildFrom($message)
->buildRecipients($message)
->buildSubject($message)
->runCallbacks($message)
->buildAttachments($message);
});
});
}
但是,此方法为我们提供了如何更改 邮件 的区域设置的线索 - 第一行中有 $this->locale
。事实上,Mailable
定义了这个字段:
class Mailable implements MailableContract, Renderable
{
// ...
/**
* The locale of the message.
*
* @var string
*/
public $locale;
我用这段代码成功发送了电子邮件:
\App::setLocale('pl');
Mail::send('emails.new_'.$itemtype, ['object' => $object, 'email' => $email_recipee], function ($m) use ( $email_recipee, $object, $itemtype) {
$m->to($email_recipee, 'Title')->subject(' Subject of email');
//
});
但是电子邮件被翻译成 en
,应用程序的默认语言。
我的问题
如何 Laravel 发送带有仅为特定电子邮件声明的区域设置的电子邮件(每个收件人设置不同的语言)。
我尝试了什么:
\App::setLocale('pl');
就在Mail
命令之前在
中全局设置我在控制器中的工作中间件__construct()
:$this->middleware('setLocale'); // sets the locale to the recipee locale
脏 (?) 解决方案
现在我只在电子邮件视图中添加一行:
{{ \App::setLocale($lead->client->lang)}}
有什么更好的方法吗? 谢谢。
您可以使用 Mailable class
Docs
在构造函数中 __construct(User $user)
您可以键入提示用户,并从那里设置语言环境:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\User;
class Welcome extends Mailable
{
use Queueable, SerializesModels;
protected $user;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(User $lead)
{
\App::setLocale($lead->client->lang);
$this->user = $lead;
$this->subject = trans('welcome_title');
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.welcome')->with('user', $this->user);
}
}
更新:因为Laravel 5.7你可以使用localize mailables:
Mail::to($request->user())->locale('es')->send(
new OrderShipped($order)
);
在Laravel 5.7之前:
您提出的建议应该可行。只需在发送邮件之前更改语言环境。但是,您应该确保重置语言环境:
$temp = \App::getLocale();
\App::setLocale($user->language);
\Mail::to($user)->send(new OrderShipped($order));
\App::setLocale($temp);
由于这有点臃肿,您可以将其简化为
\App\Mail\SendMail::to($user, '\App\Mail\OrderShipped', [$order]);
如果您创建以下 SendMail
class:
<?php
namespace App\Mail;
use App\User;
class SendMail
{
/**
* Send Mail to correct emailadress and set correct language
* @param User $user
* @param String $classname
* @param Array $data
* @return void
*/
public static function to(User $user, String $class, Array $params)
{
$temp = \App::getLocale();
\App::setLocale($user->lang);
$reflection_class = new \ReflectionClass($class);
$mailclass = $reflection_class->newInstanceArgs($params);
\Mail::to($user)->send($mailclass);
\App::setLocale($temp);
}
}
也许了解您也可以在没有 setLocale
的情况下获取您的语言内容也很有用。例如 __('birthday_parole', [], 'pl')
将尝试为您提供波兰语版本,尽管设置为 setLocale
。
对于使用 Laravel 6.* 并查看此 post 的任何人,最近情况似乎发生了变化。
现在,您可以在控制器本身中定义语言环境,只需将 ->locale()
添加到邮件即可。
例如:
Mail::to($request->user())->locale('es')->send(
new OrderShipped($order)
);
更多信息,请参阅official documentation。
编码愉快!
TL;DR: 只需在 Mailable
的对象中设置一个 $locale
字段 class:
class ResetPassword extends Mailable
{
// ...
/**
* Create a new message instance.
*/
public function __construct(User $user, string $token)
{
$this->user = $user;
$this->token = $token;
/*
* Set locale of mail to User's locale
*/
$this->locale = $this->user->locale; // <-- of course adapt this line to YOUR User model :]
}
长话短说:
有一个特质Localizable
。它声明了一个方法 withLocale
,该方法在指定的语言环境中调用给定函数“enveloped”。 “封装”是指:记住当前语言环境、设置新语言环境、调用函数、恢复记忆的语言环境。
可以在 \Illuminate\Mail\Mailable::send
:
public function send(MailerContract $mailer)
{
return $this->withLocale($this->locale, function () use ($mailer) {
Container::getInstance()->call([$this, 'build']);
return $mailer->send($this->buildView(), $this->buildViewData(), function ($message) {
$this->buildFrom($message)
->buildRecipients($message)
->buildSubject($message)
->runCallbacks($message)
->buildAttachments($message);
});
});
}
但是,此方法为我们提供了如何更改 邮件 的区域设置的线索 - 第一行中有 $this->locale
。事实上,Mailable
定义了这个字段:
class Mailable implements MailableContract, Renderable
{
// ...
/**
* The locale of the message.
*
* @var string
*/
public $locale;