Laravel中的Lang :: get('locale')和__('locale')之间有区别吗?

时间:2018-11-08 13:53:33

标签: multilingual laravel-5.7

在Laravel 5.7中,文档说要使用以下语法来检索语言环境

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

但我注意到

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

也可以使用,实际上,以前的版本中也使用过。

这两者之间是否有根本区别,还是只是语法有所改变?

1 个答案:

答案 0 :(得分:0)

如果使用json转换文件,则可能必须使用__()@lang。除此之外,语法没有改变。他们最终都会归因于\Illuminate\Translation\Translator::get()

这些都可以通过Blade文件运行:

@lang('...')
{{ __('...') }}
{{ Lang::get('...') }}
{{ trans('...') }}
{{ app('translator')->get('...') }}
{{ Lang::trans('...') }}

({@lang不会转义输出,因此,如果使用它,则需要将转义的字符串存储在翻译文件中)


如果您想更深入地学习,则会有一些 细微变化。例如,__()

/**
 * 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()。这是一个片段directly from that method,如果在您的json文件中找不到任何内容,它会回落到get()

    // 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);
}