【Laravel8】多言語化(言語別ディレクトリ)にトライしたのでやったことを書きます【参考コードあり】

自作のWebツールがあるのですが、そちらを日本語、英語対応しました。

日本語は、https://www.blugrit.com/tools/ja_JP 英語はhttps://www.blugrit.com/tools/en_US となっており、言語ごとにディレクトリが分かれるタイプです。

コントローラー、ビューは共通でテキスト部分を出し分けるようになっています。

やること

必要なことは以下の5つです。

・対応言語の定義

・言語判定

・言語別に出し分けるテキストの作成

・ビューでのテキスト出力

・ルートの編集

対応言語の定義

config内にlanguages.phpを作成します。

<?phpreturn [    'ja_JP' => '日本語',    'en_US' => 'English'];?>

ここに定義した内容はディレクトリ名に影響します。

config/app.phpに書かれているlocaleとfallback_localeを以下のようにします。

'locale' => 'ja_JP','fallback_locale' => 'ja_JP',

言語判定

app/Http/Middleware/Language.phpを作成します。

<?phpnamespace App\Http\Middleware;use \Illuminate\Support\Facades\App;use Closure;use \Illuminate\Support\Facades\Config;class Language{    /**     *      * @param \Illuminate\Http\Request $request     * @param \Closure $next     *      * @return mixed     */    public function handle($request, Closure $next)    {        // /en_US/XXXのようなURLの想定        $path = $request->path();        $lang = current(explode('/', $path));        if(array_key_exists($lang, Config::get('languages'))){            App::setLocale($lang);        }        else{            App::setLocale(Config::get('app.fallback_locale'));        }        return $next($request);    }}?>

MiddlewareでアクセスされたURLから言語を判定、config/language.phpで定義されていればsetLocaleしています。

app/Http/Kernel.phpに追加して呼び出されるようにします。

protected $middlewareGroups = [        'web' => [            // 一部省略            \App\Http\Middleware\Language::class, ←追加        ],];

言語別に出し分けるテキストの作成

resources/lang 配下に言語別のディレクトリを用意します。

今回の例ではresources/lang/ja_JP、resources/lang/en_USです。このディレクトリ名はlanguages.phpと合わせる必要があります。

ファイル名はなんでもOKですが、ここでは後の説明との関連でja_JP配下にhtml.phpを用意する想定で書きます。

html.php内に言語別のテキストを記載します。

一つの言語のファイルを仕上げてからコピーして他言語用のファイルを用意するほうが楽です。

以下、サンプルです。

<?phpreturn [    'title' => 'パスワード生成',    'meta_description' => 'パスワードを生成します。',    'submit' => '実行',];

ビューでのテキスト出力

ビューでのテキスト出力

html.phpに記載した内容をビューで呼び出します。

Middlewareで判定された言語のものが自動で取得されます。とっても便利!

以下のようにして呼び出します。ファイル名(html.php).定義したキー となっています。

@lang('html.title')//{{ __('html.title') }}でも可

@sectionや@includeに渡す時は__()を使用します。

@section('xxx', __("html.description"))

ビューでの言語判定

言語ごとに出し分けたい内容がある場合、App::getLocale()で判定できます。

<?php if(App::getLocale() == 'ja_JP'): ?>

ルートの編集

言語別のURLになるためweb.phpの編集が必要です。

以下のようにlanguages.phpの定義を利用すると楽です。

use \Illuminate\Support\Facades\Config;foreach(Config::get('languages') as $lang_code => $lang){    Route::get("/{$lang_code}", function (){        return view('index');    });}

その他

コントローラーでのテキスト取得方法

コントローラー内で言語別のテキストを取得する場合は __()を利用します。

$result['message'] = __('xxx.zzz');

注意点

構築済みのシステムを途中から多言語化する場合、システム内のパスで影響を受けるところがないか確認が必要です。

また公開済みの場合、URLが変わるならリダイレクト設定も必要になるので注意してください。

コメント