Laravel - 为多语言指定默认/回退字符串

时间:2016-06-18 21:48:46

标签: php laravel-4 translation multilingual

我开始将多语言添加到使用Laravel作为前端的网站。

然而,由于目前缺乏资源,我正在翻译字符串。在整个网站翻译之前还需要一段时间。

唯一的挑战是,如果没有翻译文本,那么显示的是关键。我想指定一个默认/回退字符串。

e.g。

{{ trans('site.'.$name) }}

如果我将'Business'作为$ name传递,并且在site.php lang文件中没有'Business'的翻译,我最终会在前端找到site.Business。这搞砸了一切。在最坏的情况下,如果没有site.Business,Laravel应输出Business

更好的是它应该为默认/回退字符串提供一个选项。

这可能吗?

旁注是否有常用词的免费翻译?这将节省我自己翻译所有内容的时间。

感谢。

2 个答案:

答案 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;
    }
}