Есть ли разница между Lang :: get ('locale') и __ ('locale') в Laravel? - PullRequest
0 голосов
/ 08 ноября 2018

В Laravel 5.7 документы говорят использовать следующий синтаксис для получения локалей

{{ __ ('my.locale')}}

но я заметил

{{Lang::get('my.locale')}}

тоже работает, и это фактически то, что также использовалось в предыдущих версиях.

Есть ли принципиальная разница между этими двумя или просто изменился синтаксис?

1 Ответ

0 голосов
/ 10 ноября 2018

Основное отличие состоит в том, что __() и @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);
}
...