Laravel5.4の多言語化

2018年8月26日

 
 

どうも
多言語化というと
たいそうな話に聞きこえますが、
Laravelでのロケールの話です。

つまり、
webアプリケーションを作る時に
htmlに文字をベタ書きしてしまうと、
あとあと
「このサイト英語にするのどれくらいかかる?」
とかの
無邪気な質問に対応しづらくなります。

ベタ書きしてしまうと、
後から、置き換える必要のある場所を洗い出して
全部htmlなりテンプレートファイルを
書き換えないといけません。

最近
Laravelでアプリを作りはじめていて
使い方を調べたので、
ここにまとめておきます。

ちなみにLaravelのバージョンは5.4です。
この記事はここを参考にしました。
https://laravel.com/docs/5.4/localization

ロケールファイルの置き場所

ロケールファイルこのように、
resources/lang/の下に
言語に分けてそれぞれの言語ファイルを置いて起きます。

/resources
    /lang
        /en
            messages.php
        /ja
            messages.php

それぞれの中身は
(英語版) lang/en/message.php

 <?php
  return [
    'description' => 'welcome to our site. this is shopping site on the web !!'
]

(日本語版) lang/ja/message.php

<?php
  return [
    'description' => 'ようこそ私たちのオンラインショッピングサイトへ'
]

になります。
このようにしておくと
message.descriptionなどを
キーにviewファイルから文字を呼びだすようになります。

ロケールファイルに書いたメッセージの呼び出し

上の設定が住んで入れば、
view ファイルで

__('message.description')'

のように、
呼び出せます。

 

ロケールの設定

 
 

ここまでで、
・言語ごとのロケールファイルの設定
・viewファイルでの呼び出し

はできます。
が、
日本語が呼ばれるか、英語が呼ばれるかどこで判断するの?
という疑問が生まれると思います。

それがどこかというと、
それは、

 
 

config/app.phpのlocaleになります。

    
/*
|--------------------------------------------------------------------------
| 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' => 'ja',

また、config/app.phpはアプリの起動時に
読まれるはずですが、
アプリの起動中でも


Route::get('welcome/{locale}', function ($locale) {
    App::setLocale($locale);

    //
});

のような形でロケールを変更できるよう。

これはやってみてはないですが、
これを使って、
言語をユーザに選ばせるとかはできそう。

 
 

おまけ – メッセージを動的にする

 
 

以下は少し補足的な内容になりますが、
メッセージを動的に変化させたい時ありますよね。

例えば、
ログイン後の画面でよくある「ようこそ〇〇さん」みたいな表示です。

 
 

これをロケールでやろうとすると
(英語版)

 <?php
  return [
    'welcom' => ':name , welcome to our site!!'
]

(日本語版)

<?php
  return [
    'welcom' => 'ようこそ :name さん'
]

のようにファイルに定義して、
呼び出す際に

__('messages.welcome', ['name' => 'John']);

のようにすれば、
変数の文字を埋め込んだ形でメッセージを表示することができます。

 
 

まとめ

 
 

ここまでで、
ロケールとか国際化とか多言語化とかに
役立つ情報をまとめました。

これはアプリを多言語で作ると決めてから
コツコツ両方のロケールを更新していくという作業
が必要なので、
早めに知っておくと良いと思います。
(後から文字を全部置き換えるという単純作業は地獄なので・・・)

以上です!!