人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravel で 動的に locale を変更し、フォームバリデーションを多言語対応する

● Laravel で 動的に locale を変更する

コントローラーのコンストラクタで変更しても、フォームのエラーメッセージには適用されないので、ミドルウェアで locale を設定します

・1. ミドルウェアを作成

php artisan make:middleware Language

app/Http/Middleware/Language.php が自動で 作成されるので以下のように書き換えます。

<?php
namespace App\Http\Middleware;
use Closure;
class Language
{
    public function handle($request, Closure $next)
    {
        $now_url = request()->fullUrl();

        $pattern_zh = '/' . preg_quote( env('BASE_URL_ZH') , '/') . '/';
        $pattern_ja = '/' . preg_quote( env('BASE_URL_JA') , '/') . '/';
        $pattern_en = '/' . preg_quote( env('BASE_URL_EN') , '/') . '/';

        if ( preg_match($pattern_zh, $now_url) ){
            \Illuminate\Support\Facades\App::setLocale( 'zh-TW' );
        }
        elseif ( preg_match($pattern_ja, $now_url) ){
            \Illuminate\Support\Facades\App::setLocale( 'ja' );
        }
        elseif ( preg_match($pattern_en, $now_url) ){
            \Illuminate\Support\Facades\App::setLocale( 'en' );
        }
        return $next($request);
    }
}

・2. ミドルウェアを app/Http/Kernel.php に登録

app/Http/Kernel.php

$middlewareGroups のリストに追加します。
これでWEBアクセスの時には必ず読み込まれます。

    protected $middlewareGroups = [
        'web' => [
            ......
            ......
            \App\Http\Middleware\Language::class,   // ● この行を追加
        ],

・3. 多言語を設定する方法を決める

いろいろやり方はあるかと思いますが今回は .env ファイルに 他言語のサイトのベース URL を設定して、 その「ベースURLにマッチする言語を現在の言語」と判別させてみます

.env

BASE_URL_JA=https://ja.YOUR-SITE.TLD
BASE_URL_ZH=https://zh.YOUR-SITE.TLD
BASE_URL_EN=https://en.YOUR-SITE.TLD

これでURLが「https://zh.YOUR-SITE.TLD」の場合は自動的にロケール「zh-TW」がセットされるようになりました。

・4. 多言語リソースを入手する

https://github.com/caouecs/Laravel-lang

ここから太陽市大言語のリソースファイルを入手して resources/lang に コピーすれば多言語対応は完了です。

引用 : http://bit.ly/2I0bWiA

No.1525
06/07 09:55

edit