我开始将多语言添加到使用Laravel作为前端的网站。
然而,由于目前缺乏资源,我正在翻译字符串。在整个网站翻译之前还需要一段时间。
唯一的挑战是,如果没有翻译文本,那么显示的是关键。我想指定一个默认/回退字符串。
e.g。
{{ trans('site.'.$name) }}
如果我将'Business'作为$ name传递,并且在site.php lang文件中没有'Business'的翻译,我最终会在前端找到site.Business
。这搞砸了一切。在最坏的情况下,如果没有site.Business
,Laravel应输出Business
。
更好的是它应该为默认/回退字符串提供一个选项。
这可能吗?
旁注是否有常用词的免费翻译?这将节省我自己翻译所有内容的时间。
感谢。
答案 0 :(得分:4)
后备语言是你应该使用的。请参阅docs
您还可以配置"后备语言",将在以后使用 活动语言不包含给定的语言行。像 默认语言,后备语言也在配置中
app/config/app.php
配置文件:
'fallback_locale' => 'en',
这肯定会花费你同样多的时间写入后备内联,因为它只是在你在翻译键中写入时在并行翻译文件中的后备中写入。考虑替代方式而不是仅仅采取行动的时间最终可以忽略不计。
如果你真的想要一个内联回退,那么你需要创建一个新的帮助方法来做一些不同的事情。因此,请准备一些家庭酿造的精彩。
让我们创建一个可以在任何视图中使用的新功能。我将使用Joseph Sibler描述的方法。在helpers.php
内创建一个名为app
的文件。然后将其添加到composer.json
数组autoload
对象下的files
"app/helpers.php"
composer dump-autoload
。不确定我的意思?看他的回答。添加后,运行trans_fb()
。
现在,让我们添加一个trans()
方法,该方法将采用resources/lang/en/auth.php
方法的所有参数,但也会使用后备方法。我将定义此方法,以便前两个参数是必需的(键和后备)。
如果Laravel找不到翻译密钥(它在auth.failed
中搜索例如<?php
if (! function_exists('trans_fb')) {
/**
* Translate the given message with a fallback string if none exists.
*
* @param string $id
* @param string $fallback
* @param array $parameters
* @param string $domain
* @param string $locale
* @return \Symfony\Component\Translation\TranslatorInterface|string
*/
function trans_fb($id, $fallback, $parameters = [], $domain = 'messages', $locale = null)
{
return ($id === ($translation = trans($id, $parameters, $domain, $locale))) ? $fallback : $translation;
}
}
作为密钥),它将使用回退,并传递原始方法的任何其他可选参数。
{{ trans_fb("i.love.laravel", "I love Laravel!") }}
然后您可以在模板中使用它:
{{1}}
答案 1 :(得分:0)
我想出了这个解决方案,它使用与 trans()
方法相同的参数,当键未翻译时,它使用来自 'fallback_locale'
的应用程序 app.php
返回翻译后的字符串。>
我仍然想知道为什么它没有在 Laravel 中本地实现,而 Laravel 只是返回未翻译的键。
if (!function_exists('trans_fb')) {
function trans_fb(string $key, array $replace = [], ?string $locale = null)
{
$translation = trans($key, $replace, $locale);
if ($key === $translation) {
return trans($key, $replace, config('app.fallback_locale'));
}
return $translation;
}
}