Laravel 5.4 の新機能: JSON Based Language Files の話

こんにちは。エンジニアの @localdisk です。このエントリは イノベーター・ジャパン Advent Calendar 2016 16日目の記事です。

先日は当社デザイナの @tyan_hikaruの記事でした。いかがでしたでしょうか? まだ読んでないという方はよかったら目を通してみてください。

さて、Laravel 5.3 のリリースから4ヶ月。5.3 も使い慣れたかなぁという今日この頃ですが、Gihtubリポジトリ では 5.4 の開発も進んでいます。今回は Laravel 5.4 の新機能の中でも個人的に嬉しい対応であった JSON Based Language Files の話をしたいと思います。

f:id:localdisk:20160824143945p:plain

何が嬉しいのか?

Web アプリケーションを多言語対応する場合、一般には*1クライアントサイドとサーバーサイドで翻訳情報を持つ必要があります。クライアントサイドはJSON以外の選択肢はほぼない状況ですが、サーバーサイドの場合、その言語と相性のよい形式で持つことが多くなります。Laravel の場合は配列で定義されたPHPファイルによって多言語サポートを実現しています。

Laravel 5.4 では多言語サポートとして上述のPHPファイル以外にもJSONをサポートします。この対応によってクライアントサイドとサーバーサイドで同じファイルを共有できることになります。クライアントサイドとサーバーサイドで同じ意味のメッセージなのに微妙に内容が違う…という悲劇を繰り返すことがなくなります。嬉しい!

特に当社でWebサービスを作成する際には必ず多言語化することを義務付けられているので非常にありがたい。

では本題に。現在時点(2016/12/14)での使い方は以下のような感じです。

言語ファイルを作る

resources/lang/{locale}.json を作成します。 {locale} には翻訳対象のロケールを指定します。日本語の場合は resources/lang/ja.json ですね。

言語ファイルの例

{
  "sample": "サンプル",
  "required": ":attribute は必ず入力してください"
}

__ 関数

JSON を用いたファイルを翻訳して出力するのは __ 関数を用います(アンダースコアを2回)。 WordPress と一緒ですね。

string __($key = null, $replace = [], $locale = null)

第1引数はキー、第2引数は置換するパラメータ、第3引数はロケールを指定します。第3引数を指定しない場合デフォルトロケール(config/app.phpで指定されているロケール)が設定されます。

使用例

<?php

// 上述の resources/lang/ja.json を使用した場合
echo __('sample'); // サンプル
echo __('required', ['attribute' => 'お名前']); // お名前は必ず入力してください

かんたんですね。 trans 関数と大体一緒です。JSONファイル内で入れ子になった時に .(ドット) で繋げることができないのが難点ですが、 そちらも近く解消されると思います。

一緒に福岡で Laravel を使い倒しませんか?

ご応募お待ちしております!

《福岡》健全な環境で思う存分プログラムを書きたいエンジニアを募集中!

明日はエンジニアの @hacktk です。お楽しみに!

*1:Node.jsはJSONで統一できる