[Laravel]国際化について
はじめに
Laravelの国際化についてまとめてみました。
tl;dr
- アプリの言語を設定する
- localeファイルを公開する
- localeファイルを作成する
- ビューから呼び出す
-
${locale}
を使って動的にlocaleを変える - middlewareを作成する
- 言語を切り替える
アプリのデフォルト言語を設定する
app.php
内にある言語に関する設定を変えます。
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
// デフォルトの言語
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
// デフォルトの言語が見つからない時に代わりに使う言語
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
// fakerの言語
'faker_locale' => 'en_US',
Route::get('/', function(){
return redirect('/' . app()->getLocale());
});
ルート /
にアクセスされたときに、アプリの現在のロケールにリダイレクトさせます。
app()->getLocale()
は現在のロケールを取得するメソッドです。
このように変更すると、/
にアクセスされた場合に現在のロケールを含んだ URL にリダイレクトされるようになります。
localeファイルを公開する
php artisan lang:publish
INFO Language files published successfully.
四つのファイルが作成されました。
lang:publish
コマンドは、アプリケーションにlangディレクトリを作成し、Laravelで使用される言語ファイルのデフォルトセットを公開します。
localeファイルを作成する
lang/es
,lang/ja
のように言語ごとにlocaleディレクトリを作成する必要があります。
/lang
/en
messages.php
/ja
messages.php
キーと値のペアを作成します。
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '« Previous',
'next' => 'Next »',
];
<?php
return [
/* メッセージの内容がご自身のアプリに適さない場合には、必要に応じて修正願います */
'previous' => '« 前',
'next' => '次 »',
];
ビューから呼び出します。
<span>@lang('pagination.previous')</span>
<span>{{ __('pagination.previous') }}</span>
<span>{{ trans('pagination.previous') }}</span>
// htmlタグをエスケープする
<span>{!! __('pagination.previous') !!}</span>
${locale}
を使って動的にlocaleを変える
www.apple.com/jp/
や``のように、URLに${locale}
の値を埋め込んで動的に言語を表示させていきます。
<?php
use Illuminate\Support\Facades\App;
Route::get('/{locale}', function (string $locale) {
// サポートされている言語のみ受け入れる
if (! in_array($locale, ['en', 'jp'])) {
abort(400);
}
// アプリケーションのロケールを設定
App::setLocale($locale);
return view('welcome');
});
URL内の{locale}
パラメータに基づいてアプリケーションのロケールを変更するようになります。
続いて、lang/
ディレクトリに言語ごとのファイルを作成します。
return [
'welcome' => 'Welcome!',
];
return [
'welcome' => 'ようこそ!',
];
resources/views/welcome.blade.php
でメッセージを表示します。
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>{{ $welcome }}</h1>
</body>
</html>
/jp
へアクセスし、ようこそ
が表示されていることを確認します。
middlewareを作成する
言語切り替えのために {locale}
をすべての URL に追加すると扱いづらいので Middleware を作成します。
ミドルウェアを使用してプリフィックス(接頭辞)を作成し、特定のルートグループやコントローラーに対してプリフィックスが適用されるようになります。
- ミドルウェアの作成:
php artisan make:middleware Localization
INFO Middleware [app/Http/Middleware/Localization.php] created successfully.
Localization.php
という名前のミドルウェアが app/Http/Middleware
ディレクトリに作成されます。
- ミドルウェアの編集:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;
use Symfony\Component\HttpFoundation\Response;
class Localization
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
app()->setLocale($request->segment(1));
URL::default(['locale' => $request->segment(1)]);
return $next($request);
}
}
app()->setLocale($request->segment(1));
は、リクエストのURLの最初のセグメント({locale}
)を取得し、それをアプリケーションのロケールとして設定しています。
例えば、URLが /en/route
の場合、$request->segment(1)
は en
になります。そして、その言語コードを使用してアプリケーションのロケールを設定します。
URL::default(['locale' => $request->segment(1)]);
は、URL::default
を使用してデフォルトのURLパラメータを設定しています。これにより、アプリケーション内で生成されるURLのデフォルトの locale
パラメータが、ユーザーの指定したロケールになります。
- ミドルウェアをルートに適用:
作成したミドルウェアを $middleware
プロパティに追加します。
protected $middleware = [
// ...
'localization' => \app\Http\Middleware\Localization::class,
];
- ミドルウェアのプリフィックスを利用:
ミドルウェアが設定されたプリフィックスをルートやコントローラーで利用できます。
Route::prefix('{locale}')
->middleware(Localization::class)
->group(function(){
Route::view('/', 'welcome');
});
{locale}
というプレースホルダを持つURLプレフィックスを使用して、アプリ内のルートへのアクセスにロケールを割り当てることができます。
例えば、URLが /en/route
の場合、{locale}
プレースホルダによって en
が抽出され、Localization
ミドルウェアによってその言語コードがアプリケーションのロケールに設定されます。
その後、Route::view('/', 'welcome');
によって、トップレベルのURL(/en
、/ja
など)へのアクセスが welcome
ビューにマッピングされます。この welcome
ビュー内で、指定された言語に基づいてコンテンツを表示できます。
Middlewareを使用するとクリーンなルートファイルを維持できます。特定のルートやコントローラーに対して locale
を制御するための柔軟性が持ち、管理しやすくなります。
言語を切り替える
アプリに複数の言語がある場合言語を切り替えるリンクやボタンを追加することが多いです。
- セッションにユーザーのローケル設定を保存する
Route::get('/{locale}', function($locale){
app()->setLocale($locale);
session()->put('localization', $locale);
return redirect()->back();
})->name('localization');
/{locale}
にアクセスされたときに、指定された locale
に基づいてアプリケーションのロケールを設定し、セッションにそのロケールを保存してから、元のページにユーザーをリダイレクトします。
/{locale}
: ユーザーがアクセスするURLの一部で、locale
パラメーターを取り込みます。
app()->setLocale($locale)
: Laravelの app()
ヘルパーを使用して、アプリケーションのロケールを指定された locale
に設定します。
session()->put('localization', $locale)
: セッションに localization
キーで指定された locale
を保存します。ユーザーの設定が次回のリクエストでも保持されます。
return redirect()->back();
: back()
メソッドを使用して、ユーザーを前のページにリダイレクトします。ユーザーが言語を変更した後に元のページに戻ります。
->name('localization')
は、このルートに名前を付けています。
route()
ヘルパーを使用してこのルートに簡単にアクセスできるようになります。
例えば、route('localization', ['locale' => 'ja'])
は /ja
にリダイレクトすることができます。
2. セッションの値を使用する
if(session()->has('localization')){
app()->setLocale(session()->get('localization'));
} else {
app()->setLocale(config('app.locale'));
}
# 一行で書くこともできる
app()->setLocale(session('localization', config('app.locale')));
セッションに保存された値に基づいてアプリケーションのロケール(言語)を設定するか、Laravelの設定で指定されたデフォルトロケールにフォールバックします。
session()->has('localization')
:これは、セッションにlocalization
という値が格納されているかどうかをチェックします。
app()->setLocale(...)
:アプリケーションのロケールを指定した値に設定します。
config('app.locale')
:セッションにlocale
の値がない場合、Laravel設定ファイルで指定されたlocale
の値を取得します。
- ビューにリンクを追加する
<a href="{{ route('localization', 'jp') }}">JP</a>
<a href="{{ route('localization', 'en') }}">EN</a>
終わりに
Laravelの国際化について簡単いまとめてみました。
Discussion