はじめに
こんにちは。ひそかに保持しているビットコインがついに800%を超えました、筆者です
Laravelで多言語サイトの構築をしているのですが、指定の言語で翻訳があるかどうかの判定をしたいケースがありました。
先入観にとらわれ地味にうまくいかなかったので記事にしました。
参考にしてくださいませ。
前提
翻訳ファイル
resources/lang/ja/messages.php
return [
];
resources/lang/en/messages.php
return [
'title' => 'Hello',
];
設定ファイル
config/app.php
return [
'fallback_locale' => 'en',
];
悪い例
App::setLocale('ja');
$has = \Illuminate\Support\Facades\Lang::has('messages.title');
dump($has); // true
App::setLocale('en');
$has = \Illuminate\Support\Facades\Lang::has('messages.title');
dump($has); // true
良い例
App::setLocale('ja');
$has = \Illuminate\Support\Facades\Lang::hasForLocale('messages.title');
dump($has); // false
App::setLocale('en');
$has = \Illuminate\Support\Facades\Lang::hasForLocale('messages.title');
dump($has); // true
結論
\Illuminate\Support\Facades\Lang::has
では、設定ファイルにfallback_locale
を設定している場合、指定の言語で翻訳が無い場合にそちらの値が採用されてしまいます。
そのため、ja
に翻訳が無くても、enを見に行ってあるので、trueが返ってしまいます。
fallback_locale
を無視して翻訳のあるかどうかの判定をする場合は、\Illuminate\Support\Facades\Lang::hasForLocale
を使ってください!
おわりに
has
でも第3引数にfalse
渡せば同じですが、引数3つ渡さないといけないので、hasForLocale
が便利です