フレームワークを使用してLaravel 5に多言語を実装する

少し前に、ドキュメントと記事のおかげで人気を博しているLaravelフレームワークを知ることにしました。 しかし、練習なしのトレーニングは何ですか? ホスティングに静かにハングアップし、トラブルを引き起こさない、かなりシンプルな自己記述型Webサイトを転送することにしました。

このサイトの機能の1つは、yaml辞書ファイルと単純なパーサーによって実装されるインターフェース言語の切り替えでした。 フレームワークのロジックにそれを転送することは、創造的な問題というよりも機械的な問題でしたが、選択した言語を覚えさせるのはもう少し困難でした。 以下に、このタスクの私のバージョンを示します。

アプリケーション構成設定


まず、目的のロケールを指定し、config / app.phpで使用する言語の配列を追加する必要があります
'locale' => 'ru', #      'locales' => ['ru', 'en'], # ,      . #     . 

辞書を作成する


Laravelの辞書はphp配列です。 それらの作成方法は、 ドキュメントに詳しく説明されています 。 アプリケーションで使用される各言語の辞書が必要です。 resources / langに各言語(enとruの2つしかない)のフォルダーを作成し、各フォルダーに独自の辞書(messages.phpなど)を作成します。 テンプレートでそれらを使用する方法は、別に説明する必要はないと思います。

ミドルウェアを作成する


デフォルトでは、Laravelは常に設定で選択された言語で起動します。 変更するには、ビューを受け取る前にリクエストをインターセプトし、App :: setLocale();メソッドを使用して言語を設定する必要があります。 ミドルウェアは、ユーザーがページをリクエストするたびに実行されるコードの一部であり、これを可能にします。 ユーザーが既にサイトにアクセスしている場合は、ユーザーが既に選択している言語(ユーザーセッションで指定)を確認し、存在しない場合は、セッションに既定の言語(ruなど)を追加します。

同時に、ユーザーが選択した言語が有効であることを確認します(このために、構成の初期段階で使用可能な言語を指定しました)。

コンソールと職人を使用して、スイッチ用のミドルウェアを作成します。 たとえば、Localeと呼びましょう。

 php artisan make:middleware Locale 

そして、handleメソッドでコードを記述します。 ここでは、構成で指定された変数が役立ちます。
  public function handle($request, Closure $next) { $raw_locale = Session::get('locale'); #       , #        . if (in_array($raw_locale, Config::get('app.locales'))) { # ,         $locale = $raw_locale; # (  - ) } #     $locale. else $locale = Config::get('app.locale'); #         App::setLocale($locale); #    return $next($request); #      } 

ファイルの先頭に追加することを忘れないでください
 use App; use Config; use Session; 


ミドルウェアを登録する


app / Http / Kernel.phpファイルで、StartSessionミドルウェア(セッションを初期化するため、 hovdevに感謝します)とミドルウェアを配列の最後に追加して、アプリケーションがロードされるたびに実行されるようにします。
 protected $middleware = [ ... \Illuminate\Session\Middleware\StartSession::class, \App\Http\Middleware\Locale::class, ]; 

言語を切り替えるルートを作成する


ユーザーセッションで言語を切り替えるパスを登録します。 このために、mysite / setlocale / enという形式のリンクを選択しました。 クリックすると、lang値(以前はミドルウェアによって設定されていた)をリンクの最後に示されている値に変更します。 途中で、選択した言語が使い慣れた方法で有効であることを確認し、スクリプトが呼び出されたのと同じページにユーザーをリダイレクトします。

 Route::get('setlocale/{locale}', function ($locale) { if (in_array($locale, \Config::get('app.locales'))) { # ,       Session::put('locale', $locale); #        locale } return redirect()->back(); #   <s></s>     }); 

以上です。

Source: https://habr.com/ru/post/J264435/


All Articles