Laravelで作成したサイトに言語切替を実装して多言語対応にしてみよう

 

Laravelでビューの表示をする際に言語ごとにファイルを作成するのは面倒ですよね。

Laravelの多言語機能を使えば簡単に実装できるのでそのやり方を紹介します。

現在多言語対応する予定がなくても言語ファイルを増やし、設定をいじるだけで対応できるので、やっておいて損はないですね。

 

ロケール設定

 

まずは、config/app.phpのロケールの設定を確認してみましょう。

初期設定では英語(en)になっているかと思うので、デフォルト設定を日本語(ja)に変更しておきましょう。

// デフォルト設定
'locale' => 'ja', // 'en'から変更

// デフォルト設定が適用できないときの代わりの設定
'fallback_locale' => 'en', 

 

これで、多言語対応した文字列があれば、日本語が使用されるようになりました。

 

言語ファイルを作成

 

言語によって出し分けたい文字列がある場合にはresources/lang/〇〇/配下にphpファイルを作成します。

例えば日本語ファイルを作成する場合にはresources/lang/ja配下にファイルを作成します。

 

resources/lang/ja/messages.phpを作成して以下のようにしてみましょう。

return [
    'welcome' => 'ようこそ',
    'welcome_user' => 'ようこそ :name さん',
];

 

同じようにresources/lang/en/messages.phpを作成して以下のようにします。

return [
    'welcome' => 'Welcome',
    'welcome_user' => 'Welcome :name',
];

 

ここで使われているコロンから始まる部分(:name)については動的に変えられるようにする変数のような役割をします。

 

これで設定は完了です。

 

言語によって表示を変える方法

 

先程設定した文字を表示させてみましょう。最初に設定した通り、日本語がデフォルトになっているので、ja側に設定した文字が出力されるはずです。

 

出力方法は何通りかあります。

// ヘルパーを使用
// messages.phpのwelcomeを読み込み
__('messages.welcome'); 
// messages.phpのwelcome_nameを読み込み,nameに$nameを入れる
__('messages.welcome_user', ['name' => $name]); 

// ファサードを使用
Lang::get('messages.welcome');
Lang::get('messages.welcome_user', ['name' => $name]);

 

また、Bladeテンプレート内では以下のようにします。

{{-- ヘルパーを使用 --}}
{{ __('messages.welcome') }}
{{ __('messages.welcome_user', ['name' => $name]) }}

{{-- @langディレクティブを使用 --}}
@lang('messages.welcome')
@lang('messages.welcome_user', ['name' => $name])

 

公式ドキュメントによると、@langディレクティブは文字列のエスケープがされないそうなので、注意が必要です。

 

以上の出力でファイルに対応する文字列が見つからなかった場合は’messages.welcome’そのものを出力します。

 

URLにロケール設定を含める

 

次に多言語サイトを作成するために、言語設定を変える方法を書いておきます。

 

設定するロケールを変更するにはAppファサードの以下のメソッドを使用します。

use App
App::setLocale('en'); // 言語設定を英語に変更

 

これをルーティングやコントローラに書き込むことで該当ページのみであれば言語設定を変更することができます。

サイト全体を多言語に対応したい場合にはセッションとミドルウェアを使用すればできるので、その方法も紹介しておきます。

 

言語切替のミドルウェア作成

 

サイトを多言語対応するためにミドルウェアとセッションでサイトの言語を制御します。

 

まず最初に、artisanコマンドでミドルウェアを作成します。

$ php artisan make:middleware SetLocale
# Middleware created successfully.

 

するとミドルウェアが作られますので、以下のようにします。

class SetLocale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // 以下を追記
        if(session()->has('locale')) {
            app()->setLocale(session('locale'));
        }
        return $next($request);
    }
}

これでミドルウェアを使ってセッションからロケールを設定できるようになりました。

 

そうしたら、ミドルウェアを登録しておきます。

protected $routeMiddleware = [
    // 略
    'set.locale' => \App\Http\Middleware\SetLocale::class,
];

 

ルーティングに適用

 

ミドルウェアの作成ができましたので、言語対応したいルーティングにミドルウェアを適用します。

Route::group(['middleware'=>'set.locale'], function () {
    // 略
    Route::get('/setlocale/{locale}', function($locale) {
        session()->put('locale', $locale);
        return redirect()->back();
    })->name('locale');
});

 

あとはviewのフッターナビなどで言語リンクを作成して、「/setlocal/ja」などのurlを呼び出せば対応した言語にサイト全体が変わるかと思います。

 

最後に

 

多言語をしてみていかがだったでしょうか。最初は翻訳ファイルを作成するのが、大変かもしれませんが、一度導入してしまえば言語ファイルに追記していくだけなので非常に楽に対応できるかと思います。