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 实体,这意味着您的翻译字符串需要以转义形式存储(例如 <>
而不是 <>
)。其他函数的 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);
}
在 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 实体,这意味着您的翻译字符串需要以转义形式存储(例如 <>
而不是 <>
)。其他函数的 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);
}