カテゴリ: Laravel 更新日: 2026/07/30

Laravelで多言語対応メールを送る方法!初心者でもわかるMailableとlangファイルの使い方

Laravelで多言語対応メールを送る方法(langファイル + Mailable)
Laravelで多言語対応メールを送る方法(langファイル + Mailable)

先生と生徒の会話形式で理解しよう

生徒

「Laravelを使って、日本語の人には日本語のメールを、英語の人には英語のメールを自動で送り分けることはできますか?」

先生

「はい、もちろんです。Laravelには多言語対応(ローカライゼーション)という機能があり、langファイルとMailableという仕組みを組み合わせることで簡単に実現できますよ。」

生徒

「プログラミングが初めてなので難しそうですが、私にも設定できますか?」

先生

「大丈夫です。まずは基本となる言葉の辞書作りから、一歩ずつ進めていきましょう!」

1. 多言語対応メールの仕組みとは?

1. 多言語対応メールの仕組みとは?
1. 多言語対応メールの仕組みとは?

Laravel(ララベル)でメールを多言語化するというのは、送り先の相手に合わせてメッセージの内容を自動で切り替える仕組みのことです。これを実現するために、主に2つの道具を使います。1つは言葉の翻訳データをまとめたlangファイル(ラングファイル)、もう1つはメールの送信処理を担当するMailable(メイラブル)クラスです。

例えば、システムが「こんにちは」という言葉をメールで送りたいとき、相手が英語設定なら「Hello」、日本語設定なら「こんにちは」と書かれた辞書を引くようなイメージです。プログラミング未経験の方でも、この「辞書を作って、それを呼び出す」という流れを理解すれば、世界中の人に向けたサービスを作ることができるようになります。

具体的には、まずプロジェクト内に言語ごとのフォルダを作り、そこにキー(単語のID)とバリュー(実際の文章)を書き込んでいきます。これが多言語対応の第一歩です。

2. langファイルで翻訳テキストを作成する

2. langファイルで翻訳テキストを作成する
2. langファイルで翻訳テキストを作成する

まずは、メールに記載する文章を「言語設定ファイル」に保存しましょう。Laravelでは lang というフォルダの中に言語別の設定を保存します。初期状態ではフォルダがない場合もありますが、その際はコマンドを使って作成します。日本語なら ja フォルダ、英語なら en フォルダを用意します。

それぞれのフォルダの中に mail.php という名前でファイルを作り、以下のような形式で文章を登録します。これが先ほど説明した「辞書」の役割を果たします。


// lang/ja/mail.php の中身
return [
    'welcome_subject' => '会員登録ありがとうございます',
    'welcome_message' => 'サービスへようこそ!あなたの登録が完了しました。',
];

このように、左側に「welcome_subject」という名前をつけ、右側に実際の文章を書きます。英語用のファイル(lang/en/mail.php)には、同じ名前で英語の文章を書くことで、システムが自動的に適切な方を選んでくれるようになります。

3. Mailableクラスを作成して送信準備

3. Mailableクラスを作成して送信準備
3. Mailableクラスを作成して送信準備

次に、メールを送るための専用の部品である Mailable(メイラブル) を作成します。Laravelでは、メール一通一通を一つの「クラス」という単位で管理します。クラスとは、特定の機能を持った「型紙」のようなものだと考えてください。

パソコンのターミナル(黒い画面)で以下の命令を実行すると、新しいメール用のファイルが作成されます。


php artisan make:mail WelcomeMail

このコマンドを実行すると、app/Mail/WelcomeMail.php というファイルが出来上がります。このファイルの中に、どのテンプレートを使うか、件名はどうするかといった設定を書いていきます。ここで先ほどのlangファイルを呼び出す設定を行うのがポイントです。

4. メールテンプレートで翻訳を表示する

4. メールテンプレートで翻訳を表示する
4. メールテンプレートで翻訳を表示する

メールの本文は、HTMLという形式で作成します。Laravelでは Blade(ブレイド) というテンプレートエンジンを使います。テンプレートとは、中身を入れ替えることができる「ひな形」のことです。ここでは、直接文字を書かずに __() という特殊な記法を使います。

この __() は「ヘルパ関数」と呼ばれ、指定したキーに対応する翻訳文章を辞書から探してきて表示してくれる便利な機能です。


<!-- resources/views/emails/welcome.blade.php -->
<div class="container">
    <h1>{{ __('mail.welcome_subject') }}</h1>
    <p>{{ __('mail.welcome_message') }}</p>
</div>

mail.welcome_subject と書くことで、「mail.phpというファイルのwelcome_subjectという項目を表示してね」という命令になります。これにより、システムの言語設定が日本語なら日本語が、英語なら英語が表示されるようになります。これをローカライゼーションと呼びます。

5. 言語を切り替えてメールを送信する

5. 言語を切り替えてメールを送信する
5. 言語を切り替えてメールを送信する

最後に、実際にメールを送信する処理を書きます。特定のユーザーに対して、その人が希望する言語でメールを送るには、送信直前に App::setLocale() という命令を使ってシステムの一時的な言語設定を変更します。あるいは、Laravelの便利な機能である locale() メソッドを使います。

以下のコードは、特定の宛先に英語を指定してメールを送る例です。プログラミングでは、このように「誰に」「どの言語で」「何を」送るかを順番に指定していきます。


use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

// ユーザーの言語設定に合わせて送信(例:英語で送信)
Mail::to('example@test.com')
    ->locale('en')
    ->send(new WelcomeMail());

locale('en') と書くことで、そのメール送信の間だけ一時的に英語モードになります。これにより、先ほどのBladeテンプレート内の __() が自動的に英語の辞書を参照し、英語のメールが届くようになります。送信が終われば自動的に元の設定に戻るので安心してください。

6. 複雑な文章に対応する変数埋め込み

6. 複雑な文章に対応する変数埋め込み
6. 複雑な文章に対応する変数埋め込み

メールを送る際、「こんにちは、〇〇さん」のように、相手の名前を入れたい場合もあります。これも多言語対応を維持したまま実現可能です。langファイル側で、変数をいれる場所に :name のように印をつけておきます。

これを プレースホルダー と呼びます。入れ物を用意しておいて、後から中身を流し込む仕組みです。まずは辞書ファイルを修正しましょう。


// lang/ja/mail.php の修正例
return [
    'greet' => 'こんにちは、:name さん!',
];

次に、Bladeテンプレート側で名前を渡すように記述します。__() 関数の第二引数に、どの名前にどの値を入れるかを指定します。これで、言語を切り替えつつ、個別の名前を表示するパーソナライズされたメールが完成します。


<!-- テンプレートでの表示方法 -->
<p>{{ __('mail.greet', ['name' => '太郎']) }}</p>

実行結果は以下のようになります。


こんにちは、太郎 さん!

7. フォルダ構成と設定の注意点

7. フォルダ構成と設定の注意点
7. フォルダ構成と設定の注意点

多言語対応を正しく動かすためには、ファイルの置き場所(ディレクトリ構造)が非常に重要です。パソコンでファイルを整理するフォルダ分けを間違えると、システムが辞書を見つけられず、エラーになったりキー名がそのまま表示されたりしてしまいます。

基本的な構造は以下の通りです。

  • lang/ : すべての言語ファイルの親フォルダ
  • lang/ja/ : 日本語のファイルをいれるフォルダ
  • lang/en/ : 英語のファイルをいれるフォルダ

また、Laravelの全体設定ファイルである config/app.php には、標準の言語設定(locale)と、翻訳が見つからなかった時の予備設定(fallback_locale)があります。初めての方は、ここを 'ja' に設定しておくことで、基本の表示を日本語に固定することができます。これにより、万が一翻訳を忘れても日本語が表示されるようになり、利用者にとって親切な設計になります。

8. 多言語メールが届かない時のチェックポイント

8. 多言語メールが届かない時のチェックポイント
8. 多言語メールが届かない時のチェックポイント

もしメールが正しく多言語化されない、あるいは届かない場合は、いくつか確認すべき点があります。まず一つ目は、キャッシュです。Laravelは動作を速くするために、設定を一時的に記憶(キャッシュ)することがあります。設定を変更した後は、コマンドでキャッシュをクリアすると解決することが多いです。

二つ目は、ファイル名の綴り(スペル)です。mail.phpemails.blade.php のように、名前が一文字でも違うとシステムは認識してくれません。三つ目は、全角と半角のミスです。プログラミングでは、記号や空白はすべて半角で書く必要があります。特に、日本語入力のまま「:」や「’」を打ってしまうとエラーの原因になります。

これらの基本を一つずつ確認していけば、必ず多言語対応メールをマスターできます。最初は難しく感じるかもしれませんが、一度仕組みを作ってしまえば、フランス語や中国語など、新しい言語を追加するのも辞書ファイルを増やすだけで済むようになります。これがプログラムの素晴らしいところです。

まとめ

まとめ
まとめ

Laravel(ララベル)を使用した多言語対応メール送信の仕組みについて、これまでの内容を詳しく振り返りましょう。Webアプリケーションがグローバル化する中で、ユーザーの言語設定に合わせて最適なメッセージを届けることは、ユーザーエクスペリエンス(UX)を向上させるために非常に重要な要素です。Laravelでは、強力なローカライゼーション機能が標準で備わっており、エンジニアは複雑な条件分岐を記述することなく、スマートに多言語化を実現できます。

多言語メール構築の重要ポイント

多言語メールの実装において核心となるのは、文章をプログラム内に直接書き込まない「外部化」という考え方です。langディレクトリ配下に言語別のPHPファイルを配置し、キーと値のペアで管理することで、ソースコードの可読性が飛躍的に高まります。また、将来的に対応言語を増やす際も、既存のロジックを変更することなく、新しい言語ディレクトリとファイルを追加するだけで対応が可能になります。

実践的なMailableクラスの構成例

実際の開発現場では、コントローラーからデータを引き継ぎ、Mailableクラス内でそれらを処理する形が一般的です。以下に、ユーザー名と言語設定を動的に受け取って送信する実践的なコード例を紹介します。


namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderConfirmationMail extends Mailable
{
    use Queueable, SerializesModels;

    public $userName;

    /**
     * 新しいインスタンスの生成
     */
    public function __construct($userName)
    {
        $this->userName = $userName;
    }

    /**
     * メールの構築
     */
    public function build()
    {
        return $this->subject(__('mail.order_subject'))
                    ->view('emails.order_confirmation');
    }
}

上記のコードでは、コンストラクタ __construct でユーザー名を受け取り、build メソッド内で subject() 関数を使って件名を動的に翻訳しています。__('mail.order_subject') と記述することで、送信時に設定されているロケールに基づいた件名が自動的に選択されます。

コントローラーでの送信処理

次に、このMailableクラスを呼び出し、特定の言語を指定して送信するコントローラー側の実装を確認しましょう。


use App\Mail\OrderConfirmationMail;
use Illuminate\Support\Facades\Mail;
use App\Models\User;

public function sendOrderMail(Request $request)
{
    $user = User::find($request->user_id);
    // ユーザーが選んだ言語('ja'や'en')を取得
    $userLocale = $user->preferred_locale; 

    Mail::to($user->email)
        ->locale($userLocale)
        ->send(new OrderConfirmationMail($user->name));

    return response()->json(['message' => 'Mail sent successfully!']);
}

このように、Mail::to()->locale()->send() のチェーンメソッドを利用することで、非常に直感的に言語を切り替えることができます。データベースにユーザーごとの希望言語を保存しておけば、完全にパーソナライズされたメール配信システムが構築可能です。

Bladeテンプレートでの変数展開

最後に、Bladeテンプレート内での表示方法をおさらいします。翻訳ファイルに定義されたプレースホルダーへ、変数を流し込む記述は以下の通りです。


<!-- resources/views/emails/order_confirmation.blade.php -->
<div style="font-family: sans-serif; line-height: 1.6;">
    <h2>{{ __('mail.order_thanks', ['name' => $userName]) }}</h2>
    <p>{{ __('mail.order_details_path') }}</p>
    <a href="{{ url('/orders') }}" class="btn btn-primary">
        {{ __('mail.view_order_button') }}
    </a>
</div>

もし、lang/ja/mail.php'order_thanks' => ':name 様、ご注文ありがとうございます!' と定義されていれば、実行結果は次のようになります。


太郎 様、ご注文ありがとうございます!

運用のコツとデバッグ方法

多言語対応を進める中での注意点として、翻訳キーの命名規則を統一することが挙げられます。例えばメール関連なら mail.xxx、ボタンなら button.xxx といった接頭辞をつけることで、ファイルが肥大化しても目的の文章をすぐに見つけ出すことができます。また、開発環境では Mailtrap などのツールを使って、実際に異なる言語のメールが正しく生成されているか、文字化けが発生していないかを念入りにテストすることをお勧めします。

LaravelのMailableとローカライゼーションを組み合わせれば、世界中のユーザーに寄り添ったアプリケーション開発がぐっと身近になります。ぜひ今回の手順を参考に、多言語メール送信機能の実装にチャレンジしてみてください。

先生と生徒の振り返り会話

生徒

「先生、まとめまで読んで多言語メールの仕組みがかなり具体的になってきました!特に locale() メソッドを使うだけで、その時だけ言語が変わるっていうのが便利ですね。」

先生

「その通りです!以前のバージョンよりもずっと簡単に書けるようになっているんですよ。これなら、特定のユーザーには英語、別のユーザーには日本語といった使い分けもスムーズに実装できるでしょう?」

生徒

「はい!でも、もし翻訳ファイルにキーを登録し忘れたらどうなるんですか?例えば mail.welcome と書いたのに、ファイル側にその設定がなかった場合です。」

先生

「鋭い質問ですね。もし翻訳が見つからない場合は、指定したキー文字列(この場合は mail.welcome)がそのまま表示されてしまいます。だから、開発が終わる前に一度、全言語のファイルが正しく埋まっているか確認するのが大切ですよ。」

生徒

「なるほど、キーがそのまま出ちゃうのは格好悪いですね。気をつけます!あと、テンプレートの中で {{ $userName }}{{ __('mail.greet', ['name' => $userName]) }} を使い分ける理由もよくわかりました。」

先生

「素晴らしい理解です。前者はただの変数表示ですが、後者は『翻訳された文章の中の適切な場所に名前をはめ込む』という処理をしています。言語によって名前が最初に来るか最後に来るかといった語順の違いにも対応できるのが強みですね。」

生徒

「言語ごとの語順までカバーできるなんて、Laravelって本当に賢いですね!さっそく自分のプロジェクトでも lang フォルダを作って、世界対応のメール送信機能を試してみようと思います!」

先生

「その意気です!エラーが出たときは、キャッシュのクリアコマンド php artisan config:clear を試すのを忘れないでくださいね。頑張りましょう!」

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelのルートとコントローラを対応付ける方法(名前付きルート)を初心者向けに解説
New2
Symfony
Symfonyで画像やファイルをアップロードする時のバリデーション完全ガイド!初心者でもわかる入力チェックの基本
New3
Laravel
Laravelで言語切替UIを作る!多言語対応(ローカリゼーション)実践ガイド
New4
CodeIgniter
CodeIgniterでローカル開発環境を構築する方法!初心者向け完全ガイド
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのキャッシュ管理を完全ガイド!初心者でもわかるメリットと注意点
No.2
Java&Spring記事人気No2
Symfony
Symfony学習に役立つおすすめドキュメント・教材・リソース一覧【初心者向け】
No.3
Java&Spring記事人気No3
Laravel
Laravelのプロジェクト構造を理解しよう!初心者向けディレクトリ解説
No.4
Java&Spring記事人気No4
CodeIgniter
CodeIgniterとは?特徴・できること・他PHPフレームワークとの違いを完全解説
No.5
Java&Spring記事人気No5
Laravel
Laravelローカリゼーション入門!言語の取得と切り替え(App::getLocale / setLocale)を徹底解説
No.6
Java&Spring記事人気No6
CodeIgniter
CodeIgniterのビュー共通化ガイド!初心者でもわかる部分ビューの読み込みとinclude設計
No.7
Java&Spring記事人気No7
Laravel
Laravelの条件分岐とループ処理をBladeで書く方法
No.8
Java&Spring記事人気No8
Laravel
Laravelのルーティングの基本構文と書き方をやさしく解説!初心者でも理解できるWebルートの仕組み