检查 laravel 的 trans() 中是否存在行
Check line existence in laravel's trans()
假设在我的 lang/en/general.php
中有多个翻译行,例如:
"token" => "This password reset token is invalid.",
"sent" => "Password reminder sent!",
"reset" => "Password has been reset!",
但在我的 lang/de/general.php
中,这些行丢失了。
所以稍后,当我使用 Lang::get('general.token')
或简单地 trans('general.token')
英文版会return
This password reset token is invalid.
德文 (de) 版本将 return
general.token
有什么方法可以处理 'translation not found' 函数,例如过滤器但不为其创建特殊的 class?例如,当一行没有翻译时,我想抛出一个Exception。
提前致谢!
仅在Laravel 4中,可以使用Lang::has()
如下,这里是the doc
if (\Lang::has('general.token')) {
// line exists.
} else {
// line not exist.
}
您可以创建自己的 TranslationServiceProvider 和 Translator 并覆盖 translator 中的 get() 方法,以便在 parent::get() returns 一个等于翻译键的翻译字符串时抛出异常@lang() 和 trans() 函数都调用了翻译器的 get() 方法。
似乎很麻烦,只是为了在您的网站上找到 "Whoops! something went wrong!" 的另一个原因。只有遇到翻译时,您才会得到异常。
另一种解决方案:您可以使用 barryvdh/laravel-translation-manager 包,它有一个翻译服务提供商,可以记录丢失的翻译密钥和一个用于管理翻译的 Web 界面。它将记录每个区域设置丢失的翻译密钥,并让您通过 Web 界面编辑它们。
设置简单,修改方便。所以你可以用抛出异常来代替日志记录。
您可能想要编写一个类似于下面的帮助程序来帮助回退:
/**
* Makes translation fall back to specified value if definition does not exist
*
* @param string $key
* @param null|string $fallback
* @param null|string $locale
* @param array|null $replace
*
* @return array|\Illuminate\Contracts\Translation\Translator|null|string
*/
function trans_fb(string $key, ?string $fallback = null, ?string $locale = null, ?array $replace = [])
{
if (\Illuminate\Support\Facades\Lang::has($key, $locale)) {
return trans($key, $replace, $locale);
}
return $fallback;
}
注意:该助手仅适用于 PHP 7.1(支持可空类型)。如果低于 7.1,请将其调整为您的 PHP 版本。
这个问题有点老了,但根据 5.8 版,您可以简单地检查一下:
array_key_exists('your-word-key', trans('your-file'))
或
array_key_exists('your-word-key', trans('your-file.array_key'))
嵌套翻译
在当前的 Laravel 版本中,您可以像这样使用 trans
助手:
@if (trans()->has('general.token'))
{{ trans('general.token') }}
@endif
假设在我的 lang/en/general.php
中有多个翻译行,例如:
"token" => "This password reset token is invalid.",
"sent" => "Password reminder sent!",
"reset" => "Password has been reset!",
但在我的 lang/de/general.php
中,这些行丢失了。
所以稍后,当我使用 Lang::get('general.token')
或简单地 trans('general.token')
英文版会return
This password reset token is invalid.
德文 (de) 版本将 return
general.token
有什么方法可以处理 'translation not found' 函数,例如过滤器但不为其创建特殊的 class?例如,当一行没有翻译时,我想抛出一个Exception。
提前致谢!
仅在Laravel 4中,可以使用Lang::has()
如下,这里是the doc
if (\Lang::has('general.token')) {
// line exists.
} else {
// line not exist.
}
您可以创建自己的 TranslationServiceProvider 和 Translator 并覆盖 translator 中的 get() 方法,以便在 parent::get() returns 一个等于翻译键的翻译字符串时抛出异常@lang() 和 trans() 函数都调用了翻译器的 get() 方法。
似乎很麻烦,只是为了在您的网站上找到 "Whoops! something went wrong!" 的另一个原因。只有遇到翻译时,您才会得到异常。
另一种解决方案:您可以使用 barryvdh/laravel-translation-manager 包,它有一个翻译服务提供商,可以记录丢失的翻译密钥和一个用于管理翻译的 Web 界面。它将记录每个区域设置丢失的翻译密钥,并让您通过 Web 界面编辑它们。
设置简单,修改方便。所以你可以用抛出异常来代替日志记录。
您可能想要编写一个类似于下面的帮助程序来帮助回退:
/**
* Makes translation fall back to specified value if definition does not exist
*
* @param string $key
* @param null|string $fallback
* @param null|string $locale
* @param array|null $replace
*
* @return array|\Illuminate\Contracts\Translation\Translator|null|string
*/
function trans_fb(string $key, ?string $fallback = null, ?string $locale = null, ?array $replace = [])
{
if (\Illuminate\Support\Facades\Lang::has($key, $locale)) {
return trans($key, $replace, $locale);
}
return $fallback;
}
注意:该助手仅适用于 PHP 7.1(支持可空类型)。如果低于 7.1,请将其调整为您的 PHP 版本。
这个问题有点老了,但根据 5.8 版,您可以简单地检查一下:
array_key_exists('your-word-key', trans('your-file'))
或
array_key_exists('your-word-key', trans('your-file.array_key'))
嵌套翻译
在当前的 Laravel 版本中,您可以像这样使用 trans
助手:
@if (trans()->has('general.token'))
{{ trans('general.token') }}
@endif