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

Is there a difference between Lang::get('locale') and __('locale') in Laravel?

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

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

但我注意到了

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

也能用,其实以前的版本也用过。

这两者之间是否存在根本区别,或者只是语法发生了变化?

主要区别在于 __()@lang 除了会检查 php 语言文件外,还会检查 json translation files。除此之外,语法没有改变;他们最终都遵循相同的 \Illuminate\Translation\Translator::get() 方法。

这些都将在 Blade 视图中工作:

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

如果您使用 @lang Blade 指令,请记住它不会转义 html 实体,这意味着您的翻译字符串需要以转义形式存储(例如 &lt;&gt; 而不是 <>)。其他函数的 None 也转义 html 实体,但使用 @lang 是该列表中唯一不通过把手传递字符串的选项 {{ }},这是调用转义函数的地方。在翻译字符串中使用 html 特殊字符可能并不常见,并且翻译字符串通常不是来自用户输入(因此跨站点脚本不是问题),但值得了解。


如果您想更深入地研究,这就是与 __()(从 Laravel 5.8 开始)的区别:

/**
 * 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()。但是,getFromJson() falls back to 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(),无非是get()的别名:

public function trans($key, array $replace = [], $locale = null)
{
    return $this->get($key, $replace, $locale);
}