はじめに
こんにちは。ひそかに保持しているビットコインがついに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が便利です![]()