Основное отличие состоит в том, что __()
и @lang
будут проверять файлы перевода json в дополнение к вашим языковым файлам php. Кроме этого, синтаксис не изменился; в конечном итоге все они используют один и тот же метод \Illuminate\Translation\Translator::get()
.
Все они будут работать в режиме Blade:
@lang('...')
{{ __('...') }}
{{ Lang::get('...') }}
{{ trans('...') }}
{{ app('translator')->get('...') }}
{{ Lang::trans('...') }}
Если вы используете директиву @lang
Blade, имейте в виду, что она не избежит htmlentities, а это означает, что ваши строки перевода должны быть сохранены в их экранированном виде. Ни одна из других функций также не экранирует htmlentities, но использование @lang
является единственной опцией в этом списке, которая не пропускает строку через руль {{ }}
, где вызывается функция escape.
Если вы хотите погрузиться глубже, это разница с __()
:
/**
* Translate the given message.
*
* @param string $key
* @param array $replace
* @param string $locale
* @return string|array|null
*/
function __($key, $replace = [], $locale = null)
{
return app('translator')->getFromJson($key, $replace, $locale);
}
Вы можете видеть, что он использует getFromJson()
. Вот фрагмент непосредственно из этого метода , где он возвращается к get()
, если ничего не нашел в ваших файлах json:
// If we can't find a translation for the JSON key, we will attempt to translate it
// using the typical translation file. This way developers can always just use a
// helper such as __ instead of having to pick between trans or __ with views.
if (! isset($line)) {
$fallback = $this->get($key, $replace, $locale);
if ($fallback !== $key) {
return $fallback;
}
}
Тогда есть trans()
, который является не более чем псевдонимом:
public function trans($key, array $replace = [], $locale = null)
{
return $this->get($key, $replace, $locale);
}