如何更改从控制器发送的电子邮件中的语言环境 - 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($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;